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: pxor %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: ptest %xmm0, %xmm0
27 ; SSE41-NEXT: sete %al
30 ; AVX-LABEL: test_v2i64:
32 ; AVX-NEXT: vptest %xmm0, %xmm0
35 %1 = call i64 @llvm.vector.reduce.or.v2i64(<2 x i64> %a0)
36 %2 = icmp eq i64 %1, 0
40 define i1 @test_v4i64(<4 x i64> %a0) {
41 ; SSE2-LABEL: test_v4i64:
43 ; SSE2-NEXT: por %xmm1, %xmm0
44 ; SSE2-NEXT: pxor %xmm1, %xmm1
45 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
46 ; SSE2-NEXT: movmskps %xmm1, %eax
47 ; SSE2-NEXT: xorl $15, %eax
48 ; SSE2-NEXT: setne %al
51 ; SSE41-LABEL: test_v4i64:
53 ; SSE41-NEXT: por %xmm1, %xmm0
54 ; SSE41-NEXT: ptest %xmm0, %xmm0
55 ; SSE41-NEXT: setne %al
58 ; AVX-LABEL: test_v4i64:
60 ; AVX-NEXT: vptest %ymm0, %ymm0
62 ; AVX-NEXT: vzeroupper
64 %1 = call i64 @llvm.vector.reduce.or.v4i64(<4 x i64> %a0)
65 %2 = icmp ne i64 %1, 0
69 define i1 @test_v8i64(<8 x i64> %a0) {
70 ; SSE2-LABEL: test_v8i64:
72 ; SSE2-NEXT: por %xmm3, %xmm1
73 ; SSE2-NEXT: por %xmm2, %xmm0
74 ; SSE2-NEXT: por %xmm1, %xmm0
75 ; SSE2-NEXT: pxor %xmm1, %xmm1
76 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
77 ; SSE2-NEXT: movmskps %xmm1, %eax
78 ; SSE2-NEXT: xorl $15, %eax
82 ; SSE41-LABEL: test_v8i64:
84 ; SSE41-NEXT: por %xmm3, %xmm1
85 ; SSE41-NEXT: por %xmm2, %xmm0
86 ; SSE41-NEXT: por %xmm1, %xmm0
87 ; SSE41-NEXT: ptest %xmm0, %xmm0
88 ; SSE41-NEXT: sete %al
91 ; AVX1-LABEL: test_v8i64:
93 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
94 ; AVX1-NEXT: vptest %ymm0, %ymm0
96 ; AVX1-NEXT: vzeroupper
99 ; AVX2-LABEL: test_v8i64:
101 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
102 ; AVX2-NEXT: vptest %ymm0, %ymm0
103 ; AVX2-NEXT: sete %al
104 ; AVX2-NEXT: vzeroupper
107 ; AVX512-LABEL: test_v8i64:
109 ; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k0
110 ; AVX512-NEXT: kortestw %k0, %k0
111 ; AVX512-NEXT: sete %al
112 ; AVX512-NEXT: vzeroupper
114 %1 = call i64 @llvm.vector.reduce.or.v8i64(<8 x i64> %a0)
115 %2 = icmp eq i64 %1, 0
119 define i1 @test_v16i64(<16 x i64> %a0) {
120 ; SSE2-LABEL: test_v16i64:
122 ; SSE2-NEXT: por %xmm7, %xmm3
123 ; SSE2-NEXT: por %xmm5, %xmm1
124 ; SSE2-NEXT: por %xmm3, %xmm1
125 ; SSE2-NEXT: por %xmm6, %xmm2
126 ; SSE2-NEXT: por %xmm4, %xmm0
127 ; SSE2-NEXT: por %xmm2, %xmm0
128 ; SSE2-NEXT: por %xmm1, %xmm0
129 ; SSE2-NEXT: pxor %xmm1, %xmm1
130 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
131 ; SSE2-NEXT: movmskps %xmm1, %eax
132 ; SSE2-NEXT: xorl $15, %eax
133 ; SSE2-NEXT: setne %al
136 ; SSE41-LABEL: test_v16i64:
138 ; SSE41-NEXT: por %xmm7, %xmm3
139 ; SSE41-NEXT: por %xmm5, %xmm1
140 ; SSE41-NEXT: por %xmm3, %xmm1
141 ; SSE41-NEXT: por %xmm6, %xmm2
142 ; SSE41-NEXT: por %xmm4, %xmm0
143 ; SSE41-NEXT: por %xmm2, %xmm0
144 ; SSE41-NEXT: por %xmm1, %xmm0
145 ; SSE41-NEXT: ptest %xmm0, %xmm0
146 ; SSE41-NEXT: setne %al
149 ; AVX1-LABEL: test_v16i64:
151 ; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1
152 ; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
153 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
154 ; AVX1-NEXT: vptest %ymm0, %ymm0
155 ; AVX1-NEXT: setne %al
156 ; AVX1-NEXT: vzeroupper
159 ; AVX2-LABEL: test_v16i64:
161 ; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1
162 ; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
163 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
164 ; AVX2-NEXT: vptest %ymm0, %ymm0
165 ; AVX2-NEXT: setne %al
166 ; AVX2-NEXT: vzeroupper
169 ; AVX512-LABEL: test_v16i64:
171 ; AVX512-NEXT: vporq %zmm1, %zmm0, %zmm0
172 ; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k0
173 ; AVX512-NEXT: kortestw %k0, %k0
174 ; AVX512-NEXT: setne %al
175 ; AVX512-NEXT: vzeroupper
177 %1 = call i64 @llvm.vector.reduce.or.v16i64(<16 x i64> %a0)
178 %2 = icmp ne i64 %1, 0
186 define i1 @test_v2i32(<2 x i32> %a0) {
187 ; SSE-LABEL: test_v2i32:
189 ; SSE-NEXT: movq %xmm0, %rax
190 ; SSE-NEXT: testq %rax, %rax
194 ; AVX-LABEL: test_v2i32:
196 ; AVX-NEXT: vmovq %xmm0, %rax
197 ; AVX-NEXT: testq %rax, %rax
200 %1 = call i32 @llvm.vector.reduce.or.v2i32(<2 x i32> %a0)
201 %2 = icmp eq i32 %1, 0
205 define i1 @test_v4i32(<4 x i32> %a0) {
206 ; SSE2-LABEL: test_v4i32:
208 ; SSE2-NEXT: pxor %xmm1, %xmm1
209 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
210 ; SSE2-NEXT: movmskps %xmm1, %eax
211 ; SSE2-NEXT: xorl $15, %eax
212 ; SSE2-NEXT: setne %al
215 ; SSE41-LABEL: test_v4i32:
217 ; SSE41-NEXT: ptest %xmm0, %xmm0
218 ; SSE41-NEXT: setne %al
221 ; AVX-LABEL: test_v4i32:
223 ; AVX-NEXT: vptest %xmm0, %xmm0
224 ; AVX-NEXT: setne %al
226 %1 = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> %a0)
227 %2 = icmp ne i32 %1, 0
231 define i1 @test_v8i32(<8 x i32> %a0) {
232 ; SSE2-LABEL: test_v8i32:
234 ; SSE2-NEXT: por %xmm1, %xmm0
235 ; SSE2-NEXT: pxor %xmm1, %xmm1
236 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
237 ; SSE2-NEXT: movmskps %xmm1, %eax
238 ; SSE2-NEXT: xorl $15, %eax
239 ; SSE2-NEXT: sete %al
242 ; SSE41-LABEL: test_v8i32:
244 ; SSE41-NEXT: por %xmm1, %xmm0
245 ; SSE41-NEXT: ptest %xmm0, %xmm0
246 ; SSE41-NEXT: sete %al
249 ; AVX-LABEL: test_v8i32:
251 ; AVX-NEXT: vptest %ymm0, %ymm0
253 ; AVX-NEXT: vzeroupper
255 %1 = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> %a0)
256 %2 = icmp eq i32 %1, 0
260 define i1 @test_v16i32(<16 x i32> %a0) {
261 ; SSE2-LABEL: test_v16i32:
263 ; SSE2-NEXT: por %xmm3, %xmm1
264 ; SSE2-NEXT: por %xmm2, %xmm0
265 ; SSE2-NEXT: por %xmm1, %xmm0
266 ; SSE2-NEXT: pxor %xmm1, %xmm1
267 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
268 ; SSE2-NEXT: movmskps %xmm1, %eax
269 ; SSE2-NEXT: xorl $15, %eax
270 ; SSE2-NEXT: setne %al
273 ; SSE41-LABEL: test_v16i32:
275 ; SSE41-NEXT: por %xmm3, %xmm1
276 ; SSE41-NEXT: por %xmm2, %xmm0
277 ; SSE41-NEXT: por %xmm1, %xmm0
278 ; SSE41-NEXT: ptest %xmm0, %xmm0
279 ; SSE41-NEXT: setne %al
282 ; AVX1-LABEL: test_v16i32:
284 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
285 ; AVX1-NEXT: vptest %ymm0, %ymm0
286 ; AVX1-NEXT: setne %al
287 ; AVX1-NEXT: vzeroupper
290 ; AVX2-LABEL: test_v16i32:
292 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
293 ; AVX2-NEXT: vptest %ymm0, %ymm0
294 ; AVX2-NEXT: setne %al
295 ; AVX2-NEXT: vzeroupper
298 ; AVX512-LABEL: test_v16i32:
300 ; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k0
301 ; AVX512-NEXT: kortestw %k0, %k0
302 ; AVX512-NEXT: setne %al
303 ; AVX512-NEXT: vzeroupper
305 %1 = call i32 @llvm.vector.reduce.or.v16i32(<16 x i32> %a0)
306 %2 = icmp ne i32 %1, 0
310 define i1 @test_v32i32(<32 x i32> %a0) {
311 ; SSE2-LABEL: test_v32i32:
313 ; SSE2-NEXT: por %xmm7, %xmm3
314 ; SSE2-NEXT: por %xmm5, %xmm1
315 ; SSE2-NEXT: por %xmm3, %xmm1
316 ; SSE2-NEXT: por %xmm6, %xmm2
317 ; SSE2-NEXT: por %xmm4, %xmm0
318 ; SSE2-NEXT: por %xmm2, %xmm0
319 ; SSE2-NEXT: por %xmm1, %xmm0
320 ; SSE2-NEXT: pxor %xmm1, %xmm1
321 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
322 ; SSE2-NEXT: movmskps %xmm1, %eax
323 ; SSE2-NEXT: xorl $15, %eax
324 ; SSE2-NEXT: sete %al
327 ; SSE41-LABEL: test_v32i32:
329 ; SSE41-NEXT: por %xmm7, %xmm3
330 ; SSE41-NEXT: por %xmm5, %xmm1
331 ; SSE41-NEXT: por %xmm3, %xmm1
332 ; SSE41-NEXT: por %xmm6, %xmm2
333 ; SSE41-NEXT: por %xmm4, %xmm0
334 ; SSE41-NEXT: por %xmm2, %xmm0
335 ; SSE41-NEXT: por %xmm1, %xmm0
336 ; SSE41-NEXT: ptest %xmm0, %xmm0
337 ; SSE41-NEXT: sete %al
340 ; AVX1-LABEL: test_v32i32:
342 ; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1
343 ; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
344 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
345 ; AVX1-NEXT: vptest %ymm0, %ymm0
346 ; AVX1-NEXT: sete %al
347 ; AVX1-NEXT: vzeroupper
350 ; AVX2-LABEL: test_v32i32:
352 ; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1
353 ; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
354 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
355 ; AVX2-NEXT: vptest %ymm0, %ymm0
356 ; AVX2-NEXT: sete %al
357 ; AVX2-NEXT: vzeroupper
360 ; AVX512-LABEL: test_v32i32:
362 ; AVX512-NEXT: vpord %zmm1, %zmm0, %zmm0
363 ; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k0
364 ; AVX512-NEXT: kortestw %k0, %k0
365 ; AVX512-NEXT: sete %al
366 ; AVX512-NEXT: vzeroupper
368 %1 = call i32 @llvm.vector.reduce.or.v32i32(<32 x i32> %a0)
369 %2 = icmp eq i32 %1, 0
377 define i1 @test_v2i16(<2 x i16> %a0) {
378 ; SSE-LABEL: test_v2i16:
380 ; SSE-NEXT: movd %xmm0, %eax
381 ; SSE-NEXT: testl %eax, %eax
385 ; AVX-LABEL: test_v2i16:
387 ; AVX-NEXT: vmovd %xmm0, %eax
388 ; AVX-NEXT: testl %eax, %eax
391 %1 = call i16 @llvm.vector.reduce.or.v2i16(<2 x i16> %a0)
392 %2 = icmp eq i16 %1, 0
396 define i1 @test_v4i16(<4 x i16> %a0) {
397 ; SSE-LABEL: test_v4i16:
399 ; SSE-NEXT: movq %xmm0, %rax
400 ; SSE-NEXT: testq %rax, %rax
401 ; SSE-NEXT: setne %al
404 ; AVX-LABEL: test_v4i16:
406 ; AVX-NEXT: vmovq %xmm0, %rax
407 ; AVX-NEXT: testq %rax, %rax
408 ; AVX-NEXT: setne %al
410 %1 = call i16 @llvm.vector.reduce.or.v4i16(<4 x i16> %a0)
411 %2 = icmp ne i16 %1, 0
415 define i1 @test_v8i16(<8 x i16> %a0) {
416 ; SSE2-LABEL: test_v8i16:
418 ; SSE2-NEXT: pxor %xmm1, %xmm1
419 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
420 ; SSE2-NEXT: pmovmskb %xmm1, %eax
421 ; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
422 ; SSE2-NEXT: sete %al
425 ; SSE41-LABEL: test_v8i16:
427 ; SSE41-NEXT: ptest %xmm0, %xmm0
428 ; SSE41-NEXT: sete %al
431 ; AVX-LABEL: test_v8i16:
433 ; AVX-NEXT: vptest %xmm0, %xmm0
436 %1 = call i16 @llvm.vector.reduce.or.v8i16(<8 x i16> %a0)
437 %2 = icmp eq i16 %1, 0
441 define i1 @test_v16i16(<16 x i16> %a0) {
442 ; SSE2-LABEL: test_v16i16:
444 ; SSE2-NEXT: por %xmm1, %xmm0
445 ; SSE2-NEXT: pxor %xmm1, %xmm1
446 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
447 ; SSE2-NEXT: pmovmskb %xmm1, %eax
448 ; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
449 ; SSE2-NEXT: setne %al
452 ; SSE41-LABEL: test_v16i16:
454 ; SSE41-NEXT: por %xmm1, %xmm0
455 ; SSE41-NEXT: ptest %xmm0, %xmm0
456 ; SSE41-NEXT: setne %al
459 ; AVX-LABEL: test_v16i16:
461 ; AVX-NEXT: vptest %ymm0, %ymm0
462 ; AVX-NEXT: setne %al
463 ; AVX-NEXT: vzeroupper
465 %1 = call i16 @llvm.vector.reduce.or.v16i16(<16 x i16> %a0)
466 %2 = icmp ne i16 %1, 0
470 define i1 @test_v32i16(<32 x i16> %a0) {
471 ; SSE2-LABEL: test_v32i16:
473 ; SSE2-NEXT: por %xmm3, %xmm1
474 ; SSE2-NEXT: por %xmm2, %xmm0
475 ; SSE2-NEXT: por %xmm1, %xmm0
476 ; SSE2-NEXT: pxor %xmm1, %xmm1
477 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
478 ; SSE2-NEXT: pmovmskb %xmm1, %eax
479 ; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
480 ; SSE2-NEXT: sete %al
483 ; SSE41-LABEL: test_v32i16:
485 ; SSE41-NEXT: por %xmm3, %xmm1
486 ; SSE41-NEXT: por %xmm2, %xmm0
487 ; SSE41-NEXT: por %xmm1, %xmm0
488 ; SSE41-NEXT: ptest %xmm0, %xmm0
489 ; SSE41-NEXT: sete %al
492 ; AVX1-LABEL: test_v32i16:
494 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
495 ; AVX1-NEXT: vptest %ymm0, %ymm0
496 ; AVX1-NEXT: sete %al
497 ; AVX1-NEXT: vzeroupper
500 ; AVX2-LABEL: test_v32i16:
502 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
503 ; AVX2-NEXT: vptest %ymm0, %ymm0
504 ; AVX2-NEXT: sete %al
505 ; AVX2-NEXT: vzeroupper
508 ; AVX512-LABEL: test_v32i16:
510 ; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k0
511 ; AVX512-NEXT: kortestw %k0, %k0
512 ; AVX512-NEXT: sete %al
513 ; AVX512-NEXT: vzeroupper
515 %1 = call i16 @llvm.vector.reduce.or.v32i16(<32 x i16> %a0)
516 %2 = icmp eq i16 %1, 0
520 define i1 @test_v64i16(<64 x i16> %a0) {
521 ; SSE2-LABEL: test_v64i16:
523 ; SSE2-NEXT: por %xmm7, %xmm3
524 ; SSE2-NEXT: por %xmm5, %xmm1
525 ; SSE2-NEXT: por %xmm3, %xmm1
526 ; SSE2-NEXT: por %xmm6, %xmm2
527 ; SSE2-NEXT: por %xmm4, %xmm0
528 ; SSE2-NEXT: por %xmm2, %xmm0
529 ; SSE2-NEXT: por %xmm1, %xmm0
530 ; SSE2-NEXT: pxor %xmm1, %xmm1
531 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
532 ; SSE2-NEXT: pmovmskb %xmm1, %eax
533 ; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
534 ; SSE2-NEXT: setne %al
537 ; SSE41-LABEL: test_v64i16:
539 ; SSE41-NEXT: por %xmm7, %xmm3
540 ; SSE41-NEXT: por %xmm5, %xmm1
541 ; SSE41-NEXT: por %xmm3, %xmm1
542 ; SSE41-NEXT: por %xmm6, %xmm2
543 ; SSE41-NEXT: por %xmm4, %xmm0
544 ; SSE41-NEXT: por %xmm2, %xmm0
545 ; SSE41-NEXT: por %xmm1, %xmm0
546 ; SSE41-NEXT: ptest %xmm0, %xmm0
547 ; SSE41-NEXT: setne %al
550 ; AVX1-LABEL: test_v64i16:
552 ; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1
553 ; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
554 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
555 ; AVX1-NEXT: vptest %ymm0, %ymm0
556 ; AVX1-NEXT: setne %al
557 ; AVX1-NEXT: vzeroupper
560 ; AVX2-LABEL: test_v64i16:
562 ; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1
563 ; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
564 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
565 ; AVX2-NEXT: vptest %ymm0, %ymm0
566 ; AVX2-NEXT: setne %al
567 ; AVX2-NEXT: vzeroupper
570 ; AVX512-LABEL: test_v64i16:
572 ; AVX512-NEXT: vporq %zmm1, %zmm0, %zmm0
573 ; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k0
574 ; AVX512-NEXT: kortestw %k0, %k0
575 ; AVX512-NEXT: setne %al
576 ; AVX512-NEXT: vzeroupper
578 %1 = call i16 @llvm.vector.reduce.or.v64i16(<64 x i16> %a0)
579 %2 = icmp ne i16 %1, 0
587 define i1 @test_v2i8(<2 x i8> %a0) {
588 ; SSE-LABEL: test_v2i8:
590 ; SSE-NEXT: movd %xmm0, %eax
591 ; SSE-NEXT: testw %ax, %ax
595 ; AVX-LABEL: test_v2i8:
597 ; AVX-NEXT: vmovd %xmm0, %eax
598 ; AVX-NEXT: testw %ax, %ax
601 %1 = call i8 @llvm.vector.reduce.or.v2i8(<2 x i8> %a0)
602 %2 = icmp eq i8 %1, 0
606 define i1 @test_v4i8(<4 x i8> %a0) {
607 ; SSE-LABEL: test_v4i8:
609 ; SSE-NEXT: movd %xmm0, %eax
610 ; SSE-NEXT: testl %eax, %eax
611 ; SSE-NEXT: setne %al
614 ; AVX-LABEL: test_v4i8:
616 ; AVX-NEXT: vmovd %xmm0, %eax
617 ; AVX-NEXT: testl %eax, %eax
618 ; AVX-NEXT: setne %al
620 %1 = call i8 @llvm.vector.reduce.or.v4i8(<4 x i8> %a0)
621 %2 = icmp ne i8 %1, 0
625 define i1 @test_v8i8(<8 x i8> %a0) {
626 ; SSE-LABEL: test_v8i8:
628 ; SSE-NEXT: movq %xmm0, %rax
629 ; SSE-NEXT: testq %rax, %rax
633 ; AVX-LABEL: test_v8i8:
635 ; AVX-NEXT: vmovq %xmm0, %rax
636 ; AVX-NEXT: testq %rax, %rax
639 %1 = call i8 @llvm.vector.reduce.or.v8i8(<8 x i8> %a0)
640 %2 = icmp eq i8 %1, 0
644 define i1 @test_v16i8(<16 x i8> %a0) {
645 ; SSE2-LABEL: test_v16i8:
647 ; SSE2-NEXT: pxor %xmm1, %xmm1
648 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
649 ; SSE2-NEXT: pmovmskb %xmm1, %eax
650 ; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
651 ; SSE2-NEXT: setne %al
654 ; SSE41-LABEL: test_v16i8:
656 ; SSE41-NEXT: ptest %xmm0, %xmm0
657 ; SSE41-NEXT: setne %al
660 ; AVX-LABEL: test_v16i8:
662 ; AVX-NEXT: vptest %xmm0, %xmm0
663 ; AVX-NEXT: setne %al
665 %1 = call i8 @llvm.vector.reduce.or.v16i8(<16 x i8> %a0)
666 %2 = icmp ne i8 %1, 0
670 define i1 @test_v32i8(<32 x i8> %a0) {
671 ; SSE2-LABEL: test_v32i8:
673 ; SSE2-NEXT: por %xmm1, %xmm0
674 ; SSE2-NEXT: pxor %xmm1, %xmm1
675 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
676 ; SSE2-NEXT: pmovmskb %xmm1, %eax
677 ; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
678 ; SSE2-NEXT: sete %al
681 ; SSE41-LABEL: test_v32i8:
683 ; SSE41-NEXT: por %xmm1, %xmm0
684 ; SSE41-NEXT: ptest %xmm0, %xmm0
685 ; SSE41-NEXT: sete %al
688 ; AVX-LABEL: test_v32i8:
690 ; AVX-NEXT: vptest %ymm0, %ymm0
692 ; AVX-NEXT: vzeroupper
694 %1 = call i8 @llvm.vector.reduce.or.v32i8(<32 x i8> %a0)
695 %2 = icmp eq i8 %1, 0
699 define i1 @test_v64i8(<64 x i8> %a0) {
700 ; SSE2-LABEL: test_v64i8:
702 ; SSE2-NEXT: por %xmm3, %xmm1
703 ; SSE2-NEXT: por %xmm2, %xmm0
704 ; SSE2-NEXT: por %xmm1, %xmm0
705 ; SSE2-NEXT: pxor %xmm1, %xmm1
706 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
707 ; SSE2-NEXT: pmovmskb %xmm1, %eax
708 ; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
709 ; SSE2-NEXT: setne %al
712 ; SSE41-LABEL: test_v64i8:
714 ; SSE41-NEXT: por %xmm3, %xmm1
715 ; SSE41-NEXT: por %xmm2, %xmm0
716 ; SSE41-NEXT: por %xmm1, %xmm0
717 ; SSE41-NEXT: ptest %xmm0, %xmm0
718 ; SSE41-NEXT: setne %al
721 ; AVX1-LABEL: test_v64i8:
723 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
724 ; AVX1-NEXT: vptest %ymm0, %ymm0
725 ; AVX1-NEXT: setne %al
726 ; AVX1-NEXT: vzeroupper
729 ; AVX2-LABEL: test_v64i8:
731 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
732 ; AVX2-NEXT: vptest %ymm0, %ymm0
733 ; AVX2-NEXT: setne %al
734 ; AVX2-NEXT: vzeroupper
737 ; AVX512-LABEL: test_v64i8:
739 ; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k0
740 ; AVX512-NEXT: kortestw %k0, %k0
741 ; AVX512-NEXT: setne %al
742 ; AVX512-NEXT: vzeroupper
744 %1 = call i8 @llvm.vector.reduce.or.v64i8(<64 x i8> %a0)
745 %2 = icmp ne i8 %1, 0
749 define i1 @test_v128i8(<128 x i8> %a0) {
750 ; SSE2-LABEL: test_v128i8:
752 ; SSE2-NEXT: por %xmm7, %xmm3
753 ; SSE2-NEXT: por %xmm5, %xmm1
754 ; SSE2-NEXT: por %xmm3, %xmm1
755 ; SSE2-NEXT: por %xmm6, %xmm2
756 ; SSE2-NEXT: por %xmm4, %xmm0
757 ; SSE2-NEXT: por %xmm2, %xmm0
758 ; SSE2-NEXT: por %xmm1, %xmm0
759 ; SSE2-NEXT: pxor %xmm1, %xmm1
760 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
761 ; SSE2-NEXT: pmovmskb %xmm1, %eax
762 ; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
763 ; SSE2-NEXT: sete %al
766 ; SSE41-LABEL: test_v128i8:
768 ; SSE41-NEXT: por %xmm7, %xmm3
769 ; SSE41-NEXT: por %xmm5, %xmm1
770 ; SSE41-NEXT: por %xmm3, %xmm1
771 ; SSE41-NEXT: por %xmm6, %xmm2
772 ; SSE41-NEXT: por %xmm4, %xmm0
773 ; SSE41-NEXT: por %xmm2, %xmm0
774 ; SSE41-NEXT: por %xmm1, %xmm0
775 ; SSE41-NEXT: ptest %xmm0, %xmm0
776 ; SSE41-NEXT: sete %al
779 ; AVX1-LABEL: test_v128i8:
781 ; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1
782 ; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
783 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
784 ; AVX1-NEXT: vptest %ymm0, %ymm0
785 ; AVX1-NEXT: sete %al
786 ; AVX1-NEXT: vzeroupper
789 ; AVX2-LABEL: test_v128i8:
791 ; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1
792 ; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
793 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
794 ; AVX2-NEXT: vptest %ymm0, %ymm0
795 ; AVX2-NEXT: sete %al
796 ; AVX2-NEXT: vzeroupper
799 ; AVX512-LABEL: test_v128i8:
801 ; AVX512-NEXT: vporq %zmm1, %zmm0, %zmm0
802 ; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k0
803 ; AVX512-NEXT: kortestw %k0, %k0
804 ; AVX512-NEXT: sete %al
805 ; AVX512-NEXT: vzeroupper
807 %1 = call i8 @llvm.vector.reduce.or.v128i8(<128 x i8> %a0)
808 %2 = icmp eq i8 %1, 0
813 ; Compare Truncated/Masked OR Reductions
816 define i1 @trunc_v2i64(<2 x i64> %a0) {
817 ; SSE2-LABEL: trunc_v2i64:
819 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
820 ; SSE2-NEXT: por %xmm0, %xmm1
821 ; SSE2-NEXT: movd %xmm1, %eax
822 ; SSE2-NEXT: testw %ax, %ax
823 ; SSE2-NEXT: sete %al
826 ; SSE41-LABEL: trunc_v2i64:
828 ; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
829 ; SSE41-NEXT: sete %al
832 ; AVX1OR2-LABEL: trunc_v2i64:
834 ; AVX1OR2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
835 ; AVX1OR2-NEXT: sete %al
838 ; AVX512F-LABEL: trunc_v2i64:
840 ; AVX512F-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
841 ; AVX512F-NEXT: sete %al
844 ; AVX512BW-LABEL: trunc_v2i64:
846 ; AVX512BW-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
847 ; AVX512BW-NEXT: sete %al
848 ; AVX512BW-NEXT: retq
850 ; AVX512BWVL-LABEL: trunc_v2i64:
851 ; AVX512BWVL: # %bb.0:
852 ; AVX512BWVL-NEXT: vpbroadcastq {{.*#+}} xmm1 = [65535,65535]
853 ; AVX512BWVL-NEXT: vptest %xmm1, %xmm0
854 ; AVX512BWVL-NEXT: sete %al
855 ; AVX512BWVL-NEXT: retq
856 %1 = call i64 @llvm.vector.reduce.or.v2i64(<2 x i64> %a0)
857 %2 = trunc i64 %1 to i16
858 %3 = icmp eq i16 %2, 0
862 define i1 @mask_v8i32(<8 x i32> %a0) {
863 ; SSE2-LABEL: mask_v8i32:
865 ; SSE2-NEXT: orps %xmm1, %xmm0
866 ; SSE2-NEXT: movmskps %xmm0, %eax
867 ; SSE2-NEXT: testl %eax, %eax
868 ; SSE2-NEXT: sete %al
871 ; SSE41-LABEL: mask_v8i32:
873 ; SSE41-NEXT: por %xmm1, %xmm0
874 ; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
875 ; SSE41-NEXT: sete %al
878 ; AVX1-LABEL: mask_v8i32:
880 ; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
881 ; AVX1-NEXT: sete %al
882 ; AVX1-NEXT: vzeroupper
885 ; AVX2-LABEL: mask_v8i32:
887 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [9223372039002259456,9223372039002259456,9223372039002259456,9223372039002259456]
888 ; AVX2-NEXT: vptest %ymm1, %ymm0
889 ; AVX2-NEXT: sete %al
890 ; AVX2-NEXT: vzeroupper
893 ; AVX512-LABEL: mask_v8i32:
895 ; AVX512-NEXT: vpbroadcastq {{.*#+}} ymm1 = [9223372039002259456,9223372039002259456,9223372039002259456,9223372039002259456]
896 ; AVX512-NEXT: vptest %ymm1, %ymm0
897 ; AVX512-NEXT: sete %al
898 ; AVX512-NEXT: vzeroupper
900 %1 = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> %a0)
901 %2 = and i32 %1, 2147483648
902 %3 = icmp eq i32 %2, 0
906 define i1 @trunc_v16i16(<16 x i16> %a0) {
907 ; SSE2-LABEL: trunc_v16i16:
909 ; SSE2-NEXT: por %xmm1, %xmm0
910 ; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
911 ; SSE2-NEXT: pxor %xmm1, %xmm1
912 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
913 ; SSE2-NEXT: pmovmskb %xmm1, %eax
914 ; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
915 ; SSE2-NEXT: setne %al
918 ; SSE41-LABEL: trunc_v16i16:
920 ; SSE41-NEXT: por %xmm1, %xmm0
921 ; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
922 ; SSE41-NEXT: setne %al
925 ; AVX-LABEL: trunc_v16i16:
927 ; AVX-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
928 ; AVX-NEXT: setne %al
929 ; AVX-NEXT: vzeroupper
931 %1 = call i16 @llvm.vector.reduce.or.v16i16(<16 x i16> %a0)
932 %2 = trunc i16 %1 to i8
933 %3 = icmp ne i8 %2, 0
937 define i1 @mask_v128i8(<128 x i8> %a0) {
938 ; SSE2-LABEL: mask_v128i8:
940 ; SSE2-NEXT: por %xmm7, %xmm3
941 ; SSE2-NEXT: por %xmm5, %xmm1
942 ; SSE2-NEXT: por %xmm3, %xmm1
943 ; SSE2-NEXT: por %xmm6, %xmm2
944 ; SSE2-NEXT: por %xmm4, %xmm0
945 ; SSE2-NEXT: por %xmm2, %xmm0
946 ; SSE2-NEXT: por %xmm1, %xmm0
947 ; SSE2-NEXT: psllw $7, %xmm0
948 ; SSE2-NEXT: pmovmskb %xmm0, %eax
949 ; SSE2-NEXT: testl %eax, %eax
950 ; SSE2-NEXT: sete %al
953 ; SSE41-LABEL: mask_v128i8:
955 ; SSE41-NEXT: por %xmm7, %xmm3
956 ; SSE41-NEXT: por %xmm5, %xmm1
957 ; SSE41-NEXT: por %xmm3, %xmm1
958 ; SSE41-NEXT: por %xmm6, %xmm2
959 ; SSE41-NEXT: por %xmm4, %xmm0
960 ; SSE41-NEXT: por %xmm2, %xmm0
961 ; SSE41-NEXT: por %xmm1, %xmm0
962 ; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
963 ; SSE41-NEXT: sete %al
966 ; AVX1-LABEL: mask_v128i8:
968 ; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1
969 ; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
970 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
971 ; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
972 ; AVX1-NEXT: sete %al
973 ; AVX1-NEXT: vzeroupper
976 ; AVX2-LABEL: mask_v128i8:
978 ; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1
979 ; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
980 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
981 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [72340172838076673,72340172838076673,72340172838076673,72340172838076673]
982 ; AVX2-NEXT: vptest %ymm1, %ymm0
983 ; AVX2-NEXT: sete %al
984 ; AVX2-NEXT: vzeroupper
987 ; AVX512-LABEL: mask_v128i8:
989 ; AVX512-NEXT: vporq %zmm1, %zmm0, %zmm0
990 ; AVX512-NEXT: vptestmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %k0
991 ; AVX512-NEXT: kortestw %k0, %k0
992 ; AVX512-NEXT: sete %al
993 ; AVX512-NEXT: vzeroupper
995 %1 = call i8 @llvm.vector.reduce.or.v128i8(<128 x i8> %a0)
997 %3 = icmp eq i8 %2, 0
1001 %struct.Box = type { i32, i32, i32, i32 }
1002 define zeroext i1 @PR44781(ptr %0) {
1003 ; SSE2-LABEL: PR44781:
1005 ; SSE2-NEXT: movdqu (%rdi), %xmm0
1006 ; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1007 ; SSE2-NEXT: pxor %xmm1, %xmm1
1008 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
1009 ; SSE2-NEXT: movmskps %xmm1, %eax
1010 ; SSE2-NEXT: xorl $15, %eax
1011 ; SSE2-NEXT: sete %al
1014 ; SSE41-LABEL: PR44781:
1016 ; SSE41-NEXT: movdqu (%rdi), %xmm0
1017 ; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1018 ; SSE41-NEXT: sete %al
1021 ; AVX1OR2-LABEL: PR44781:
1023 ; AVX1OR2-NEXT: vmovdqu (%rdi), %xmm0
1024 ; AVX1OR2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1025 ; AVX1OR2-NEXT: sete %al
1026 ; AVX1OR2-NEXT: retq
1028 ; AVX512F-LABEL: PR44781:
1030 ; AVX512F-NEXT: vmovdqu (%rdi), %xmm0
1031 ; AVX512F-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1032 ; AVX512F-NEXT: sete %al
1033 ; AVX512F-NEXT: retq
1035 ; AVX512BW-LABEL: PR44781:
1036 ; AVX512BW: # %bb.0:
1037 ; AVX512BW-NEXT: vmovdqu (%rdi), %xmm0
1038 ; AVX512BW-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1039 ; AVX512BW-NEXT: sete %al
1040 ; AVX512BW-NEXT: retq
1042 ; AVX512BWVL-LABEL: PR44781:
1043 ; AVX512BWVL: # %bb.0:
1044 ; AVX512BWVL-NEXT: vmovdqu (%rdi), %xmm0
1045 ; AVX512BWVL-NEXT: vpbroadcastq {{.*#+}} xmm1 = [64424509455,64424509455]
1046 ; AVX512BWVL-NEXT: vptest %xmm1, %xmm0
1047 ; AVX512BWVL-NEXT: sete %al
1048 ; AVX512BWVL-NEXT: retq
1049 %2 = load <4 x i32>, ptr %0, align 4
1050 %3 = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> %2)
1052 %5 = icmp eq i32 %4, 0
1056 define i32 @mask_v3i1(<3 x i32> %a, <3 x i32> %b) {
1057 ; SSE2-LABEL: mask_v3i1:
1059 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm0
1060 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
1061 ; SSE2-NEXT: pxor %xmm0, %xmm1
1062 ; SSE2-NEXT: movd %xmm1, %eax
1063 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
1064 ; SSE2-NEXT: movd %xmm0, %ecx
1065 ; SSE2-NEXT: orl %eax, %ecx
1066 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
1067 ; SSE2-NEXT: movd %xmm0, %eax
1068 ; SSE2-NEXT: orl %ecx, %eax
1069 ; SSE2-NEXT: testb $1, %al
1070 ; SSE2-NEXT: je .LBB27_2
1071 ; SSE2-NEXT: # %bb.1:
1072 ; SSE2-NEXT: xorl %eax, %eax
1074 ; SSE2-NEXT: .LBB27_2:
1075 ; SSE2-NEXT: movl $1, %eax
1078 ; SSE41-LABEL: mask_v3i1:
1080 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm0
1081 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
1082 ; SSE41-NEXT: pxor %xmm0, %xmm1
1083 ; SSE41-NEXT: pextrd $1, %xmm1, %eax
1084 ; SSE41-NEXT: movd %xmm1, %ecx
1085 ; SSE41-NEXT: orl %eax, %ecx
1086 ; SSE41-NEXT: pextrd $2, %xmm1, %eax
1087 ; SSE41-NEXT: orl %ecx, %eax
1088 ; SSE41-NEXT: testb $1, %al
1089 ; SSE41-NEXT: je .LBB27_2
1090 ; SSE41-NEXT: # %bb.1:
1091 ; SSE41-NEXT: xorl %eax, %eax
1093 ; SSE41-NEXT: .LBB27_2:
1094 ; SSE41-NEXT: movl $1, %eax
1097 ; AVX1OR2-LABEL: mask_v3i1:
1099 ; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1100 ; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
1101 ; AVX1OR2-NEXT: vpxor %xmm1, %xmm0, %xmm0
1102 ; AVX1OR2-NEXT: vpextrd $1, %xmm0, %eax
1103 ; AVX1OR2-NEXT: vmovd %xmm0, %ecx
1104 ; AVX1OR2-NEXT: orl %eax, %ecx
1105 ; AVX1OR2-NEXT: vpextrd $2, %xmm0, %eax
1106 ; AVX1OR2-NEXT: orl %ecx, %eax
1107 ; AVX1OR2-NEXT: testb $1, %al
1108 ; AVX1OR2-NEXT: je .LBB27_2
1109 ; AVX1OR2-NEXT: # %bb.1:
1110 ; AVX1OR2-NEXT: xorl %eax, %eax
1111 ; AVX1OR2-NEXT: retq
1112 ; AVX1OR2-NEXT: .LBB27_2:
1113 ; AVX1OR2-NEXT: movl $1, %eax
1114 ; AVX1OR2-NEXT: retq
1116 ; AVX512F-LABEL: mask_v3i1:
1118 ; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1
1119 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
1120 ; AVX512F-NEXT: vpcmpneqd %zmm1, %zmm0, %k0
1121 ; AVX512F-NEXT: kshiftrw $2, %k0, %k1
1122 ; AVX512F-NEXT: korw %k1, %k0, %k1
1123 ; AVX512F-NEXT: kshiftrw $1, %k0, %k0
1124 ; AVX512F-NEXT: korw %k0, %k1, %k0
1125 ; AVX512F-NEXT: kmovw %k0, %eax
1126 ; AVX512F-NEXT: testb $1, %al
1127 ; AVX512F-NEXT: je .LBB27_2
1128 ; AVX512F-NEXT: # %bb.1:
1129 ; AVX512F-NEXT: xorl %eax, %eax
1130 ; AVX512F-NEXT: vzeroupper
1131 ; AVX512F-NEXT: retq
1132 ; AVX512F-NEXT: .LBB27_2:
1133 ; AVX512F-NEXT: movl $1, %eax
1134 ; AVX512F-NEXT: vzeroupper
1135 ; AVX512F-NEXT: retq
1137 ; AVX512BW-LABEL: mask_v3i1:
1138 ; AVX512BW: # %bb.0:
1139 ; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1
1140 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
1141 ; AVX512BW-NEXT: vpcmpneqd %zmm1, %zmm0, %k0
1142 ; AVX512BW-NEXT: kshiftrw $2, %k0, %k1
1143 ; AVX512BW-NEXT: korw %k1, %k0, %k1
1144 ; AVX512BW-NEXT: kshiftrw $1, %k0, %k0
1145 ; AVX512BW-NEXT: korw %k0, %k1, %k0
1146 ; AVX512BW-NEXT: kmovd %k0, %eax
1147 ; AVX512BW-NEXT: testb $1, %al
1148 ; AVX512BW-NEXT: je .LBB27_2
1149 ; AVX512BW-NEXT: # %bb.1:
1150 ; AVX512BW-NEXT: xorl %eax, %eax
1151 ; AVX512BW-NEXT: vzeroupper
1152 ; AVX512BW-NEXT: retq
1153 ; AVX512BW-NEXT: .LBB27_2:
1154 ; AVX512BW-NEXT: movl $1, %eax
1155 ; AVX512BW-NEXT: vzeroupper
1156 ; AVX512BW-NEXT: retq
1158 ; AVX512BWVL-LABEL: mask_v3i1:
1159 ; AVX512BWVL: # %bb.0:
1160 ; AVX512BWVL-NEXT: vpcmpneqd %xmm1, %xmm0, %k0
1161 ; AVX512BWVL-NEXT: kshiftrw $2, %k0, %k1
1162 ; AVX512BWVL-NEXT: korw %k1, %k0, %k1
1163 ; AVX512BWVL-NEXT: kshiftrw $1, %k0, %k0
1164 ; AVX512BWVL-NEXT: korw %k0, %k1, %k0
1165 ; AVX512BWVL-NEXT: kmovd %k0, %eax
1166 ; AVX512BWVL-NEXT: testb $1, %al
1167 ; AVX512BWVL-NEXT: je .LBB27_2
1168 ; AVX512BWVL-NEXT: # %bb.1:
1169 ; AVX512BWVL-NEXT: xorl %eax, %eax
1170 ; AVX512BWVL-NEXT: retq
1171 ; AVX512BWVL-NEXT: .LBB27_2:
1172 ; AVX512BWVL-NEXT: movl $1, %eax
1173 ; AVX512BWVL-NEXT: retq
1174 %1 = icmp ne <3 x i32> %a, %b
1175 %2 = call i1 @llvm.vector.reduce.or.v3i1(<3 x i1> %1)
1176 br i1 %2, label %3, label %4
1183 declare i64 @llvm.vector.reduce.or.v2i64(<2 x i64>)
1184 declare i64 @llvm.vector.reduce.or.v4i64(<4 x i64>)
1185 declare i64 @llvm.vector.reduce.or.v8i64(<8 x i64>)
1186 declare i64 @llvm.vector.reduce.or.v16i64(<16 x i64>)
1188 declare i32 @llvm.vector.reduce.or.v2i32(<2 x i32>)
1189 declare i32 @llvm.vector.reduce.or.v4i32(<4 x i32>)
1190 declare i32 @llvm.vector.reduce.or.v8i32(<8 x i32>)
1191 declare i32 @llvm.vector.reduce.or.v16i32(<16 x i32>)
1192 declare i32 @llvm.vector.reduce.or.v32i32(<32 x i32>)
1194 declare i16 @llvm.vector.reduce.or.v2i16(<2 x i16>)
1195 declare i16 @llvm.vector.reduce.or.v4i16(<4 x i16>)
1196 declare i16 @llvm.vector.reduce.or.v8i16(<8 x i16>)
1197 declare i16 @llvm.vector.reduce.or.v16i16(<16 x i16>)
1198 declare i16 @llvm.vector.reduce.or.v32i16(<32 x i16>)
1199 declare i16 @llvm.vector.reduce.or.v64i16(<64 x i16>)
1201 declare i8 @llvm.vector.reduce.or.v2i8(<2 x i8>)
1202 declare i8 @llvm.vector.reduce.or.v4i8(<4 x i8>)
1203 declare i8 @llvm.vector.reduce.or.v8i8(<8 x i8>)
1204 declare i8 @llvm.vector.reduce.or.v16i8(<16 x i8>)
1205 declare i8 @llvm.vector.reduce.or.v32i8(<32 x i8>)
1206 declare i8 @llvm.vector.reduce.or.v64i8(<64 x i8>)
1207 declare i8 @llvm.vector.reduce.or.v128i8(<128 x i8>)
1209 declare i1 @llvm.vector.reduce.or.v3i1(<3 x i1>)