Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / X86 / vector-reduce-or-cmp.ll
blobf8ba00b0332994a41b44741059c5232c73021851
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
11 ; vXi64
14 define i1 @test_v2i64(<2 x i64> %a0) {
15 ; SSE2-LABEL: test_v2i64:
16 ; SSE2:       # %bb.0:
17 ; SSE2-NEXT:    pxor %xmm1, %xmm1
18 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
19 ; SSE2-NEXT:    movmskps %xmm1, %eax
20 ; SSE2-NEXT:    xorl $15, %eax
21 ; SSE2-NEXT:    sete %al
22 ; SSE2-NEXT:    retq
24 ; SSE41-LABEL: test_v2i64:
25 ; SSE41:       # %bb.0:
26 ; SSE41-NEXT:    ptest %xmm0, %xmm0
27 ; SSE41-NEXT:    sete %al
28 ; SSE41-NEXT:    retq
30 ; AVX-LABEL: test_v2i64:
31 ; AVX:       # %bb.0:
32 ; AVX-NEXT:    vptest %xmm0, %xmm0
33 ; AVX-NEXT:    sete %al
34 ; AVX-NEXT:    retq
35   %1 = call i64 @llvm.vector.reduce.or.v2i64(<2 x i64> %a0)
36   %2 = icmp eq i64 %1, 0
37   ret i1 %2
40 define i1 @test_v4i64(<4 x i64> %a0) {
41 ; SSE2-LABEL: test_v4i64:
42 ; SSE2:       # %bb.0:
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
49 ; SSE2-NEXT:    retq
51 ; SSE41-LABEL: test_v4i64:
52 ; SSE41:       # %bb.0:
53 ; SSE41-NEXT:    por %xmm1, %xmm0
54 ; SSE41-NEXT:    ptest %xmm0, %xmm0
55 ; SSE41-NEXT:    setne %al
56 ; SSE41-NEXT:    retq
58 ; AVX-LABEL: test_v4i64:
59 ; AVX:       # %bb.0:
60 ; AVX-NEXT:    vptest %ymm0, %ymm0
61 ; AVX-NEXT:    setne %al
62 ; AVX-NEXT:    vzeroupper
63 ; AVX-NEXT:    retq
64   %1 = call i64 @llvm.vector.reduce.or.v4i64(<4 x i64> %a0)
65   %2 = icmp ne i64 %1, 0
66   ret i1 %2
69 define i1 @test_v8i64(<8 x i64> %a0) {
70 ; SSE2-LABEL: test_v8i64:
71 ; SSE2:       # %bb.0:
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
79 ; SSE2-NEXT:    sete %al
80 ; SSE2-NEXT:    retq
82 ; SSE41-LABEL: test_v8i64:
83 ; SSE41:       # %bb.0:
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
89 ; SSE41-NEXT:    retq
91 ; AVX1-LABEL: test_v8i64:
92 ; AVX1:       # %bb.0:
93 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
94 ; AVX1-NEXT:    vptest %ymm0, %ymm0
95 ; AVX1-NEXT:    sete %al
96 ; AVX1-NEXT:    vzeroupper
97 ; AVX1-NEXT:    retq
99 ; AVX2-LABEL: test_v8i64:
100 ; AVX2:       # %bb.0:
101 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
102 ; AVX2-NEXT:    vptest %ymm0, %ymm0
103 ; AVX2-NEXT:    sete %al
104 ; AVX2-NEXT:    vzeroupper
105 ; AVX2-NEXT:    retq
107 ; AVX512-LABEL: test_v8i64:
108 ; AVX512:       # %bb.0:
109 ; AVX512-NEXT:    vptestmd %zmm0, %zmm0, %k0
110 ; AVX512-NEXT:    kortestw %k0, %k0
111 ; AVX512-NEXT:    sete %al
112 ; AVX512-NEXT:    vzeroupper
113 ; AVX512-NEXT:    retq
114   %1 = call i64 @llvm.vector.reduce.or.v8i64(<8 x i64> %a0)
115   %2 = icmp eq i64 %1, 0
116   ret i1 %2
119 define i1 @test_v16i64(<16 x i64> %a0) {
120 ; SSE2-LABEL: test_v16i64:
121 ; SSE2:       # %bb.0:
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
134 ; SSE2-NEXT:    retq
136 ; SSE41-LABEL: test_v16i64:
137 ; SSE41:       # %bb.0:
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
147 ; SSE41-NEXT:    retq
149 ; AVX1-LABEL: test_v16i64:
150 ; AVX1:       # %bb.0:
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
157 ; AVX1-NEXT:    retq
159 ; AVX2-LABEL: test_v16i64:
160 ; AVX2:       # %bb.0:
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
167 ; AVX2-NEXT:    retq
169 ; AVX512-LABEL: test_v16i64:
170 ; AVX512:       # %bb.0:
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
176 ; AVX512-NEXT:    retq
177   %1 = call i64 @llvm.vector.reduce.or.v16i64(<16 x i64> %a0)
178   %2 = icmp ne i64 %1, 0
179   ret i1 %2
183 ; vXi32
186 define i1 @test_v2i32(<2 x i32> %a0) {
187 ; SSE-LABEL: test_v2i32:
188 ; SSE:       # %bb.0:
189 ; SSE-NEXT:    movq %xmm0, %rax
190 ; SSE-NEXT:    testq %rax, %rax
191 ; SSE-NEXT:    sete %al
192 ; SSE-NEXT:    retq
194 ; AVX-LABEL: test_v2i32:
195 ; AVX:       # %bb.0:
196 ; AVX-NEXT:    vmovq %xmm0, %rax
197 ; AVX-NEXT:    testq %rax, %rax
198 ; AVX-NEXT:    sete %al
199 ; AVX-NEXT:    retq
200   %1 = call i32 @llvm.vector.reduce.or.v2i32(<2 x i32> %a0)
201   %2 = icmp eq i32 %1, 0
202   ret i1 %2
205 define i1 @test_v4i32(<4 x i32> %a0) {
206 ; SSE2-LABEL: test_v4i32:
207 ; SSE2:       # %bb.0:
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
213 ; SSE2-NEXT:    retq
215 ; SSE41-LABEL: test_v4i32:
216 ; SSE41:       # %bb.0:
217 ; SSE41-NEXT:    ptest %xmm0, %xmm0
218 ; SSE41-NEXT:    setne %al
219 ; SSE41-NEXT:    retq
221 ; AVX-LABEL: test_v4i32:
222 ; AVX:       # %bb.0:
223 ; AVX-NEXT:    vptest %xmm0, %xmm0
224 ; AVX-NEXT:    setne %al
225 ; AVX-NEXT:    retq
226   %1 = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> %a0)
227   %2 = icmp ne i32 %1, 0
228   ret i1 %2
231 define i1 @test_v8i32(<8 x i32> %a0) {
232 ; SSE2-LABEL: test_v8i32:
233 ; SSE2:       # %bb.0:
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
240 ; SSE2-NEXT:    retq
242 ; SSE41-LABEL: test_v8i32:
243 ; SSE41:       # %bb.0:
244 ; SSE41-NEXT:    por %xmm1, %xmm0
245 ; SSE41-NEXT:    ptest %xmm0, %xmm0
246 ; SSE41-NEXT:    sete %al
247 ; SSE41-NEXT:    retq
249 ; AVX-LABEL: test_v8i32:
250 ; AVX:       # %bb.0:
251 ; AVX-NEXT:    vptest %ymm0, %ymm0
252 ; AVX-NEXT:    sete %al
253 ; AVX-NEXT:    vzeroupper
254 ; AVX-NEXT:    retq
255   %1 = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> %a0)
256   %2 = icmp eq i32 %1, 0
257   ret i1 %2
260 define i1 @test_v16i32(<16 x i32> %a0) {
261 ; SSE2-LABEL: test_v16i32:
262 ; SSE2:       # %bb.0:
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
271 ; SSE2-NEXT:    retq
273 ; SSE41-LABEL: test_v16i32:
274 ; SSE41:       # %bb.0:
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
280 ; SSE41-NEXT:    retq
282 ; AVX1-LABEL: test_v16i32:
283 ; AVX1:       # %bb.0:
284 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
285 ; AVX1-NEXT:    vptest %ymm0, %ymm0
286 ; AVX1-NEXT:    setne %al
287 ; AVX1-NEXT:    vzeroupper
288 ; AVX1-NEXT:    retq
290 ; AVX2-LABEL: test_v16i32:
291 ; AVX2:       # %bb.0:
292 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
293 ; AVX2-NEXT:    vptest %ymm0, %ymm0
294 ; AVX2-NEXT:    setne %al
295 ; AVX2-NEXT:    vzeroupper
296 ; AVX2-NEXT:    retq
298 ; AVX512-LABEL: test_v16i32:
299 ; AVX512:       # %bb.0:
300 ; AVX512-NEXT:    vptestmd %zmm0, %zmm0, %k0
301 ; AVX512-NEXT:    kortestw %k0, %k0
302 ; AVX512-NEXT:    setne %al
303 ; AVX512-NEXT:    vzeroupper
304 ; AVX512-NEXT:    retq
305   %1 = call i32 @llvm.vector.reduce.or.v16i32(<16 x i32> %a0)
306   %2 = icmp ne i32 %1, 0
307   ret i1 %2
310 define i1 @test_v32i32(<32 x i32> %a0) {
311 ; SSE2-LABEL: test_v32i32:
312 ; SSE2:       # %bb.0:
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
325 ; SSE2-NEXT:    retq
327 ; SSE41-LABEL: test_v32i32:
328 ; SSE41:       # %bb.0:
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
338 ; SSE41-NEXT:    retq
340 ; AVX1-LABEL: test_v32i32:
341 ; AVX1:       # %bb.0:
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
348 ; AVX1-NEXT:    retq
350 ; AVX2-LABEL: test_v32i32:
351 ; AVX2:       # %bb.0:
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
358 ; AVX2-NEXT:    retq
360 ; AVX512-LABEL: test_v32i32:
361 ; AVX512:       # %bb.0:
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
367 ; AVX512-NEXT:    retq
368   %1 = call i32 @llvm.vector.reduce.or.v32i32(<32 x i32> %a0)
369   %2 = icmp eq i32 %1, 0
370   ret i1 %2
374 ; vXi16
377 define i1 @test_v2i16(<2 x i16> %a0) {
378 ; SSE-LABEL: test_v2i16:
379 ; SSE:       # %bb.0:
380 ; SSE-NEXT:    movd %xmm0, %eax
381 ; SSE-NEXT:    testl %eax, %eax
382 ; SSE-NEXT:    sete %al
383 ; SSE-NEXT:    retq
385 ; AVX-LABEL: test_v2i16:
386 ; AVX:       # %bb.0:
387 ; AVX-NEXT:    vmovd %xmm0, %eax
388 ; AVX-NEXT:    testl %eax, %eax
389 ; AVX-NEXT:    sete %al
390 ; AVX-NEXT:    retq
391   %1 = call i16 @llvm.vector.reduce.or.v2i16(<2 x i16> %a0)
392   %2 = icmp eq i16 %1, 0
393   ret i1 %2
396 define i1 @test_v4i16(<4 x i16> %a0) {
397 ; SSE-LABEL: test_v4i16:
398 ; SSE:       # %bb.0:
399 ; SSE-NEXT:    movq %xmm0, %rax
400 ; SSE-NEXT:    testq %rax, %rax
401 ; SSE-NEXT:    setne %al
402 ; SSE-NEXT:    retq
404 ; AVX-LABEL: test_v4i16:
405 ; AVX:       # %bb.0:
406 ; AVX-NEXT:    vmovq %xmm0, %rax
407 ; AVX-NEXT:    testq %rax, %rax
408 ; AVX-NEXT:    setne %al
409 ; AVX-NEXT:    retq
410   %1 = call i16 @llvm.vector.reduce.or.v4i16(<4 x i16> %a0)
411   %2 = icmp ne i16 %1, 0
412   ret i1 %2
415 define i1 @test_v8i16(<8 x i16> %a0) {
416 ; SSE2-LABEL: test_v8i16:
417 ; SSE2:       # %bb.0:
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
423 ; SSE2-NEXT:    retq
425 ; SSE41-LABEL: test_v8i16:
426 ; SSE41:       # %bb.0:
427 ; SSE41-NEXT:    ptest %xmm0, %xmm0
428 ; SSE41-NEXT:    sete %al
429 ; SSE41-NEXT:    retq
431 ; AVX-LABEL: test_v8i16:
432 ; AVX:       # %bb.0:
433 ; AVX-NEXT:    vptest %xmm0, %xmm0
434 ; AVX-NEXT:    sete %al
435 ; AVX-NEXT:    retq
436   %1 = call i16 @llvm.vector.reduce.or.v8i16(<8 x i16> %a0)
437   %2 = icmp eq i16 %1, 0
438   ret i1 %2
441 define i1 @test_v16i16(<16 x i16> %a0) {
442 ; SSE2-LABEL: test_v16i16:
443 ; SSE2:       # %bb.0:
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
450 ; SSE2-NEXT:    retq
452 ; SSE41-LABEL: test_v16i16:
453 ; SSE41:       # %bb.0:
454 ; SSE41-NEXT:    por %xmm1, %xmm0
455 ; SSE41-NEXT:    ptest %xmm0, %xmm0
456 ; SSE41-NEXT:    setne %al
457 ; SSE41-NEXT:    retq
459 ; AVX-LABEL: test_v16i16:
460 ; AVX:       # %bb.0:
461 ; AVX-NEXT:    vptest %ymm0, %ymm0
462 ; AVX-NEXT:    setne %al
463 ; AVX-NEXT:    vzeroupper
464 ; AVX-NEXT:    retq
465   %1 = call i16 @llvm.vector.reduce.or.v16i16(<16 x i16> %a0)
466   %2 = icmp ne i16 %1, 0
467   ret i1 %2
470 define i1 @test_v32i16(<32 x i16> %a0) {
471 ; SSE2-LABEL: test_v32i16:
472 ; SSE2:       # %bb.0:
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
481 ; SSE2-NEXT:    retq
483 ; SSE41-LABEL: test_v32i16:
484 ; SSE41:       # %bb.0:
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
490 ; SSE41-NEXT:    retq
492 ; AVX1-LABEL: test_v32i16:
493 ; AVX1:       # %bb.0:
494 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
495 ; AVX1-NEXT:    vptest %ymm0, %ymm0
496 ; AVX1-NEXT:    sete %al
497 ; AVX1-NEXT:    vzeroupper
498 ; AVX1-NEXT:    retq
500 ; AVX2-LABEL: test_v32i16:
501 ; AVX2:       # %bb.0:
502 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
503 ; AVX2-NEXT:    vptest %ymm0, %ymm0
504 ; AVX2-NEXT:    sete %al
505 ; AVX2-NEXT:    vzeroupper
506 ; AVX2-NEXT:    retq
508 ; AVX512-LABEL: test_v32i16:
509 ; AVX512:       # %bb.0:
510 ; AVX512-NEXT:    vptestmd %zmm0, %zmm0, %k0
511 ; AVX512-NEXT:    kortestw %k0, %k0
512 ; AVX512-NEXT:    sete %al
513 ; AVX512-NEXT:    vzeroupper
514 ; AVX512-NEXT:    retq
515   %1 = call i16 @llvm.vector.reduce.or.v32i16(<32 x i16> %a0)
516   %2 = icmp eq i16 %1, 0
517   ret i1 %2
520 define i1 @test_v64i16(<64 x i16> %a0) {
521 ; SSE2-LABEL: test_v64i16:
522 ; SSE2:       # %bb.0:
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
535 ; SSE2-NEXT:    retq
537 ; SSE41-LABEL: test_v64i16:
538 ; SSE41:       # %bb.0:
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
548 ; SSE41-NEXT:    retq
550 ; AVX1-LABEL: test_v64i16:
551 ; AVX1:       # %bb.0:
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
558 ; AVX1-NEXT:    retq
560 ; AVX2-LABEL: test_v64i16:
561 ; AVX2:       # %bb.0:
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
568 ; AVX2-NEXT:    retq
570 ; AVX512-LABEL: test_v64i16:
571 ; AVX512:       # %bb.0:
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
577 ; AVX512-NEXT:    retq
578   %1 = call i16 @llvm.vector.reduce.or.v64i16(<64 x i16> %a0)
579   %2 = icmp ne i16 %1, 0
580   ret i1 %2
584 ; vXi8
587 define i1 @test_v2i8(<2 x i8> %a0) {
588 ; SSE-LABEL: test_v2i8:
589 ; SSE:       # %bb.0:
590 ; SSE-NEXT:    movd %xmm0, %eax
591 ; SSE-NEXT:    testw %ax, %ax
592 ; SSE-NEXT:    sete %al
593 ; SSE-NEXT:    retq
595 ; AVX-LABEL: test_v2i8:
596 ; AVX:       # %bb.0:
597 ; AVX-NEXT:    vmovd %xmm0, %eax
598 ; AVX-NEXT:    testw %ax, %ax
599 ; AVX-NEXT:    sete %al
600 ; AVX-NEXT:    retq
601   %1 = call i8 @llvm.vector.reduce.or.v2i8(<2 x i8> %a0)
602   %2 = icmp eq i8 %1, 0
603   ret i1 %2
606 define i1 @test_v4i8(<4 x i8> %a0) {
607 ; SSE-LABEL: test_v4i8:
608 ; SSE:       # %bb.0:
609 ; SSE-NEXT:    movd %xmm0, %eax
610 ; SSE-NEXT:    testl %eax, %eax
611 ; SSE-NEXT:    setne %al
612 ; SSE-NEXT:    retq
614 ; AVX-LABEL: test_v4i8:
615 ; AVX:       # %bb.0:
616 ; AVX-NEXT:    vmovd %xmm0, %eax
617 ; AVX-NEXT:    testl %eax, %eax
618 ; AVX-NEXT:    setne %al
619 ; AVX-NEXT:    retq
620   %1 = call i8 @llvm.vector.reduce.or.v4i8(<4 x i8> %a0)
621   %2 = icmp ne i8 %1, 0
622   ret i1 %2
625 define i1 @test_v8i8(<8 x i8> %a0) {
626 ; SSE-LABEL: test_v8i8:
627 ; SSE:       # %bb.0:
628 ; SSE-NEXT:    movq %xmm0, %rax
629 ; SSE-NEXT:    testq %rax, %rax
630 ; SSE-NEXT:    sete %al
631 ; SSE-NEXT:    retq
633 ; AVX-LABEL: test_v8i8:
634 ; AVX:       # %bb.0:
635 ; AVX-NEXT:    vmovq %xmm0, %rax
636 ; AVX-NEXT:    testq %rax, %rax
637 ; AVX-NEXT:    sete %al
638 ; AVX-NEXT:    retq
639   %1 = call i8 @llvm.vector.reduce.or.v8i8(<8 x i8> %a0)
640   %2 = icmp eq i8 %1, 0
641   ret i1 %2
644 define i1 @test_v16i8(<16 x i8> %a0) {
645 ; SSE2-LABEL: test_v16i8:
646 ; SSE2:       # %bb.0:
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
652 ; SSE2-NEXT:    retq
654 ; SSE41-LABEL: test_v16i8:
655 ; SSE41:       # %bb.0:
656 ; SSE41-NEXT:    ptest %xmm0, %xmm0
657 ; SSE41-NEXT:    setne %al
658 ; SSE41-NEXT:    retq
660 ; AVX-LABEL: test_v16i8:
661 ; AVX:       # %bb.0:
662 ; AVX-NEXT:    vptest %xmm0, %xmm0
663 ; AVX-NEXT:    setne %al
664 ; AVX-NEXT:    retq
665   %1 = call i8 @llvm.vector.reduce.or.v16i8(<16 x i8> %a0)
666   %2 = icmp ne i8 %1, 0
667   ret i1 %2
670 define i1 @test_v32i8(<32 x i8> %a0) {
671 ; SSE2-LABEL: test_v32i8:
672 ; SSE2:       # %bb.0:
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
679 ; SSE2-NEXT:    retq
681 ; SSE41-LABEL: test_v32i8:
682 ; SSE41:       # %bb.0:
683 ; SSE41-NEXT:    por %xmm1, %xmm0
684 ; SSE41-NEXT:    ptest %xmm0, %xmm0
685 ; SSE41-NEXT:    sete %al
686 ; SSE41-NEXT:    retq
688 ; AVX-LABEL: test_v32i8:
689 ; AVX:       # %bb.0:
690 ; AVX-NEXT:    vptest %ymm0, %ymm0
691 ; AVX-NEXT:    sete %al
692 ; AVX-NEXT:    vzeroupper
693 ; AVX-NEXT:    retq
694   %1 = call i8 @llvm.vector.reduce.or.v32i8(<32 x i8> %a0)
695   %2 = icmp eq i8 %1, 0
696   ret i1 %2
699 define i1 @test_v64i8(<64 x i8> %a0) {
700 ; SSE2-LABEL: test_v64i8:
701 ; SSE2:       # %bb.0:
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
710 ; SSE2-NEXT:    retq
712 ; SSE41-LABEL: test_v64i8:
713 ; SSE41:       # %bb.0:
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
719 ; SSE41-NEXT:    retq
721 ; AVX1-LABEL: test_v64i8:
722 ; AVX1:       # %bb.0:
723 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
724 ; AVX1-NEXT:    vptest %ymm0, %ymm0
725 ; AVX1-NEXT:    setne %al
726 ; AVX1-NEXT:    vzeroupper
727 ; AVX1-NEXT:    retq
729 ; AVX2-LABEL: test_v64i8:
730 ; AVX2:       # %bb.0:
731 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
732 ; AVX2-NEXT:    vptest %ymm0, %ymm0
733 ; AVX2-NEXT:    setne %al
734 ; AVX2-NEXT:    vzeroupper
735 ; AVX2-NEXT:    retq
737 ; AVX512-LABEL: test_v64i8:
738 ; AVX512:       # %bb.0:
739 ; AVX512-NEXT:    vptestmd %zmm0, %zmm0, %k0
740 ; AVX512-NEXT:    kortestw %k0, %k0
741 ; AVX512-NEXT:    setne %al
742 ; AVX512-NEXT:    vzeroupper
743 ; AVX512-NEXT:    retq
744   %1 = call i8 @llvm.vector.reduce.or.v64i8(<64 x i8> %a0)
745   %2 = icmp ne i8 %1, 0
746   ret i1 %2
749 define i1 @test_v128i8(<128 x i8> %a0) {
750 ; SSE2-LABEL: test_v128i8:
751 ; SSE2:       # %bb.0:
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
764 ; SSE2-NEXT:    retq
766 ; SSE41-LABEL: test_v128i8:
767 ; SSE41:       # %bb.0:
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
777 ; SSE41-NEXT:    retq
779 ; AVX1-LABEL: test_v128i8:
780 ; AVX1:       # %bb.0:
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
787 ; AVX1-NEXT:    retq
789 ; AVX2-LABEL: test_v128i8:
790 ; AVX2:       # %bb.0:
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
797 ; AVX2-NEXT:    retq
799 ; AVX512-LABEL: test_v128i8:
800 ; AVX512:       # %bb.0:
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
806 ; AVX512-NEXT:    retq
807   %1 = call i8 @llvm.vector.reduce.or.v128i8(<128 x i8> %a0)
808   %2 = icmp eq i8 %1, 0
809   ret i1 %2
813 ; Compare Truncated/Masked OR Reductions
816 define i1 @trunc_v2i64(<2 x i64> %a0) {
817 ; SSE2-LABEL: trunc_v2i64:
818 ; SSE2:       # %bb.0:
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
824 ; SSE2-NEXT:    retq
826 ; SSE41-LABEL: trunc_v2i64:
827 ; SSE41:       # %bb.0:
828 ; SSE41-NEXT:    ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
829 ; SSE41-NEXT:    sete %al
830 ; SSE41-NEXT:    retq
832 ; AVX1OR2-LABEL: trunc_v2i64:
833 ; AVX1OR2:       # %bb.0:
834 ; AVX1OR2-NEXT:    vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
835 ; AVX1OR2-NEXT:    sete %al
836 ; AVX1OR2-NEXT:    retq
838 ; AVX512F-LABEL: trunc_v2i64:
839 ; AVX512F:       # %bb.0:
840 ; AVX512F-NEXT:    vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
841 ; AVX512F-NEXT:    sete %al
842 ; AVX512F-NEXT:    retq
844 ; AVX512BW-LABEL: trunc_v2i64:
845 ; AVX512BW:       # %bb.0:
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
859   ret i1 %3
862 define i1 @mask_v8i32(<8 x i32> %a0) {
863 ; SSE2-LABEL: mask_v8i32:
864 ; SSE2:       # %bb.0:
865 ; SSE2-NEXT:    orps %xmm1, %xmm0
866 ; SSE2-NEXT:    movmskps %xmm0, %eax
867 ; SSE2-NEXT:    testl %eax, %eax
868 ; SSE2-NEXT:    sete %al
869 ; SSE2-NEXT:    retq
871 ; SSE41-LABEL: mask_v8i32:
872 ; SSE41:       # %bb.0:
873 ; SSE41-NEXT:    por %xmm1, %xmm0
874 ; SSE41-NEXT:    ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
875 ; SSE41-NEXT:    sete %al
876 ; SSE41-NEXT:    retq
878 ; AVX1-LABEL: mask_v8i32:
879 ; AVX1:       # %bb.0:
880 ; AVX1-NEXT:    vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
881 ; AVX1-NEXT:    sete %al
882 ; AVX1-NEXT:    vzeroupper
883 ; AVX1-NEXT:    retq
885 ; AVX2-LABEL: mask_v8i32:
886 ; AVX2:       # %bb.0:
887 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [9223372039002259456,9223372039002259456,9223372039002259456,9223372039002259456]
888 ; AVX2-NEXT:    vptest %ymm1, %ymm0
889 ; AVX2-NEXT:    sete %al
890 ; AVX2-NEXT:    vzeroupper
891 ; AVX2-NEXT:    retq
893 ; AVX512-LABEL: mask_v8i32:
894 ; AVX512:       # %bb.0:
895 ; AVX512-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [9223372039002259456,9223372039002259456,9223372039002259456,9223372039002259456]
896 ; AVX512-NEXT:    vptest %ymm1, %ymm0
897 ; AVX512-NEXT:    sete %al
898 ; AVX512-NEXT:    vzeroupper
899 ; AVX512-NEXT:    retq
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
903   ret i1 %3
906 define i1 @trunc_v16i16(<16 x i16> %a0) {
907 ; SSE2-LABEL: trunc_v16i16:
908 ; SSE2:       # %bb.0:
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
916 ; SSE2-NEXT:    retq
918 ; SSE41-LABEL: trunc_v16i16:
919 ; SSE41:       # %bb.0:
920 ; SSE41-NEXT:    por %xmm1, %xmm0
921 ; SSE41-NEXT:    ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
922 ; SSE41-NEXT:    setne %al
923 ; SSE41-NEXT:    retq
925 ; AVX-LABEL: trunc_v16i16:
926 ; AVX:       # %bb.0:
927 ; AVX-NEXT:    vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
928 ; AVX-NEXT:    setne %al
929 ; AVX-NEXT:    vzeroupper
930 ; AVX-NEXT:    retq
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
934   ret i1 %3
937 define i1 @mask_v128i8(<128 x i8> %a0) {
938 ; SSE2-LABEL: mask_v128i8:
939 ; SSE2:       # %bb.0:
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
951 ; SSE2-NEXT:    retq
953 ; SSE41-LABEL: mask_v128i8:
954 ; SSE41:       # %bb.0:
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
964 ; SSE41-NEXT:    retq
966 ; AVX1-LABEL: mask_v128i8:
967 ; AVX1:       # %bb.0:
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
974 ; AVX1-NEXT:    retq
976 ; AVX2-LABEL: mask_v128i8:
977 ; AVX2:       # %bb.0:
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
985 ; AVX2-NEXT:    retq
987 ; AVX512-LABEL: mask_v128i8:
988 ; AVX512:       # %bb.0:
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
994 ; AVX512-NEXT:    retq
995   %1 = call i8 @llvm.vector.reduce.or.v128i8(<128 x i8> %a0)
996   %2 = and i8 %1, 1
997   %3 = icmp eq i8 %2, 0
998   ret i1 %3
1001 %struct.Box = type { i32, i32, i32, i32 }
1002 define zeroext i1 @PR44781(ptr %0) {
1003 ; SSE2-LABEL: PR44781:
1004 ; SSE2:       # %bb.0:
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
1012 ; SSE2-NEXT:    retq
1014 ; SSE41-LABEL: PR44781:
1015 ; SSE41:       # %bb.0:
1016 ; SSE41-NEXT:    movdqu (%rdi), %xmm0
1017 ; SSE41-NEXT:    ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1018 ; SSE41-NEXT:    sete %al
1019 ; SSE41-NEXT:    retq
1021 ; AVX1OR2-LABEL: PR44781:
1022 ; AVX1OR2:       # %bb.0:
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:
1029 ; AVX512F:       # %bb.0:
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)
1051   %4 = and i32 %3, 15
1052   %5 = icmp eq i32 %4, 0
1053   ret i1 %5
1056 define i32 @mask_v3i1(<3 x i32> %a, <3 x i32> %b) {
1057 ; SSE2-LABEL: mask_v3i1:
1058 ; SSE2:       # %bb.0:
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
1073 ; SSE2-NEXT:    retq
1074 ; SSE2-NEXT:  .LBB27_2:
1075 ; SSE2-NEXT:    movl $1, %eax
1076 ; SSE2-NEXT:    retq
1078 ; SSE41-LABEL: mask_v3i1:
1079 ; SSE41:       # %bb.0:
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
1092 ; SSE41-NEXT:    retq
1093 ; SSE41-NEXT:  .LBB27_2:
1094 ; SSE41-NEXT:    movl $1, %eax
1095 ; SSE41-NEXT:    retq
1097 ; AVX1OR2-LABEL: mask_v3i1:
1098 ; AVX1OR2:       # %bb.0:
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:
1117 ; AVX512F:       # %bb.0:
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
1178   ret i32 0
1180   ret i32 1
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>)