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,AVX1
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BWVL
13 define i1 @test_v2i64(<2 x i64> %a0) {
14 ; SSE2-LABEL: test_v2i64:
16 ; SSE2-NEXT: pxor %xmm1, %xmm1
17 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
18 ; SSE2-NEXT: pmovmskb %xmm1, %eax
19 ; SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
23 ; SSE41-LABEL: test_v2i64:
25 ; SSE41-NEXT: ptest %xmm0, %xmm0
26 ; SSE41-NEXT: sete %al
29 ; AVX-LABEL: test_v2i64:
31 ; AVX-NEXT: vptest %xmm0, %xmm0
34 %1 = call i64 @llvm.vector.reduce.or.v2i64(<2 x i64> %a0)
35 %2 = icmp eq i64 %1, 0
39 define i1 @test_v4i64(<4 x i64> %a0) {
40 ; SSE2-LABEL: test_v4i64:
42 ; SSE2-NEXT: por %xmm1, %xmm0
43 ; SSE2-NEXT: pxor %xmm1, %xmm1
44 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
45 ; SSE2-NEXT: pmovmskb %xmm1, %eax
46 ; SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
47 ; SSE2-NEXT: setne %al
50 ; SSE41-LABEL: test_v4i64:
52 ; SSE41-NEXT: por %xmm1, %xmm0
53 ; SSE41-NEXT: ptest %xmm0, %xmm0
54 ; SSE41-NEXT: setne %al
57 ; AVX-LABEL: test_v4i64:
59 ; AVX-NEXT: vptest %ymm0, %ymm0
61 ; AVX-NEXT: vzeroupper
63 %1 = call i64 @llvm.vector.reduce.or.v4i64(<4 x i64> %a0)
64 %2 = icmp ne i64 %1, 0
68 define i1 @test_v8i64(<8 x i64> %a0) {
69 ; SSE2-LABEL: test_v8i64:
71 ; SSE2-NEXT: por %xmm3, %xmm1
72 ; SSE2-NEXT: por %xmm2, %xmm1
73 ; SSE2-NEXT: por %xmm0, %xmm1
74 ; SSE2-NEXT: pxor %xmm0, %xmm0
75 ; SSE2-NEXT: pcmpeqb %xmm1, %xmm0
76 ; SSE2-NEXT: pmovmskb %xmm0, %eax
77 ; SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
81 ; SSE41-LABEL: test_v8i64:
83 ; SSE41-NEXT: por %xmm3, %xmm1
84 ; SSE41-NEXT: por %xmm2, %xmm1
85 ; SSE41-NEXT: por %xmm0, %xmm1
86 ; SSE41-NEXT: ptest %xmm1, %xmm1
87 ; SSE41-NEXT: sete %al
90 ; AVX1-LABEL: test_v8i64:
92 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
93 ; AVX1-NEXT: vptest %ymm0, %ymm0
95 ; AVX1-NEXT: vzeroupper
98 ; AVX2-LABEL: test_v8i64:
100 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
101 ; AVX2-NEXT: vptest %ymm0, %ymm0
102 ; AVX2-NEXT: sete %al
103 ; AVX2-NEXT: vzeroupper
106 ; AVX512-LABEL: test_v8i64:
108 ; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1
109 ; AVX512-NEXT: vpor %ymm1, %ymm0, %ymm0
110 ; AVX512-NEXT: vptest %ymm0, %ymm0
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, %xmm3
124 ; SSE2-NEXT: por %xmm1, %xmm3
125 ; SSE2-NEXT: por %xmm6, %xmm2
126 ; SSE2-NEXT: por %xmm4, %xmm2
127 ; SSE2-NEXT: por %xmm3, %xmm2
128 ; SSE2-NEXT: por %xmm0, %xmm2
129 ; SSE2-NEXT: pxor %xmm0, %xmm0
130 ; SSE2-NEXT: pcmpeqb %xmm2, %xmm0
131 ; SSE2-NEXT: pmovmskb %xmm0, %eax
132 ; SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
133 ; SSE2-NEXT: setne %al
136 ; SSE41-LABEL: test_v16i64:
138 ; SSE41-NEXT: por %xmm7, %xmm3
139 ; SSE41-NEXT: por %xmm5, %xmm3
140 ; SSE41-NEXT: por %xmm1, %xmm3
141 ; SSE41-NEXT: por %xmm6, %xmm2
142 ; SSE41-NEXT: por %xmm4, %xmm2
143 ; SSE41-NEXT: por %xmm3, %xmm2
144 ; SSE41-NEXT: por %xmm0, %xmm2
145 ; SSE41-NEXT: ptest %xmm2, %xmm2
146 ; SSE41-NEXT: setne %al
149 ; AVX1-LABEL: test_v16i64:
151 ; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1
152 ; AVX1-NEXT: vorps %ymm1, %ymm2, %ymm1
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 %ymm1, %ymm2, %ymm1
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: vextracti64x4 $1, %zmm0, %ymm1
173 ; AVX512-NEXT: vpor %ymm1, %ymm0, %ymm0
174 ; AVX512-NEXT: vptest %ymm0, %ymm0
175 ; AVX512-NEXT: setne %al
176 ; AVX512-NEXT: vzeroupper
178 %1 = call i64 @llvm.vector.reduce.or.v16i64(<16 x i64> %a0)
179 %2 = icmp ne i64 %1, 0
187 define i1 @test_v2i32(<2 x i32> %a0) {
188 ; SSE-LABEL: test_v2i32:
190 ; SSE-NEXT: movq %xmm0, %rax
191 ; SSE-NEXT: testq %rax, %rax
195 ; AVX-LABEL: test_v2i32:
197 ; AVX-NEXT: vmovq %xmm0, %rax
198 ; AVX-NEXT: testq %rax, %rax
201 %1 = call i32 @llvm.vector.reduce.or.v2i32(<2 x i32> %a0)
202 %2 = icmp eq i32 %1, 0
206 define i1 @test_v4i32(<4 x i32> %a0) {
207 ; SSE2-LABEL: test_v4i32:
209 ; SSE2-NEXT: pxor %xmm1, %xmm1
210 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
211 ; SSE2-NEXT: pmovmskb %xmm1, %eax
212 ; SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
213 ; SSE2-NEXT: setne %al
216 ; SSE41-LABEL: test_v4i32:
218 ; SSE41-NEXT: ptest %xmm0, %xmm0
219 ; SSE41-NEXT: setne %al
222 ; AVX-LABEL: test_v4i32:
224 ; AVX-NEXT: vptest %xmm0, %xmm0
225 ; AVX-NEXT: setne %al
227 %1 = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> %a0)
228 %2 = icmp ne i32 %1, 0
232 define i1 @test_v8i32(<8 x i32> %a0) {
233 ; SSE2-LABEL: test_v8i32:
235 ; SSE2-NEXT: por %xmm1, %xmm0
236 ; SSE2-NEXT: pxor %xmm1, %xmm1
237 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
238 ; SSE2-NEXT: pmovmskb %xmm1, %eax
239 ; SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
240 ; SSE2-NEXT: sete %al
243 ; SSE41-LABEL: test_v8i32:
245 ; SSE41-NEXT: por %xmm1, %xmm0
246 ; SSE41-NEXT: ptest %xmm0, %xmm0
247 ; SSE41-NEXT: sete %al
250 ; AVX-LABEL: test_v8i32:
252 ; AVX-NEXT: vptest %ymm0, %ymm0
254 ; AVX-NEXT: vzeroupper
256 %1 = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> %a0)
257 %2 = icmp eq i32 %1, 0
261 define i1 @test_v16i32(<16 x i32> %a0) {
262 ; SSE2-LABEL: test_v16i32:
264 ; SSE2-NEXT: por %xmm3, %xmm1
265 ; SSE2-NEXT: por %xmm2, %xmm1
266 ; SSE2-NEXT: por %xmm0, %xmm1
267 ; SSE2-NEXT: pxor %xmm0, %xmm0
268 ; SSE2-NEXT: pcmpeqb %xmm1, %xmm0
269 ; SSE2-NEXT: pmovmskb %xmm0, %eax
270 ; SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
271 ; SSE2-NEXT: setne %al
274 ; SSE41-LABEL: test_v16i32:
276 ; SSE41-NEXT: por %xmm3, %xmm1
277 ; SSE41-NEXT: por %xmm2, %xmm1
278 ; SSE41-NEXT: por %xmm0, %xmm1
279 ; SSE41-NEXT: ptest %xmm1, %xmm1
280 ; SSE41-NEXT: setne %al
283 ; AVX1-LABEL: test_v16i32:
285 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
286 ; AVX1-NEXT: vptest %ymm0, %ymm0
287 ; AVX1-NEXT: setne %al
288 ; AVX1-NEXT: vzeroupper
291 ; AVX2-LABEL: test_v16i32:
293 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
294 ; AVX2-NEXT: vptest %ymm0, %ymm0
295 ; AVX2-NEXT: setne %al
296 ; AVX2-NEXT: vzeroupper
299 ; AVX512-LABEL: test_v16i32:
301 ; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1
302 ; AVX512-NEXT: vpor %ymm1, %ymm0, %ymm0
303 ; AVX512-NEXT: vptest %ymm0, %ymm0
304 ; AVX512-NEXT: setne %al
305 ; AVX512-NEXT: vzeroupper
307 %1 = call i32 @llvm.vector.reduce.or.v16i32(<16 x i32> %a0)
308 %2 = icmp ne i32 %1, 0
312 define i1 @test_v32i32(<32 x i32> %a0) {
313 ; SSE2-LABEL: test_v32i32:
315 ; SSE2-NEXT: por %xmm7, %xmm3
316 ; SSE2-NEXT: por %xmm5, %xmm3
317 ; SSE2-NEXT: por %xmm1, %xmm3
318 ; SSE2-NEXT: por %xmm6, %xmm2
319 ; SSE2-NEXT: por %xmm4, %xmm2
320 ; SSE2-NEXT: por %xmm3, %xmm2
321 ; SSE2-NEXT: por %xmm0, %xmm2
322 ; SSE2-NEXT: pxor %xmm0, %xmm0
323 ; SSE2-NEXT: pcmpeqb %xmm2, %xmm0
324 ; SSE2-NEXT: pmovmskb %xmm0, %eax
325 ; SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
326 ; SSE2-NEXT: sete %al
329 ; SSE41-LABEL: test_v32i32:
331 ; SSE41-NEXT: por %xmm7, %xmm3
332 ; SSE41-NEXT: por %xmm5, %xmm3
333 ; SSE41-NEXT: por %xmm1, %xmm3
334 ; SSE41-NEXT: por %xmm6, %xmm2
335 ; SSE41-NEXT: por %xmm4, %xmm2
336 ; SSE41-NEXT: por %xmm3, %xmm2
337 ; SSE41-NEXT: por %xmm0, %xmm2
338 ; SSE41-NEXT: ptest %xmm2, %xmm2
339 ; SSE41-NEXT: sete %al
342 ; AVX1-LABEL: test_v32i32:
344 ; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1
345 ; AVX1-NEXT: vorps %ymm1, %ymm2, %ymm1
346 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
347 ; AVX1-NEXT: vptest %ymm0, %ymm0
348 ; AVX1-NEXT: sete %al
349 ; AVX1-NEXT: vzeroupper
352 ; AVX2-LABEL: test_v32i32:
354 ; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1
355 ; AVX2-NEXT: vpor %ymm1, %ymm2, %ymm1
356 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
357 ; AVX2-NEXT: vptest %ymm0, %ymm0
358 ; AVX2-NEXT: sete %al
359 ; AVX2-NEXT: vzeroupper
362 ; AVX512-LABEL: test_v32i32:
364 ; AVX512-NEXT: vpord %zmm1, %zmm0, %zmm0
365 ; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1
366 ; AVX512-NEXT: vpor %ymm1, %ymm0, %ymm0
367 ; AVX512-NEXT: vptest %ymm0, %ymm0
368 ; AVX512-NEXT: sete %al
369 ; AVX512-NEXT: vzeroupper
371 %1 = call i32 @llvm.vector.reduce.or.v32i32(<32 x i32> %a0)
372 %2 = icmp eq i32 %1, 0
380 define i1 @test_v2i16(<2 x i16> %a0) {
381 ; SSE-LABEL: test_v2i16:
383 ; SSE-NEXT: movd %xmm0, %eax
384 ; SSE-NEXT: testl %eax, %eax
388 ; AVX-LABEL: test_v2i16:
390 ; AVX-NEXT: vmovd %xmm0, %eax
391 ; AVX-NEXT: testl %eax, %eax
394 %1 = call i16 @llvm.vector.reduce.or.v2i16(<2 x i16> %a0)
395 %2 = icmp eq i16 %1, 0
399 define i1 @test_v4i16(<4 x i16> %a0) {
400 ; SSE-LABEL: test_v4i16:
402 ; SSE-NEXT: movq %xmm0, %rax
403 ; SSE-NEXT: testq %rax, %rax
404 ; SSE-NEXT: setne %al
407 ; AVX-LABEL: test_v4i16:
409 ; AVX-NEXT: vmovq %xmm0, %rax
410 ; AVX-NEXT: testq %rax, %rax
411 ; AVX-NEXT: setne %al
413 %1 = call i16 @llvm.vector.reduce.or.v4i16(<4 x i16> %a0)
414 %2 = icmp ne i16 %1, 0
418 define i1 @test_v8i16(<8 x i16> %a0) {
419 ; SSE2-LABEL: test_v8i16:
421 ; SSE2-NEXT: pxor %xmm1, %xmm1
422 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
423 ; SSE2-NEXT: pmovmskb %xmm1, %eax
424 ; SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
425 ; SSE2-NEXT: sete %al
428 ; SSE41-LABEL: test_v8i16:
430 ; SSE41-NEXT: ptest %xmm0, %xmm0
431 ; SSE41-NEXT: sete %al
434 ; AVX-LABEL: test_v8i16:
436 ; AVX-NEXT: vptest %xmm0, %xmm0
439 %1 = call i16 @llvm.vector.reduce.or.v8i16(<8 x i16> %a0)
440 %2 = icmp eq i16 %1, 0
444 define i1 @test_v16i16(<16 x i16> %a0) {
445 ; SSE2-LABEL: test_v16i16:
447 ; SSE2-NEXT: por %xmm1, %xmm0
448 ; SSE2-NEXT: pxor %xmm1, %xmm1
449 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
450 ; SSE2-NEXT: pmovmskb %xmm1, %eax
451 ; SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
452 ; SSE2-NEXT: setne %al
455 ; SSE41-LABEL: test_v16i16:
457 ; SSE41-NEXT: por %xmm1, %xmm0
458 ; SSE41-NEXT: ptest %xmm0, %xmm0
459 ; SSE41-NEXT: setne %al
462 ; AVX-LABEL: test_v16i16:
464 ; AVX-NEXT: vptest %ymm0, %ymm0
465 ; AVX-NEXT: setne %al
466 ; AVX-NEXT: vzeroupper
468 %1 = call i16 @llvm.vector.reduce.or.v16i16(<16 x i16> %a0)
469 %2 = icmp ne i16 %1, 0
473 define i1 @test_v32i16(<32 x i16> %a0) {
474 ; SSE2-LABEL: test_v32i16:
476 ; SSE2-NEXT: por %xmm3, %xmm1
477 ; SSE2-NEXT: por %xmm2, %xmm1
478 ; SSE2-NEXT: por %xmm0, %xmm1
479 ; SSE2-NEXT: pxor %xmm0, %xmm0
480 ; SSE2-NEXT: pcmpeqb %xmm1, %xmm0
481 ; SSE2-NEXT: pmovmskb %xmm0, %eax
482 ; SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
483 ; SSE2-NEXT: sete %al
486 ; SSE41-LABEL: test_v32i16:
488 ; SSE41-NEXT: por %xmm3, %xmm1
489 ; SSE41-NEXT: por %xmm2, %xmm1
490 ; SSE41-NEXT: por %xmm0, %xmm1
491 ; SSE41-NEXT: ptest %xmm1, %xmm1
492 ; SSE41-NEXT: sete %al
495 ; AVX1-LABEL: test_v32i16:
497 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
498 ; AVX1-NEXT: vptest %ymm0, %ymm0
499 ; AVX1-NEXT: sete %al
500 ; AVX1-NEXT: vzeroupper
503 ; AVX2-LABEL: test_v32i16:
505 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
506 ; AVX2-NEXT: vptest %ymm0, %ymm0
507 ; AVX2-NEXT: sete %al
508 ; AVX2-NEXT: vzeroupper
511 ; AVX512-LABEL: test_v32i16:
513 ; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1
514 ; AVX512-NEXT: vpor %ymm1, %ymm0, %ymm0
515 ; AVX512-NEXT: vptest %ymm0, %ymm0
516 ; AVX512-NEXT: sete %al
517 ; AVX512-NEXT: vzeroupper
519 %1 = call i16 @llvm.vector.reduce.or.v32i16(<32 x i16> %a0)
520 %2 = icmp eq i16 %1, 0
524 define i1 @test_v64i16(<64 x i16> %a0) {
525 ; SSE2-LABEL: test_v64i16:
527 ; SSE2-NEXT: por %xmm7, %xmm3
528 ; SSE2-NEXT: por %xmm5, %xmm3
529 ; SSE2-NEXT: por %xmm1, %xmm3
530 ; SSE2-NEXT: por %xmm6, %xmm2
531 ; SSE2-NEXT: por %xmm4, %xmm2
532 ; SSE2-NEXT: por %xmm3, %xmm2
533 ; SSE2-NEXT: por %xmm0, %xmm2
534 ; SSE2-NEXT: pxor %xmm0, %xmm0
535 ; SSE2-NEXT: pcmpeqb %xmm2, %xmm0
536 ; SSE2-NEXT: pmovmskb %xmm0, %eax
537 ; SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
538 ; SSE2-NEXT: setne %al
541 ; SSE41-LABEL: test_v64i16:
543 ; SSE41-NEXT: por %xmm7, %xmm3
544 ; SSE41-NEXT: por %xmm5, %xmm3
545 ; SSE41-NEXT: por %xmm1, %xmm3
546 ; SSE41-NEXT: por %xmm6, %xmm2
547 ; SSE41-NEXT: por %xmm4, %xmm2
548 ; SSE41-NEXT: por %xmm3, %xmm2
549 ; SSE41-NEXT: por %xmm0, %xmm2
550 ; SSE41-NEXT: ptest %xmm2, %xmm2
551 ; SSE41-NEXT: setne %al
554 ; AVX1-LABEL: test_v64i16:
556 ; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1
557 ; AVX1-NEXT: vorps %ymm1, %ymm2, %ymm1
558 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
559 ; AVX1-NEXT: vptest %ymm0, %ymm0
560 ; AVX1-NEXT: setne %al
561 ; AVX1-NEXT: vzeroupper
564 ; AVX2-LABEL: test_v64i16:
566 ; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1
567 ; AVX2-NEXT: vpor %ymm1, %ymm2, %ymm1
568 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
569 ; AVX2-NEXT: vptest %ymm0, %ymm0
570 ; AVX2-NEXT: setne %al
571 ; AVX2-NEXT: vzeroupper
574 ; AVX512-LABEL: test_v64i16:
576 ; AVX512-NEXT: vporq %zmm1, %zmm0, %zmm0
577 ; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1
578 ; AVX512-NEXT: vpor %ymm1, %ymm0, %ymm0
579 ; AVX512-NEXT: vptest %ymm0, %ymm0
580 ; AVX512-NEXT: setne %al
581 ; AVX512-NEXT: vzeroupper
583 %1 = call i16 @llvm.vector.reduce.or.v64i16(<64 x i16> %a0)
584 %2 = icmp ne i16 %1, 0
592 define i1 @test_v2i8(<2 x i8> %a0) {
593 ; SSE-LABEL: test_v2i8:
595 ; SSE-NEXT: movd %xmm0, %eax
596 ; SSE-NEXT: testw %ax, %ax
600 ; AVX-LABEL: test_v2i8:
602 ; AVX-NEXT: vmovd %xmm0, %eax
603 ; AVX-NEXT: testw %ax, %ax
606 %1 = call i8 @llvm.vector.reduce.or.v2i8(<2 x i8> %a0)
607 %2 = icmp eq i8 %1, 0
611 define i1 @test_v4i8(<4 x i8> %a0) {
612 ; SSE-LABEL: test_v4i8:
614 ; SSE-NEXT: movd %xmm0, %eax
615 ; SSE-NEXT: testl %eax, %eax
616 ; SSE-NEXT: setne %al
619 ; AVX-LABEL: test_v4i8:
621 ; AVX-NEXT: vmovd %xmm0, %eax
622 ; AVX-NEXT: testl %eax, %eax
623 ; AVX-NEXT: setne %al
625 %1 = call i8 @llvm.vector.reduce.or.v4i8(<4 x i8> %a0)
626 %2 = icmp ne i8 %1, 0
630 define i1 @test_v8i8(<8 x i8> %a0) {
631 ; SSE-LABEL: test_v8i8:
633 ; SSE-NEXT: movq %xmm0, %rax
634 ; SSE-NEXT: testq %rax, %rax
638 ; AVX-LABEL: test_v8i8:
640 ; AVX-NEXT: vmovq %xmm0, %rax
641 ; AVX-NEXT: testq %rax, %rax
644 %1 = call i8 @llvm.vector.reduce.or.v8i8(<8 x i8> %a0)
645 %2 = icmp eq i8 %1, 0
649 define i1 @test_v16i8(<16 x i8> %a0) {
650 ; SSE2-LABEL: test_v16i8:
652 ; SSE2-NEXT: pxor %xmm1, %xmm1
653 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
654 ; SSE2-NEXT: pmovmskb %xmm1, %eax
655 ; SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
656 ; SSE2-NEXT: setne %al
659 ; SSE41-LABEL: test_v16i8:
661 ; SSE41-NEXT: ptest %xmm0, %xmm0
662 ; SSE41-NEXT: setne %al
665 ; AVX-LABEL: test_v16i8:
667 ; AVX-NEXT: vptest %xmm0, %xmm0
668 ; AVX-NEXT: setne %al
670 %1 = call i8 @llvm.vector.reduce.or.v16i8(<16 x i8> %a0)
671 %2 = icmp ne i8 %1, 0
675 define i1 @test_v32i8(<32 x i8> %a0) {
676 ; SSE2-LABEL: test_v32i8:
678 ; SSE2-NEXT: por %xmm1, %xmm0
679 ; SSE2-NEXT: pxor %xmm1, %xmm1
680 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
681 ; SSE2-NEXT: pmovmskb %xmm1, %eax
682 ; SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
683 ; SSE2-NEXT: sete %al
686 ; SSE41-LABEL: test_v32i8:
688 ; SSE41-NEXT: por %xmm1, %xmm0
689 ; SSE41-NEXT: ptest %xmm0, %xmm0
690 ; SSE41-NEXT: sete %al
693 ; AVX-LABEL: test_v32i8:
695 ; AVX-NEXT: vptest %ymm0, %ymm0
697 ; AVX-NEXT: vzeroupper
699 %1 = call i8 @llvm.vector.reduce.or.v32i8(<32 x i8> %a0)
700 %2 = icmp eq i8 %1, 0
704 define i1 @test_v64i8(<64 x i8> %a0) {
705 ; SSE2-LABEL: test_v64i8:
707 ; SSE2-NEXT: por %xmm3, %xmm1
708 ; SSE2-NEXT: por %xmm2, %xmm1
709 ; SSE2-NEXT: por %xmm0, %xmm1
710 ; SSE2-NEXT: pxor %xmm0, %xmm0
711 ; SSE2-NEXT: pcmpeqb %xmm1, %xmm0
712 ; SSE2-NEXT: pmovmskb %xmm0, %eax
713 ; SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
714 ; SSE2-NEXT: setne %al
717 ; SSE41-LABEL: test_v64i8:
719 ; SSE41-NEXT: por %xmm3, %xmm1
720 ; SSE41-NEXT: por %xmm2, %xmm1
721 ; SSE41-NEXT: por %xmm0, %xmm1
722 ; SSE41-NEXT: ptest %xmm1, %xmm1
723 ; SSE41-NEXT: setne %al
726 ; AVX1-LABEL: test_v64i8:
728 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
729 ; AVX1-NEXT: vptest %ymm0, %ymm0
730 ; AVX1-NEXT: setne %al
731 ; AVX1-NEXT: vzeroupper
734 ; AVX2-LABEL: test_v64i8:
736 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
737 ; AVX2-NEXT: vptest %ymm0, %ymm0
738 ; AVX2-NEXT: setne %al
739 ; AVX2-NEXT: vzeroupper
742 ; AVX512-LABEL: test_v64i8:
744 ; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1
745 ; AVX512-NEXT: vpor %ymm1, %ymm0, %ymm0
746 ; AVX512-NEXT: vptest %ymm0, %ymm0
747 ; AVX512-NEXT: setne %al
748 ; AVX512-NEXT: vzeroupper
750 %1 = call i8 @llvm.vector.reduce.or.v64i8(<64 x i8> %a0)
751 %2 = icmp ne i8 %1, 0
755 define i1 @test_v128i8(<128 x i8> %a0) {
756 ; SSE2-LABEL: test_v128i8:
758 ; SSE2-NEXT: por %xmm7, %xmm3
759 ; SSE2-NEXT: por %xmm5, %xmm3
760 ; SSE2-NEXT: por %xmm1, %xmm3
761 ; SSE2-NEXT: por %xmm6, %xmm2
762 ; SSE2-NEXT: por %xmm4, %xmm2
763 ; SSE2-NEXT: por %xmm3, %xmm2
764 ; SSE2-NEXT: por %xmm0, %xmm2
765 ; SSE2-NEXT: pxor %xmm0, %xmm0
766 ; SSE2-NEXT: pcmpeqb %xmm2, %xmm0
767 ; SSE2-NEXT: pmovmskb %xmm0, %eax
768 ; SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
769 ; SSE2-NEXT: sete %al
772 ; SSE41-LABEL: test_v128i8:
774 ; SSE41-NEXT: por %xmm7, %xmm3
775 ; SSE41-NEXT: por %xmm5, %xmm3
776 ; SSE41-NEXT: por %xmm1, %xmm3
777 ; SSE41-NEXT: por %xmm6, %xmm2
778 ; SSE41-NEXT: por %xmm4, %xmm2
779 ; SSE41-NEXT: por %xmm3, %xmm2
780 ; SSE41-NEXT: por %xmm0, %xmm2
781 ; SSE41-NEXT: ptest %xmm2, %xmm2
782 ; SSE41-NEXT: sete %al
785 ; AVX1-LABEL: test_v128i8:
787 ; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1
788 ; AVX1-NEXT: vorps %ymm1, %ymm2, %ymm1
789 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
790 ; AVX1-NEXT: vptest %ymm0, %ymm0
791 ; AVX1-NEXT: sete %al
792 ; AVX1-NEXT: vzeroupper
795 ; AVX2-LABEL: test_v128i8:
797 ; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1
798 ; AVX2-NEXT: vpor %ymm1, %ymm2, %ymm1
799 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
800 ; AVX2-NEXT: vptest %ymm0, %ymm0
801 ; AVX2-NEXT: sete %al
802 ; AVX2-NEXT: vzeroupper
805 ; AVX512-LABEL: test_v128i8:
807 ; AVX512-NEXT: vporq %zmm1, %zmm0, %zmm0
808 ; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1
809 ; AVX512-NEXT: vpor %ymm1, %ymm0, %ymm0
810 ; AVX512-NEXT: vptest %ymm0, %ymm0
811 ; AVX512-NEXT: sete %al
812 ; AVX512-NEXT: vzeroupper
814 %1 = call i8 @llvm.vector.reduce.or.v128i8(<128 x i8> %a0)
815 %2 = icmp eq i8 %1, 0
820 ; Compare Truncated/Masked OR Reductions
823 define i1 @trunc_v2i64(<2 x i64> %a0) {
824 ; SSE2-LABEL: trunc_v2i64:
826 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
827 ; SSE2-NEXT: por %xmm0, %xmm1
828 ; SSE2-NEXT: movd %xmm1, %eax
829 ; SSE2-NEXT: testw %ax, %ax
830 ; SSE2-NEXT: sete %al
833 ; SSE41-LABEL: trunc_v2i64:
835 ; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
836 ; SSE41-NEXT: sete %al
839 ; AVX-LABEL: trunc_v2i64:
841 ; AVX-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
844 %1 = call i64 @llvm.vector.reduce.or.v2i64(<2 x i64> %a0)
845 %2 = trunc i64 %1 to i16
846 %3 = icmp eq i16 %2, 0
850 define i1 @mask_v8i32(<8 x i32> %a0) {
851 ; SSE2-LABEL: mask_v8i32:
853 ; SSE2-NEXT: por %xmm1, %xmm0
854 ; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
855 ; SSE2-NEXT: pxor %xmm1, %xmm1
856 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
857 ; SSE2-NEXT: pmovmskb %xmm1, %eax
858 ; SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
859 ; SSE2-NEXT: sete %al
862 ; SSE41-LABEL: mask_v8i32:
864 ; SSE41-NEXT: por %xmm1, %xmm0
865 ; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
866 ; SSE41-NEXT: sete %al
869 ; AVX1-LABEL: mask_v8i32:
871 ; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
872 ; AVX1-NEXT: sete %al
873 ; AVX1-NEXT: vzeroupper
876 ; AVX2-LABEL: mask_v8i32:
878 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [9223372039002259456,9223372039002259456,9223372039002259456,9223372039002259456]
879 ; AVX2-NEXT: vptest %ymm1, %ymm0
880 ; AVX2-NEXT: sete %al
881 ; AVX2-NEXT: vzeroupper
884 ; AVX512-LABEL: mask_v8i32:
886 ; AVX512-NEXT: vpbroadcastq {{.*#+}} ymm1 = [9223372039002259456,9223372039002259456,9223372039002259456,9223372039002259456]
887 ; AVX512-NEXT: vptest %ymm1, %ymm0
888 ; AVX512-NEXT: sete %al
889 ; AVX512-NEXT: vzeroupper
891 %1 = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> %a0)
892 %2 = and i32 %1, 2147483648
893 %3 = icmp eq i32 %2, 0
897 define i1 @trunc_v16i16(<16 x i16> %a0) {
898 ; SSE2-LABEL: trunc_v16i16:
900 ; SSE2-NEXT: por %xmm1, %xmm0
901 ; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
902 ; SSE2-NEXT: pxor %xmm1, %xmm1
903 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
904 ; SSE2-NEXT: pmovmskb %xmm1, %eax
905 ; SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
906 ; SSE2-NEXT: setne %al
909 ; SSE41-LABEL: trunc_v16i16:
911 ; SSE41-NEXT: por %xmm1, %xmm0
912 ; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
913 ; SSE41-NEXT: setne %al
916 ; AVX1-LABEL: trunc_v16i16:
918 ; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
919 ; AVX1-NEXT: setne %al
920 ; AVX1-NEXT: vzeroupper
923 ; AVX2-LABEL: trunc_v16i16:
925 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [71777214294589695,71777214294589695,71777214294589695,71777214294589695]
926 ; AVX2-NEXT: vptest %ymm1, %ymm0
927 ; AVX2-NEXT: setne %al
928 ; AVX2-NEXT: vzeroupper
931 ; AVX512-LABEL: trunc_v16i16:
933 ; AVX512-NEXT: vpbroadcastq {{.*#+}} ymm1 = [71777214294589695,71777214294589695,71777214294589695,71777214294589695]
934 ; AVX512-NEXT: vptest %ymm1, %ymm0
935 ; AVX512-NEXT: setne %al
936 ; AVX512-NEXT: vzeroupper
938 %1 = call i16 @llvm.vector.reduce.or.v16i16(<16 x i16> %a0)
939 %2 = trunc i16 %1 to i8
940 %3 = icmp ne i8 %2, 0
944 define i1 @mask_v128i8(<128 x i8> %a0) {
945 ; SSE2-LABEL: mask_v128i8:
947 ; SSE2-NEXT: por %xmm7, %xmm3
948 ; SSE2-NEXT: por %xmm5, %xmm3
949 ; SSE2-NEXT: por %xmm1, %xmm3
950 ; SSE2-NEXT: por %xmm6, %xmm2
951 ; SSE2-NEXT: por %xmm4, %xmm2
952 ; SSE2-NEXT: por %xmm3, %xmm2
953 ; SSE2-NEXT: por %xmm0, %xmm2
954 ; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
955 ; SSE2-NEXT: pxor %xmm0, %xmm0
956 ; SSE2-NEXT: pcmpeqb %xmm2, %xmm0
957 ; SSE2-NEXT: pmovmskb %xmm0, %eax
958 ; SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
959 ; SSE2-NEXT: sete %al
962 ; SSE41-LABEL: mask_v128i8:
964 ; SSE41-NEXT: por %xmm7, %xmm3
965 ; SSE41-NEXT: por %xmm5, %xmm3
966 ; SSE41-NEXT: por %xmm1, %xmm3
967 ; SSE41-NEXT: por %xmm6, %xmm2
968 ; SSE41-NEXT: por %xmm4, %xmm2
969 ; SSE41-NEXT: por %xmm3, %xmm2
970 ; SSE41-NEXT: por %xmm0, %xmm2
971 ; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
972 ; SSE41-NEXT: sete %al
975 ; AVX1-LABEL: mask_v128i8:
977 ; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1
978 ; AVX1-NEXT: vorps %ymm1, %ymm2, %ymm1
979 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
980 ; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
981 ; AVX1-NEXT: sete %al
982 ; AVX1-NEXT: vzeroupper
985 ; AVX2-LABEL: mask_v128i8:
987 ; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1
988 ; AVX2-NEXT: vpor %ymm1, %ymm2, %ymm1
989 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
990 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [72340172838076673,72340172838076673,72340172838076673,72340172838076673]
991 ; AVX2-NEXT: vptest %ymm1, %ymm0
992 ; AVX2-NEXT: sete %al
993 ; AVX2-NEXT: vzeroupper
996 ; AVX512-LABEL: mask_v128i8:
998 ; AVX512-NEXT: vporq %zmm1, %zmm0, %zmm0
999 ; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1
1000 ; AVX512-NEXT: vpor %ymm1, %ymm0, %ymm0
1001 ; AVX512-NEXT: vpbroadcastq {{.*#+}} ymm1 = [72340172838076673,72340172838076673,72340172838076673,72340172838076673]
1002 ; AVX512-NEXT: vptest %ymm1, %ymm0
1003 ; AVX512-NEXT: sete %al
1004 ; AVX512-NEXT: vzeroupper
1006 %1 = call i8 @llvm.vector.reduce.or.v128i8(<128 x i8> %a0)
1008 %3 = icmp eq i8 %2, 0
1012 %struct.Box = type { i32, i32, i32, i32 }
1013 define zeroext i1 @PR44781(%struct.Box* %0) {
1014 ; SSE2-LABEL: PR44781:
1016 ; SSE2-NEXT: movdqu (%rdi), %xmm0
1017 ; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1018 ; SSE2-NEXT: pxor %xmm1, %xmm1
1019 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
1020 ; SSE2-NEXT: pmovmskb %xmm1, %eax
1021 ; SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
1022 ; SSE2-NEXT: sete %al
1025 ; SSE41-LABEL: PR44781:
1027 ; SSE41-NEXT: movdqu (%rdi), %xmm0
1028 ; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1029 ; SSE41-NEXT: sete %al
1032 ; AVX-LABEL: PR44781:
1034 ; AVX-NEXT: vmovdqu (%rdi), %xmm0
1035 ; AVX-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1036 ; AVX-NEXT: sete %al
1038 %2 = bitcast %struct.Box* %0 to <4 x i32>*
1039 %3 = load <4 x i32>, <4 x i32>* %2, align 4
1040 %4 = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> %3)
1042 %6 = icmp eq i32 %5, 0
1046 define i32 @mask_v3i1(<3 x i32> %a, <3 x i32> %b) {
1047 ; SSE2-LABEL: mask_v3i1:
1049 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm0
1050 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
1051 ; SSE2-NEXT: pxor %xmm0, %xmm1
1052 ; SSE2-NEXT: movd %xmm1, %eax
1053 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
1054 ; SSE2-NEXT: movd %xmm0, %ecx
1055 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
1056 ; SSE2-NEXT: movd %xmm0, %edx
1057 ; SSE2-NEXT: orl %ecx, %edx
1058 ; SSE2-NEXT: orl %eax, %edx
1059 ; SSE2-NEXT: testb $1, %dl
1060 ; SSE2-NEXT: je .LBB27_2
1061 ; SSE2-NEXT: # %bb.1:
1062 ; SSE2-NEXT: xorl %eax, %eax
1064 ; SSE2-NEXT: .LBB27_2:
1065 ; SSE2-NEXT: movl $1, %eax
1068 ; SSE41-LABEL: mask_v3i1:
1070 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm0
1071 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
1072 ; SSE41-NEXT: pxor %xmm0, %xmm1
1073 ; SSE41-NEXT: pextrd $1, %xmm1, %eax
1074 ; SSE41-NEXT: movd %xmm1, %ecx
1075 ; SSE41-NEXT: pextrd $2, %xmm1, %edx
1076 ; SSE41-NEXT: orl %eax, %edx
1077 ; SSE41-NEXT: orl %ecx, %edx
1078 ; SSE41-NEXT: testb $1, %dl
1079 ; SSE41-NEXT: je .LBB27_2
1080 ; SSE41-NEXT: # %bb.1:
1081 ; SSE41-NEXT: xorl %eax, %eax
1083 ; SSE41-NEXT: .LBB27_2:
1084 ; SSE41-NEXT: movl $1, %eax
1087 ; AVX1-LABEL: mask_v3i1:
1089 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1090 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
1091 ; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
1092 ; AVX1-NEXT: vpextrd $1, %xmm0, %eax
1093 ; AVX1-NEXT: vmovd %xmm0, %ecx
1094 ; AVX1-NEXT: vpextrd $2, %xmm0, %edx
1095 ; AVX1-NEXT: orl %eax, %edx
1096 ; AVX1-NEXT: orl %ecx, %edx
1097 ; AVX1-NEXT: testb $1, %dl
1098 ; AVX1-NEXT: je .LBB27_2
1099 ; AVX1-NEXT: # %bb.1:
1100 ; AVX1-NEXT: xorl %eax, %eax
1102 ; AVX1-NEXT: .LBB27_2:
1103 ; AVX1-NEXT: movl $1, %eax
1106 ; AVX2-LABEL: mask_v3i1:
1108 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1109 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
1110 ; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
1111 ; AVX2-NEXT: vpextrd $1, %xmm0, %eax
1112 ; AVX2-NEXT: vmovd %xmm0, %ecx
1113 ; AVX2-NEXT: vpextrd $2, %xmm0, %edx
1114 ; AVX2-NEXT: orl %eax, %edx
1115 ; AVX2-NEXT: orl %ecx, %edx
1116 ; AVX2-NEXT: testb $1, %dl
1117 ; AVX2-NEXT: je .LBB27_2
1118 ; AVX2-NEXT: # %bb.1:
1119 ; AVX2-NEXT: xorl %eax, %eax
1121 ; AVX2-NEXT: .LBB27_2:
1122 ; AVX2-NEXT: movl $1, %eax
1125 ; AVX512BW-LABEL: mask_v3i1:
1126 ; AVX512BW: # %bb.0:
1127 ; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1
1128 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
1129 ; AVX512BW-NEXT: vpcmpneqd %zmm1, %zmm0, %k0
1130 ; AVX512BW-NEXT: kshiftrw $2, %k0, %k1
1131 ; AVX512BW-NEXT: korw %k1, %k0, %k1
1132 ; AVX512BW-NEXT: kshiftrw $1, %k0, %k0
1133 ; AVX512BW-NEXT: korw %k0, %k1, %k0
1134 ; AVX512BW-NEXT: kmovd %k0, %eax
1135 ; AVX512BW-NEXT: testb $1, %al
1136 ; AVX512BW-NEXT: je .LBB27_2
1137 ; AVX512BW-NEXT: # %bb.1:
1138 ; AVX512BW-NEXT: xorl %eax, %eax
1139 ; AVX512BW-NEXT: vzeroupper
1140 ; AVX512BW-NEXT: retq
1141 ; AVX512BW-NEXT: .LBB27_2:
1142 ; AVX512BW-NEXT: movl $1, %eax
1143 ; AVX512BW-NEXT: vzeroupper
1144 ; AVX512BW-NEXT: retq
1146 ; AVX512BWVL-LABEL: mask_v3i1:
1147 ; AVX512BWVL: # %bb.0:
1148 ; AVX512BWVL-NEXT: vpcmpneqd %xmm1, %xmm0, %k0
1149 ; AVX512BWVL-NEXT: kshiftrw $2, %k0, %k1
1150 ; AVX512BWVL-NEXT: korw %k1, %k0, %k1
1151 ; AVX512BWVL-NEXT: kshiftrw $1, %k0, %k0
1152 ; AVX512BWVL-NEXT: korw %k0, %k1, %k0
1153 ; AVX512BWVL-NEXT: kmovd %k0, %eax
1154 ; AVX512BWVL-NEXT: testb $1, %al
1155 ; AVX512BWVL-NEXT: je .LBB27_2
1156 ; AVX512BWVL-NEXT: # %bb.1:
1157 ; AVX512BWVL-NEXT: xorl %eax, %eax
1158 ; AVX512BWVL-NEXT: retq
1159 ; AVX512BWVL-NEXT: .LBB27_2:
1160 ; AVX512BWVL-NEXT: movl $1, %eax
1161 ; AVX512BWVL-NEXT: retq
1162 %1 = icmp ne <3 x i32> %a, %b
1163 %2 = call i1 @llvm.vector.reduce.or.v3i1(<3 x i1> %1)
1164 br i1 %2, label %3, label %4
1171 declare i64 @llvm.vector.reduce.or.v2i64(<2 x i64>)
1172 declare i64 @llvm.vector.reduce.or.v4i64(<4 x i64>)
1173 declare i64 @llvm.vector.reduce.or.v8i64(<8 x i64>)
1174 declare i64 @llvm.vector.reduce.or.v16i64(<16 x i64>)
1176 declare i32 @llvm.vector.reduce.or.v2i32(<2 x i32>)
1177 declare i32 @llvm.vector.reduce.or.v4i32(<4 x i32>)
1178 declare i32 @llvm.vector.reduce.or.v8i32(<8 x i32>)
1179 declare i32 @llvm.vector.reduce.or.v16i32(<16 x i32>)
1180 declare i32 @llvm.vector.reduce.or.v32i32(<32 x i32>)
1182 declare i16 @llvm.vector.reduce.or.v2i16(<2 x i16>)
1183 declare i16 @llvm.vector.reduce.or.v4i16(<4 x i16>)
1184 declare i16 @llvm.vector.reduce.or.v8i16(<8 x i16>)
1185 declare i16 @llvm.vector.reduce.or.v16i16(<16 x i16>)
1186 declare i16 @llvm.vector.reduce.or.v32i16(<32 x i16>)
1187 declare i16 @llvm.vector.reduce.or.v64i16(<64 x i16>)
1189 declare i8 @llvm.vector.reduce.or.v2i8(<2 x i8>)
1190 declare i8 @llvm.vector.reduce.or.v4i8(<4 x i8>)
1191 declare i8 @llvm.vector.reduce.or.v8i8(<8 x i8>)
1192 declare i8 @llvm.vector.reduce.or.v16i8(<16 x i8>)
1193 declare i8 @llvm.vector.reduce.or.v32i8(<32 x i8>)
1194 declare i8 @llvm.vector.reduce.or.v64i8(<64 x i8>)
1195 declare i8 @llvm.vector.reduce.or.v128i8(<128 x i8>)
1197 declare i1 @llvm.vector.reduce.or.v3i1(<3 x i1>)