[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / X86 / vector-reduce-or-cmp.ll
blob31cbb9a1afefa75eb9a6430c63fae684f52a9cf6
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
10 ; vXi64
13 define i1 @test_v2i64(<2 x i64> %a0) {
14 ; SSE2-LABEL: test_v2i64:
15 ; SSE2:       # %bb.0:
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
20 ; SSE2-NEXT:    sete %al
21 ; SSE2-NEXT:    retq
23 ; SSE41-LABEL: test_v2i64:
24 ; SSE41:       # %bb.0:
25 ; SSE41-NEXT:    ptest %xmm0, %xmm0
26 ; SSE41-NEXT:    sete %al
27 ; SSE41-NEXT:    retq
29 ; AVX-LABEL: test_v2i64:
30 ; AVX:       # %bb.0:
31 ; AVX-NEXT:    vptest %xmm0, %xmm0
32 ; AVX-NEXT:    sete %al
33 ; AVX-NEXT:    retq
34   %1 = call i64 @llvm.vector.reduce.or.v2i64(<2 x i64> %a0)
35   %2 = icmp eq i64 %1, 0
36   ret i1 %2
39 define i1 @test_v4i64(<4 x i64> %a0) {
40 ; SSE2-LABEL: test_v4i64:
41 ; SSE2:       # %bb.0:
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
48 ; SSE2-NEXT:    retq
50 ; SSE41-LABEL: test_v4i64:
51 ; SSE41:       # %bb.0:
52 ; SSE41-NEXT:    por %xmm1, %xmm0
53 ; SSE41-NEXT:    ptest %xmm0, %xmm0
54 ; SSE41-NEXT:    setne %al
55 ; SSE41-NEXT:    retq
57 ; AVX-LABEL: test_v4i64:
58 ; AVX:       # %bb.0:
59 ; AVX-NEXT:    vptest %ymm0, %ymm0
60 ; AVX-NEXT:    setne %al
61 ; AVX-NEXT:    vzeroupper
62 ; AVX-NEXT:    retq
63   %1 = call i64 @llvm.vector.reduce.or.v4i64(<4 x i64> %a0)
64   %2 = icmp ne i64 %1, 0
65   ret i1 %2
68 define i1 @test_v8i64(<8 x i64> %a0) {
69 ; SSE2-LABEL: test_v8i64:
70 ; SSE2:       # %bb.0:
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
78 ; SSE2-NEXT:    sete %al
79 ; SSE2-NEXT:    retq
81 ; SSE41-LABEL: test_v8i64:
82 ; SSE41:       # %bb.0:
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
88 ; SSE41-NEXT:    retq
90 ; AVX1-LABEL: test_v8i64:
91 ; AVX1:       # %bb.0:
92 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
93 ; AVX1-NEXT:    vptest %ymm0, %ymm0
94 ; AVX1-NEXT:    sete %al
95 ; AVX1-NEXT:    vzeroupper
96 ; AVX1-NEXT:    retq
98 ; AVX2-LABEL: test_v8i64:
99 ; AVX2:       # %bb.0:
100 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
101 ; AVX2-NEXT:    vptest %ymm0, %ymm0
102 ; AVX2-NEXT:    sete %al
103 ; AVX2-NEXT:    vzeroupper
104 ; AVX2-NEXT:    retq
106 ; AVX512-LABEL: test_v8i64:
107 ; AVX512:       # %bb.0:
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
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, %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
134 ; SSE2-NEXT:    retq
136 ; SSE41-LABEL: test_v16i64:
137 ; SSE41:       # %bb.0:
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
147 ; SSE41-NEXT:    retq
149 ; AVX1-LABEL: test_v16i64:
150 ; AVX1:       # %bb.0:
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
157 ; AVX1-NEXT:    retq
159 ; AVX2-LABEL: test_v16i64:
160 ; AVX2:       # %bb.0:
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
167 ; AVX2-NEXT:    retq
169 ; AVX512-LABEL: test_v16i64:
170 ; AVX512:       # %bb.0:
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
177 ; AVX512-NEXT:    retq
178   %1 = call i64 @llvm.vector.reduce.or.v16i64(<16 x i64> %a0)
179   %2 = icmp ne i64 %1, 0
180   ret i1 %2
184 ; vXi32
187 define i1 @test_v2i32(<2 x i32> %a0) {
188 ; SSE-LABEL: test_v2i32:
189 ; SSE:       # %bb.0:
190 ; SSE-NEXT:    movq %xmm0, %rax
191 ; SSE-NEXT:    testq %rax, %rax
192 ; SSE-NEXT:    sete %al
193 ; SSE-NEXT:    retq
195 ; AVX-LABEL: test_v2i32:
196 ; AVX:       # %bb.0:
197 ; AVX-NEXT:    vmovq %xmm0, %rax
198 ; AVX-NEXT:    testq %rax, %rax
199 ; AVX-NEXT:    sete %al
200 ; AVX-NEXT:    retq
201   %1 = call i32 @llvm.vector.reduce.or.v2i32(<2 x i32> %a0)
202   %2 = icmp eq i32 %1, 0
203   ret i1 %2
206 define i1 @test_v4i32(<4 x i32> %a0) {
207 ; SSE2-LABEL: test_v4i32:
208 ; SSE2:       # %bb.0:
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
214 ; SSE2-NEXT:    retq
216 ; SSE41-LABEL: test_v4i32:
217 ; SSE41:       # %bb.0:
218 ; SSE41-NEXT:    ptest %xmm0, %xmm0
219 ; SSE41-NEXT:    setne %al
220 ; SSE41-NEXT:    retq
222 ; AVX-LABEL: test_v4i32:
223 ; AVX:       # %bb.0:
224 ; AVX-NEXT:    vptest %xmm0, %xmm0
225 ; AVX-NEXT:    setne %al
226 ; AVX-NEXT:    retq
227   %1 = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> %a0)
228   %2 = icmp ne i32 %1, 0
229   ret i1 %2
232 define i1 @test_v8i32(<8 x i32> %a0) {
233 ; SSE2-LABEL: test_v8i32:
234 ; SSE2:       # %bb.0:
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
241 ; SSE2-NEXT:    retq
243 ; SSE41-LABEL: test_v8i32:
244 ; SSE41:       # %bb.0:
245 ; SSE41-NEXT:    por %xmm1, %xmm0
246 ; SSE41-NEXT:    ptest %xmm0, %xmm0
247 ; SSE41-NEXT:    sete %al
248 ; SSE41-NEXT:    retq
250 ; AVX-LABEL: test_v8i32:
251 ; AVX:       # %bb.0:
252 ; AVX-NEXT:    vptest %ymm0, %ymm0
253 ; AVX-NEXT:    sete %al
254 ; AVX-NEXT:    vzeroupper
255 ; AVX-NEXT:    retq
256   %1 = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> %a0)
257   %2 = icmp eq i32 %1, 0
258   ret i1 %2
261 define i1 @test_v16i32(<16 x i32> %a0) {
262 ; SSE2-LABEL: test_v16i32:
263 ; SSE2:       # %bb.0:
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
272 ; SSE2-NEXT:    retq
274 ; SSE41-LABEL: test_v16i32:
275 ; SSE41:       # %bb.0:
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
281 ; SSE41-NEXT:    retq
283 ; AVX1-LABEL: test_v16i32:
284 ; AVX1:       # %bb.0:
285 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
286 ; AVX1-NEXT:    vptest %ymm0, %ymm0
287 ; AVX1-NEXT:    setne %al
288 ; AVX1-NEXT:    vzeroupper
289 ; AVX1-NEXT:    retq
291 ; AVX2-LABEL: test_v16i32:
292 ; AVX2:       # %bb.0:
293 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
294 ; AVX2-NEXT:    vptest %ymm0, %ymm0
295 ; AVX2-NEXT:    setne %al
296 ; AVX2-NEXT:    vzeroupper
297 ; AVX2-NEXT:    retq
299 ; AVX512-LABEL: test_v16i32:
300 ; AVX512:       # %bb.0:
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
306 ; AVX512-NEXT:    retq
307   %1 = call i32 @llvm.vector.reduce.or.v16i32(<16 x i32> %a0)
308   %2 = icmp ne i32 %1, 0
309   ret i1 %2
312 define i1 @test_v32i32(<32 x i32> %a0) {
313 ; SSE2-LABEL: test_v32i32:
314 ; SSE2:       # %bb.0:
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
327 ; SSE2-NEXT:    retq
329 ; SSE41-LABEL: test_v32i32:
330 ; SSE41:       # %bb.0:
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
340 ; SSE41-NEXT:    retq
342 ; AVX1-LABEL: test_v32i32:
343 ; AVX1:       # %bb.0:
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
350 ; AVX1-NEXT:    retq
352 ; AVX2-LABEL: test_v32i32:
353 ; AVX2:       # %bb.0:
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
360 ; AVX2-NEXT:    retq
362 ; AVX512-LABEL: test_v32i32:
363 ; AVX512:       # %bb.0:
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
370 ; AVX512-NEXT:    retq
371   %1 = call i32 @llvm.vector.reduce.or.v32i32(<32 x i32> %a0)
372   %2 = icmp eq i32 %1, 0
373   ret i1 %2
377 ; vXi16
380 define i1 @test_v2i16(<2 x i16> %a0) {
381 ; SSE-LABEL: test_v2i16:
382 ; SSE:       # %bb.0:
383 ; SSE-NEXT:    movd %xmm0, %eax
384 ; SSE-NEXT:    testl %eax, %eax
385 ; SSE-NEXT:    sete %al
386 ; SSE-NEXT:    retq
388 ; AVX-LABEL: test_v2i16:
389 ; AVX:       # %bb.0:
390 ; AVX-NEXT:    vmovd %xmm0, %eax
391 ; AVX-NEXT:    testl %eax, %eax
392 ; AVX-NEXT:    sete %al
393 ; AVX-NEXT:    retq
394   %1 = call i16 @llvm.vector.reduce.or.v2i16(<2 x i16> %a0)
395   %2 = icmp eq i16 %1, 0
396   ret i1 %2
399 define i1 @test_v4i16(<4 x i16> %a0) {
400 ; SSE-LABEL: test_v4i16:
401 ; SSE:       # %bb.0:
402 ; SSE-NEXT:    movq %xmm0, %rax
403 ; SSE-NEXT:    testq %rax, %rax
404 ; SSE-NEXT:    setne %al
405 ; SSE-NEXT:    retq
407 ; AVX-LABEL: test_v4i16:
408 ; AVX:       # %bb.0:
409 ; AVX-NEXT:    vmovq %xmm0, %rax
410 ; AVX-NEXT:    testq %rax, %rax
411 ; AVX-NEXT:    setne %al
412 ; AVX-NEXT:    retq
413   %1 = call i16 @llvm.vector.reduce.or.v4i16(<4 x i16> %a0)
414   %2 = icmp ne i16 %1, 0
415   ret i1 %2
418 define i1 @test_v8i16(<8 x i16> %a0) {
419 ; SSE2-LABEL: test_v8i16:
420 ; SSE2:       # %bb.0:
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
426 ; SSE2-NEXT:    retq
428 ; SSE41-LABEL: test_v8i16:
429 ; SSE41:       # %bb.0:
430 ; SSE41-NEXT:    ptest %xmm0, %xmm0
431 ; SSE41-NEXT:    sete %al
432 ; SSE41-NEXT:    retq
434 ; AVX-LABEL: test_v8i16:
435 ; AVX:       # %bb.0:
436 ; AVX-NEXT:    vptest %xmm0, %xmm0
437 ; AVX-NEXT:    sete %al
438 ; AVX-NEXT:    retq
439   %1 = call i16 @llvm.vector.reduce.or.v8i16(<8 x i16> %a0)
440   %2 = icmp eq i16 %1, 0
441   ret i1 %2
444 define i1 @test_v16i16(<16 x i16> %a0) {
445 ; SSE2-LABEL: test_v16i16:
446 ; SSE2:       # %bb.0:
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
453 ; SSE2-NEXT:    retq
455 ; SSE41-LABEL: test_v16i16:
456 ; SSE41:       # %bb.0:
457 ; SSE41-NEXT:    por %xmm1, %xmm0
458 ; SSE41-NEXT:    ptest %xmm0, %xmm0
459 ; SSE41-NEXT:    setne %al
460 ; SSE41-NEXT:    retq
462 ; AVX-LABEL: test_v16i16:
463 ; AVX:       # %bb.0:
464 ; AVX-NEXT:    vptest %ymm0, %ymm0
465 ; AVX-NEXT:    setne %al
466 ; AVX-NEXT:    vzeroupper
467 ; AVX-NEXT:    retq
468   %1 = call i16 @llvm.vector.reduce.or.v16i16(<16 x i16> %a0)
469   %2 = icmp ne i16 %1, 0
470   ret i1 %2
473 define i1 @test_v32i16(<32 x i16> %a0) {
474 ; SSE2-LABEL: test_v32i16:
475 ; SSE2:       # %bb.0:
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
484 ; SSE2-NEXT:    retq
486 ; SSE41-LABEL: test_v32i16:
487 ; SSE41:       # %bb.0:
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
493 ; SSE41-NEXT:    retq
495 ; AVX1-LABEL: test_v32i16:
496 ; AVX1:       # %bb.0:
497 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
498 ; AVX1-NEXT:    vptest %ymm0, %ymm0
499 ; AVX1-NEXT:    sete %al
500 ; AVX1-NEXT:    vzeroupper
501 ; AVX1-NEXT:    retq
503 ; AVX2-LABEL: test_v32i16:
504 ; AVX2:       # %bb.0:
505 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
506 ; AVX2-NEXT:    vptest %ymm0, %ymm0
507 ; AVX2-NEXT:    sete %al
508 ; AVX2-NEXT:    vzeroupper
509 ; AVX2-NEXT:    retq
511 ; AVX512-LABEL: test_v32i16:
512 ; AVX512:       # %bb.0:
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
518 ; AVX512-NEXT:    retq
519   %1 = call i16 @llvm.vector.reduce.or.v32i16(<32 x i16> %a0)
520   %2 = icmp eq i16 %1, 0
521   ret i1 %2
524 define i1 @test_v64i16(<64 x i16> %a0) {
525 ; SSE2-LABEL: test_v64i16:
526 ; SSE2:       # %bb.0:
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
539 ; SSE2-NEXT:    retq
541 ; SSE41-LABEL: test_v64i16:
542 ; SSE41:       # %bb.0:
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
552 ; SSE41-NEXT:    retq
554 ; AVX1-LABEL: test_v64i16:
555 ; AVX1:       # %bb.0:
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
562 ; AVX1-NEXT:    retq
564 ; AVX2-LABEL: test_v64i16:
565 ; AVX2:       # %bb.0:
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
572 ; AVX2-NEXT:    retq
574 ; AVX512-LABEL: test_v64i16:
575 ; AVX512:       # %bb.0:
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
582 ; AVX512-NEXT:    retq
583   %1 = call i16 @llvm.vector.reduce.or.v64i16(<64 x i16> %a0)
584   %2 = icmp ne i16 %1, 0
585   ret i1 %2
589 ; vXi8
592 define i1 @test_v2i8(<2 x i8> %a0) {
593 ; SSE-LABEL: test_v2i8:
594 ; SSE:       # %bb.0:
595 ; SSE-NEXT:    movd %xmm0, %eax
596 ; SSE-NEXT:    testw %ax, %ax
597 ; SSE-NEXT:    sete %al
598 ; SSE-NEXT:    retq
600 ; AVX-LABEL: test_v2i8:
601 ; AVX:       # %bb.0:
602 ; AVX-NEXT:    vmovd %xmm0, %eax
603 ; AVX-NEXT:    testw %ax, %ax
604 ; AVX-NEXT:    sete %al
605 ; AVX-NEXT:    retq
606   %1 = call i8 @llvm.vector.reduce.or.v2i8(<2 x i8> %a0)
607   %2 = icmp eq i8 %1, 0
608   ret i1 %2
611 define i1 @test_v4i8(<4 x i8> %a0) {
612 ; SSE-LABEL: test_v4i8:
613 ; SSE:       # %bb.0:
614 ; SSE-NEXT:    movd %xmm0, %eax
615 ; SSE-NEXT:    testl %eax, %eax
616 ; SSE-NEXT:    setne %al
617 ; SSE-NEXT:    retq
619 ; AVX-LABEL: test_v4i8:
620 ; AVX:       # %bb.0:
621 ; AVX-NEXT:    vmovd %xmm0, %eax
622 ; AVX-NEXT:    testl %eax, %eax
623 ; AVX-NEXT:    setne %al
624 ; AVX-NEXT:    retq
625   %1 = call i8 @llvm.vector.reduce.or.v4i8(<4 x i8> %a0)
626   %2 = icmp ne i8 %1, 0
627   ret i1 %2
630 define i1 @test_v8i8(<8 x i8> %a0) {
631 ; SSE-LABEL: test_v8i8:
632 ; SSE:       # %bb.0:
633 ; SSE-NEXT:    movq %xmm0, %rax
634 ; SSE-NEXT:    testq %rax, %rax
635 ; SSE-NEXT:    sete %al
636 ; SSE-NEXT:    retq
638 ; AVX-LABEL: test_v8i8:
639 ; AVX:       # %bb.0:
640 ; AVX-NEXT:    vmovq %xmm0, %rax
641 ; AVX-NEXT:    testq %rax, %rax
642 ; AVX-NEXT:    sete %al
643 ; AVX-NEXT:    retq
644   %1 = call i8 @llvm.vector.reduce.or.v8i8(<8 x i8> %a0)
645   %2 = icmp eq i8 %1, 0
646   ret i1 %2
649 define i1 @test_v16i8(<16 x i8> %a0) {
650 ; SSE2-LABEL: test_v16i8:
651 ; SSE2:       # %bb.0:
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
657 ; SSE2-NEXT:    retq
659 ; SSE41-LABEL: test_v16i8:
660 ; SSE41:       # %bb.0:
661 ; SSE41-NEXT:    ptest %xmm0, %xmm0
662 ; SSE41-NEXT:    setne %al
663 ; SSE41-NEXT:    retq
665 ; AVX-LABEL: test_v16i8:
666 ; AVX:       # %bb.0:
667 ; AVX-NEXT:    vptest %xmm0, %xmm0
668 ; AVX-NEXT:    setne %al
669 ; AVX-NEXT:    retq
670   %1 = call i8 @llvm.vector.reduce.or.v16i8(<16 x i8> %a0)
671   %2 = icmp ne i8 %1, 0
672   ret i1 %2
675 define i1 @test_v32i8(<32 x i8> %a0) {
676 ; SSE2-LABEL: test_v32i8:
677 ; SSE2:       # %bb.0:
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
684 ; SSE2-NEXT:    retq
686 ; SSE41-LABEL: test_v32i8:
687 ; SSE41:       # %bb.0:
688 ; SSE41-NEXT:    por %xmm1, %xmm0
689 ; SSE41-NEXT:    ptest %xmm0, %xmm0
690 ; SSE41-NEXT:    sete %al
691 ; SSE41-NEXT:    retq
693 ; AVX-LABEL: test_v32i8:
694 ; AVX:       # %bb.0:
695 ; AVX-NEXT:    vptest %ymm0, %ymm0
696 ; AVX-NEXT:    sete %al
697 ; AVX-NEXT:    vzeroupper
698 ; AVX-NEXT:    retq
699   %1 = call i8 @llvm.vector.reduce.or.v32i8(<32 x i8> %a0)
700   %2 = icmp eq i8 %1, 0
701   ret i1 %2
704 define i1 @test_v64i8(<64 x i8> %a0) {
705 ; SSE2-LABEL: test_v64i8:
706 ; SSE2:       # %bb.0:
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
715 ; SSE2-NEXT:    retq
717 ; SSE41-LABEL: test_v64i8:
718 ; SSE41:       # %bb.0:
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
724 ; SSE41-NEXT:    retq
726 ; AVX1-LABEL: test_v64i8:
727 ; AVX1:       # %bb.0:
728 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
729 ; AVX1-NEXT:    vptest %ymm0, %ymm0
730 ; AVX1-NEXT:    setne %al
731 ; AVX1-NEXT:    vzeroupper
732 ; AVX1-NEXT:    retq
734 ; AVX2-LABEL: test_v64i8:
735 ; AVX2:       # %bb.0:
736 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
737 ; AVX2-NEXT:    vptest %ymm0, %ymm0
738 ; AVX2-NEXT:    setne %al
739 ; AVX2-NEXT:    vzeroupper
740 ; AVX2-NEXT:    retq
742 ; AVX512-LABEL: test_v64i8:
743 ; AVX512:       # %bb.0:
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
749 ; AVX512-NEXT:    retq
750   %1 = call i8 @llvm.vector.reduce.or.v64i8(<64 x i8> %a0)
751   %2 = icmp ne i8 %1, 0
752   ret i1 %2
755 define i1 @test_v128i8(<128 x i8> %a0) {
756 ; SSE2-LABEL: test_v128i8:
757 ; SSE2:       # %bb.0:
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
770 ; SSE2-NEXT:    retq
772 ; SSE41-LABEL: test_v128i8:
773 ; SSE41:       # %bb.0:
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
783 ; SSE41-NEXT:    retq
785 ; AVX1-LABEL: test_v128i8:
786 ; AVX1:       # %bb.0:
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
793 ; AVX1-NEXT:    retq
795 ; AVX2-LABEL: test_v128i8:
796 ; AVX2:       # %bb.0:
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
803 ; AVX2-NEXT:    retq
805 ; AVX512-LABEL: test_v128i8:
806 ; AVX512:       # %bb.0:
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
813 ; AVX512-NEXT:    retq
814   %1 = call i8 @llvm.vector.reduce.or.v128i8(<128 x i8> %a0)
815   %2 = icmp eq i8 %1, 0
816   ret i1 %2
820 ; Compare Truncated/Masked OR Reductions
823 define i1 @trunc_v2i64(<2 x i64> %a0) {
824 ; SSE2-LABEL: trunc_v2i64:
825 ; SSE2:       # %bb.0:
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
831 ; SSE2-NEXT:    retq
833 ; SSE41-LABEL: trunc_v2i64:
834 ; SSE41:       # %bb.0:
835 ; SSE41-NEXT:    ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
836 ; SSE41-NEXT:    sete %al
837 ; SSE41-NEXT:    retq
839 ; AVX-LABEL: trunc_v2i64:
840 ; AVX:       # %bb.0:
841 ; AVX-NEXT:    vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
842 ; AVX-NEXT:    sete %al
843 ; AVX-NEXT:    retq
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
847   ret i1 %3
850 define i1 @mask_v8i32(<8 x i32> %a0) {
851 ; SSE2-LABEL: mask_v8i32:
852 ; SSE2:       # %bb.0:
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
860 ; SSE2-NEXT:    retq
862 ; SSE41-LABEL: mask_v8i32:
863 ; SSE41:       # %bb.0:
864 ; SSE41-NEXT:    por %xmm1, %xmm0
865 ; SSE41-NEXT:    ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
866 ; SSE41-NEXT:    sete %al
867 ; SSE41-NEXT:    retq
869 ; AVX1-LABEL: mask_v8i32:
870 ; AVX1:       # %bb.0:
871 ; AVX1-NEXT:    vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
872 ; AVX1-NEXT:    sete %al
873 ; AVX1-NEXT:    vzeroupper
874 ; AVX1-NEXT:    retq
876 ; AVX2-LABEL: mask_v8i32:
877 ; AVX2:       # %bb.0:
878 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [9223372039002259456,9223372039002259456,9223372039002259456,9223372039002259456]
879 ; AVX2-NEXT:    vptest %ymm1, %ymm0
880 ; AVX2-NEXT:    sete %al
881 ; AVX2-NEXT:    vzeroupper
882 ; AVX2-NEXT:    retq
884 ; AVX512-LABEL: mask_v8i32:
885 ; AVX512:       # %bb.0:
886 ; AVX512-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [9223372039002259456,9223372039002259456,9223372039002259456,9223372039002259456]
887 ; AVX512-NEXT:    vptest %ymm1, %ymm0
888 ; AVX512-NEXT:    sete %al
889 ; AVX512-NEXT:    vzeroupper
890 ; AVX512-NEXT:    retq
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
894   ret i1 %3
897 define i1 @trunc_v16i16(<16 x i16> %a0) {
898 ; SSE2-LABEL: trunc_v16i16:
899 ; SSE2:       # %bb.0:
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
907 ; SSE2-NEXT:    retq
909 ; SSE41-LABEL: trunc_v16i16:
910 ; SSE41:       # %bb.0:
911 ; SSE41-NEXT:    por %xmm1, %xmm0
912 ; SSE41-NEXT:    ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
913 ; SSE41-NEXT:    setne %al
914 ; SSE41-NEXT:    retq
916 ; AVX1-LABEL: trunc_v16i16:
917 ; AVX1:       # %bb.0:
918 ; AVX1-NEXT:    vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
919 ; AVX1-NEXT:    setne %al
920 ; AVX1-NEXT:    vzeroupper
921 ; AVX1-NEXT:    retq
923 ; AVX2-LABEL: trunc_v16i16:
924 ; AVX2:       # %bb.0:
925 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [71777214294589695,71777214294589695,71777214294589695,71777214294589695]
926 ; AVX2-NEXT:    vptest %ymm1, %ymm0
927 ; AVX2-NEXT:    setne %al
928 ; AVX2-NEXT:    vzeroupper
929 ; AVX2-NEXT:    retq
931 ; AVX512-LABEL: trunc_v16i16:
932 ; AVX512:       # %bb.0:
933 ; AVX512-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [71777214294589695,71777214294589695,71777214294589695,71777214294589695]
934 ; AVX512-NEXT:    vptest %ymm1, %ymm0
935 ; AVX512-NEXT:    setne %al
936 ; AVX512-NEXT:    vzeroupper
937 ; AVX512-NEXT:    retq
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
941   ret i1 %3
944 define i1 @mask_v128i8(<128 x i8> %a0) {
945 ; SSE2-LABEL: mask_v128i8:
946 ; SSE2:       # %bb.0:
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
960 ; SSE2-NEXT:    retq
962 ; SSE41-LABEL: mask_v128i8:
963 ; SSE41:       # %bb.0:
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
973 ; SSE41-NEXT:    retq
975 ; AVX1-LABEL: mask_v128i8:
976 ; AVX1:       # %bb.0:
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
983 ; AVX1-NEXT:    retq
985 ; AVX2-LABEL: mask_v128i8:
986 ; AVX2:       # %bb.0:
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
994 ; AVX2-NEXT:    retq
996 ; AVX512-LABEL: mask_v128i8:
997 ; AVX512:       # %bb.0:
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
1005 ; AVX512-NEXT:    retq
1006   %1 = call i8 @llvm.vector.reduce.or.v128i8(<128 x i8> %a0)
1007   %2 = and i8 %1, 1
1008   %3 = icmp eq i8 %2, 0
1009   ret i1 %3
1012 %struct.Box = type { i32, i32, i32, i32 }
1013 define zeroext i1 @PR44781(%struct.Box* %0) {
1014 ; SSE2-LABEL: PR44781:
1015 ; SSE2:       # %bb.0:
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
1023 ; SSE2-NEXT:    retq
1025 ; SSE41-LABEL: PR44781:
1026 ; SSE41:       # %bb.0:
1027 ; SSE41-NEXT:    movdqu (%rdi), %xmm0
1028 ; SSE41-NEXT:    ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1029 ; SSE41-NEXT:    sete %al
1030 ; SSE41-NEXT:    retq
1032 ; AVX-LABEL: PR44781:
1033 ; AVX:       # %bb.0:
1034 ; AVX-NEXT:    vmovdqu (%rdi), %xmm0
1035 ; AVX-NEXT:    vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1036 ; AVX-NEXT:    sete %al
1037 ; AVX-NEXT:    retq
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)
1041   %5 = and i32 %4, 15
1042   %6 = icmp eq i32 %5, 0
1043   ret i1 %6
1046 define i32 @mask_v3i1(<3 x i32> %a, <3 x i32> %b) {
1047 ; SSE2-LABEL: mask_v3i1:
1048 ; SSE2:       # %bb.0:
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
1063 ; SSE2-NEXT:    retq
1064 ; SSE2-NEXT:  .LBB27_2:
1065 ; SSE2-NEXT:    movl $1, %eax
1066 ; SSE2-NEXT:    retq
1068 ; SSE41-LABEL: mask_v3i1:
1069 ; SSE41:       # %bb.0:
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
1082 ; SSE41-NEXT:    retq
1083 ; SSE41-NEXT:  .LBB27_2:
1084 ; SSE41-NEXT:    movl $1, %eax
1085 ; SSE41-NEXT:    retq
1087 ; AVX1-LABEL: mask_v3i1:
1088 ; AVX1:       # %bb.0:
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
1101 ; AVX1-NEXT:    retq
1102 ; AVX1-NEXT:  .LBB27_2:
1103 ; AVX1-NEXT:    movl $1, %eax
1104 ; AVX1-NEXT:    retq
1106 ; AVX2-LABEL: mask_v3i1:
1107 ; AVX2:       # %bb.0:
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
1120 ; AVX2-NEXT:    retq
1121 ; AVX2-NEXT:  .LBB27_2:
1122 ; AVX2-NEXT:    movl $1, %eax
1123 ; AVX2-NEXT:    retq
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
1166   ret i32 0
1168   ret i32 1
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>)