[ARM] Generate 8.1-m CSINC, CSNEG and CSINV instructions.
[llvm-core.git] / test / CodeGen / Thumb2 / mve-pred-not.ll
blob32b3b807e4513c26d9153988381c3f1ad180effc
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=thumbv8.1m.main-arm-none-eabi -mattr=+mve -verify-machineinstrs %s -o - | FileCheck %s
4 define arm_aapcs_vfpcc <4 x i32> @cmpeqz_v4i1(<4 x i32> %a, <4 x i32> %b) {
5 ; CHECK-LABEL: cmpeqz_v4i1:
6 ; CHECK:       @ %bb.0: @ %entry
7 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
8 ; CHECK-NEXT:    vpsel q0, q1, q0
9 ; CHECK-NEXT:    bx lr
10 entry:
11   %c1 = icmp eq <4 x i32> %a, zeroinitializer
12   %o = xor <4 x i1> %c1, <i1 -1, i1 -1, i1 -1, i1 -1>
13   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
14   ret <4 x i32> %s
17 define arm_aapcs_vfpcc <4 x i32> @cmpnez_v4i1(<4 x i32> %a, <4 x i32> %b) {
18 ; CHECK-LABEL: cmpnez_v4i1:
19 ; CHECK:       @ %bb.0: @ %entry
20 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
21 ; CHECK-NEXT:    vpsel q0, q1, q0
22 ; CHECK-NEXT:    bx lr
23 entry:
24   %c1 = icmp eq <4 x i32> %a, zeroinitializer
25   %o = xor <4 x i1> %c1, <i1 -1, i1 -1, i1 -1, i1 -1>
26   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
27   ret <4 x i32> %s
30 define arm_aapcs_vfpcc <4 x i32> @cmpsltz_v4i1(<4 x i32> %a, <4 x i32> %b) {
31 ; CHECK-LABEL: cmpsltz_v4i1:
32 ; CHECK:       @ %bb.0: @ %entry
33 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
34 ; CHECK-NEXT:    vpsel q0, q1, q0
35 ; CHECK-NEXT:    bx lr
36 entry:
37   %c1 = icmp eq <4 x i32> %a, zeroinitializer
38   %o = xor <4 x i1> %c1, <i1 -1, i1 -1, i1 -1, i1 -1>
39   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
40   ret <4 x i32> %s
43 define arm_aapcs_vfpcc <4 x i32> @cmpsgtz_v4i1(<4 x i32> %a, <4 x i32> %b) {
44 ; CHECK-LABEL: cmpsgtz_v4i1:
45 ; CHECK:       @ %bb.0: @ %entry
46 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
47 ; CHECK-NEXT:    vpsel q0, q1, q0
48 ; CHECK-NEXT:    bx lr
49 entry:
50   %c1 = icmp eq <4 x i32> %a, zeroinitializer
51   %o = xor <4 x i1> %c1, <i1 -1, i1 -1, i1 -1, i1 -1>
52   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
53   ret <4 x i32> %s
56 define arm_aapcs_vfpcc <4 x i32> @cmpslez_v4i1(<4 x i32> %a, <4 x i32> %b) {
57 ; CHECK-LABEL: cmpslez_v4i1:
58 ; CHECK:       @ %bb.0: @ %entry
59 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
60 ; CHECK-NEXT:    vpsel q0, q1, q0
61 ; CHECK-NEXT:    bx lr
62 entry:
63   %c1 = icmp eq <4 x i32> %a, zeroinitializer
64   %o = xor <4 x i1> %c1, <i1 -1, i1 -1, i1 -1, i1 -1>
65   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
66   ret <4 x i32> %s
69 define arm_aapcs_vfpcc <4 x i32> @cmpsgez_v4i1(<4 x i32> %a, <4 x i32> %b) {
70 ; CHECK-LABEL: cmpsgez_v4i1:
71 ; CHECK:       @ %bb.0: @ %entry
72 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
73 ; CHECK-NEXT:    vpsel q0, q1, q0
74 ; CHECK-NEXT:    bx lr
75 entry:
76   %c1 = icmp eq <4 x i32> %a, zeroinitializer
77   %o = xor <4 x i1> %c1, <i1 -1, i1 -1, i1 -1, i1 -1>
78   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
79   ret <4 x i32> %s
82 define arm_aapcs_vfpcc <4 x i32> @cmpultz_v4i1(<4 x i32> %a, <4 x i32> %b) {
83 ; CHECK-LABEL: cmpultz_v4i1:
84 ; CHECK:       @ %bb.0: @ %entry
85 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
86 ; CHECK-NEXT:    vpsel q0, q1, q0
87 ; CHECK-NEXT:    bx lr
88 entry:
89   %c1 = icmp eq <4 x i32> %a, zeroinitializer
90   %o = xor <4 x i1> %c1, <i1 -1, i1 -1, i1 -1, i1 -1>
91   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
92   ret <4 x i32> %s
95 define arm_aapcs_vfpcc <4 x i32> @cmpugtz_v4i1(<4 x i32> %a, <4 x i32> %b) {
96 ; CHECK-LABEL: cmpugtz_v4i1:
97 ; CHECK:       @ %bb.0: @ %entry
98 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
99 ; CHECK-NEXT:    vpsel q0, q1, q0
100 ; CHECK-NEXT:    bx lr
101 entry:
102   %c1 = icmp eq <4 x i32> %a, zeroinitializer
103   %o = xor <4 x i1> %c1, <i1 -1, i1 -1, i1 -1, i1 -1>
104   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
105   ret <4 x i32> %s
108 define arm_aapcs_vfpcc <4 x i32> @cmpulez_v4i1(<4 x i32> %a, <4 x i32> %b) {
109 ; CHECK-LABEL: cmpulez_v4i1:
110 ; CHECK:       @ %bb.0: @ %entry
111 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
112 ; CHECK-NEXT:    vpsel q0, q1, q0
113 ; CHECK-NEXT:    bx lr
114 entry:
115   %c1 = icmp eq <4 x i32> %a, zeroinitializer
116   %o = xor <4 x i1> %c1, <i1 -1, i1 -1, i1 -1, i1 -1>
117   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
118   ret <4 x i32> %s
121 define arm_aapcs_vfpcc <4 x i32> @cmpugez_v4i1(<4 x i32> %a, <4 x i32> %b) {
122 ; CHECK-LABEL: cmpugez_v4i1:
123 ; CHECK:       @ %bb.0: @ %entry
124 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
125 ; CHECK-NEXT:    vpsel q0, q1, q0
126 ; CHECK-NEXT:    bx lr
127 entry:
128   %c1 = icmp eq <4 x i32> %a, zeroinitializer
129   %o = xor <4 x i1> %c1, <i1 -1, i1 -1, i1 -1, i1 -1>
130   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
131   ret <4 x i32> %s
136 define arm_aapcs_vfpcc <4 x i32> @cmpeq_v4i1(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
137 ; CHECK-LABEL: cmpeq_v4i1:
138 ; CHECK:       @ %bb.0: @ %entry
139 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
140 ; CHECK-NEXT:    vpsel q0, q1, q0
141 ; CHECK-NEXT:    bx lr
142 entry:
143   %c1 = icmp eq <4 x i32> %a, zeroinitializer
144   %o = xor <4 x i1> %c1, <i1 -1, i1 -1, i1 -1, i1 -1>
145   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
146   ret <4 x i32> %s
149 define arm_aapcs_vfpcc <4 x i32> @cmpne_v4i1(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
150 ; CHECK-LABEL: cmpne_v4i1:
151 ; CHECK:       @ %bb.0: @ %entry
152 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
153 ; CHECK-NEXT:    vpsel q0, q1, q0
154 ; CHECK-NEXT:    bx lr
155 entry:
156   %c1 = icmp eq <4 x i32> %a, zeroinitializer
157   %o = xor <4 x i1> %c1, <i1 -1, i1 -1, i1 -1, i1 -1>
158   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
159   ret <4 x i32> %s
162 define arm_aapcs_vfpcc <4 x i32> @cmpslt_v4i1(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
163 ; CHECK-LABEL: cmpslt_v4i1:
164 ; CHECK:       @ %bb.0: @ %entry
165 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
166 ; CHECK-NEXT:    vpsel q0, q1, q0
167 ; CHECK-NEXT:    bx lr
168 entry:
169   %c1 = icmp eq <4 x i32> %a, zeroinitializer
170   %o = xor <4 x i1> %c1, <i1 -1, i1 -1, i1 -1, i1 -1>
171   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
172   ret <4 x i32> %s
175 define arm_aapcs_vfpcc <4 x i32> @cmpsgt_v4i1(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
176 ; CHECK-LABEL: cmpsgt_v4i1:
177 ; CHECK:       @ %bb.0: @ %entry
178 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
179 ; CHECK-NEXT:    vpsel q0, q1, q0
180 ; CHECK-NEXT:    bx lr
181 entry:
182   %c1 = icmp eq <4 x i32> %a, zeroinitializer
183   %o = xor <4 x i1> %c1, <i1 -1, i1 -1, i1 -1, i1 -1>
184   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
185   ret <4 x i32> %s
188 define arm_aapcs_vfpcc <4 x i32> @cmpsle_v4i1(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
189 ; CHECK-LABEL: cmpsle_v4i1:
190 ; CHECK:       @ %bb.0: @ %entry
191 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
192 ; CHECK-NEXT:    vpsel q0, q1, q0
193 ; CHECK-NEXT:    bx lr
194 entry:
195   %c1 = icmp eq <4 x i32> %a, zeroinitializer
196   %o = xor <4 x i1> %c1, <i1 -1, i1 -1, i1 -1, i1 -1>
197   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
198   ret <4 x i32> %s
201 define arm_aapcs_vfpcc <4 x i32> @cmpsge_v4i1(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
202 ; CHECK-LABEL: cmpsge_v4i1:
203 ; CHECK:       @ %bb.0: @ %entry
204 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
205 ; CHECK-NEXT:    vpsel q0, q1, q0
206 ; CHECK-NEXT:    bx lr
207 entry:
208   %c1 = icmp eq <4 x i32> %a, zeroinitializer
209   %o = xor <4 x i1> %c1, <i1 -1, i1 -1, i1 -1, i1 -1>
210   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
211   ret <4 x i32> %s
214 define arm_aapcs_vfpcc <4 x i32> @cmpult_v4i1(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
215 ; CHECK-LABEL: cmpult_v4i1:
216 ; CHECK:       @ %bb.0: @ %entry
217 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
218 ; CHECK-NEXT:    vpsel q0, q1, q0
219 ; CHECK-NEXT:    bx lr
220 entry:
221   %c1 = icmp eq <4 x i32> %a, zeroinitializer
222   %o = xor <4 x i1> %c1, <i1 -1, i1 -1, i1 -1, i1 -1>
223   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
224   ret <4 x i32> %s
227 define arm_aapcs_vfpcc <4 x i32> @cmpugt_v4i1(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
228 ; CHECK-LABEL: cmpugt_v4i1:
229 ; CHECK:       @ %bb.0: @ %entry
230 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
231 ; CHECK-NEXT:    vpsel q0, q1, q0
232 ; CHECK-NEXT:    bx lr
233 entry:
234   %c1 = icmp eq <4 x i32> %a, zeroinitializer
235   %o = xor <4 x i1> %c1, <i1 -1, i1 -1, i1 -1, i1 -1>
236   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
237   ret <4 x i32> %s
240 define arm_aapcs_vfpcc <4 x i32> @cmpule_v4i1(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
241 ; CHECK-LABEL: cmpule_v4i1:
242 ; CHECK:       @ %bb.0: @ %entry
243 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
244 ; CHECK-NEXT:    vpsel q0, q1, q0
245 ; CHECK-NEXT:    bx lr
246 entry:
247   %c1 = icmp eq <4 x i32> %a, zeroinitializer
248   %o = xor <4 x i1> %c1, <i1 -1, i1 -1, i1 -1, i1 -1>
249   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
250   ret <4 x i32> %s
253 define arm_aapcs_vfpcc <4 x i32> @cmpuge_v4i1(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
254 ; CHECK-LABEL: cmpuge_v4i1:
255 ; CHECK:       @ %bb.0: @ %entry
256 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
257 ; CHECK-NEXT:    vpsel q0, q1, q0
258 ; CHECK-NEXT:    bx lr
259 entry:
260   %c1 = icmp eq <4 x i32> %a, zeroinitializer
261   %o = xor <4 x i1> %c1, <i1 -1, i1 -1, i1 -1, i1 -1>
262   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
263   ret <4 x i32> %s
269 define arm_aapcs_vfpcc <8 x i16> @cmpeqz_v8i1(<8 x i16> %a, <8 x i16> %b) {
270 ; CHECK-LABEL: cmpeqz_v8i1:
271 ; CHECK:       @ %bb.0: @ %entry
272 ; CHECK-NEXT:    vcmp.i16 eq, q0, zr
273 ; CHECK-NEXT:    vpsel q0, q1, q0
274 ; CHECK-NEXT:    bx lr
275 entry:
276   %c1 = icmp eq <8 x i16> %a, zeroinitializer
277   %o = xor <8 x i1> %c1, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>
278   %s = select <8 x i1> %o, <8 x i16> %a, <8 x i16> %b
279   ret <8 x i16> %s
282 define arm_aapcs_vfpcc <8 x i16> @cmpeq_v8i1(<8 x i16> %a, <8 x i16> %b, <8 x i16> %c) {
283 ; CHECK-LABEL: cmpeq_v8i1:
284 ; CHECK:       @ %bb.0: @ %entry
285 ; CHECK-NEXT:    vcmp.i16 eq, q0, zr
286 ; CHECK-NEXT:    vpsel q0, q1, q0
287 ; CHECK-NEXT:    bx lr
288 entry:
289   %c1 = icmp eq <8 x i16> %a, zeroinitializer
290   %o = xor <8 x i1> %c1, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>
291   %s = select <8 x i1> %o, <8 x i16> %a, <8 x i16> %b
292   ret <8 x i16> %s
296 define arm_aapcs_vfpcc <16 x i8> @cmpeqz_v16i1(<16 x i8> %a, <16 x i8> %b) {
297 ; CHECK-LABEL: cmpeqz_v16i1:
298 ; CHECK:       @ %bb.0: @ %entry
299 ; CHECK-NEXT:    vcmp.i8 eq, q0, zr
300 ; CHECK-NEXT:    vpsel q0, q1, q0
301 ; CHECK-NEXT:    bx lr
302 entry:
303   %c1 = icmp eq <16 x i8> %a, zeroinitializer
304   %o = xor <16 x i1> %c1, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>
305   %s = select <16 x i1> %o, <16 x i8> %a, <16 x i8> %b
306   ret <16 x i8> %s
309 define arm_aapcs_vfpcc <16 x i8> @cmpeq_v16i1(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) {
310 ; CHECK-LABEL: cmpeq_v16i1:
311 ; CHECK:       @ %bb.0: @ %entry
312 ; CHECK-NEXT:    vcmp.i8 eq, q0, zr
313 ; CHECK-NEXT:    vpsel q0, q1, q0
314 ; CHECK-NEXT:    bx lr
315 entry:
316   %c1 = icmp eq <16 x i8> %a, zeroinitializer
317   %o = xor <16 x i1> %c1, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>
318   %s = select <16 x i1> %o, <16 x i8> %a, <16 x i8> %b
319   ret <16 x i8> %s
323 define arm_aapcs_vfpcc <2 x i64> @cmpeqz_v2i1(<2 x i64> %a, <2 x i64> %b) {
324 ; CHECK-LABEL: cmpeqz_v2i1:
325 ; CHECK:       @ %bb.0: @ %entry
326 ; CHECK-NEXT:    vmov r0, s1
327 ; CHECK-NEXT:    vmov r1, s0
328 ; CHECK-NEXT:    orrs r0, r1
329 ; CHECK-NEXT:    vmov r1, s2
330 ; CHECK-NEXT:    csinc r0, zr, zr, ne
331 ; CHECK-NEXT:    tst.w r0, #1
332 ; CHECK-NEXT:    csinv r0, zr, zr, eq
333 ; CHECK-NEXT:    vmov.32 q2[0], r0
334 ; CHECK-NEXT:    vmov.32 q2[1], r0
335 ; CHECK-NEXT:    vmov r0, s3
336 ; CHECK-NEXT:    orrs r0, r1
337 ; CHECK-NEXT:    csinc r0, zr, zr, ne
338 ; CHECK-NEXT:    tst.w r0, #1
339 ; CHECK-NEXT:    csinv r0, zr, zr, eq
340 ; CHECK-NEXT:    vmov.32 q2[2], r0
341 ; CHECK-NEXT:    vmov.32 q2[3], r0
342 ; CHECK-NEXT:    vbic q0, q0, q2
343 ; CHECK-NEXT:    vand q1, q1, q2
344 ; CHECK-NEXT:    vorr q0, q1, q0
345 ; CHECK-NEXT:    bx lr
346 entry:
347   %c1 = icmp eq <2 x i64> %a, zeroinitializer
348   %o = xor <2 x i1> %c1, <i1 -1, i1 -1>
349   %s = select <2 x i1> %o, <2 x i64> %a, <2 x i64> %b
350   ret <2 x i64> %s
353 define arm_aapcs_vfpcc <2 x i64> @cmpeq_v2i1(<2 x i64> %a, <2 x i64> %b, <2 x i64> %c) {
354 ; CHECK-LABEL: cmpeq_v2i1:
355 ; CHECK:       @ %bb.0: @ %entry
356 ; CHECK-NEXT:    vmov r0, s1
357 ; CHECK-NEXT:    vmov r1, s0
358 ; CHECK-NEXT:    orrs r0, r1
359 ; CHECK-NEXT:    vmov r1, s2
360 ; CHECK-NEXT:    csinc r0, zr, zr, ne
361 ; CHECK-NEXT:    tst.w r0, #1
362 ; CHECK-NEXT:    csinv r0, zr, zr, eq
363 ; CHECK-NEXT:    vmov.32 q2[0], r0
364 ; CHECK-NEXT:    vmov.32 q2[1], r0
365 ; CHECK-NEXT:    vmov r0, s3
366 ; CHECK-NEXT:    orrs r0, r1
367 ; CHECK-NEXT:    csinc r0, zr, zr, ne
368 ; CHECK-NEXT:    tst.w r0, #1
369 ; CHECK-NEXT:    csinv r0, zr, zr, eq
370 ; CHECK-NEXT:    vmov.32 q2[2], r0
371 ; CHECK-NEXT:    vmov.32 q2[3], r0
372 ; CHECK-NEXT:    vbic q0, q0, q2
373 ; CHECK-NEXT:    vand q1, q1, q2
374 ; CHECK-NEXT:    vorr q0, q1, q0
375 ; CHECK-NEXT:    bx lr
376 entry:
377   %c1 = icmp eq <2 x i64> %a, zeroinitializer
378   %o = xor <2 x i1> %c1, <i1 -1, i1 -1>
379   %s = select <2 x i1> %o, <2 x i64> %a, <2 x i64> %b
380   ret <2 x i64> %s
383 define arm_aapcs_vfpcc <4 x i32> @vpnot_v4i1(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
384 ; CHECK-LABEL: vpnot_v4i1:
385 ; CHECK:       @ %bb.0: @ %entry
386 ; CHECK-NEXT:    vcmp.s32 lt, q0, zr
387 ; CHECK-NEXT:    vpst
388 ; CHECK-NEXT:    vcmpt.s32 gt, q1, zr
389 ; CHECK-NEXT:    vpnot
390 ; CHECK-NEXT:    vpst
391 ; CHECK-NEXT:    vcmpt.i32 eq, q2, zr
392 ; CHECK-NEXT:    vpsel q0, q0, q1
393 ; CHECK-NEXT:    bx lr
394 entry:
395   %c1 = icmp slt <4 x i32> %a, zeroinitializer
396   %c2 = icmp sgt <4 x i32> %b, zeroinitializer
397   %c3 = icmp eq <4 x i32> %c, zeroinitializer
398   %o1 = and <4 x i1> %c1, %c2
399   %o2 = xor <4 x i1> %o1, <i1 -1, i1 -1, i1 -1, i1 -1>
400   %o = and <4 x i1> %c3, %o2
401   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
402   ret <4 x i32> %s