1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE41
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX1
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX2
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BWVL
14 define i1 @test_v2i64(<2 x i64> %a0) {
15 ; SSE2-LABEL: test_v2i64:
17 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
18 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
19 ; SSE2-NEXT: movmskps %xmm1, %eax
20 ; SSE2-NEXT: xorl $15, %eax
24 ; SSE41-LABEL: test_v2i64:
26 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
27 ; SSE41-NEXT: ptest %xmm1, %xmm0
28 ; SSE41-NEXT: setb %al
31 ; AVX-LABEL: test_v2i64:
33 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
34 ; AVX-NEXT: vptest %xmm1, %xmm0
37 %1 = call i64 @llvm.vector.reduce.and.v2i64(<2 x i64> %a0)
38 %2 = icmp eq i64 %1, -1
42 define i1 @test_v4i64(<4 x i64> %a0) {
43 ; SSE2-LABEL: test_v4i64:
45 ; SSE2-NEXT: pand %xmm1, %xmm0
46 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
47 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
48 ; SSE2-NEXT: movmskps %xmm1, %eax
49 ; SSE2-NEXT: xorl $15, %eax
50 ; SSE2-NEXT: setne %al
53 ; SSE41-LABEL: test_v4i64:
55 ; SSE41-NEXT: pand %xmm1, %xmm0
56 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
57 ; SSE41-NEXT: ptest %xmm1, %xmm0
58 ; SSE41-NEXT: setae %al
61 ; AVX1-LABEL: test_v4i64:
63 ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
64 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
65 ; AVX1-NEXT: vptest %ymm1, %ymm0
66 ; AVX1-NEXT: setae %al
67 ; AVX1-NEXT: vzeroupper
70 ; AVX2-LABEL: test_v4i64:
72 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
73 ; AVX2-NEXT: vptest %ymm1, %ymm0
74 ; AVX2-NEXT: setae %al
75 ; AVX2-NEXT: vzeroupper
78 ; AVX512-LABEL: test_v4i64:
80 ; AVX512-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
81 ; AVX512-NEXT: vptest %ymm1, %ymm0
82 ; AVX512-NEXT: setae %al
83 ; AVX512-NEXT: vzeroupper
85 %1 = call i64 @llvm.vector.reduce.and.v4i64(<4 x i64> %a0)
86 %2 = icmp ne i64 %1, -1
90 define i1 @test_v8i64(<8 x i64> %a0) {
91 ; SSE2-LABEL: test_v8i64:
93 ; SSE2-NEXT: pand %xmm3, %xmm1
94 ; SSE2-NEXT: pand %xmm2, %xmm0
95 ; SSE2-NEXT: pand %xmm1, %xmm0
96 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
97 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
98 ; SSE2-NEXT: movmskps %xmm1, %eax
99 ; SSE2-NEXT: xorl $15, %eax
100 ; SSE2-NEXT: sete %al
103 ; SSE41-LABEL: test_v8i64:
105 ; SSE41-NEXT: pand %xmm3, %xmm1
106 ; SSE41-NEXT: pand %xmm2, %xmm0
107 ; SSE41-NEXT: pand %xmm1, %xmm0
108 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
109 ; SSE41-NEXT: ptest %xmm1, %xmm0
110 ; SSE41-NEXT: setb %al
113 ; AVX1-LABEL: test_v8i64:
115 ; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
116 ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
117 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
118 ; AVX1-NEXT: vptest %ymm1, %ymm0
119 ; AVX1-NEXT: setb %al
120 ; AVX1-NEXT: vzeroupper
123 ; AVX2-LABEL: test_v8i64:
125 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
126 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
127 ; AVX2-NEXT: vptest %ymm1, %ymm0
128 ; AVX2-NEXT: setb %al
129 ; AVX2-NEXT: vzeroupper
132 ; AVX512-LABEL: test_v8i64:
134 ; AVX512-NEXT: vpternlogd $255, %zmm1, %zmm1, %zmm1
135 ; AVX512-NEXT: vpcmpneqd %zmm1, %zmm0, %k0
136 ; AVX512-NEXT: kortestw %k0, %k0
137 ; AVX512-NEXT: sete %al
138 ; AVX512-NEXT: vzeroupper
140 %1 = call i64 @llvm.vector.reduce.and.v8i64(<8 x i64> %a0)
141 %2 = icmp eq i64 %1, -1
145 define i1 @test_v16i64(<16 x i64> %a0) {
146 ; SSE2-LABEL: test_v16i64:
148 ; SSE2-NEXT: pand %xmm7, %xmm3
149 ; SSE2-NEXT: pand %xmm5, %xmm1
150 ; SSE2-NEXT: pand %xmm3, %xmm1
151 ; SSE2-NEXT: pand %xmm6, %xmm2
152 ; SSE2-NEXT: pand %xmm4, %xmm0
153 ; SSE2-NEXT: pand %xmm2, %xmm0
154 ; SSE2-NEXT: pand %xmm1, %xmm0
155 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
156 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
157 ; SSE2-NEXT: movmskps %xmm1, %eax
158 ; SSE2-NEXT: xorl $15, %eax
159 ; SSE2-NEXT: setne %al
162 ; SSE41-LABEL: test_v16i64:
164 ; SSE41-NEXT: pand %xmm7, %xmm3
165 ; SSE41-NEXT: pand %xmm5, %xmm1
166 ; SSE41-NEXT: pand %xmm3, %xmm1
167 ; SSE41-NEXT: pand %xmm6, %xmm2
168 ; SSE41-NEXT: pand %xmm4, %xmm0
169 ; SSE41-NEXT: pand %xmm2, %xmm0
170 ; SSE41-NEXT: pand %xmm1, %xmm0
171 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
172 ; SSE41-NEXT: ptest %xmm1, %xmm0
173 ; SSE41-NEXT: setae %al
176 ; AVX1-LABEL: test_v16i64:
178 ; AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1
179 ; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0
180 ; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
181 ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
182 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
183 ; AVX1-NEXT: vptest %ymm1, %ymm0
184 ; AVX1-NEXT: setae %al
185 ; AVX1-NEXT: vzeroupper
188 ; AVX2-LABEL: test_v16i64:
190 ; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1
191 ; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0
192 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
193 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
194 ; AVX2-NEXT: vptest %ymm1, %ymm0
195 ; AVX2-NEXT: setae %al
196 ; AVX2-NEXT: vzeroupper
199 ; AVX512-LABEL: test_v16i64:
201 ; AVX512-NEXT: vpandq %zmm1, %zmm0, %zmm0
202 ; AVX512-NEXT: vpternlogd $255, %zmm1, %zmm1, %zmm1
203 ; AVX512-NEXT: vpcmpneqd %zmm1, %zmm0, %k0
204 ; AVX512-NEXT: kortestw %k0, %k0
205 ; AVX512-NEXT: setne %al
206 ; AVX512-NEXT: vzeroupper
208 %1 = call i64 @llvm.vector.reduce.and.v16i64(<16 x i64> %a0)
209 %2 = icmp ne i64 %1, -1
217 define i1 @test_v2i32(<2 x i32> %a0) {
218 ; SSE-LABEL: test_v2i32:
220 ; SSE-NEXT: movq %xmm0, %rax
221 ; SSE-NEXT: cmpq $-1, %rax
225 ; AVX-LABEL: test_v2i32:
227 ; AVX-NEXT: vmovq %xmm0, %rax
228 ; AVX-NEXT: cmpq $-1, %rax
231 %1 = call i32 @llvm.vector.reduce.and.v2i32(<2 x i32> %a0)
232 %2 = icmp eq i32 %1, -1
236 define i1 @test_v4i32(<4 x i32> %a0) {
237 ; SSE2-LABEL: test_v4i32:
239 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
240 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
241 ; SSE2-NEXT: movmskps %xmm1, %eax
242 ; SSE2-NEXT: xorl $15, %eax
243 ; SSE2-NEXT: setne %al
246 ; SSE41-LABEL: test_v4i32:
248 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
249 ; SSE41-NEXT: ptest %xmm1, %xmm0
250 ; SSE41-NEXT: setae %al
253 ; AVX-LABEL: test_v4i32:
255 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
256 ; AVX-NEXT: vptest %xmm1, %xmm0
257 ; AVX-NEXT: setae %al
259 %1 = call i32 @llvm.vector.reduce.and.v4i32(<4 x i32> %a0)
260 %2 = icmp ne i32 %1, -1
264 define i1 @test_v8i32(<8 x i32> %a0) {
265 ; SSE2-LABEL: test_v8i32:
267 ; SSE2-NEXT: pand %xmm1, %xmm0
268 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
269 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
270 ; SSE2-NEXT: movmskps %xmm1, %eax
271 ; SSE2-NEXT: xorl $15, %eax
272 ; SSE2-NEXT: sete %al
275 ; SSE41-LABEL: test_v8i32:
277 ; SSE41-NEXT: pand %xmm1, %xmm0
278 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
279 ; SSE41-NEXT: ptest %xmm1, %xmm0
280 ; SSE41-NEXT: setb %al
283 ; AVX1-LABEL: test_v8i32:
285 ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
286 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
287 ; AVX1-NEXT: vptest %ymm1, %ymm0
288 ; AVX1-NEXT: setb %al
289 ; AVX1-NEXT: vzeroupper
292 ; AVX2-LABEL: test_v8i32:
294 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
295 ; AVX2-NEXT: vptest %ymm1, %ymm0
296 ; AVX2-NEXT: setb %al
297 ; AVX2-NEXT: vzeroupper
300 ; AVX512-LABEL: test_v8i32:
302 ; AVX512-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
303 ; AVX512-NEXT: vptest %ymm1, %ymm0
304 ; AVX512-NEXT: setb %al
305 ; AVX512-NEXT: vzeroupper
307 %1 = call i32 @llvm.vector.reduce.and.v8i32(<8 x i32> %a0)
308 %2 = icmp eq i32 %1, -1
312 define i1 @test_v16i32(<16 x i32> %a0) {
313 ; SSE2-LABEL: test_v16i32:
315 ; SSE2-NEXT: pand %xmm3, %xmm1
316 ; SSE2-NEXT: pand %xmm2, %xmm0
317 ; SSE2-NEXT: pand %xmm1, %xmm0
318 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
319 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
320 ; SSE2-NEXT: movmskps %xmm1, %eax
321 ; SSE2-NEXT: xorl $15, %eax
322 ; SSE2-NEXT: setne %al
325 ; SSE41-LABEL: test_v16i32:
327 ; SSE41-NEXT: pand %xmm3, %xmm1
328 ; SSE41-NEXT: pand %xmm2, %xmm0
329 ; SSE41-NEXT: pand %xmm1, %xmm0
330 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
331 ; SSE41-NEXT: ptest %xmm1, %xmm0
332 ; SSE41-NEXT: setae %al
335 ; AVX1-LABEL: test_v16i32:
337 ; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
338 ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
339 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
340 ; AVX1-NEXT: vptest %ymm1, %ymm0
341 ; AVX1-NEXT: setae %al
342 ; AVX1-NEXT: vzeroupper
345 ; AVX2-LABEL: test_v16i32:
347 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
348 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
349 ; AVX2-NEXT: vptest %ymm1, %ymm0
350 ; AVX2-NEXT: setae %al
351 ; AVX2-NEXT: vzeroupper
354 ; AVX512-LABEL: test_v16i32:
356 ; AVX512-NEXT: vpternlogd $255, %zmm1, %zmm1, %zmm1
357 ; AVX512-NEXT: vpcmpneqd %zmm1, %zmm0, %k0
358 ; AVX512-NEXT: kortestw %k0, %k0
359 ; AVX512-NEXT: setne %al
360 ; AVX512-NEXT: vzeroupper
362 %1 = call i32 @llvm.vector.reduce.and.v16i32(<16 x i32> %a0)
363 %2 = icmp ne i32 %1, -1
367 define i1 @test_v32i32(<32 x i32> %a0) {
368 ; SSE2-LABEL: test_v32i32:
370 ; SSE2-NEXT: pand %xmm7, %xmm3
371 ; SSE2-NEXT: pand %xmm5, %xmm1
372 ; SSE2-NEXT: pand %xmm3, %xmm1
373 ; SSE2-NEXT: pand %xmm6, %xmm2
374 ; SSE2-NEXT: pand %xmm4, %xmm0
375 ; SSE2-NEXT: pand %xmm2, %xmm0
376 ; SSE2-NEXT: pand %xmm1, %xmm0
377 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
378 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
379 ; SSE2-NEXT: movmskps %xmm1, %eax
380 ; SSE2-NEXT: xorl $15, %eax
381 ; SSE2-NEXT: sete %al
384 ; SSE41-LABEL: test_v32i32:
386 ; SSE41-NEXT: pand %xmm7, %xmm3
387 ; SSE41-NEXT: pand %xmm5, %xmm1
388 ; SSE41-NEXT: pand %xmm3, %xmm1
389 ; SSE41-NEXT: pand %xmm6, %xmm2
390 ; SSE41-NEXT: pand %xmm4, %xmm0
391 ; SSE41-NEXT: pand %xmm2, %xmm0
392 ; SSE41-NEXT: pand %xmm1, %xmm0
393 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
394 ; SSE41-NEXT: ptest %xmm1, %xmm0
395 ; SSE41-NEXT: setb %al
398 ; AVX1-LABEL: test_v32i32:
400 ; AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1
401 ; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0
402 ; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
403 ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
404 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
405 ; AVX1-NEXT: vptest %ymm1, %ymm0
406 ; AVX1-NEXT: setb %al
407 ; AVX1-NEXT: vzeroupper
410 ; AVX2-LABEL: test_v32i32:
412 ; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1
413 ; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0
414 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
415 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
416 ; AVX2-NEXT: vptest %ymm1, %ymm0
417 ; AVX2-NEXT: setb %al
418 ; AVX2-NEXT: vzeroupper
421 ; AVX512-LABEL: test_v32i32:
423 ; AVX512-NEXT: vpandd %zmm1, %zmm0, %zmm0
424 ; AVX512-NEXT: vpternlogd $255, %zmm1, %zmm1, %zmm1
425 ; AVX512-NEXT: vpcmpneqd %zmm1, %zmm0, %k0
426 ; AVX512-NEXT: kortestw %k0, %k0
427 ; AVX512-NEXT: sete %al
428 ; AVX512-NEXT: vzeroupper
430 %1 = call i32 @llvm.vector.reduce.and.v32i32(<32 x i32> %a0)
431 %2 = icmp eq i32 %1, -1
439 define i1 @test_v2i16(<2 x i16> %a0) {
440 ; SSE-LABEL: test_v2i16:
442 ; SSE-NEXT: movd %xmm0, %eax
443 ; SSE-NEXT: cmpl $-1, %eax
447 ; AVX-LABEL: test_v2i16:
449 ; AVX-NEXT: vmovd %xmm0, %eax
450 ; AVX-NEXT: cmpl $-1, %eax
453 %1 = call i16 @llvm.vector.reduce.and.v2i16(<2 x i16> %a0)
454 %2 = icmp eq i16 %1, -1
458 define i1 @test_v4i16(<4 x i16> %a0) {
459 ; SSE-LABEL: test_v4i16:
461 ; SSE-NEXT: movq %xmm0, %rax
462 ; SSE-NEXT: cmpq $-1, %rax
463 ; SSE-NEXT: setne %al
466 ; AVX-LABEL: test_v4i16:
468 ; AVX-NEXT: vmovq %xmm0, %rax
469 ; AVX-NEXT: cmpq $-1, %rax
470 ; AVX-NEXT: setne %al
472 %1 = call i16 @llvm.vector.reduce.and.v4i16(<4 x i16> %a0)
473 %2 = icmp ne i16 %1, -1
477 define i1 @test_v8i16(<8 x i16> %a0) {
478 ; SSE2-LABEL: test_v8i16:
480 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
481 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
482 ; SSE2-NEXT: pmovmskb %xmm1, %eax
483 ; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
484 ; SSE2-NEXT: sete %al
487 ; SSE41-LABEL: test_v8i16:
489 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
490 ; SSE41-NEXT: ptest %xmm1, %xmm0
491 ; SSE41-NEXT: setb %al
494 ; AVX-LABEL: test_v8i16:
496 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
497 ; AVX-NEXT: vptest %xmm1, %xmm0
500 %1 = call i16 @llvm.vector.reduce.and.v8i16(<8 x i16> %a0)
501 %2 = icmp eq i16 %1, -1
505 define i1 @test_v16i16(<16 x i16> %a0) {
506 ; SSE2-LABEL: test_v16i16:
508 ; SSE2-NEXT: pand %xmm1, %xmm0
509 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
510 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
511 ; SSE2-NEXT: pmovmskb %xmm1, %eax
512 ; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
513 ; SSE2-NEXT: setne %al
516 ; SSE41-LABEL: test_v16i16:
518 ; SSE41-NEXT: pand %xmm1, %xmm0
519 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
520 ; SSE41-NEXT: ptest %xmm1, %xmm0
521 ; SSE41-NEXT: setae %al
524 ; AVX1-LABEL: test_v16i16:
526 ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
527 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
528 ; AVX1-NEXT: vptest %ymm1, %ymm0
529 ; AVX1-NEXT: setae %al
530 ; AVX1-NEXT: vzeroupper
533 ; AVX2-LABEL: test_v16i16:
535 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
536 ; AVX2-NEXT: vptest %ymm1, %ymm0
537 ; AVX2-NEXT: setae %al
538 ; AVX2-NEXT: vzeroupper
541 ; AVX512-LABEL: test_v16i16:
543 ; AVX512-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
544 ; AVX512-NEXT: vptest %ymm1, %ymm0
545 ; AVX512-NEXT: setae %al
546 ; AVX512-NEXT: vzeroupper
548 %1 = call i16 @llvm.vector.reduce.and.v16i16(<16 x i16> %a0)
549 %2 = icmp ne i16 %1, -1
553 define i1 @test_v32i16(<32 x i16> %a0) {
554 ; SSE2-LABEL: test_v32i16:
556 ; SSE2-NEXT: pand %xmm3, %xmm1
557 ; SSE2-NEXT: pand %xmm2, %xmm0
558 ; SSE2-NEXT: pand %xmm1, %xmm0
559 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
560 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
561 ; SSE2-NEXT: pmovmskb %xmm1, %eax
562 ; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
563 ; SSE2-NEXT: sete %al
566 ; SSE41-LABEL: test_v32i16:
568 ; SSE41-NEXT: pand %xmm3, %xmm1
569 ; SSE41-NEXT: pand %xmm2, %xmm0
570 ; SSE41-NEXT: pand %xmm1, %xmm0
571 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
572 ; SSE41-NEXT: ptest %xmm1, %xmm0
573 ; SSE41-NEXT: setb %al
576 ; AVX1-LABEL: test_v32i16:
578 ; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
579 ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
580 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
581 ; AVX1-NEXT: vptest %ymm1, %ymm0
582 ; AVX1-NEXT: setb %al
583 ; AVX1-NEXT: vzeroupper
586 ; AVX2-LABEL: test_v32i16:
588 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
589 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
590 ; AVX2-NEXT: vptest %ymm1, %ymm0
591 ; AVX2-NEXT: setb %al
592 ; AVX2-NEXT: vzeroupper
595 ; AVX512-LABEL: test_v32i16:
597 ; AVX512-NEXT: vpternlogd $255, %zmm1, %zmm1, %zmm1
598 ; AVX512-NEXT: vpcmpneqd %zmm1, %zmm0, %k0
599 ; AVX512-NEXT: kortestw %k0, %k0
600 ; AVX512-NEXT: sete %al
601 ; AVX512-NEXT: vzeroupper
603 %1 = call i16 @llvm.vector.reduce.and.v32i16(<32 x i16> %a0)
604 %2 = icmp eq i16 %1, -1
608 define i1 @test_v64i16(<64 x i16> %a0) {
609 ; SSE2-LABEL: test_v64i16:
611 ; SSE2-NEXT: pand %xmm7, %xmm3
612 ; SSE2-NEXT: pand %xmm5, %xmm1
613 ; SSE2-NEXT: pand %xmm3, %xmm1
614 ; SSE2-NEXT: pand %xmm6, %xmm2
615 ; SSE2-NEXT: pand %xmm4, %xmm0
616 ; SSE2-NEXT: pand %xmm2, %xmm0
617 ; SSE2-NEXT: pand %xmm1, %xmm0
618 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
619 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
620 ; SSE2-NEXT: pmovmskb %xmm1, %eax
621 ; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
622 ; SSE2-NEXT: setne %al
625 ; SSE41-LABEL: test_v64i16:
627 ; SSE41-NEXT: pand %xmm7, %xmm3
628 ; SSE41-NEXT: pand %xmm5, %xmm1
629 ; SSE41-NEXT: pand %xmm3, %xmm1
630 ; SSE41-NEXT: pand %xmm6, %xmm2
631 ; SSE41-NEXT: pand %xmm4, %xmm0
632 ; SSE41-NEXT: pand %xmm2, %xmm0
633 ; SSE41-NEXT: pand %xmm1, %xmm0
634 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
635 ; SSE41-NEXT: ptest %xmm1, %xmm0
636 ; SSE41-NEXT: setae %al
639 ; AVX1-LABEL: test_v64i16:
641 ; AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1
642 ; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0
643 ; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
644 ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
645 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
646 ; AVX1-NEXT: vptest %ymm1, %ymm0
647 ; AVX1-NEXT: setae %al
648 ; AVX1-NEXT: vzeroupper
651 ; AVX2-LABEL: test_v64i16:
653 ; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1
654 ; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0
655 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
656 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
657 ; AVX2-NEXT: vptest %ymm1, %ymm0
658 ; AVX2-NEXT: setae %al
659 ; AVX2-NEXT: vzeroupper
662 ; AVX512-LABEL: test_v64i16:
664 ; AVX512-NEXT: vpandq %zmm1, %zmm0, %zmm0
665 ; AVX512-NEXT: vpternlogd $255, %zmm1, %zmm1, %zmm1
666 ; AVX512-NEXT: vpcmpneqd %zmm1, %zmm0, %k0
667 ; AVX512-NEXT: kortestw %k0, %k0
668 ; AVX512-NEXT: setne %al
669 ; AVX512-NEXT: vzeroupper
671 %1 = call i16 @llvm.vector.reduce.and.v64i16(<64 x i16> %a0)
672 %2 = icmp ne i16 %1, -1
680 define i1 @test_v2i8(<2 x i8> %a0) {
681 ; SSE-LABEL: test_v2i8:
683 ; SSE-NEXT: movd %xmm0, %eax
684 ; SSE-NEXT: cmpw $-1, %ax
688 ; AVX-LABEL: test_v2i8:
690 ; AVX-NEXT: vmovd %xmm0, %eax
691 ; AVX-NEXT: cmpw $-1, %ax
694 %1 = call i8 @llvm.vector.reduce.and.v2i8(<2 x i8> %a0)
695 %2 = icmp eq i8 %1, -1
699 define i1 @test_v4i8(<4 x i8> %a0) {
700 ; SSE-LABEL: test_v4i8:
702 ; SSE-NEXT: movd %xmm0, %eax
703 ; SSE-NEXT: cmpl $-1, %eax
704 ; SSE-NEXT: setne %al
707 ; AVX-LABEL: test_v4i8:
709 ; AVX-NEXT: vmovd %xmm0, %eax
710 ; AVX-NEXT: cmpl $-1, %eax
711 ; AVX-NEXT: setne %al
713 %1 = call i8 @llvm.vector.reduce.and.v4i8(<4 x i8> %a0)
714 %2 = icmp ne i8 %1, -1
718 define i1 @test_v8i8(<8 x i8> %a0) {
719 ; SSE-LABEL: test_v8i8:
721 ; SSE-NEXT: movq %xmm0, %rax
722 ; SSE-NEXT: cmpq $-1, %rax
726 ; AVX-LABEL: test_v8i8:
728 ; AVX-NEXT: vmovq %xmm0, %rax
729 ; AVX-NEXT: cmpq $-1, %rax
732 %1 = call i8 @llvm.vector.reduce.and.v8i8(<8 x i8> %a0)
733 %2 = icmp eq i8 %1, -1
737 define i1 @test_v16i8(<16 x i8> %a0) {
738 ; SSE2-LABEL: test_v16i8:
740 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
741 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
742 ; SSE2-NEXT: pmovmskb %xmm1, %eax
743 ; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
744 ; SSE2-NEXT: setne %al
747 ; SSE41-LABEL: test_v16i8:
749 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
750 ; SSE41-NEXT: ptest %xmm1, %xmm0
751 ; SSE41-NEXT: setae %al
754 ; AVX-LABEL: test_v16i8:
756 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
757 ; AVX-NEXT: vptest %xmm1, %xmm0
758 ; AVX-NEXT: setae %al
760 %1 = call i8 @llvm.vector.reduce.and.v16i8(<16 x i8> %a0)
761 %2 = icmp ne i8 %1, -1
765 define i1 @test_v32i8(<32 x i8> %a0) {
766 ; SSE2-LABEL: test_v32i8:
768 ; SSE2-NEXT: pand %xmm1, %xmm0
769 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
770 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
771 ; SSE2-NEXT: pmovmskb %xmm1, %eax
772 ; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
773 ; SSE2-NEXT: sete %al
776 ; SSE41-LABEL: test_v32i8:
778 ; SSE41-NEXT: pand %xmm1, %xmm0
779 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
780 ; SSE41-NEXT: ptest %xmm1, %xmm0
781 ; SSE41-NEXT: setb %al
784 ; AVX1-LABEL: test_v32i8:
786 ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
787 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
788 ; AVX1-NEXT: vptest %ymm1, %ymm0
789 ; AVX1-NEXT: setb %al
790 ; AVX1-NEXT: vzeroupper
793 ; AVX2-LABEL: test_v32i8:
795 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
796 ; AVX2-NEXT: vptest %ymm1, %ymm0
797 ; AVX2-NEXT: setb %al
798 ; AVX2-NEXT: vzeroupper
801 ; AVX512-LABEL: test_v32i8:
803 ; AVX512-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
804 ; AVX512-NEXT: vptest %ymm1, %ymm0
805 ; AVX512-NEXT: setb %al
806 ; AVX512-NEXT: vzeroupper
808 %1 = call i8 @llvm.vector.reduce.and.v32i8(<32 x i8> %a0)
809 %2 = icmp eq i8 %1, -1
813 define i1 @test_v64i8(<64 x i8> %a0) {
814 ; SSE2-LABEL: test_v64i8:
816 ; SSE2-NEXT: pand %xmm3, %xmm1
817 ; SSE2-NEXT: pand %xmm2, %xmm0
818 ; SSE2-NEXT: pand %xmm1, %xmm0
819 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
820 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
821 ; SSE2-NEXT: pmovmskb %xmm1, %eax
822 ; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
823 ; SSE2-NEXT: setne %al
826 ; SSE41-LABEL: test_v64i8:
828 ; SSE41-NEXT: pand %xmm3, %xmm1
829 ; SSE41-NEXT: pand %xmm2, %xmm0
830 ; SSE41-NEXT: pand %xmm1, %xmm0
831 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
832 ; SSE41-NEXT: ptest %xmm1, %xmm0
833 ; SSE41-NEXT: setae %al
836 ; AVX1-LABEL: test_v64i8:
838 ; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
839 ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
840 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
841 ; AVX1-NEXT: vptest %ymm1, %ymm0
842 ; AVX1-NEXT: setae %al
843 ; AVX1-NEXT: vzeroupper
846 ; AVX2-LABEL: test_v64i8:
848 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
849 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
850 ; AVX2-NEXT: vptest %ymm1, %ymm0
851 ; AVX2-NEXT: setae %al
852 ; AVX2-NEXT: vzeroupper
855 ; AVX512-LABEL: test_v64i8:
857 ; AVX512-NEXT: vpternlogd $255, %zmm1, %zmm1, %zmm1
858 ; AVX512-NEXT: vpcmpneqd %zmm1, %zmm0, %k0
859 ; AVX512-NEXT: kortestw %k0, %k0
860 ; AVX512-NEXT: setne %al
861 ; AVX512-NEXT: vzeroupper
863 %1 = call i8 @llvm.vector.reduce.and.v64i8(<64 x i8> %a0)
864 %2 = icmp ne i8 %1, -1
868 define i1 @test_v128i8(<128 x i8> %a0) {
869 ; SSE2-LABEL: test_v128i8:
871 ; SSE2-NEXT: pand %xmm7, %xmm3
872 ; SSE2-NEXT: pand %xmm5, %xmm1
873 ; SSE2-NEXT: pand %xmm3, %xmm1
874 ; SSE2-NEXT: pand %xmm6, %xmm2
875 ; SSE2-NEXT: pand %xmm4, %xmm0
876 ; SSE2-NEXT: pand %xmm2, %xmm0
877 ; SSE2-NEXT: pand %xmm1, %xmm0
878 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
879 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
880 ; SSE2-NEXT: pmovmskb %xmm1, %eax
881 ; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
882 ; SSE2-NEXT: sete %al
885 ; SSE41-LABEL: test_v128i8:
887 ; SSE41-NEXT: pand %xmm7, %xmm3
888 ; SSE41-NEXT: pand %xmm5, %xmm1
889 ; SSE41-NEXT: pand %xmm3, %xmm1
890 ; SSE41-NEXT: pand %xmm6, %xmm2
891 ; SSE41-NEXT: pand %xmm4, %xmm0
892 ; SSE41-NEXT: pand %xmm2, %xmm0
893 ; SSE41-NEXT: pand %xmm1, %xmm0
894 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
895 ; SSE41-NEXT: ptest %xmm1, %xmm0
896 ; SSE41-NEXT: setb %al
899 ; AVX1-LABEL: test_v128i8:
901 ; AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1
902 ; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0
903 ; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
904 ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
905 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
906 ; AVX1-NEXT: vptest %ymm1, %ymm0
907 ; AVX1-NEXT: setb %al
908 ; AVX1-NEXT: vzeroupper
911 ; AVX2-LABEL: test_v128i8:
913 ; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1
914 ; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0
915 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
916 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
917 ; AVX2-NEXT: vptest %ymm1, %ymm0
918 ; AVX2-NEXT: setb %al
919 ; AVX2-NEXT: vzeroupper
922 ; AVX512-LABEL: test_v128i8:
924 ; AVX512-NEXT: vpandq %zmm1, %zmm0, %zmm0
925 ; AVX512-NEXT: vpternlogd $255, %zmm1, %zmm1, %zmm1
926 ; AVX512-NEXT: vpcmpneqd %zmm1, %zmm0, %k0
927 ; AVX512-NEXT: kortestw %k0, %k0
928 ; AVX512-NEXT: sete %al
929 ; AVX512-NEXT: vzeroupper
931 %1 = call i8 @llvm.vector.reduce.and.v128i8(<128 x i8> %a0)
932 %2 = icmp eq i8 %1, -1
936 declare i64 @llvm.vector.reduce.and.v2i64(<2 x i64>)
937 declare i64 @llvm.vector.reduce.and.v4i64(<4 x i64>)
938 declare i64 @llvm.vector.reduce.and.v8i64(<8 x i64>)
939 declare i64 @llvm.vector.reduce.and.v16i64(<16 x i64>)
941 declare i32 @llvm.vector.reduce.and.v2i32(<2 x i32>)
942 declare i32 @llvm.vector.reduce.and.v4i32(<4 x i32>)
943 declare i32 @llvm.vector.reduce.and.v8i32(<8 x i32>)
944 declare i32 @llvm.vector.reduce.and.v16i32(<16 x i32>)
945 declare i32 @llvm.vector.reduce.and.v32i32(<32 x i32>)
947 declare i16 @llvm.vector.reduce.and.v2i16(<2 x i16>)
948 declare i16 @llvm.vector.reduce.and.v4i16(<4 x i16>)
949 declare i16 @llvm.vector.reduce.and.v8i16(<8 x i16>)
950 declare i16 @llvm.vector.reduce.and.v16i16(<16 x i16>)
951 declare i16 @llvm.vector.reduce.and.v32i16(<32 x i16>)
952 declare i16 @llvm.vector.reduce.and.v64i16(<64 x i16>)
954 declare i8 @llvm.vector.reduce.and.v2i8(<2 x i8>)
955 declare i8 @llvm.vector.reduce.and.v4i8(<4 x i8>)
956 declare i8 @llvm.vector.reduce.and.v8i8(<8 x i8>)
957 declare i8 @llvm.vector.reduce.and.v16i8(<16 x i8>)
958 declare i8 @llvm.vector.reduce.and.v32i8(<32 x i8>)
959 declare i8 @llvm.vector.reduce.and.v64i8(<64 x i8>)
960 declare i8 @llvm.vector.reduce.and.v128i8(<128 x i8>)
961 ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: