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
8
9;
10; vXi64
11;
12
13define 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
22;
23; SSE41-LABEL: test_v2i64:
24; SSE41:       # %bb.0:
25; SSE41-NEXT:    ptest %xmm0, %xmm0
26; SSE41-NEXT:    sete %al
27; SSE41-NEXT:    retq
28;
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
37}
38
39define 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
49;
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
56;
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
66}
67
68define 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
80;
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
89;
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
97;
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
105;
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
117}
118
119define 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
135;
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
148;
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
158;
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
168;
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
181}
182
183;
184; vXi32
185;
186
187define 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
194;
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
204}
205
206define 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
215;
216; SSE41-LABEL: test_v4i32:
217; SSE41:       # %bb.0:
218; SSE41-NEXT:    ptest %xmm0, %xmm0
219; SSE41-NEXT:    setne %al
220; SSE41-NEXT:    retq
221;
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
230}
231
232define 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
242;
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
249;
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
259}
260
261define 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
273;
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
282;
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
290;
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
298;
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
310}
311
312define 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
328;
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
341;
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
351;
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
361;
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
374}
375
376;
377; vXi16
378;
379
380define 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
387;
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
397}
398
399define 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
406;
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
416}
417
418define 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
427;
428; SSE41-LABEL: test_v8i16:
429; SSE41:       # %bb.0:
430; SSE41-NEXT:    ptest %xmm0, %xmm0
431; SSE41-NEXT:    sete %al
432; SSE41-NEXT:    retq
433;
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
442}
443
444define 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
454;
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
461;
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
471}
472
473define 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
485;
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
494;
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
502;
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
510;
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
522}
523
524define 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
540;
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
553;
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
563;
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
573;
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
586}
587
588;
589; vXi8
590;
591
592define 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
599;
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
609}
610
611define 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
618;
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
628}
629
630define 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
637;
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
647}
648
649define 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
658;
659; SSE41-LABEL: test_v16i8:
660; SSE41:       # %bb.0:
661; SSE41-NEXT:    ptest %xmm0, %xmm0
662; SSE41-NEXT:    setne %al
663; SSE41-NEXT:    retq
664;
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
673}
674
675define 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
685;
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
692;
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
702}
703
704define 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
716;
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
725;
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
733;
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
741;
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
753}
754
755define 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
771;
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
784;
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
794;
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
804;
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
817}
818
819;
820; Compare Truncated/Masked OR Reductions
821;
822
823define 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
832;
833; SSE41-LABEL: trunc_v2i64:
834; SSE41:       # %bb.0:
835; SSE41-NEXT:    ptest {{.*}}(%rip), %xmm0
836; SSE41-NEXT:    sete %al
837; SSE41-NEXT:    retq
838;
839; AVX-LABEL: trunc_v2i64:
840; AVX:       # %bb.0:
841; AVX-NEXT:    vptest {{.*}}(%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
848}
849
850define 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 {{.*}}(%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
861;
862; SSE41-LABEL: mask_v8i32:
863; SSE41:       # %bb.0:
864; SSE41-NEXT:    por %xmm1, %xmm0
865; SSE41-NEXT:    ptest {{.*}}(%rip), %xmm0
866; SSE41-NEXT:    sete %al
867; SSE41-NEXT:    retq
868;
869; AVX1-LABEL: mask_v8i32:
870; AVX1:       # %bb.0:
871; AVX1-NEXT:    vptest {{.*}}(%rip), %ymm0
872; AVX1-NEXT:    sete %al
873; AVX1-NEXT:    vzeroupper
874; AVX1-NEXT:    retq
875;
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
883;
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
895}
896
897define 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 {{.*}}(%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
908;
909; SSE41-LABEL: trunc_v16i16:
910; SSE41:       # %bb.0:
911; SSE41-NEXT:    por %xmm1, %xmm0
912; SSE41-NEXT:    ptest {{.*}}(%rip), %xmm0
913; SSE41-NEXT:    setne %al
914; SSE41-NEXT:    retq
915;
916; AVX1-LABEL: trunc_v16i16:
917; AVX1:       # %bb.0:
918; AVX1-NEXT:    vptest {{.*}}(%rip), %ymm0
919; AVX1-NEXT:    setne %al
920; AVX1-NEXT:    vzeroupper
921; AVX1-NEXT:    retq
922;
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
930;
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
942}
943
944define 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 {{.*}}(%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
961;
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 {{.*}}(%rip), %xmm2
972; SSE41-NEXT:    sete %al
973; SSE41-NEXT:    retq
974;
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 {{.*}}(%rip), %ymm0
981; AVX1-NEXT:    sete %al
982; AVX1-NEXT:    vzeroupper
983; AVX1-NEXT:    retq
984;
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
995;
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
1010}
1011
1012%struct.Box = type { i32, i32, i32, i32 }
1013define zeroext i1 @PR44781(%struct.Box* %0) {
1014; SSE2-LABEL: PR44781:
1015; SSE2:       # %bb.0:
1016; SSE2-NEXT:    movdqu (%rdi), %xmm0
1017; SSE2-NEXT:    pand {{.*}}(%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
1024;
1025; SSE41-LABEL: PR44781:
1026; SSE41:       # %bb.0:
1027; SSE41-NEXT:    movdqu (%rdi), %xmm0
1028; SSE41-NEXT:    ptest {{.*}}(%rip), %xmm0
1029; SSE41-NEXT:    sete %al
1030; SSE41-NEXT:    retq
1031;
1032; AVX-LABEL: PR44781:
1033; AVX:       # %bb.0:
1034; AVX-NEXT:    vmovdqu (%rdi), %xmm0
1035; AVX-NEXT:    vptest {{.*}}(%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
1044}
1045
1046define 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
1067;
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
1086;
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
1105;
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
1124;
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
1145;
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
11653:
1166  ret i32 0
11674:
1168  ret i32 1
1169}
1170
1171declare i64 @llvm.vector.reduce.or.v2i64(<2 x i64>)
1172declare i64 @llvm.vector.reduce.or.v4i64(<4 x i64>)
1173declare i64 @llvm.vector.reduce.or.v8i64(<8 x i64>)
1174declare i64 @llvm.vector.reduce.or.v16i64(<16 x i64>)
1175
1176declare i32 @llvm.vector.reduce.or.v2i32(<2 x i32>)
1177declare i32 @llvm.vector.reduce.or.v4i32(<4 x i32>)
1178declare i32 @llvm.vector.reduce.or.v8i32(<8 x i32>)
1179declare i32 @llvm.vector.reduce.or.v16i32(<16 x i32>)
1180declare i32 @llvm.vector.reduce.or.v32i32(<32 x i32>)
1181
1182declare i16 @llvm.vector.reduce.or.v2i16(<2 x i16>)
1183declare i16 @llvm.vector.reduce.or.v4i16(<4 x i16>)
1184declare i16 @llvm.vector.reduce.or.v8i16(<8 x i16>)
1185declare i16 @llvm.vector.reduce.or.v16i16(<16 x i16>)
1186declare i16 @llvm.vector.reduce.or.v32i16(<32 x i16>)
1187declare i16 @llvm.vector.reduce.or.v64i16(<64 x i16>)
1188
1189declare i8 @llvm.vector.reduce.or.v2i8(<2 x i8>)
1190declare i8 @llvm.vector.reduce.or.v4i8(<4 x i8>)
1191declare i8 @llvm.vector.reduce.or.v8i8(<8 x i8>)
1192declare i8 @llvm.vector.reduce.or.v16i8(<16 x i8>)
1193declare i8 @llvm.vector.reduce.or.v32i8(<32 x i8>)
1194declare i8 @llvm.vector.reduce.or.v64i8(<64 x i8>)
1195declare i8 @llvm.vector.reduce.or.v128i8(<128 x i8>)
1196
1197declare i1 @llvm.vector.reduce.or.v3i1(<3 x i1>)
1198