[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / setcc-fsh.ll
blob08bfe282703ff69d6956926be35275dd9adf828e
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=aarch64-- -o - %s | FileCheck %s
4 declare i32 @llvm.fshl.i32(i32, i32, i32)
5 declare i16 @llvm.fshr.i16(i16, i16, i16)
6 declare i64 @llvm.fshr.i64(i64, i64, i64)
7 declare <4 x i32> @llvm.fshl.v4i32(<4 x i32>, <4 x i32>, <4 x i32>)
9 define i1 @fshl_or_eq_0(i32 %x, i32 %y) {
10 ; CHECK-LABEL: fshl_or_eq_0:
11 ; CHECK:       // %bb.0:
12 ; CHECK-NEXT:    orr w8, w0, w1, lsl #5
13 ; CHECK-NEXT:    cmp w8, #0
14 ; CHECK-NEXT:    cset w0, eq
15 ; CHECK-NEXT:    ret
16   %or = or i32 %x, %y
17   %f = call i32 @llvm.fshl.i32(i32 %or, i32 %x, i32 5)
18   %r = icmp eq i32 %f, 0
19   ret i1 %r
22 define i1 @fshl_or_commute_eq_0(i32 %x, i32 %y) {
23 ; CHECK-LABEL: fshl_or_commute_eq_0:
24 ; CHECK:       // %bb.0:
25 ; CHECK-NEXT:    orr w8, w0, w1, lsl #5
26 ; CHECK-NEXT:    cmp w8, #0
27 ; CHECK-NEXT:    cset w0, eq
28 ; CHECK-NEXT:    ret
29   %or = or i32 %y, %x
30   %f = call i32 @llvm.fshl.i32(i32 %or, i32 %x, i32 5)
31   %r = icmp eq i32 %f, 0
32   ret i1 %r
35 define <4 x i1> @fshl_or2_eq_0(<4 x i32> %x, <4 x i32> %y) {
36 ; CHECK-LABEL: fshl_or2_eq_0:
37 ; CHECK:       // %bb.0:
38 ; CHECK-NEXT:    ushr v1.4s, v1.4s, #7
39 ; CHECK-NEXT:    orr v0.16b, v1.16b, v0.16b
40 ; CHECK-NEXT:    cmeq v0.4s, v0.4s, #0
41 ; CHECK-NEXT:    xtn v0.4h, v0.4s
42 ; CHECK-NEXT:    ret
43   %or = or <4 x i32> %x, %y
44   %f = call <4 x i32> @llvm.fshl.v4i32(<4 x i32> %x, <4 x i32> %or, <4 x i32> <i32 25, i32 25, i32 25, i32 25>)
45   %r = icmp eq <4 x i32> %f, zeroinitializer
46   ret <4 x i1> %r
49 define <4 x i1> @fshl_or2_commute_eq_0(<4 x i32> %x, <4 x i32> %y) {
50 ; CHECK-LABEL: fshl_or2_commute_eq_0:
51 ; CHECK:       // %bb.0:
52 ; CHECK-NEXT:    ushr v1.4s, v1.4s, #7
53 ; CHECK-NEXT:    orr v0.16b, v1.16b, v0.16b
54 ; CHECK-NEXT:    cmeq v0.4s, v0.4s, #0
55 ; CHECK-NEXT:    xtn v0.4h, v0.4s
56 ; CHECK-NEXT:    ret
57   %or = or <4 x i32> %y, %x
58   %f = call <4 x i32> @llvm.fshl.v4i32(<4 x i32> %x, <4 x i32> %or, <4 x i32> <i32 25, i32 25, i32 25, i32 25>)
59   %r = icmp eq <4 x i32> %f, zeroinitializer
60   ret <4 x i1> %r
63 define i1 @fshr_or_eq_0(i16 %x, i16 %y) {
64 ; CHECK-LABEL: fshr_or_eq_0:
65 ; CHECK:       // %bb.0:
66 ; CHECK-NEXT:    orr w8, w0, w1, lsl #8
67 ; CHECK-NEXT:    tst w8, #0xffff
68 ; CHECK-NEXT:    cset w0, eq
69 ; CHECK-NEXT:    ret
70   %or = or i16 %x, %y
71   %f = call i16 @llvm.fshr.i16(i16 %or, i16 %x, i16 8)
72   %r = icmp eq i16 %f, 0
73   ret i1 %r
76 define i1 @fshr_or_commute_eq_0(i16 %x, i16 %y) {
77 ; CHECK-LABEL: fshr_or_commute_eq_0:
78 ; CHECK:       // %bb.0:
79 ; CHECK-NEXT:    orr w8, w0, w1, lsl #8
80 ; CHECK-NEXT:    tst w8, #0xffff
81 ; CHECK-NEXT:    cset w0, eq
82 ; CHECK-NEXT:    ret
83   %or = or i16 %y, %x
84   %f = call i16 @llvm.fshr.i16(i16 %or, i16 %x, i16 8)
85   %r = icmp eq i16 %f, 0
86   ret i1 %r
89 define i1 @fshr_or2_eq_0(i64 %x, i64 %y) {
90 ; CHECK-LABEL: fshr_or2_eq_0:
91 ; CHECK:       // %bb.0:
92 ; CHECK-NEXT:    orr x8, x0, x1, lsr #3
93 ; CHECK-NEXT:    cmp x8, #0
94 ; CHECK-NEXT:    cset w0, eq
95 ; CHECK-NEXT:    ret
96   %or = or i64 %x, %y
97   %f = call i64 @llvm.fshr.i64(i64 %x, i64 %or, i64 3)
98   %r = icmp eq i64 %f, 0
99   ret i1 %r
102 define i1 @fshl_or_ne_0(i32 %x, i32 %y) {
103 ; CHECK-LABEL: fshl_or_ne_0:
104 ; CHECK:       // %bb.0:
105 ; CHECK-NEXT:    orr w8, w0, w1, lsl #7
106 ; CHECK-NEXT:    cmp w8, #0
107 ; CHECK-NEXT:    cset w0, ne
108 ; CHECK-NEXT:    ret
109   %or = or i32 %x, %y
110   %f = call i32 @llvm.fshl.i32(i32 %or, i32 %x, i32 7)
111   %r = icmp ne i32 %f, 0
112   ret i1 %r
115 define i1 @fshl_or_commute_ne_0(i32 %x, i32 %y) {
116 ; CHECK-LABEL: fshl_or_commute_ne_0:
117 ; CHECK:       // %bb.0:
118 ; CHECK-NEXT:    orr w8, w0, w1, lsl #7
119 ; CHECK-NEXT:    cmp w8, #0
120 ; CHECK-NEXT:    cset w0, ne
121 ; CHECK-NEXT:    ret
122   %or = or i32 %y, %x
123   %f = call i32 @llvm.fshl.i32(i32 %or, i32 %x, i32 7)
124   %r = icmp ne i32 %f, 0
125   ret i1 %r
128 define <4 x i1> @fshl_or2_ne_0(<4 x i32> %x, <4 x i32> %y) {
129 ; CHECK-LABEL: fshl_or2_ne_0:
130 ; CHECK:       // %bb.0:
131 ; CHECK-NEXT:    ushr v1.4s, v1.4s, #27
132 ; CHECK-NEXT:    orr v0.16b, v1.16b, v0.16b
133 ; CHECK-NEXT:    cmtst v0.4s, v0.4s, v0.4s
134 ; CHECK-NEXT:    xtn v0.4h, v0.4s
135 ; CHECK-NEXT:    ret
136   %or = or <4 x i32> %x, %y
137   %f = call <4 x i32> @llvm.fshl.v4i32(<4 x i32> %x, <4 x i32> %or, <4 x i32> <i32 5, i32 5, i32 5, i32 5>)
138   %r = icmp ne <4 x i32> %f, zeroinitializer
139   ret <4 x i1> %r
142 define <4 x i1> @fshl_or2_commute_ne_0(<4 x i32> %x, <4 x i32> %y) {
143 ; CHECK-LABEL: fshl_or2_commute_ne_0:
144 ; CHECK:       // %bb.0:
145 ; CHECK-NEXT:    ushr v1.4s, v1.4s, #27
146 ; CHECK-NEXT:    orr v0.16b, v1.16b, v0.16b
147 ; CHECK-NEXT:    cmtst v0.4s, v0.4s, v0.4s
148 ; CHECK-NEXT:    xtn v0.4h, v0.4s
149 ; CHECK-NEXT:    ret
150   %or = or <4 x i32> %y, %x
151   %f = call <4 x i32> @llvm.fshl.v4i32(<4 x i32> %x, <4 x i32> %or, <4 x i32> <i32 5, i32 5, i32 5, i32 5>)
152   %r = icmp ne <4 x i32> %f, zeroinitializer
153   ret <4 x i1> %r
156 define i1 @fshr_or_ne_0(i64 %x, i64 %y) {
157 ; CHECK-LABEL: fshr_or_ne_0:
158 ; CHECK:       // %bb.0:
159 ; CHECK-NEXT:    orr x8, x0, x1, lsl #63
160 ; CHECK-NEXT:    cmp x8, #0
161 ; CHECK-NEXT:    cset w0, ne
162 ; CHECK-NEXT:    ret
163   %or = or i64 %x, %y
164   %f = call i64 @llvm.fshr.i64(i64 %or, i64 %x, i64 1)
165   %r = icmp ne i64 %f, 0
166   ret i1 %r
169 define i1 @fshr_or_commute_ne_0(i64 %x, i64 %y) {
170 ; CHECK-LABEL: fshr_or_commute_ne_0:
171 ; CHECK:       // %bb.0:
172 ; CHECK-NEXT:    orr x8, x0, x1, lsl #63
173 ; CHECK-NEXT:    cmp x8, #0
174 ; CHECK-NEXT:    cset w0, ne
175 ; CHECK-NEXT:    ret
176   %or = or i64 %y, %x
177   %f = call i64 @llvm.fshr.i64(i64 %or, i64 %x, i64 1)
178   %r = icmp ne i64 %f, 0
179   ret i1 %r
182 define i1 @fshr_or2_ne_0(i16 %x, i16 %y) {
183 ; CHECK-LABEL: fshr_or2_ne_0:
184 ; CHECK:       // %bb.0:
185 ; CHECK-NEXT:    and w8, w1, #0xfffc
186 ; CHECK-NEXT:    orr w8, w0, w8, lsr #2
187 ; CHECK-NEXT:    tst w8, #0xffff
188 ; CHECK-NEXT:    cset w0, ne
189 ; CHECK-NEXT:    ret
190   %or = or i16 %x, %y
191   %f = call i16 @llvm.fshr.i16(i16 %x, i16 %or, i16 2)
192   %r = icmp ne i16 %f, 0
193   ret i1 %r
196 define i1 @fshr_or2_commute_ne_0(i16 %x, i16 %y) {
197 ; CHECK-LABEL: fshr_or2_commute_ne_0:
198 ; CHECK:       // %bb.0:
199 ; CHECK-NEXT:    and w8, w1, #0xfffc
200 ; CHECK-NEXT:    orr w8, w0, w8, lsr #2
201 ; CHECK-NEXT:    tst w8, #0xffff
202 ; CHECK-NEXT:    cset w0, ne
203 ; CHECK-NEXT:    ret
204   %or = or i16 %y, %x
205   %f = call i16 @llvm.fshr.i16(i16 %x, i16 %or, i16 2)
206   %r = icmp ne i16 %f, 0
207   ret i1 %r
210 define i1 @fshl_xor_eq_0(i32 %x, i32 %y) {
211 ; CHECK-LABEL: fshl_xor_eq_0:
212 ; CHECK:       // %bb.0:
213 ; CHECK-NEXT:    eor w8, w0, w1
214 ; CHECK-NEXT:    extr w8, w8, w0, #30
215 ; CHECK-NEXT:    cmp w8, #0
216 ; CHECK-NEXT:    cset w0, eq
217 ; CHECK-NEXT:    ret
218   %or = xor i32 %x, %y
219   %f = call i32 @llvm.fshl.i32(i32 %or, i32 %x, i32 2)
220   %r = icmp eq i32 %f, 0
221   ret i1 %r
224 define i1 @fshl_or_sgt_0(i32 %x, i32 %y) {
225 ; CHECK-LABEL: fshl_or_sgt_0:
226 ; CHECK:       // %bb.0:
227 ; CHECK-NEXT:    orr w8, w0, w1
228 ; CHECK-NEXT:    extr w8, w8, w0, #30
229 ; CHECK-NEXT:    cmp w8, #0
230 ; CHECK-NEXT:    cset w0, gt
231 ; CHECK-NEXT:    ret
232   %or = or i32 %x, %y
233   %f = call i32 @llvm.fshl.i32(i32 %or, i32 %x, i32 2)
234   %r = icmp sgt i32 %f, 0
235   ret i1 %r
238 define i1 @fshl_or_ne_2(i32 %x, i32 %y) {
239 ; CHECK-LABEL: fshl_or_ne_2:
240 ; CHECK:       // %bb.0:
241 ; CHECK-NEXT:    orr w8, w0, w1
242 ; CHECK-NEXT:    extr w8, w8, w0, #30
243 ; CHECK-NEXT:    cmp w8, #2
244 ; CHECK-NEXT:    cset w0, ne
245 ; CHECK-NEXT:    ret
246   %or = or i32 %x, %y
247   %f = call i32 @llvm.fshl.i32(i32 %or, i32 %x, i32 2)
248   %r = icmp ne i32 %f, 2
249   ret i1 %r