xref: /llvm-project/llvm/test/CodeGen/X86/vector-reduce-or-cmp.ll (revision 254cdcddd65efe3c045d49853239932ab07121d5)
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
9
10;
11; vXi64
12;
13
14define 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
23;
24; SSE41-LABEL: test_v2i64:
25; SSE41:       # %bb.0:
26; SSE41-NEXT:    ptest %xmm0, %xmm0
27; SSE41-NEXT:    sete %al
28; SSE41-NEXT:    retq
29;
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
38}
39
40define 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
50;
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
57;
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
67}
68
69define 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
81;
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
90;
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
98;
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
106;
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
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, %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
135;
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
148;
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
158;
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
168;
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
180}
181
182;
183; vXi32
184;
185
186define 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
193;
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
203}
204
205define 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
214;
215; SSE41-LABEL: test_v4i32:
216; SSE41:       # %bb.0:
217; SSE41-NEXT:    ptest %xmm0, %xmm0
218; SSE41-NEXT:    setne %al
219; SSE41-NEXT:    retq
220;
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
229}
230
231define 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
241;
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
248;
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
258}
259
260define 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
272;
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
281;
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
289;
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
297;
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
308}
309
310define 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
326;
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
339;
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
349;
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
359;
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
371}
372
373;
374; vXi16
375;
376
377define 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
384;
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
394}
395
396define 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
403;
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
413}
414
415define 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
424;
425; SSE41-LABEL: test_v8i16:
426; SSE41:       # %bb.0:
427; SSE41-NEXT:    ptest %xmm0, %xmm0
428; SSE41-NEXT:    sete %al
429; SSE41-NEXT:    retq
430;
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
439}
440
441define 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
451;
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
458;
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
468}
469
470define 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
482;
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
491;
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
499;
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
507;
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
518}
519
520define 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
536;
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
549;
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
559;
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
569;
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
581}
582
583;
584; vXi8
585;
586
587define 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
594;
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
604}
605
606define 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
613;
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
623}
624
625define 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
632;
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
642}
643
644define 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
653;
654; SSE41-LABEL: test_v16i8:
655; SSE41:       # %bb.0:
656; SSE41-NEXT:    ptest %xmm0, %xmm0
657; SSE41-NEXT:    setne %al
658; SSE41-NEXT:    retq
659;
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
668}
669
670define 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
680;
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
687;
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
697}
698
699define 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
711;
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
720;
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
728;
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
736;
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
747}
748
749define 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
765;
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
778;
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
788;
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
798;
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
810}
811
812;
813; Compare Truncated/Masked OR Reductions
814;
815
816define 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
825;
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
831;
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
837;
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
843;
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
849;
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
860}
861
862define 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
870;
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
877;
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
884;
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
892;
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
904}
905
906define 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
917;
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
924;
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
935}
936
937define 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
952;
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
965;
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
975;
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
986;
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
999}
1000
1001%struct.Box = type { i32, i32, i32, i32 }
1002define 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
1013;
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
1020;
1021; AVX1-LABEL: PR44781:
1022; AVX1:       # %bb.0:
1023; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm0 = [15,15,15,15]
1024; AVX1-NEXT:    vptest (%rdi), %xmm0
1025; AVX1-NEXT:    sete %al
1026; AVX1-NEXT:    retq
1027;
1028; AVX2-LABEL: PR44781:
1029; AVX2:       # %bb.0:
1030; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm0 = [15,15,15,15]
1031; AVX2-NEXT:    vptest (%rdi), %xmm0
1032; AVX2-NEXT:    sete %al
1033; AVX2-NEXT:    retq
1034;
1035; AVX512F-LABEL: PR44781:
1036; AVX512F:       # %bb.0:
1037; AVX512F-NEXT:    vpbroadcastd {{.*#+}} xmm0 = [15,15,15,15]
1038; AVX512F-NEXT:    vptest (%rdi), %xmm0
1039; AVX512F-NEXT:    sete %al
1040; AVX512F-NEXT:    retq
1041;
1042; AVX512BW-LABEL: PR44781:
1043; AVX512BW:       # %bb.0:
1044; AVX512BW-NEXT:    vpbroadcastd {{.*#+}} xmm0 = [15,15,15,15]
1045; AVX512BW-NEXT:    vptest (%rdi), %xmm0
1046; AVX512BW-NEXT:    sete %al
1047; AVX512BW-NEXT:    retq
1048;
1049; AVX512BWVL-LABEL: PR44781:
1050; AVX512BWVL:       # %bb.0:
1051; AVX512BWVL-NEXT:    vpbroadcastq {{.*#+}} xmm0 = [64424509455,64424509455]
1052; AVX512BWVL-NEXT:    vptest (%rdi), %xmm0
1053; AVX512BWVL-NEXT:    sete %al
1054; AVX512BWVL-NEXT:    retq
1055  %2 = load <4 x i32>, ptr %0, align 4
1056  %3 = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> %2)
1057  %4 = and i32 %3, 15
1058  %5 = icmp eq i32 %4, 0
1059  ret i1 %5
1060}
1061
1062define i32 @mask_v3i1(<3 x i32> %a, <3 x i32> %b) {
1063; SSE2-LABEL: mask_v3i1:
1064; SSE2:       # %bb.0:
1065; SSE2-NEXT:    pcmpeqd %xmm1, %xmm0
1066; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
1067; SSE2-NEXT:    pxor %xmm0, %xmm1
1068; SSE2-NEXT:    movd %xmm1, %eax
1069; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
1070; SSE2-NEXT:    movd %xmm0, %ecx
1071; SSE2-NEXT:    orl %eax, %ecx
1072; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
1073; SSE2-NEXT:    movd %xmm0, %eax
1074; SSE2-NEXT:    orl %ecx, %eax
1075; SSE2-NEXT:    testb $1, %al
1076; SSE2-NEXT:    je .LBB27_2
1077; SSE2-NEXT:  # %bb.1:
1078; SSE2-NEXT:    xorl %eax, %eax
1079; SSE2-NEXT:    retq
1080; SSE2-NEXT:  .LBB27_2:
1081; SSE2-NEXT:    movl $1, %eax
1082; SSE2-NEXT:    retq
1083;
1084; SSE41-LABEL: mask_v3i1:
1085; SSE41:       # %bb.0:
1086; SSE41-NEXT:    pcmpeqd %xmm1, %xmm0
1087; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
1088; SSE41-NEXT:    pxor %xmm0, %xmm1
1089; SSE41-NEXT:    pextrd $1, %xmm1, %eax
1090; SSE41-NEXT:    movd %xmm1, %ecx
1091; SSE41-NEXT:    orl %eax, %ecx
1092; SSE41-NEXT:    pextrd $2, %xmm1, %eax
1093; SSE41-NEXT:    orl %ecx, %eax
1094; SSE41-NEXT:    testb $1, %al
1095; SSE41-NEXT:    je .LBB27_2
1096; SSE41-NEXT:  # %bb.1:
1097; SSE41-NEXT:    xorl %eax, %eax
1098; SSE41-NEXT:    retq
1099; SSE41-NEXT:  .LBB27_2:
1100; SSE41-NEXT:    movl $1, %eax
1101; SSE41-NEXT:    retq
1102;
1103; AVX1OR2-LABEL: mask_v3i1:
1104; AVX1OR2:       # %bb.0:
1105; AVX1OR2-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
1106; AVX1OR2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1107; AVX1OR2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1108; AVX1OR2-NEXT:    vpextrd $1, %xmm0, %eax
1109; AVX1OR2-NEXT:    vmovd %xmm0, %ecx
1110; AVX1OR2-NEXT:    orl %eax, %ecx
1111; AVX1OR2-NEXT:    vpextrd $2, %xmm0, %eax
1112; AVX1OR2-NEXT:    orl %ecx, %eax
1113; AVX1OR2-NEXT:    testb $1, %al
1114; AVX1OR2-NEXT:    je .LBB27_2
1115; AVX1OR2-NEXT:  # %bb.1:
1116; AVX1OR2-NEXT:    xorl %eax, %eax
1117; AVX1OR2-NEXT:    retq
1118; AVX1OR2-NEXT:  .LBB27_2:
1119; AVX1OR2-NEXT:    movl $1, %eax
1120; AVX1OR2-NEXT:    retq
1121;
1122; AVX512F-LABEL: mask_v3i1:
1123; AVX512F:       # %bb.0:
1124; AVX512F-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
1125; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1126; AVX512F-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0
1127; AVX512F-NEXT:    kshiftrw $2, %k0, %k1
1128; AVX512F-NEXT:    korw %k1, %k0, %k1
1129; AVX512F-NEXT:    kshiftrw $1, %k0, %k0
1130; AVX512F-NEXT:    korw %k0, %k1, %k0
1131; AVX512F-NEXT:    kmovw %k0, %eax
1132; AVX512F-NEXT:    testb $1, %al
1133; AVX512F-NEXT:    je .LBB27_2
1134; AVX512F-NEXT:  # %bb.1:
1135; AVX512F-NEXT:    xorl %eax, %eax
1136; AVX512F-NEXT:    vzeroupper
1137; AVX512F-NEXT:    retq
1138; AVX512F-NEXT:  .LBB27_2:
1139; AVX512F-NEXT:    movl $1, %eax
1140; AVX512F-NEXT:    vzeroupper
1141; AVX512F-NEXT:    retq
1142;
1143; AVX512BW-LABEL: mask_v3i1:
1144; AVX512BW:       # %bb.0:
1145; AVX512BW-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
1146; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1147; AVX512BW-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0
1148; AVX512BW-NEXT:    kshiftrw $2, %k0, %k1
1149; AVX512BW-NEXT:    korw %k1, %k0, %k1
1150; AVX512BW-NEXT:    kshiftrw $1, %k0, %k0
1151; AVX512BW-NEXT:    korw %k0, %k1, %k0
1152; AVX512BW-NEXT:    kmovd %k0, %eax
1153; AVX512BW-NEXT:    testb $1, %al
1154; AVX512BW-NEXT:    je .LBB27_2
1155; AVX512BW-NEXT:  # %bb.1:
1156; AVX512BW-NEXT:    xorl %eax, %eax
1157; AVX512BW-NEXT:    vzeroupper
1158; AVX512BW-NEXT:    retq
1159; AVX512BW-NEXT:  .LBB27_2:
1160; AVX512BW-NEXT:    movl $1, %eax
1161; AVX512BW-NEXT:    vzeroupper
1162; AVX512BW-NEXT:    retq
1163;
1164; AVX512BWVL-LABEL: mask_v3i1:
1165; AVX512BWVL:       # %bb.0:
1166; AVX512BWVL-NEXT:    vpcmpneqd %xmm1, %xmm0, %k0
1167; AVX512BWVL-NEXT:    kshiftrw $2, %k0, %k1
1168; AVX512BWVL-NEXT:    korw %k1, %k0, %k1
1169; AVX512BWVL-NEXT:    kshiftrw $1, %k0, %k0
1170; AVX512BWVL-NEXT:    korw %k0, %k1, %k0
1171; AVX512BWVL-NEXT:    kmovd %k0, %eax
1172; AVX512BWVL-NEXT:    testb $1, %al
1173; AVX512BWVL-NEXT:    je .LBB27_2
1174; AVX512BWVL-NEXT:  # %bb.1:
1175; AVX512BWVL-NEXT:    xorl %eax, %eax
1176; AVX512BWVL-NEXT:    retq
1177; AVX512BWVL-NEXT:  .LBB27_2:
1178; AVX512BWVL-NEXT:    movl $1, %eax
1179; AVX512BWVL-NEXT:    retq
1180  %1 = icmp ne <3 x i32> %a, %b
1181  %2 = call i1 @llvm.vector.reduce.or.v3i1(<3 x i1> %1)
1182  br i1 %2, label %3, label %4
11833:
1184  ret i32 0
11854:
1186  ret i32 1
1187}
1188
1189declare i64 @llvm.vector.reduce.or.v2i64(<2 x i64>)
1190declare i64 @llvm.vector.reduce.or.v4i64(<4 x i64>)
1191declare i64 @llvm.vector.reduce.or.v8i64(<8 x i64>)
1192declare i64 @llvm.vector.reduce.or.v16i64(<16 x i64>)
1193
1194declare i32 @llvm.vector.reduce.or.v2i32(<2 x i32>)
1195declare i32 @llvm.vector.reduce.or.v4i32(<4 x i32>)
1196declare i32 @llvm.vector.reduce.or.v8i32(<8 x i32>)
1197declare i32 @llvm.vector.reduce.or.v16i32(<16 x i32>)
1198declare i32 @llvm.vector.reduce.or.v32i32(<32 x i32>)
1199
1200declare i16 @llvm.vector.reduce.or.v2i16(<2 x i16>)
1201declare i16 @llvm.vector.reduce.or.v4i16(<4 x i16>)
1202declare i16 @llvm.vector.reduce.or.v8i16(<8 x i16>)
1203declare i16 @llvm.vector.reduce.or.v16i16(<16 x i16>)
1204declare i16 @llvm.vector.reduce.or.v32i16(<32 x i16>)
1205declare i16 @llvm.vector.reduce.or.v64i16(<64 x i16>)
1206
1207declare i8 @llvm.vector.reduce.or.v2i8(<2 x i8>)
1208declare i8 @llvm.vector.reduce.or.v4i8(<4 x i8>)
1209declare i8 @llvm.vector.reduce.or.v8i8(<8 x i8>)
1210declare i8 @llvm.vector.reduce.or.v16i8(<16 x i8>)
1211declare i8 @llvm.vector.reduce.or.v32i8(<32 x i8>)
1212declare i8 @llvm.vector.reduce.or.v64i8(<64 x i8>)
1213declare i8 @llvm.vector.reduce.or.v128i8(<128 x i8>)
1214
1215declare i1 @llvm.vector.reduce.or.v3i1(<3 x i1>)
1216