[ARM] Basic And/Or/Xor handling for MVE predicates
[llvm-complete.git] / test / CodeGen / Thumb2 / mve-pred-or.ll
blob9394dae4bab0f305dac3526f6c5d7f0b286fe076
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, q1, zr
8 ; CHECK-NEXT:    vmrs r0, p0
9 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
10 ; CHECK-NEXT:    vmrs r1, p0
11 ; CHECK-NEXT:    orrs r0, r1
12 ; CHECK-NEXT:    vmsr p0, r0
13 ; CHECK-NEXT:    vpsel q0, q0, q1
14 ; CHECK-NEXT:    bx lr
15 entry:
16   %c1 = icmp eq <4 x i32> %a, zeroinitializer
17   %c2 = icmp eq <4 x i32> %b, zeroinitializer
18   %o = or <4 x i1> %c1, %c2
19   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
20   ret <4 x i32> %s
23 define arm_aapcs_vfpcc <4 x i32> @cmpnez_v4i1(<4 x i32> %a, <4 x i32> %b) {
24 ; CHECK-LABEL: cmpnez_v4i1:
25 ; CHECK:       @ %bb.0: @ %entry
26 ; CHECK-NEXT:    vcmp.i32 ne, q1, zr
27 ; CHECK-NEXT:    vmrs r0, p0
28 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
29 ; CHECK-NEXT:    vmrs r1, p0
30 ; CHECK-NEXT:    orrs r0, r1
31 ; CHECK-NEXT:    vmsr p0, r0
32 ; CHECK-NEXT:    vpsel q0, q0, q1
33 ; CHECK-NEXT:    bx lr
34 entry:
35   %c1 = icmp eq <4 x i32> %a, zeroinitializer
36   %c2 = icmp ne <4 x i32> %b, zeroinitializer
37   %o = or <4 x i1> %c1, %c2
38   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
39   ret <4 x i32> %s
42 define arm_aapcs_vfpcc <4 x i32> @cmpsltz_v4i1(<4 x i32> %a, <4 x i32> %b) {
43 ; CHECK-LABEL: cmpsltz_v4i1:
44 ; CHECK:       @ %bb.0: @ %entry
45 ; CHECK-NEXT:    vcmp.s32 lt, q1, zr
46 ; CHECK-NEXT:    vmrs r0, p0
47 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
48 ; CHECK-NEXT:    vmrs r1, p0
49 ; CHECK-NEXT:    orrs r0, r1
50 ; CHECK-NEXT:    vmsr p0, r0
51 ; CHECK-NEXT:    vpsel q0, q0, q1
52 ; CHECK-NEXT:    bx lr
53 entry:
54   %c1 = icmp eq <4 x i32> %a, zeroinitializer
55   %c2 = icmp slt <4 x i32> %b, zeroinitializer
56   %o = or <4 x i1> %c1, %c2
57   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
58   ret <4 x i32> %s
61 define arm_aapcs_vfpcc <4 x i32> @cmpsgtz_v4i1(<4 x i32> %a, <4 x i32> %b) {
62 ; CHECK-LABEL: cmpsgtz_v4i1:
63 ; CHECK:       @ %bb.0: @ %entry
64 ; CHECK-NEXT:    vcmp.s32 gt, q1, zr
65 ; CHECK-NEXT:    vmrs r0, p0
66 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
67 ; CHECK-NEXT:    vmrs r1, p0
68 ; CHECK-NEXT:    orrs r0, r1
69 ; CHECK-NEXT:    vmsr p0, r0
70 ; CHECK-NEXT:    vpsel q0, q0, q1
71 ; CHECK-NEXT:    bx lr
72 entry:
73   %c1 = icmp eq <4 x i32> %a, zeroinitializer
74   %c2 = icmp sgt <4 x i32> %b, zeroinitializer
75   %o = or <4 x i1> %c1, %c2
76   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
77   ret <4 x i32> %s
80 define arm_aapcs_vfpcc <4 x i32> @cmpslez_v4i1(<4 x i32> %a, <4 x i32> %b) {
81 ; CHECK-LABEL: cmpslez_v4i1:
82 ; CHECK:       @ %bb.0: @ %entry
83 ; CHECK-NEXT:    vcmp.s32 le, q1, zr
84 ; CHECK-NEXT:    vmrs r0, p0
85 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
86 ; CHECK-NEXT:    vmrs r1, p0
87 ; CHECK-NEXT:    orrs r0, r1
88 ; CHECK-NEXT:    vmsr p0, r0
89 ; CHECK-NEXT:    vpsel q0, q0, q1
90 ; CHECK-NEXT:    bx lr
91 entry:
92   %c1 = icmp eq <4 x i32> %a, zeroinitializer
93   %c2 = icmp sle <4 x i32> %b, zeroinitializer
94   %o = or <4 x i1> %c1, %c2
95   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
96   ret <4 x i32> %s
99 define arm_aapcs_vfpcc <4 x i32> @cmpsgez_v4i1(<4 x i32> %a, <4 x i32> %b) {
100 ; CHECK-LABEL: cmpsgez_v4i1:
101 ; CHECK:       @ %bb.0: @ %entry
102 ; CHECK-NEXT:    vcmp.s32 ge, q1, zr
103 ; CHECK-NEXT:    vmrs r0, p0
104 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
105 ; CHECK-NEXT:    vmrs r1, p0
106 ; CHECK-NEXT:    orrs r0, r1
107 ; CHECK-NEXT:    vmsr p0, r0
108 ; CHECK-NEXT:    vpsel q0, q0, q1
109 ; CHECK-NEXT:    bx lr
110 entry:
111   %c1 = icmp eq <4 x i32> %a, zeroinitializer
112   %c2 = icmp sge <4 x i32> %b, zeroinitializer
113   %o = or <4 x i1> %c1, %c2
114   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
115   ret <4 x i32> %s
118 define arm_aapcs_vfpcc <4 x i32> @cmpultz_v4i1(<4 x i32> %a, <4 x i32> %b) {
119 ; CHECK-LABEL: cmpultz_v4i1:
120 ; CHECK:       @ %bb.0: @ %entry
121 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
122 ; CHECK-NEXT:    vpsel q0, q0, q1
123 ; CHECK-NEXT:    bx lr
124 entry:
125   %c1 = icmp eq <4 x i32> %a, zeroinitializer
126   %c2 = icmp ult <4 x i32> %b, zeroinitializer
127   %o = or <4 x i1> %c1, %c2
128   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
129   ret <4 x i32> %s
132 define arm_aapcs_vfpcc <4 x i32> @cmpugtz_v4i1(<4 x i32> %a, <4 x i32> %b) {
133 ; CHECK-LABEL: cmpugtz_v4i1:
134 ; CHECK:       @ %bb.0: @ %entry
135 ; CHECK-NEXT:    vcmp.i32 ne, q1, zr
136 ; CHECK-NEXT:    vmrs r0, p0
137 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
138 ; CHECK-NEXT:    vmrs r1, p0
139 ; CHECK-NEXT:    orrs r0, r1
140 ; CHECK-NEXT:    vmsr p0, r0
141 ; CHECK-NEXT:    vpsel q0, q0, q1
142 ; CHECK-NEXT:    bx lr
143 entry:
144   %c1 = icmp eq <4 x i32> %a, zeroinitializer
145   %c2 = icmp ugt <4 x i32> %b, zeroinitializer
146   %o = or <4 x i1> %c1, %c2
147   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
148   ret <4 x i32> %s
151 define arm_aapcs_vfpcc <4 x i32> @cmpulez_v4i1(<4 x i32> %a, <4 x i32> %b) {
152 ; CHECK-LABEL: cmpulez_v4i1:
153 ; CHECK:       @ %bb.0: @ %entry
154 ; CHECK-NEXT:    vmov.i32 q2, #0x0
155 ; CHECK-NEXT:    vcmp.u32 cs, q2, q1
156 ; CHECK-NEXT:    vmrs r0, p0
157 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
158 ; CHECK-NEXT:    vmrs r1, p0
159 ; CHECK-NEXT:    orrs r0, r1
160 ; CHECK-NEXT:    vmsr p0, r0
161 ; CHECK-NEXT:    vpsel q0, q0, q1
162 ; CHECK-NEXT:    bx lr
163 entry:
164   %c1 = icmp eq <4 x i32> %a, zeroinitializer
165   %c2 = icmp ule <4 x i32> %b, zeroinitializer
166   %o = or <4 x i1> %c1, %c2
167   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
168   ret <4 x i32> %s
171 define arm_aapcs_vfpcc <4 x i32> @cmpugez_v4i1(<4 x i32> %a, <4 x i32> %b) {
172 ; CHECK-LABEL: cmpugez_v4i1:
173 ; CHECK:       @ %bb.0: @ %entry
174 ; CHECK-NEXT:    bx lr
175 entry:
176   %c1 = icmp eq <4 x i32> %a, zeroinitializer
177   %c2 = icmp uge <4 x i32> %b, zeroinitializer
178   %o = or <4 x i1> %c1, %c2
179   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
180   ret <4 x i32> %s
185 define arm_aapcs_vfpcc <4 x i32> @cmpeq_v4i1(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
186 ; CHECK-LABEL: cmpeq_v4i1:
187 ; CHECK:       @ %bb.0: @ %entry
188 ; CHECK-NEXT:    vcmp.i32 eq, q1, q2
189 ; CHECK-NEXT:    vmrs r0, p0
190 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
191 ; CHECK-NEXT:    vmrs r1, p0
192 ; CHECK-NEXT:    orrs r0, r1
193 ; CHECK-NEXT:    vmsr p0, r0
194 ; CHECK-NEXT:    vpsel q0, q0, q1
195 ; CHECK-NEXT:    bx lr
196 entry:
197   %c1 = icmp eq <4 x i32> %a, zeroinitializer
198   %c2 = icmp eq <4 x i32> %b, %c
199   %o = or <4 x i1> %c1, %c2
200   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
201   ret <4 x i32> %s
204 define arm_aapcs_vfpcc <4 x i32> @cmpne_v4i1(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
205 ; CHECK-LABEL: cmpne_v4i1:
206 ; CHECK:       @ %bb.0: @ %entry
207 ; CHECK-NEXT:    vcmp.i32 ne, q1, q2
208 ; CHECK-NEXT:    vmrs r0, p0
209 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
210 ; CHECK-NEXT:    vmrs r1, p0
211 ; CHECK-NEXT:    orrs r0, r1
212 ; CHECK-NEXT:    vmsr p0, r0
213 ; CHECK-NEXT:    vpsel q0, q0, q1
214 ; CHECK-NEXT:    bx lr
215 entry:
216   %c1 = icmp eq <4 x i32> %a, zeroinitializer
217   %c2 = icmp ne <4 x i32> %b, %c
218   %o = or <4 x i1> %c1, %c2
219   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
220   ret <4 x i32> %s
223 define arm_aapcs_vfpcc <4 x i32> @cmpslt_v4i1(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
224 ; CHECK-LABEL: cmpslt_v4i1:
225 ; CHECK:       @ %bb.0: @ %entry
226 ; CHECK-NEXT:    vcmp.s32 gt, q2, q1
227 ; CHECK-NEXT:    vmrs r0, p0
228 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
229 ; CHECK-NEXT:    vmrs r1, p0
230 ; CHECK-NEXT:    orrs r0, r1
231 ; CHECK-NEXT:    vmsr p0, r0
232 ; CHECK-NEXT:    vpsel q0, q0, q1
233 ; CHECK-NEXT:    bx lr
234 entry:
235   %c1 = icmp eq <4 x i32> %a, zeroinitializer
236   %c2 = icmp slt <4 x i32> %b, %c
237   %o = or <4 x i1> %c1, %c2
238   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
239   ret <4 x i32> %s
242 define arm_aapcs_vfpcc <4 x i32> @cmpsgt_v4i1(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
243 ; CHECK-LABEL: cmpsgt_v4i1:
244 ; CHECK:       @ %bb.0: @ %entry
245 ; CHECK-NEXT:    vcmp.s32 gt, q1, q2
246 ; CHECK-NEXT:    vmrs r0, p0
247 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
248 ; CHECK-NEXT:    vmrs r1, p0
249 ; CHECK-NEXT:    orrs r0, r1
250 ; CHECK-NEXT:    vmsr p0, r0
251 ; CHECK-NEXT:    vpsel q0, q0, q1
252 ; CHECK-NEXT:    bx lr
253 entry:
254   %c1 = icmp eq <4 x i32> %a, zeroinitializer
255   %c2 = icmp sgt <4 x i32> %b, %c
256   %o = or <4 x i1> %c1, %c2
257   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
258   ret <4 x i32> %s
261 define arm_aapcs_vfpcc <4 x i32> @cmpsle_v4i1(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
262 ; CHECK-LABEL: cmpsle_v4i1:
263 ; CHECK:       @ %bb.0: @ %entry
264 ; CHECK-NEXT:    vcmp.s32 ge, q2, q1
265 ; CHECK-NEXT:    vmrs r0, p0
266 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
267 ; CHECK-NEXT:    vmrs r1, p0
268 ; CHECK-NEXT:    orrs r0, r1
269 ; CHECK-NEXT:    vmsr p0, r0
270 ; CHECK-NEXT:    vpsel q0, q0, q1
271 ; CHECK-NEXT:    bx lr
272 entry:
273   %c1 = icmp eq <4 x i32> %a, zeroinitializer
274   %c2 = icmp sle <4 x i32> %b, %c
275   %o = or <4 x i1> %c1, %c2
276   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
277   ret <4 x i32> %s
280 define arm_aapcs_vfpcc <4 x i32> @cmpsge_v4i1(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
281 ; CHECK-LABEL: cmpsge_v4i1:
282 ; CHECK:       @ %bb.0: @ %entry
283 ; CHECK-NEXT:    vcmp.s32 ge, q1, q2
284 ; CHECK-NEXT:    vmrs r0, p0
285 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
286 ; CHECK-NEXT:    vmrs r1, p0
287 ; CHECK-NEXT:    orrs r0, r1
288 ; CHECK-NEXT:    vmsr p0, r0
289 ; CHECK-NEXT:    vpsel q0, q0, q1
290 ; CHECK-NEXT:    bx lr
291 entry:
292   %c1 = icmp eq <4 x i32> %a, zeroinitializer
293   %c2 = icmp sge <4 x i32> %b, %c
294   %o = or <4 x i1> %c1, %c2
295   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
296   ret <4 x i32> %s
299 define arm_aapcs_vfpcc <4 x i32> @cmpult_v4i1(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
300 ; CHECK-LABEL: cmpult_v4i1:
301 ; CHECK:       @ %bb.0: @ %entry
302 ; CHECK-NEXT:    vcmp.u32 hi, q2, q1
303 ; CHECK-NEXT:    vmrs r0, p0
304 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
305 ; CHECK-NEXT:    vmrs r1, p0
306 ; CHECK-NEXT:    orrs r0, r1
307 ; CHECK-NEXT:    vmsr p0, r0
308 ; CHECK-NEXT:    vpsel q0, q0, q1
309 ; CHECK-NEXT:    bx lr
310 entry:
311   %c1 = icmp eq <4 x i32> %a, zeroinitializer
312   %c2 = icmp ult <4 x i32> %b, %c
313   %o = or <4 x i1> %c1, %c2
314   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
315   ret <4 x i32> %s
318 define arm_aapcs_vfpcc <4 x i32> @cmpugt_v4i1(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
319 ; CHECK-LABEL: cmpugt_v4i1:
320 ; CHECK:       @ %bb.0: @ %entry
321 ; CHECK-NEXT:    vcmp.u32 hi, q1, q2
322 ; CHECK-NEXT:    vmrs r0, p0
323 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
324 ; CHECK-NEXT:    vmrs r1, p0
325 ; CHECK-NEXT:    orrs r0, r1
326 ; CHECK-NEXT:    vmsr p0, r0
327 ; CHECK-NEXT:    vpsel q0, q0, q1
328 ; CHECK-NEXT:    bx lr
329 entry:
330   %c1 = icmp eq <4 x i32> %a, zeroinitializer
331   %c2 = icmp ugt <4 x i32> %b, %c
332   %o = or <4 x i1> %c1, %c2
333   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
334   ret <4 x i32> %s
337 define arm_aapcs_vfpcc <4 x i32> @cmpule_v4i1(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
338 ; CHECK-LABEL: cmpule_v4i1:
339 ; CHECK:       @ %bb.0: @ %entry
340 ; CHECK-NEXT:    vcmp.u32 cs, q2, q1
341 ; CHECK-NEXT:    vmrs r0, p0
342 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
343 ; CHECK-NEXT:    vmrs r1, p0
344 ; CHECK-NEXT:    orrs r0, r1
345 ; CHECK-NEXT:    vmsr p0, r0
346 ; CHECK-NEXT:    vpsel q0, q0, q1
347 ; CHECK-NEXT:    bx lr
348 entry:
349   %c1 = icmp eq <4 x i32> %a, zeroinitializer
350   %c2 = icmp ule <4 x i32> %b, %c
351   %o = or <4 x i1> %c1, %c2
352   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
353   ret <4 x i32> %s
356 define arm_aapcs_vfpcc <4 x i32> @cmpuge_v4i1(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
357 ; CHECK-LABEL: cmpuge_v4i1:
358 ; CHECK:       @ %bb.0: @ %entry
359 ; CHECK-NEXT:    vcmp.u32 cs, q1, q2
360 ; CHECK-NEXT:    vmrs r0, p0
361 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
362 ; CHECK-NEXT:    vmrs r1, p0
363 ; CHECK-NEXT:    orrs r0, r1
364 ; CHECK-NEXT:    vmsr p0, r0
365 ; CHECK-NEXT:    vpsel q0, q0, q1
366 ; CHECK-NEXT:    bx lr
367 entry:
368   %c1 = icmp eq <4 x i32> %a, zeroinitializer
369   %c2 = icmp uge <4 x i32> %b, %c
370   %o = or <4 x i1> %c1, %c2
371   %s = select <4 x i1> %o, <4 x i32> %a, <4 x i32> %b
372   ret <4 x i32> %s
378 define arm_aapcs_vfpcc <8 x i16> @cmpeqz_v8i1(<8 x i16> %a, <8 x i16> %b) {
379 ; CHECK-LABEL: cmpeqz_v8i1:
380 ; CHECK:       @ %bb.0: @ %entry
381 ; CHECK-NEXT:    vcmp.i16 eq, q1, zr
382 ; CHECK-NEXT:    vmrs r0, p0
383 ; CHECK-NEXT:    vcmp.i16 eq, q0, zr
384 ; CHECK-NEXT:    vmrs r1, p0
385 ; CHECK-NEXT:    orrs r0, r1
386 ; CHECK-NEXT:    vmsr p0, r0
387 ; CHECK-NEXT:    vpsel q0, q0, q1
388 ; CHECK-NEXT:    bx lr
389 entry:
390   %c1 = icmp eq <8 x i16> %a, zeroinitializer
391   %c2 = icmp eq <8 x i16> %b, zeroinitializer
392   %o = or <8 x i1> %c1, %c2
393   %s = select <8 x i1> %o, <8 x i16> %a, <8 x i16> %b
394   ret <8 x i16> %s
397 define arm_aapcs_vfpcc <8 x i16> @cmpeq_v8i1(<8 x i16> %a, <8 x i16> %b, <8 x i16> %c) {
398 ; CHECK-LABEL: cmpeq_v8i1:
399 ; CHECK:       @ %bb.0: @ %entry
400 ; CHECK-NEXT:    vcmp.i16 eq, q1, q2
401 ; CHECK-NEXT:    vmrs r0, p0
402 ; CHECK-NEXT:    vcmp.i16 eq, q0, zr
403 ; CHECK-NEXT:    vmrs r1, p0
404 ; CHECK-NEXT:    orrs r0, r1
405 ; CHECK-NEXT:    vmsr p0, r0
406 ; CHECK-NEXT:    vpsel q0, q0, q1
407 ; CHECK-NEXT:    bx lr
408 entry:
409   %c1 = icmp eq <8 x i16> %a, zeroinitializer
410   %c2 = icmp eq <8 x i16> %b, %c
411   %o = or <8 x i1> %c1, %c2
412   %s = select <8 x i1> %o, <8 x i16> %a, <8 x i16> %b
413   ret <8 x i16> %s
417 define arm_aapcs_vfpcc <16 x i8> @cmpeqz_v16i1(<16 x i8> %a, <16 x i8> %b) {
418 ; CHECK-LABEL: cmpeqz_v16i1:
419 ; CHECK:       @ %bb.0: @ %entry
420 ; CHECK-NEXT:    vcmp.i8 eq, q1, zr
421 ; CHECK-NEXT:    vmrs r0, p0
422 ; CHECK-NEXT:    vcmp.i8 eq, q0, zr
423 ; CHECK-NEXT:    vmrs r1, p0
424 ; CHECK-NEXT:    orrs r0, r1
425 ; CHECK-NEXT:    vmsr p0, r0
426 ; CHECK-NEXT:    vpsel q0, q0, q1
427 ; CHECK-NEXT:    bx lr
428 entry:
429   %c1 = icmp eq <16 x i8> %a, zeroinitializer
430   %c2 = icmp eq <16 x i8> %b, zeroinitializer
431   %o = or <16 x i1> %c1, %c2
432   %s = select <16 x i1> %o, <16 x i8> %a, <16 x i8> %b
433   ret <16 x i8> %s
436 define arm_aapcs_vfpcc <16 x i8> @cmpeq_v16i1(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) {
437 ; CHECK-LABEL: cmpeq_v16i1:
438 ; CHECK:       @ %bb.0: @ %entry
439 ; CHECK-NEXT:    vcmp.i8 eq, q1, q2
440 ; CHECK-NEXT:    vmrs r0, p0
441 ; CHECK-NEXT:    vcmp.i8 eq, q0, zr
442 ; CHECK-NEXT:    vmrs r1, p0
443 ; CHECK-NEXT:    orrs r0, r1
444 ; CHECK-NEXT:    vmsr p0, r0
445 ; CHECK-NEXT:    vpsel q0, q0, q1
446 ; CHECK-NEXT:    bx lr
447 entry:
448   %c1 = icmp eq <16 x i8> %a, zeroinitializer
449   %c2 = icmp eq <16 x i8> %b, %c
450   %o = or <16 x i1> %c1, %c2
451   %s = select <16 x i1> %o, <16 x i8> %a, <16 x i8> %b
452   ret <16 x i8> %s
456 define arm_aapcs_vfpcc <2 x i64> @cmpeqz_v2i1(<2 x i64> %a, <2 x i64> %b) {
457 ; CHECK-LABEL: cmpeqz_v2i1:
458 ; CHECK:       @ %bb.0: @ %entry
459 ; CHECK-NEXT:    vmov r0, s5
460 ; CHECK-NEXT:    vmov r1, s4
461 ; CHECK-NEXT:    orrs r0, r1
462 ; CHECK-NEXT:    vmov r1, s6
463 ; CHECK-NEXT:    clz r0, r0
464 ; CHECK-NEXT:    lsrs r0, r0, #5
465 ; CHECK-NEXT:    it ne
466 ; CHECK-NEXT:    movne.w r0, #-1
467 ; CHECK-NEXT:    vmov.32 q2[0], r0
468 ; CHECK-NEXT:    vmov.32 q2[1], r0
469 ; CHECK-NEXT:    vmov r0, s7
470 ; CHECK-NEXT:    orrs r0, r1
471 ; CHECK-NEXT:    vmov r1, s0
472 ; CHECK-NEXT:    clz r0, r0
473 ; CHECK-NEXT:    lsrs r0, r0, #5
474 ; CHECK-NEXT:    it ne
475 ; CHECK-NEXT:    movne.w r0, #-1
476 ; CHECK-NEXT:    vmov.32 q2[2], r0
477 ; CHECK-NEXT:    vmov.32 q2[3], r0
478 ; CHECK-NEXT:    vmov r0, s1
479 ; CHECK-NEXT:    orrs r0, r1
480 ; CHECK-NEXT:    vmov r1, s2
481 ; CHECK-NEXT:    clz r0, r0
482 ; CHECK-NEXT:    lsrs r0, r0, #5
483 ; CHECK-NEXT:    it ne
484 ; CHECK-NEXT:    movne.w r0, #-1
485 ; CHECK-NEXT:    vmov.32 q3[0], r0
486 ; CHECK-NEXT:    vmov.32 q3[1], r0
487 ; CHECK-NEXT:    vmov r0, s3
488 ; CHECK-NEXT:    orrs r0, r1
489 ; CHECK-NEXT:    clz r0, r0
490 ; CHECK-NEXT:    lsrs r0, r0, #5
491 ; CHECK-NEXT:    it ne
492 ; CHECK-NEXT:    movne.w r0, #-1
493 ; CHECK-NEXT:    vmov.32 q3[2], r0
494 ; CHECK-NEXT:    vmov.32 q3[3], r0
495 ; CHECK-NEXT:    vorr q2, q3, q2
496 ; CHECK-NEXT:    vbic q1, q1, q2
497 ; CHECK-NEXT:    vand q0, q0, q2
498 ; CHECK-NEXT:    vorr q0, q0, q1
499 ; CHECK-NEXT:    bx lr
500 entry:
501   %c1 = icmp eq <2 x i64> %a, zeroinitializer
502   %c2 = icmp eq <2 x i64> %b, zeroinitializer
503   %o = or <2 x i1> %c1, %c2
504   %s = select <2 x i1> %o, <2 x i64> %a, <2 x i64> %b
505   ret <2 x i64> %s
508 define arm_aapcs_vfpcc <2 x i64> @cmpeq_v2i1(<2 x i64> %a, <2 x i64> %b, <2 x i64> %c) {
509 ; CHECK-LABEL: cmpeq_v2i1:
510 ; CHECK:       @ %bb.0: @ %entry
511 ; CHECK-NEXT:    vmov r0, s9
512 ; CHECK-NEXT:    vmov r1, s5
513 ; CHECK-NEXT:    vmov r2, s4
514 ; CHECK-NEXT:    eors r0, r1
515 ; CHECK-NEXT:    vmov r1, s8
516 ; CHECK-NEXT:    eors r1, r2
517 ; CHECK-NEXT:    vmov r2, s6
518 ; CHECK-NEXT:    orrs r0, r1
519 ; CHECK-NEXT:    vmov r1, s7
520 ; CHECK-NEXT:    clz r0, r0
521 ; CHECK-NEXT:    lsrs r0, r0, #5
522 ; CHECK-NEXT:    it ne
523 ; CHECK-NEXT:    movne.w r0, #-1
524 ; CHECK-NEXT:    vmov.32 q3[0], r0
525 ; CHECK-NEXT:    vmov.32 q3[1], r0
526 ; CHECK-NEXT:    vmov r0, s11
527 ; CHECK-NEXT:    eors r0, r1
528 ; CHECK-NEXT:    vmov r1, s10
529 ; CHECK-NEXT:    eors r1, r2
530 ; CHECK-NEXT:    orrs r0, r1
531 ; CHECK-NEXT:    vmov r1, s0
532 ; CHECK-NEXT:    clz r0, r0
533 ; CHECK-NEXT:    lsrs r0, r0, #5
534 ; CHECK-NEXT:    it ne
535 ; CHECK-NEXT:    movne.w r0, #-1
536 ; CHECK-NEXT:    vmov.32 q3[2], r0
537 ; CHECK-NEXT:    vmov.32 q3[3], r0
538 ; CHECK-NEXT:    vmov r0, s1
539 ; CHECK-NEXT:    orrs r0, r1
540 ; CHECK-NEXT:    vmov r1, s2
541 ; CHECK-NEXT:    clz r0, r0
542 ; CHECK-NEXT:    lsrs r0, r0, #5
543 ; CHECK-NEXT:    it ne
544 ; CHECK-NEXT:    movne.w r0, #-1
545 ; CHECK-NEXT:    vmov.32 q2[0], r0
546 ; CHECK-NEXT:    vmov.32 q2[1], r0
547 ; CHECK-NEXT:    vmov r0, s3
548 ; CHECK-NEXT:    orrs r0, r1
549 ; CHECK-NEXT:    clz r0, r0
550 ; CHECK-NEXT:    lsrs r0, r0, #5
551 ; CHECK-NEXT:    it ne
552 ; CHECK-NEXT:    movne.w r0, #-1
553 ; CHECK-NEXT:    vmov.32 q2[2], r0
554 ; CHECK-NEXT:    vmov.32 q2[3], r0
555 ; CHECK-NEXT:    vorr q2, q2, q3
556 ; CHECK-NEXT:    vbic q1, q1, q2
557 ; CHECK-NEXT:    vand q0, q0, q2
558 ; CHECK-NEXT:    vorr q0, q0, q1
559 ; CHECK-NEXT:    bx lr
560 entry:
561   %c1 = icmp eq <2 x i64> %a, zeroinitializer
562   %c2 = icmp eq <2 x i64> %b, %c
563   %o = or <2 x i1> %c1, %c2
564   %s = select <2 x i1> %o, <2 x i64> %a, <2 x i64> %b
565   ret <2 x i64> %s