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 | FileCheck %s --check-prefixes=AVX512,AVX512F
7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX512,AVX512BW
8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VL
9
10;
11; Truncate
12;
13
14define i1 @trunc_v2i64_v2i1(<2 x i64>) {
15; SSE-LABEL: trunc_v2i64_v2i1:
16; SSE:       # %bb.0:
17; SSE-NEXT:    psllq $63, %xmm0
18; SSE-NEXT:    movmskpd %xmm0, %eax
19; SSE-NEXT:    testb %al, %al
20; SSE-NEXT:    setne %al
21; SSE-NEXT:    retq
22;
23; AVX-LABEL: trunc_v2i64_v2i1:
24; AVX:       # %bb.0:
25; AVX-NEXT:    vpsllq $63, %xmm0, %xmm0
26; AVX-NEXT:    vmovmskpd %xmm0, %eax
27; AVX-NEXT:    testb %al, %al
28; AVX-NEXT:    setne %al
29; AVX-NEXT:    retq
30;
31; AVX512F-LABEL: trunc_v2i64_v2i1:
32; AVX512F:       # %bb.0:
33; AVX512F-NEXT:    vpsllq $63, %xmm0, %xmm0
34; AVX512F-NEXT:    vptestmq %zmm0, %zmm0, %k0
35; AVX512F-NEXT:    kmovw %k0, %eax
36; AVX512F-NEXT:    testb $3, %al
37; AVX512F-NEXT:    setne %al
38; AVX512F-NEXT:    vzeroupper
39; AVX512F-NEXT:    retq
40;
41; AVX512BW-LABEL: trunc_v2i64_v2i1:
42; AVX512BW:       # %bb.0:
43; AVX512BW-NEXT:    vpsllq $63, %xmm0, %xmm0
44; AVX512BW-NEXT:    vptestmq %zmm0, %zmm0, %k0
45; AVX512BW-NEXT:    kmovd %k0, %eax
46; AVX512BW-NEXT:    testb $3, %al
47; AVX512BW-NEXT:    setne %al
48; AVX512BW-NEXT:    vzeroupper
49; AVX512BW-NEXT:    retq
50;
51; AVX512VL-LABEL: trunc_v2i64_v2i1:
52; AVX512VL:       # %bb.0:
53; AVX512VL-NEXT:    vpsllq $63, %xmm0, %xmm0
54; AVX512VL-NEXT:    vptestmq %xmm0, %xmm0, %k0
55; AVX512VL-NEXT:    kmovd %k0, %eax
56; AVX512VL-NEXT:    testb %al, %al
57; AVX512VL-NEXT:    setne %al
58; AVX512VL-NEXT:    retq
59  %a = trunc <2 x i64> %0 to <2 x i1>
60  %b = call i1 @llvm.experimental.vector.reduce.or.v2i1(<2 x i1> %a)
61  ret i1 %b
62}
63
64define i1 @trunc_v4i32_v4i1(<4 x i32>) {
65; SSE-LABEL: trunc_v4i32_v4i1:
66; SSE:       # %bb.0:
67; SSE-NEXT:    pslld $31, %xmm0
68; SSE-NEXT:    movmskps %xmm0, %eax
69; SSE-NEXT:    testb %al, %al
70; SSE-NEXT:    setne %al
71; SSE-NEXT:    retq
72;
73; AVX-LABEL: trunc_v4i32_v4i1:
74; AVX:       # %bb.0:
75; AVX-NEXT:    vpslld $31, %xmm0, %xmm0
76; AVX-NEXT:    vmovmskps %xmm0, %eax
77; AVX-NEXT:    testb %al, %al
78; AVX-NEXT:    setne %al
79; AVX-NEXT:    retq
80;
81; AVX512F-LABEL: trunc_v4i32_v4i1:
82; AVX512F:       # %bb.0:
83; AVX512F-NEXT:    vpslld $31, %xmm0, %xmm0
84; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k0
85; AVX512F-NEXT:    kmovw %k0, %eax
86; AVX512F-NEXT:    testb $15, %al
87; AVX512F-NEXT:    setne %al
88; AVX512F-NEXT:    vzeroupper
89; AVX512F-NEXT:    retq
90;
91; AVX512BW-LABEL: trunc_v4i32_v4i1:
92; AVX512BW:       # %bb.0:
93; AVX512BW-NEXT:    vpslld $31, %xmm0, %xmm0
94; AVX512BW-NEXT:    vptestmd %zmm0, %zmm0, %k0
95; AVX512BW-NEXT:    kmovd %k0, %eax
96; AVX512BW-NEXT:    testb $15, %al
97; AVX512BW-NEXT:    setne %al
98; AVX512BW-NEXT:    vzeroupper
99; AVX512BW-NEXT:    retq
100;
101; AVX512VL-LABEL: trunc_v4i32_v4i1:
102; AVX512VL:       # %bb.0:
103; AVX512VL-NEXT:    vpslld $31, %xmm0, %xmm0
104; AVX512VL-NEXT:    vptestmd %xmm0, %xmm0, %k0
105; AVX512VL-NEXT:    kmovd %k0, %eax
106; AVX512VL-NEXT:    testb %al, %al
107; AVX512VL-NEXT:    setne %al
108; AVX512VL-NEXT:    retq
109  %a = trunc <4 x i32> %0 to <4 x i1>
110  %b = call i1 @llvm.experimental.vector.reduce.or.v4i1(<4 x i1> %a)
111  ret i1 %b
112}
113
114define i1 @trunc_v8i16_v8i1(<8 x i8>) {
115; SSE2-LABEL: trunc_v8i16_v8i1:
116; SSE2:       # %bb.0:
117; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
118; SSE2-NEXT:    psllw $15, %xmm0
119; SSE2-NEXT:    packsswb %xmm0, %xmm0
120; SSE2-NEXT:    pmovmskb %xmm0, %eax
121; SSE2-NEXT:    testb %al, %al
122; SSE2-NEXT:    setne %al
123; SSE2-NEXT:    retq
124;
125; SSE41-LABEL: trunc_v8i16_v8i1:
126; SSE41:       # %bb.0:
127; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
128; SSE41-NEXT:    psllw $15, %xmm0
129; SSE41-NEXT:    packsswb %xmm0, %xmm0
130; SSE41-NEXT:    pmovmskb %xmm0, %eax
131; SSE41-NEXT:    testb %al, %al
132; SSE41-NEXT:    setne %al
133; SSE41-NEXT:    retq
134;
135; AVX-LABEL: trunc_v8i16_v8i1:
136; AVX:       # %bb.0:
137; AVX-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
138; AVX-NEXT:    vpsllw $15, %xmm0, %xmm0
139; AVX-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
140; AVX-NEXT:    vpmovmskb %xmm0, %eax
141; AVX-NEXT:    testb %al, %al
142; AVX-NEXT:    setne %al
143; AVX-NEXT:    retq
144;
145; AVX512F-LABEL: trunc_v8i16_v8i1:
146; AVX512F:       # %bb.0:
147; AVX512F-NEXT:    vpmovsxbd %xmm0, %zmm0
148; AVX512F-NEXT:    vpslld $31, %zmm0, %zmm0
149; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k0
150; AVX512F-NEXT:    kmovw %k0, %eax
151; AVX512F-NEXT:    testb %al, %al
152; AVX512F-NEXT:    setne %al
153; AVX512F-NEXT:    vzeroupper
154; AVX512F-NEXT:    retq
155;
156; AVX512BW-LABEL: trunc_v8i16_v8i1:
157; AVX512BW:       # %bb.0:
158; AVX512BW-NEXT:    vpsllw $7, %xmm0, %xmm0
159; AVX512BW-NEXT:    vpmovb2m %zmm0, %k0
160; AVX512BW-NEXT:    kmovd %k0, %eax
161; AVX512BW-NEXT:    testb %al, %al
162; AVX512BW-NEXT:    setne %al
163; AVX512BW-NEXT:    vzeroupper
164; AVX512BW-NEXT:    retq
165;
166; AVX512VL-LABEL: trunc_v8i16_v8i1:
167; AVX512VL:       # %bb.0:
168; AVX512VL-NEXT:    vpsllw $7, %xmm0, %xmm0
169; AVX512VL-NEXT:    vpmovb2m %xmm0, %k0
170; AVX512VL-NEXT:    kmovd %k0, %eax
171; AVX512VL-NEXT:    testb %al, %al
172; AVX512VL-NEXT:    setne %al
173; AVX512VL-NEXT:    retq
174  %a = trunc <8 x i8> %0 to <8 x i1>
175  %b = call i1 @llvm.experimental.vector.reduce.or.v8i1(<8 x i1> %a)
176  ret i1 %b
177}
178
179define i1 @trunc_v16i8_v16i1(<16 x i8>) {
180; SSE-LABEL: trunc_v16i8_v16i1:
181; SSE:       # %bb.0:
182; SSE-NEXT:    psllw $7, %xmm0
183; SSE-NEXT:    pmovmskb %xmm0, %eax
184; SSE-NEXT:    testw %ax, %ax
185; SSE-NEXT:    setne %al
186; SSE-NEXT:    retq
187;
188; AVX-LABEL: trunc_v16i8_v16i1:
189; AVX:       # %bb.0:
190; AVX-NEXT:    vpsllw $7, %xmm0, %xmm0
191; AVX-NEXT:    vpmovmskb %xmm0, %eax
192; AVX-NEXT:    testw %ax, %ax
193; AVX-NEXT:    setne %al
194; AVX-NEXT:    retq
195;
196; AVX512-LABEL: trunc_v16i8_v16i1:
197; AVX512:       # %bb.0:
198; AVX512-NEXT:    vpsllw $7, %xmm0, %xmm0
199; AVX512-NEXT:    vpmovmskb %xmm0, %eax
200; AVX512-NEXT:    testw %ax, %ax
201; AVX512-NEXT:    setne %al
202; AVX512-NEXT:    retq
203  %a = trunc <16 x i8> %0 to <16 x i1>
204  %b = call i1 @llvm.experimental.vector.reduce.or.v16i1(<16 x i1> %a)
205  ret i1 %b
206}
207
208define i1 @trunc_v4i64_v4i1(<4 x i64>) {
209; SSE-LABEL: trunc_v4i64_v4i1:
210; SSE:       # %bb.0:
211; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
212; SSE-NEXT:    pslld $31, %xmm0
213; SSE-NEXT:    movmskps %xmm0, %eax
214; SSE-NEXT:    testb %al, %al
215; SSE-NEXT:    setne %al
216; SSE-NEXT:    retq
217;
218; AVX-LABEL: trunc_v4i64_v4i1:
219; AVX:       # %bb.0:
220; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm1
221; AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
222; AVX-NEXT:    vpslld $31, %xmm0, %xmm0
223; AVX-NEXT:    vmovmskps %xmm0, %eax
224; AVX-NEXT:    testb %al, %al
225; AVX-NEXT:    setne %al
226; AVX-NEXT:    vzeroupper
227; AVX-NEXT:    retq
228;
229; AVX512F-LABEL: trunc_v4i64_v4i1:
230; AVX512F:       # %bb.0:
231; AVX512F-NEXT:    vpsllq $63, %ymm0, %ymm0
232; AVX512F-NEXT:    vptestmq %zmm0, %zmm0, %k0
233; AVX512F-NEXT:    kmovw %k0, %eax
234; AVX512F-NEXT:    testb $15, %al
235; AVX512F-NEXT:    setne %al
236; AVX512F-NEXT:    vzeroupper
237; AVX512F-NEXT:    retq
238;
239; AVX512BW-LABEL: trunc_v4i64_v4i1:
240; AVX512BW:       # %bb.0:
241; AVX512BW-NEXT:    vpsllq $63, %ymm0, %ymm0
242; AVX512BW-NEXT:    vptestmq %zmm0, %zmm0, %k0
243; AVX512BW-NEXT:    kmovd %k0, %eax
244; AVX512BW-NEXT:    testb $15, %al
245; AVX512BW-NEXT:    setne %al
246; AVX512BW-NEXT:    vzeroupper
247; AVX512BW-NEXT:    retq
248;
249; AVX512VL-LABEL: trunc_v4i64_v4i1:
250; AVX512VL:       # %bb.0:
251; AVX512VL-NEXT:    vpsllq $63, %ymm0, %ymm0
252; AVX512VL-NEXT:    vptestmq %ymm0, %ymm0, %k0
253; AVX512VL-NEXT:    kmovd %k0, %eax
254; AVX512VL-NEXT:    testb %al, %al
255; AVX512VL-NEXT:    setne %al
256; AVX512VL-NEXT:    vzeroupper
257; AVX512VL-NEXT:    retq
258  %a = trunc <4 x i64> %0 to <4 x i1>
259  %b = call i1 @llvm.experimental.vector.reduce.or.v4i1(<4 x i1> %a)
260  ret i1 %b
261}
262
263define i1 @trunc_v8i32_v8i1(<8 x i32>) {
264; SSE2-LABEL: trunc_v8i32_v8i1:
265; SSE2:       # %bb.0:
266; SSE2-NEXT:    pslld $16, %xmm1
267; SSE2-NEXT:    psrad $16, %xmm1
268; SSE2-NEXT:    pslld $16, %xmm0
269; SSE2-NEXT:    psrad $16, %xmm0
270; SSE2-NEXT:    packssdw %xmm1, %xmm0
271; SSE2-NEXT:    psllw $15, %xmm0
272; SSE2-NEXT:    packsswb %xmm0, %xmm0
273; SSE2-NEXT:    pmovmskb %xmm0, %eax
274; SSE2-NEXT:    testb %al, %al
275; SSE2-NEXT:    setne %al
276; SSE2-NEXT:    retq
277;
278; SSE41-LABEL: trunc_v8i32_v8i1:
279; SSE41:       # %bb.0:
280; SSE41-NEXT:    pxor %xmm2, %xmm2
281; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3],xmm1[4],xmm2[5],xmm1[6],xmm2[7]
282; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7]
283; SSE41-NEXT:    packusdw %xmm1, %xmm0
284; SSE41-NEXT:    psllw $15, %xmm0
285; SSE41-NEXT:    packsswb %xmm0, %xmm0
286; SSE41-NEXT:    pmovmskb %xmm0, %eax
287; SSE41-NEXT:    testb %al, %al
288; SSE41-NEXT:    setne %al
289; SSE41-NEXT:    retq
290;
291; AVX1-LABEL: trunc_v8i32_v8i1:
292; AVX1:       # %bb.0:
293; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
294; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
295; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
296; AVX1-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
297; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
298; AVX1-NEXT:    vpsllw $15, %xmm0, %xmm0
299; AVX1-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
300; AVX1-NEXT:    vpmovmskb %xmm0, %eax
301; AVX1-NEXT:    testb %al, %al
302; AVX1-NEXT:    setne %al
303; AVX1-NEXT:    vzeroupper
304; AVX1-NEXT:    retq
305;
306; AVX2-LABEL: trunc_v8i32_v8i1:
307; AVX2:       # %bb.0:
308; AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
309; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
310; AVX2-NEXT:    vpsllw $15, %xmm0, %xmm0
311; AVX2-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
312; AVX2-NEXT:    vpmovmskb %xmm0, %eax
313; AVX2-NEXT:    testb %al, %al
314; AVX2-NEXT:    setne %al
315; AVX2-NEXT:    vzeroupper
316; AVX2-NEXT:    retq
317;
318; AVX512F-LABEL: trunc_v8i32_v8i1:
319; AVX512F:       # %bb.0:
320; AVX512F-NEXT:    vpslld $31, %ymm0, %ymm0
321; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k0
322; AVX512F-NEXT:    kmovw %k0, %eax
323; AVX512F-NEXT:    testb %al, %al
324; AVX512F-NEXT:    setne %al
325; AVX512F-NEXT:    vzeroupper
326; AVX512F-NEXT:    retq
327;
328; AVX512BW-LABEL: trunc_v8i32_v8i1:
329; AVX512BW:       # %bb.0:
330; AVX512BW-NEXT:    vpslld $31, %ymm0, %ymm0
331; AVX512BW-NEXT:    vptestmd %zmm0, %zmm0, %k0
332; AVX512BW-NEXT:    kmovd %k0, %eax
333; AVX512BW-NEXT:    testb %al, %al
334; AVX512BW-NEXT:    setne %al
335; AVX512BW-NEXT:    vzeroupper
336; AVX512BW-NEXT:    retq
337;
338; AVX512VL-LABEL: trunc_v8i32_v8i1:
339; AVX512VL:       # %bb.0:
340; AVX512VL-NEXT:    vpslld $31, %ymm0, %ymm0
341; AVX512VL-NEXT:    vptestmd %ymm0, %ymm0, %k0
342; AVX512VL-NEXT:    kmovd %k0, %eax
343; AVX512VL-NEXT:    testb %al, %al
344; AVX512VL-NEXT:    setne %al
345; AVX512VL-NEXT:    vzeroupper
346; AVX512VL-NEXT:    retq
347  %a = trunc <8 x i32> %0 to <8 x i1>
348  %b = call i1 @llvm.experimental.vector.reduce.or.v8i1(<8 x i1> %a)
349  ret i1 %b
350}
351
352define i1 @trunc_v16i16_v16i1(<16 x i16>) {
353; SSE-LABEL: trunc_v16i16_v16i1:
354; SSE:       # %bb.0:
355; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
356; SSE-NEXT:    pand %xmm2, %xmm1
357; SSE-NEXT:    pand %xmm2, %xmm0
358; SSE-NEXT:    packuswb %xmm1, %xmm0
359; SSE-NEXT:    psllw $7, %xmm0
360; SSE-NEXT:    pmovmskb %xmm0, %eax
361; SSE-NEXT:    testw %ax, %ax
362; SSE-NEXT:    setne %al
363; SSE-NEXT:    retq
364;
365; AVX1-LABEL: trunc_v16i16_v16i1:
366; AVX1:       # %bb.0:
367; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
368; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
369; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
370; AVX1-NEXT:    vpsllw $7, %xmm0, %xmm0
371; AVX1-NEXT:    vpmovmskb %xmm0, %eax
372; AVX1-NEXT:    testw %ax, %ax
373; AVX1-NEXT:    setne %al
374; AVX1-NEXT:    vzeroupper
375; AVX1-NEXT:    retq
376;
377; AVX2-LABEL: trunc_v16i16_v16i1:
378; AVX2:       # %bb.0:
379; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
380; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
381; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
382; AVX2-NEXT:    vpsllw $7, %xmm0, %xmm0
383; AVX2-NEXT:    vpmovmskb %xmm0, %eax
384; AVX2-NEXT:    testw %ax, %ax
385; AVX2-NEXT:    setne %al
386; AVX2-NEXT:    vzeroupper
387; AVX2-NEXT:    retq
388;
389; AVX512F-LABEL: trunc_v16i16_v16i1:
390; AVX512F:       # %bb.0:
391; AVX512F-NEXT:    vpmovsxwd %ymm0, %zmm0
392; AVX512F-NEXT:    vpslld $31, %zmm0, %zmm0
393; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k0
394; AVX512F-NEXT:    kortestw %k0, %k0
395; AVX512F-NEXT:    setne %al
396; AVX512F-NEXT:    vzeroupper
397; AVX512F-NEXT:    retq
398;
399; AVX512BW-LABEL: trunc_v16i16_v16i1:
400; AVX512BW:       # %bb.0:
401; AVX512BW-NEXT:    vpsllw $15, %ymm0, %ymm0
402; AVX512BW-NEXT:    vpmovw2m %zmm0, %k0
403; AVX512BW-NEXT:    kortestw %k0, %k0
404; AVX512BW-NEXT:    setne %al
405; AVX512BW-NEXT:    vzeroupper
406; AVX512BW-NEXT:    retq
407;
408; AVX512VL-LABEL: trunc_v16i16_v16i1:
409; AVX512VL:       # %bb.0:
410; AVX512VL-NEXT:    vpsllw $15, %ymm0, %ymm0
411; AVX512VL-NEXT:    vpmovw2m %ymm0, %k0
412; AVX512VL-NEXT:    kortestw %k0, %k0
413; AVX512VL-NEXT:    setne %al
414; AVX512VL-NEXT:    vzeroupper
415; AVX512VL-NEXT:    retq
416  %a = trunc <16 x i16> %0 to <16 x i1>
417  %b = call i1 @llvm.experimental.vector.reduce.or.v16i1(<16 x i1> %a)
418  ret i1 %b
419}
420
421define i1 @trunc_v32i8_v32i1(<32 x i8>) {
422; SSE-LABEL: trunc_v32i8_v32i1:
423; SSE:       # %bb.0:
424; SSE-NEXT:    por %xmm1, %xmm0
425; SSE-NEXT:    psllw $7, %xmm0
426; SSE-NEXT:    pmovmskb %xmm0, %eax
427; SSE-NEXT:    testw %ax, %ax
428; SSE-NEXT:    setne %al
429; SSE-NEXT:    retq
430;
431; AVX1-LABEL: trunc_v32i8_v32i1:
432; AVX1:       # %bb.0:
433; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
434; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
435; AVX1-NEXT:    vpsllw $7, %xmm0, %xmm0
436; AVX1-NEXT:    vpmovmskb %xmm0, %eax
437; AVX1-NEXT:    testw %ax, %ax
438; AVX1-NEXT:    setne %al
439; AVX1-NEXT:    vzeroupper
440; AVX1-NEXT:    retq
441;
442; AVX2-LABEL: trunc_v32i8_v32i1:
443; AVX2:       # %bb.0:
444; AVX2-NEXT:    vpsllw $7, %ymm0, %ymm0
445; AVX2-NEXT:    vpmovmskb %ymm0, %eax
446; AVX2-NEXT:    testl %eax, %eax
447; AVX2-NEXT:    setne %al
448; AVX2-NEXT:    vzeroupper
449; AVX2-NEXT:    retq
450;
451; AVX512F-LABEL: trunc_v32i8_v32i1:
452; AVX512F:       # %bb.0:
453; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm1
454; AVX512F-NEXT:    vpor %xmm1, %xmm0, %xmm0
455; AVX512F-NEXT:    vpmovsxbd %xmm0, %zmm0
456; AVX512F-NEXT:    vpslld $31, %zmm0, %zmm0
457; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k0
458; AVX512F-NEXT:    kshiftrw $8, %k0, %k1
459; AVX512F-NEXT:    korw %k1, %k0, %k0
460; AVX512F-NEXT:    kshiftrw $4, %k0, %k1
461; AVX512F-NEXT:    korw %k1, %k0, %k0
462; AVX512F-NEXT:    kshiftrw $2, %k0, %k1
463; AVX512F-NEXT:    korw %k1, %k0, %k0
464; AVX512F-NEXT:    kshiftrw $1, %k0, %k1
465; AVX512F-NEXT:    korw %k1, %k0, %k0
466; AVX512F-NEXT:    kmovw %k0, %eax
467; AVX512F-NEXT:    # kill: def $al killed $al killed $eax
468; AVX512F-NEXT:    vzeroupper
469; AVX512F-NEXT:    retq
470;
471; AVX512BW-LABEL: trunc_v32i8_v32i1:
472; AVX512BW:       # %bb.0:
473; AVX512BW-NEXT:    vpsllw $7, %ymm0, %ymm0
474; AVX512BW-NEXT:    vpmovmskb %ymm0, %eax
475; AVX512BW-NEXT:    testl %eax, %eax
476; AVX512BW-NEXT:    setne %al
477; AVX512BW-NEXT:    vzeroupper
478; AVX512BW-NEXT:    retq
479;
480; AVX512VL-LABEL: trunc_v32i8_v32i1:
481; AVX512VL:       # %bb.0:
482; AVX512VL-NEXT:    vpsllw $7, %ymm0, %ymm0
483; AVX512VL-NEXT:    vpmovmskb %ymm0, %eax
484; AVX512VL-NEXT:    testl %eax, %eax
485; AVX512VL-NEXT:    setne %al
486; AVX512VL-NEXT:    vzeroupper
487; AVX512VL-NEXT:    retq
488  %a = trunc <32 x i8> %0 to <32 x i1>
489  %b = call i1 @llvm.experimental.vector.reduce.or.v32i1(<32 x i1> %a)
490  ret i1 %b
491}
492
493define i1 @trunc_v8i64_v8i1(<8 x i64>) {
494; SSE2-LABEL: trunc_v8i64_v8i1:
495; SSE2:       # %bb.0:
496; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
497; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
498; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
499; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
500; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
501; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[0,2,2,3]
502; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,1,0,2,4,5,6,7]
503; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
504; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[0,1,0,2,4,5,6,7]
505; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
506; SSE2-NEXT:    movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
507; SSE2-NEXT:    psllw $15, %xmm2
508; SSE2-NEXT:    packsswb %xmm0, %xmm2
509; SSE2-NEXT:    pmovmskb %xmm2, %eax
510; SSE2-NEXT:    testb %al, %al
511; SSE2-NEXT:    setne %al
512; SSE2-NEXT:    retq
513;
514; SSE41-LABEL: trunc_v8i64_v8i1:
515; SSE41:       # %bb.0:
516; SSE41-NEXT:    pxor %xmm4, %xmm4
517; SSE41-NEXT:    pblendw {{.*#+}} xmm3 = xmm3[0],xmm4[1,2,3],xmm3[4],xmm4[5,6,7]
518; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0],xmm4[1,2,3],xmm2[4],xmm4[5,6,7]
519; SSE41-NEXT:    packusdw %xmm3, %xmm2
520; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0],xmm4[1,2,3],xmm1[4],xmm4[5,6,7]
521; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0],xmm4[1,2,3],xmm0[4],xmm4[5,6,7]
522; SSE41-NEXT:    packusdw %xmm1, %xmm0
523; SSE41-NEXT:    packusdw %xmm2, %xmm0
524; SSE41-NEXT:    psllw $15, %xmm0
525; SSE41-NEXT:    packsswb %xmm0, %xmm0
526; SSE41-NEXT:    pmovmskb %xmm0, %eax
527; SSE41-NEXT:    testb %al, %al
528; SSE41-NEXT:    setne %al
529; SSE41-NEXT:    retq
530;
531; AVX1-LABEL: trunc_v8i64_v8i1:
532; AVX1:       # %bb.0:
533; AVX1-NEXT:    vmovaps {{.*#+}} ymm2 = [65535,65535,65535,65535]
534; AVX1-NEXT:    vandps %ymm2, %ymm1, %ymm1
535; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
536; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
537; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
538; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
539; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
540; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
541; AVX1-NEXT:    vpsllw $15, %xmm0, %xmm0
542; AVX1-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
543; AVX1-NEXT:    vpmovmskb %xmm0, %eax
544; AVX1-NEXT:    testb %al, %al
545; AVX1-NEXT:    setne %al
546; AVX1-NEXT:    vzeroupper
547; AVX1-NEXT:    retq
548;
549; AVX2-LABEL: trunc_v8i64_v8i1:
550; AVX2:       # %bb.0:
551; AVX2-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]
552; AVX2-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
553; AVX2-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6]
554; AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
555; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
556; AVX2-NEXT:    vpsllw $15, %xmm0, %xmm0
557; AVX2-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
558; AVX2-NEXT:    vpmovmskb %xmm0, %eax
559; AVX2-NEXT:    testb %al, %al
560; AVX2-NEXT:    setne %al
561; AVX2-NEXT:    vzeroupper
562; AVX2-NEXT:    retq
563;
564; AVX512F-LABEL: trunc_v8i64_v8i1:
565; AVX512F:       # %bb.0:
566; AVX512F-NEXT:    vpsllq $63, %zmm0, %zmm0
567; AVX512F-NEXT:    vptestmq %zmm0, %zmm0, %k0
568; AVX512F-NEXT:    kmovw %k0, %eax
569; AVX512F-NEXT:    testb %al, %al
570; AVX512F-NEXT:    setne %al
571; AVX512F-NEXT:    vzeroupper
572; AVX512F-NEXT:    retq
573;
574; AVX512BW-LABEL: trunc_v8i64_v8i1:
575; AVX512BW:       # %bb.0:
576; AVX512BW-NEXT:    vpsllq $63, %zmm0, %zmm0
577; AVX512BW-NEXT:    vptestmq %zmm0, %zmm0, %k0
578; AVX512BW-NEXT:    kmovd %k0, %eax
579; AVX512BW-NEXT:    testb %al, %al
580; AVX512BW-NEXT:    setne %al
581; AVX512BW-NEXT:    vzeroupper
582; AVX512BW-NEXT:    retq
583;
584; AVX512VL-LABEL: trunc_v8i64_v8i1:
585; AVX512VL:       # %bb.0:
586; AVX512VL-NEXT:    vpsllq $63, %zmm0, %zmm0
587; AVX512VL-NEXT:    vptestmq %zmm0, %zmm0, %k0
588; AVX512VL-NEXT:    kmovd %k0, %eax
589; AVX512VL-NEXT:    testb %al, %al
590; AVX512VL-NEXT:    setne %al
591; AVX512VL-NEXT:    vzeroupper
592; AVX512VL-NEXT:    retq
593  %a = trunc <8 x i64> %0 to <8 x i1>
594  %b = call i1 @llvm.experimental.vector.reduce.or.v8i1(<8 x i1> %a)
595  ret i1 %b
596}
597
598define i1 @trunc_v16i32_v16i1(<16 x i32>) {
599; SSE2-LABEL: trunc_v16i32_v16i1:
600; SSE2:       # %bb.0:
601; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]
602; SSE2-NEXT:    pand %xmm4, %xmm3
603; SSE2-NEXT:    pand %xmm4, %xmm2
604; SSE2-NEXT:    packuswb %xmm3, %xmm2
605; SSE2-NEXT:    pand %xmm4, %xmm1
606; SSE2-NEXT:    pand %xmm4, %xmm0
607; SSE2-NEXT:    packuswb %xmm1, %xmm0
608; SSE2-NEXT:    packuswb %xmm2, %xmm0
609; SSE2-NEXT:    psllw $7, %xmm0
610; SSE2-NEXT:    pmovmskb %xmm0, %eax
611; SSE2-NEXT:    testw %ax, %ax
612; SSE2-NEXT:    setne %al
613; SSE2-NEXT:    retq
614;
615; SSE41-LABEL: trunc_v16i32_v16i1:
616; SSE41:       # %bb.0:
617; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]
618; SSE41-NEXT:    pand %xmm4, %xmm3
619; SSE41-NEXT:    pand %xmm4, %xmm2
620; SSE41-NEXT:    packusdw %xmm3, %xmm2
621; SSE41-NEXT:    pand %xmm4, %xmm1
622; SSE41-NEXT:    pand %xmm4, %xmm0
623; SSE41-NEXT:    packusdw %xmm1, %xmm0
624; SSE41-NEXT:    packuswb %xmm2, %xmm0
625; SSE41-NEXT:    psllw $7, %xmm0
626; SSE41-NEXT:    pmovmskb %xmm0, %eax
627; SSE41-NEXT:    testw %ax, %ax
628; SSE41-NEXT:    setne %al
629; SSE41-NEXT:    retq
630;
631; AVX1-LABEL: trunc_v16i32_v16i1:
632; AVX1:       # %bb.0:
633; AVX1-NEXT:    vmovaps {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255]
634; AVX1-NEXT:    vandps %ymm2, %ymm1, %ymm1
635; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
636; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
637; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
638; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
639; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
640; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
641; AVX1-NEXT:    vpsllw $7, %xmm0, %xmm0
642; AVX1-NEXT:    vpmovmskb %xmm0, %eax
643; AVX1-NEXT:    testw %ax, %ax
644; AVX1-NEXT:    setne %al
645; AVX1-NEXT:    vzeroupper
646; AVX1-NEXT:    retq
647;
648; AVX2-LABEL: trunc_v16i32_v16i1:
649; AVX2:       # %bb.0:
650; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
651; AVX2-NEXT:    vpshufb %ymm2, %ymm1, %ymm1
652; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3]
653; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
654; AVX2-NEXT:    vpand %xmm3, %xmm1, %xmm1
655; AVX2-NEXT:    vpshufb %ymm2, %ymm0, %ymm0
656; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
657; AVX2-NEXT:    vpand %xmm3, %xmm0, %xmm0
658; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
659; AVX2-NEXT:    vpsllw $7, %xmm0, %xmm0
660; AVX2-NEXT:    vpmovmskb %xmm0, %eax
661; AVX2-NEXT:    testw %ax, %ax
662; AVX2-NEXT:    setne %al
663; AVX2-NEXT:    vzeroupper
664; AVX2-NEXT:    retq
665;
666; AVX512-LABEL: trunc_v16i32_v16i1:
667; AVX512:       # %bb.0:
668; AVX512-NEXT:    vpslld $31, %zmm0, %zmm0
669; AVX512-NEXT:    vptestmd %zmm0, %zmm0, %k0
670; AVX512-NEXT:    kortestw %k0, %k0
671; AVX512-NEXT:    setne %al
672; AVX512-NEXT:    vzeroupper
673; AVX512-NEXT:    retq
674  %a = trunc <16 x i32> %0 to <16 x i1>
675  %b = call i1 @llvm.experimental.vector.reduce.or.v16i1(<16 x i1> %a)
676  ret i1 %b
677}
678
679define i1 @trunc_v32i16_v32i1(<32 x i16>) {
680; SSE-LABEL: trunc_v32i16_v32i1:
681; SSE:       # %bb.0:
682; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
683; SSE-NEXT:    pand %xmm4, %xmm3
684; SSE-NEXT:    pand %xmm4, %xmm2
685; SSE-NEXT:    packuswb %xmm3, %xmm2
686; SSE-NEXT:    pand %xmm4, %xmm1
687; SSE-NEXT:    pand %xmm4, %xmm0
688; SSE-NEXT:    packuswb %xmm1, %xmm0
689; SSE-NEXT:    por %xmm2, %xmm0
690; SSE-NEXT:    psllw $7, %xmm0
691; SSE-NEXT:    pmovmskb %xmm0, %eax
692; SSE-NEXT:    testw %ax, %ax
693; SSE-NEXT:    setne %al
694; SSE-NEXT:    retq
695;
696; AVX1-LABEL: trunc_v32i16_v32i1:
697; AVX1:       # %bb.0:
698; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
699; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
700; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
701; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
702; AVX1-NEXT:    vpsllw $7, %xmm0, %xmm0
703; AVX1-NEXT:    vpmovmskb %xmm0, %eax
704; AVX1-NEXT:    testw %ax, %ax
705; AVX1-NEXT:    setne %al
706; AVX1-NEXT:    vzeroupper
707; AVX1-NEXT:    retq
708;
709; AVX2-LABEL: trunc_v32i16_v32i1:
710; AVX2:       # %bb.0:
711; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
712; AVX2-NEXT:    vpand %ymm2, %ymm1, %ymm1
713; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0
714; AVX2-NEXT:    vperm2i128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]
715; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
716; AVX2-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
717; AVX2-NEXT:    vpsllw $7, %ymm0, %ymm0
718; AVX2-NEXT:    vpmovmskb %ymm0, %eax
719; AVX2-NEXT:    testl %eax, %eax
720; AVX2-NEXT:    setne %al
721; AVX2-NEXT:    vzeroupper
722; AVX2-NEXT:    retq
723;
724; AVX512F-LABEL: trunc_v32i16_v32i1:
725; AVX512F:       # %bb.0:
726; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
727; AVX512F-NEXT:    vpor %ymm1, %ymm0, %ymm0
728; AVX512F-NEXT:    vpmovsxwd %ymm0, %zmm0
729; AVX512F-NEXT:    vpslld $31, %zmm0, %zmm0
730; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k0
731; AVX512F-NEXT:    kshiftrw $8, %k0, %k1
732; AVX512F-NEXT:    korw %k1, %k0, %k0
733; AVX512F-NEXT:    kshiftrw $4, %k0, %k1
734; AVX512F-NEXT:    korw %k1, %k0, %k0
735; AVX512F-NEXT:    kshiftrw $2, %k0, %k1
736; AVX512F-NEXT:    korw %k1, %k0, %k0
737; AVX512F-NEXT:    kshiftrw $1, %k0, %k1
738; AVX512F-NEXT:    korw %k1, %k0, %k0
739; AVX512F-NEXT:    kmovw %k0, %eax
740; AVX512F-NEXT:    # kill: def $al killed $al killed $eax
741; AVX512F-NEXT:    vzeroupper
742; AVX512F-NEXT:    retq
743;
744; AVX512BW-LABEL: trunc_v32i16_v32i1:
745; AVX512BW:       # %bb.0:
746; AVX512BW-NEXT:    vpsllw $15, %zmm0, %zmm0
747; AVX512BW-NEXT:    vpmovw2m %zmm0, %k0
748; AVX512BW-NEXT:    kortestd %k0, %k0
749; AVX512BW-NEXT:    setne %al
750; AVX512BW-NEXT:    vzeroupper
751; AVX512BW-NEXT:    retq
752;
753; AVX512VL-LABEL: trunc_v32i16_v32i1:
754; AVX512VL:       # %bb.0:
755; AVX512VL-NEXT:    vpsllw $15, %zmm0, %zmm0
756; AVX512VL-NEXT:    vpmovw2m %zmm0, %k0
757; AVX512VL-NEXT:    kortestd %k0, %k0
758; AVX512VL-NEXT:    setne %al
759; AVX512VL-NEXT:    vzeroupper
760; AVX512VL-NEXT:    retq
761  %a = trunc <32 x i16> %0 to <32 x i1>
762  %b = call i1 @llvm.experimental.vector.reduce.or.v32i1(<32 x i1> %a)
763  ret i1 %b
764}
765
766define i1 @trunc_v64i8_v64i1(<64 x i8>) {
767; SSE-LABEL: trunc_v64i8_v64i1:
768; SSE:       # %bb.0:
769; SSE-NEXT:    por %xmm3, %xmm1
770; SSE-NEXT:    por %xmm2, %xmm1
771; SSE-NEXT:    por %xmm0, %xmm1
772; SSE-NEXT:    psllw $7, %xmm1
773; SSE-NEXT:    pmovmskb %xmm1, %eax
774; SSE-NEXT:    testw %ax, %ax
775; SSE-NEXT:    setne %al
776; SSE-NEXT:    retq
777;
778; AVX1-LABEL: trunc_v64i8_v64i1:
779; AVX1:       # %bb.0:
780; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
781; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
782; AVX1-NEXT:    vorps %xmm1, %xmm0, %xmm0
783; AVX1-NEXT:    vpsllw $7, %xmm0, %xmm0
784; AVX1-NEXT:    vpmovmskb %xmm0, %eax
785; AVX1-NEXT:    testw %ax, %ax
786; AVX1-NEXT:    setne %al
787; AVX1-NEXT:    vzeroupper
788; AVX1-NEXT:    retq
789;
790; AVX2-LABEL: trunc_v64i8_v64i1:
791; AVX2:       # %bb.0:
792; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
793; AVX2-NEXT:    vpsllw $7, %ymm0, %ymm0
794; AVX2-NEXT:    vpmovmskb %ymm0, %eax
795; AVX2-NEXT:    testl %eax, %eax
796; AVX2-NEXT:    setne %al
797; AVX2-NEXT:    vzeroupper
798; AVX2-NEXT:    retq
799;
800; AVX512F-LABEL: trunc_v64i8_v64i1:
801; AVX512F:       # %bb.0:
802; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
803; AVX512F-NEXT:    vextracti128 $1, %ymm1, %xmm2
804; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm3
805; AVX512F-NEXT:    vpor %xmm2, %xmm3, %xmm2
806; AVX512F-NEXT:    vpor %xmm2, %xmm1, %xmm1
807; AVX512F-NEXT:    vpor %xmm1, %xmm0, %xmm0
808; AVX512F-NEXT:    vpmovsxbd %xmm0, %zmm0
809; AVX512F-NEXT:    vpslld $31, %zmm0, %zmm0
810; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k0
811; AVX512F-NEXT:    kshiftrw $8, %k0, %k1
812; AVX512F-NEXT:    korw %k1, %k0, %k0
813; AVX512F-NEXT:    kshiftrw $4, %k0, %k1
814; AVX512F-NEXT:    korw %k1, %k0, %k0
815; AVX512F-NEXT:    kshiftrw $2, %k0, %k1
816; AVX512F-NEXT:    korw %k1, %k0, %k0
817; AVX512F-NEXT:    kshiftrw $1, %k0, %k1
818; AVX512F-NEXT:    korw %k1, %k0, %k0
819; AVX512F-NEXT:    kmovw %k0, %eax
820; AVX512F-NEXT:    # kill: def $al killed $al killed $eax
821; AVX512F-NEXT:    vzeroupper
822; AVX512F-NEXT:    retq
823;
824; AVX512BW-LABEL: trunc_v64i8_v64i1:
825; AVX512BW:       # %bb.0:
826; AVX512BW-NEXT:    vpsllw $7, %zmm0, %zmm0
827; AVX512BW-NEXT:    vpmovb2m %zmm0, %k0
828; AVX512BW-NEXT:    kortestq %k0, %k0
829; AVX512BW-NEXT:    setne %al
830; AVX512BW-NEXT:    vzeroupper
831; AVX512BW-NEXT:    retq
832;
833; AVX512VL-LABEL: trunc_v64i8_v64i1:
834; AVX512VL:       # %bb.0:
835; AVX512VL-NEXT:    vpsllw $7, %zmm0, %zmm0
836; AVX512VL-NEXT:    vpmovb2m %zmm0, %k0
837; AVX512VL-NEXT:    kortestq %k0, %k0
838; AVX512VL-NEXT:    setne %al
839; AVX512VL-NEXT:    vzeroupper
840; AVX512VL-NEXT:    retq
841  %a = trunc <64 x i8> %0 to <64 x i1>
842  %b = call i1 @llvm.experimental.vector.reduce.or.v64i1(<64 x i1> %a)
843  ret i1 %b
844}
845
846;
847; Comparison
848;
849
850define i1 @icmp_v2i64_v2i1(<2 x i64>) {
851; SSE2-LABEL: icmp_v2i64_v2i1:
852; SSE2:       # %bb.0:
853; SSE2-NEXT:    pxor %xmm1, %xmm1
854; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
855; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,0,3,2]
856; SSE2-NEXT:    pand %xmm1, %xmm0
857; SSE2-NEXT:    movmskpd %xmm0, %eax
858; SSE2-NEXT:    testb %al, %al
859; SSE2-NEXT:    setne %al
860; SSE2-NEXT:    retq
861;
862; SSE41-LABEL: icmp_v2i64_v2i1:
863; SSE41:       # %bb.0:
864; SSE41-NEXT:    pxor %xmm1, %xmm1
865; SSE41-NEXT:    pcmpeqq %xmm0, %xmm1
866; SSE41-NEXT:    movmskpd %xmm1, %eax
867; SSE41-NEXT:    testb %al, %al
868; SSE41-NEXT:    setne %al
869; SSE41-NEXT:    retq
870;
871; AVX-LABEL: icmp_v2i64_v2i1:
872; AVX:       # %bb.0:
873; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
874; AVX-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm0
875; AVX-NEXT:    vmovmskpd %xmm0, %eax
876; AVX-NEXT:    testb %al, %al
877; AVX-NEXT:    setne %al
878; AVX-NEXT:    retq
879;
880; AVX512F-LABEL: icmp_v2i64_v2i1:
881; AVX512F:       # %bb.0:
882; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
883; AVX512F-NEXT:    vptestnmq %zmm0, %zmm0, %k0
884; AVX512F-NEXT:    kmovw %k0, %eax
885; AVX512F-NEXT:    testb $3, %al
886; AVX512F-NEXT:    setne %al
887; AVX512F-NEXT:    vzeroupper
888; AVX512F-NEXT:    retq
889;
890; AVX512BW-LABEL: icmp_v2i64_v2i1:
891; AVX512BW:       # %bb.0:
892; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
893; AVX512BW-NEXT:    vptestnmq %zmm0, %zmm0, %k0
894; AVX512BW-NEXT:    kmovd %k0, %eax
895; AVX512BW-NEXT:    testb $3, %al
896; AVX512BW-NEXT:    setne %al
897; AVX512BW-NEXT:    vzeroupper
898; AVX512BW-NEXT:    retq
899;
900; AVX512VL-LABEL: icmp_v2i64_v2i1:
901; AVX512VL:       # %bb.0:
902; AVX512VL-NEXT:    vptestnmq %xmm0, %xmm0, %k0
903; AVX512VL-NEXT:    kmovd %k0, %eax
904; AVX512VL-NEXT:    testb %al, %al
905; AVX512VL-NEXT:    setne %al
906; AVX512VL-NEXT:    retq
907  %a = icmp eq <2 x i64> %0, zeroinitializer
908  %b = call i1 @llvm.experimental.vector.reduce.or.v2i1(<2 x i1> %a)
909  ret i1 %b
910}
911
912define i1 @icmp_v4i32_v4i1(<4 x i32>) {
913; SSE-LABEL: icmp_v4i32_v4i1:
914; SSE:       # %bb.0:
915; SSE-NEXT:    pxor %xmm1, %xmm1
916; SSE-NEXT:    pcmpeqd %xmm0, %xmm1
917; SSE-NEXT:    movmskps %xmm1, %eax
918; SSE-NEXT:    testb %al, %al
919; SSE-NEXT:    setne %al
920; SSE-NEXT:    retq
921;
922; AVX-LABEL: icmp_v4i32_v4i1:
923; AVX:       # %bb.0:
924; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
925; AVX-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
926; AVX-NEXT:    vmovmskps %xmm0, %eax
927; AVX-NEXT:    testb %al, %al
928; AVX-NEXT:    setne %al
929; AVX-NEXT:    retq
930;
931; AVX512F-LABEL: icmp_v4i32_v4i1:
932; AVX512F:       # %bb.0:
933; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
934; AVX512F-NEXT:    vptestnmd %zmm0, %zmm0, %k0
935; AVX512F-NEXT:    kmovw %k0, %eax
936; AVX512F-NEXT:    testb $15, %al
937; AVX512F-NEXT:    setne %al
938; AVX512F-NEXT:    vzeroupper
939; AVX512F-NEXT:    retq
940;
941; AVX512BW-LABEL: icmp_v4i32_v4i1:
942; AVX512BW:       # %bb.0:
943; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
944; AVX512BW-NEXT:    vptestnmd %zmm0, %zmm0, %k0
945; AVX512BW-NEXT:    kmovd %k0, %eax
946; AVX512BW-NEXT:    testb $15, %al
947; AVX512BW-NEXT:    setne %al
948; AVX512BW-NEXT:    vzeroupper
949; AVX512BW-NEXT:    retq
950;
951; AVX512VL-LABEL: icmp_v4i32_v4i1:
952; AVX512VL:       # %bb.0:
953; AVX512VL-NEXT:    vptestnmd %xmm0, %xmm0, %k0
954; AVX512VL-NEXT:    kmovd %k0, %eax
955; AVX512VL-NEXT:    testb %al, %al
956; AVX512VL-NEXT:    setne %al
957; AVX512VL-NEXT:    retq
958  %a = icmp eq <4 x i32> %0, zeroinitializer
959  %b = call i1 @llvm.experimental.vector.reduce.or.v4i1(<4 x i1> %a)
960  ret i1 %b
961}
962
963define i1 @icmp_v8i16_v8i1(<8 x i8>) {
964; SSE2-LABEL: icmp_v8i16_v8i1:
965; SSE2:       # %bb.0:
966; SSE2-NEXT:    pxor %xmm1, %xmm1
967; SSE2-NEXT:    pcmpeqb %xmm0, %xmm1
968; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
969; SSE2-NEXT:    packsswb %xmm0, %xmm0
970; SSE2-NEXT:    pmovmskb %xmm0, %eax
971; SSE2-NEXT:    testb %al, %al
972; SSE2-NEXT:    setne %al
973; SSE2-NEXT:    retq
974;
975; SSE41-LABEL: icmp_v8i16_v8i1:
976; SSE41:       # %bb.0:
977; SSE41-NEXT:    pxor %xmm1, %xmm1
978; SSE41-NEXT:    pcmpeqb %xmm0, %xmm1
979; SSE41-NEXT:    pmovsxbw %xmm1, %xmm0
980; SSE41-NEXT:    packsswb %xmm0, %xmm0
981; SSE41-NEXT:    pmovmskb %xmm0, %eax
982; SSE41-NEXT:    testb %al, %al
983; SSE41-NEXT:    setne %al
984; SSE41-NEXT:    retq
985;
986; AVX-LABEL: icmp_v8i16_v8i1:
987; AVX:       # %bb.0:
988; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
989; AVX-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
990; AVX-NEXT:    vpmovsxbw %xmm0, %xmm0
991; AVX-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
992; AVX-NEXT:    vpmovmskb %xmm0, %eax
993; AVX-NEXT:    testb %al, %al
994; AVX-NEXT:    setne %al
995; AVX-NEXT:    retq
996;
997; AVX512F-LABEL: icmp_v8i16_v8i1:
998; AVX512F:       # %bb.0:
999; AVX512F-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1000; AVX512F-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
1001; AVX512F-NEXT:    vpmovsxbd %xmm0, %zmm0
1002; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k0
1003; AVX512F-NEXT:    kmovw %k0, %eax
1004; AVX512F-NEXT:    testb %al, %al
1005; AVX512F-NEXT:    setne %al
1006; AVX512F-NEXT:    vzeroupper
1007; AVX512F-NEXT:    retq
1008;
1009; AVX512BW-LABEL: icmp_v8i16_v8i1:
1010; AVX512BW:       # %bb.0:
1011; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1012; AVX512BW-NEXT:    vptestnmb %zmm0, %zmm0, %k0
1013; AVX512BW-NEXT:    kmovd %k0, %eax
1014; AVX512BW-NEXT:    testb %al, %al
1015; AVX512BW-NEXT:    setne %al
1016; AVX512BW-NEXT:    vzeroupper
1017; AVX512BW-NEXT:    retq
1018;
1019; AVX512VL-LABEL: icmp_v8i16_v8i1:
1020; AVX512VL:       # %bb.0:
1021; AVX512VL-NEXT:    vptestnmb %xmm0, %xmm0, %k0
1022; AVX512VL-NEXT:    kmovd %k0, %eax
1023; AVX512VL-NEXT:    testb %al, %al
1024; AVX512VL-NEXT:    setne %al
1025; AVX512VL-NEXT:    retq
1026  %a = icmp eq <8 x i8> %0, zeroinitializer
1027  %b = call i1 @llvm.experimental.vector.reduce.or.v8i1(<8 x i1> %a)
1028  ret i1 %b
1029}
1030
1031define i1 @icmp_v16i8_v16i1(<16 x i8>) {
1032; SSE-LABEL: icmp_v16i8_v16i1:
1033; SSE:       # %bb.0:
1034; SSE-NEXT:    pxor %xmm1, %xmm1
1035; SSE-NEXT:    pcmpeqb %xmm0, %xmm1
1036; SSE-NEXT:    pmovmskb %xmm1, %eax
1037; SSE-NEXT:    testw %ax, %ax
1038; SSE-NEXT:    setne %al
1039; SSE-NEXT:    retq
1040;
1041; AVX-LABEL: icmp_v16i8_v16i1:
1042; AVX:       # %bb.0:
1043; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1044; AVX-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
1045; AVX-NEXT:    vpmovmskb %xmm0, %eax
1046; AVX-NEXT:    testw %ax, %ax
1047; AVX-NEXT:    setne %al
1048; AVX-NEXT:    retq
1049;
1050; AVX512F-LABEL: icmp_v16i8_v16i1:
1051; AVX512F:       # %bb.0:
1052; AVX512F-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1053; AVX512F-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
1054; AVX512F-NEXT:    vpmovmskb %xmm0, %eax
1055; AVX512F-NEXT:    testw %ax, %ax
1056; AVX512F-NEXT:    setne %al
1057; AVX512F-NEXT:    retq
1058;
1059; AVX512BW-LABEL: icmp_v16i8_v16i1:
1060; AVX512BW:       # %bb.0:
1061; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1062; AVX512BW-NEXT:    vptestnmb %zmm0, %zmm0, %k0
1063; AVX512BW-NEXT:    kortestw %k0, %k0
1064; AVX512BW-NEXT:    setne %al
1065; AVX512BW-NEXT:    vzeroupper
1066; AVX512BW-NEXT:    retq
1067;
1068; AVX512VL-LABEL: icmp_v16i8_v16i1:
1069; AVX512VL:       # %bb.0:
1070; AVX512VL-NEXT:    vptestnmb %xmm0, %xmm0, %k0
1071; AVX512VL-NEXT:    kortestw %k0, %k0
1072; AVX512VL-NEXT:    setne %al
1073; AVX512VL-NEXT:    retq
1074  %a = icmp eq <16 x i8> %0, zeroinitializer
1075  %b = call i1 @llvm.experimental.vector.reduce.or.v16i1(<16 x i1> %a)
1076  ret i1 %b
1077}
1078
1079define i1 @icmp_v4i64_v4i1(<4 x i64>) {
1080; SSE2-LABEL: icmp_v4i64_v4i1:
1081; SSE2:       # %bb.0:
1082; SSE2-NEXT:    pxor %xmm2, %xmm2
1083; SSE2-NEXT:    pcmpeqd %xmm2, %xmm1
1084; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,0,3,2]
1085; SSE2-NEXT:    pand %xmm1, %xmm3
1086; SSE2-NEXT:    pcmpeqd %xmm2, %xmm0
1087; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]
1088; SSE2-NEXT:    pand %xmm0, %xmm1
1089; SSE2-NEXT:    packssdw %xmm3, %xmm1
1090; SSE2-NEXT:    movmskps %xmm1, %eax
1091; SSE2-NEXT:    testb %al, %al
1092; SSE2-NEXT:    setne %al
1093; SSE2-NEXT:    retq
1094;
1095; SSE41-LABEL: icmp_v4i64_v4i1:
1096; SSE41:       # %bb.0:
1097; SSE41-NEXT:    pxor %xmm2, %xmm2
1098; SSE41-NEXT:    pcmpeqq %xmm2, %xmm1
1099; SSE41-NEXT:    pcmpeqq %xmm2, %xmm0
1100; SSE41-NEXT:    packssdw %xmm1, %xmm0
1101; SSE41-NEXT:    movmskps %xmm0, %eax
1102; SSE41-NEXT:    testb %al, %al
1103; SSE41-NEXT:    setne %al
1104; SSE41-NEXT:    retq
1105;
1106; AVX1-LABEL: icmp_v4i64_v4i1:
1107; AVX1:       # %bb.0:
1108; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1109; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1110; AVX1-NEXT:    vpcmpeqq %xmm2, %xmm1, %xmm1
1111; AVX1-NEXT:    vpcmpeqq %xmm2, %xmm0, %xmm0
1112; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1113; AVX1-NEXT:    vmovmskpd %ymm0, %eax
1114; AVX1-NEXT:    testb %al, %al
1115; AVX1-NEXT:    setne %al
1116; AVX1-NEXT:    vzeroupper
1117; AVX1-NEXT:    retq
1118;
1119; AVX2-LABEL: icmp_v4i64_v4i1:
1120; AVX2:       # %bb.0:
1121; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1122; AVX2-NEXT:    vpcmpeqq %ymm1, %ymm0, %ymm0
1123; AVX2-NEXT:    vmovmskpd %ymm0, %eax
1124; AVX2-NEXT:    testb %al, %al
1125; AVX2-NEXT:    setne %al
1126; AVX2-NEXT:    vzeroupper
1127; AVX2-NEXT:    retq
1128;
1129; AVX512F-LABEL: icmp_v4i64_v4i1:
1130; AVX512F:       # %bb.0:
1131; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1132; AVX512F-NEXT:    vptestnmq %zmm0, %zmm0, %k0
1133; AVX512F-NEXT:    kmovw %k0, %eax
1134; AVX512F-NEXT:    testb $15, %al
1135; AVX512F-NEXT:    setne %al
1136; AVX512F-NEXT:    vzeroupper
1137; AVX512F-NEXT:    retq
1138;
1139; AVX512BW-LABEL: icmp_v4i64_v4i1:
1140; AVX512BW:       # %bb.0:
1141; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1142; AVX512BW-NEXT:    vptestnmq %zmm0, %zmm0, %k0
1143; AVX512BW-NEXT:    kmovd %k0, %eax
1144; AVX512BW-NEXT:    testb $15, %al
1145; AVX512BW-NEXT:    setne %al
1146; AVX512BW-NEXT:    vzeroupper
1147; AVX512BW-NEXT:    retq
1148;
1149; AVX512VL-LABEL: icmp_v4i64_v4i1:
1150; AVX512VL:       # %bb.0:
1151; AVX512VL-NEXT:    vptestnmq %ymm0, %ymm0, %k0
1152; AVX512VL-NEXT:    kmovd %k0, %eax
1153; AVX512VL-NEXT:    testb %al, %al
1154; AVX512VL-NEXT:    setne %al
1155; AVX512VL-NEXT:    vzeroupper
1156; AVX512VL-NEXT:    retq
1157  %a = icmp eq <4 x i64> %0, zeroinitializer
1158  %b = call i1 @llvm.experimental.vector.reduce.or.v4i1(<4 x i1> %a)
1159  ret i1 %b
1160}
1161
1162define i1 @icmp_v8i32_v8i1(<8 x i32>) {
1163; SSE-LABEL: icmp_v8i32_v8i1:
1164; SSE:       # %bb.0:
1165; SSE-NEXT:    pxor %xmm2, %xmm2
1166; SSE-NEXT:    pcmpeqd %xmm2, %xmm1
1167; SSE-NEXT:    pcmpeqd %xmm2, %xmm0
1168; SSE-NEXT:    packssdw %xmm1, %xmm0
1169; SSE-NEXT:    packsswb %xmm0, %xmm0
1170; SSE-NEXT:    pmovmskb %xmm0, %eax
1171; SSE-NEXT:    testb %al, %al
1172; SSE-NEXT:    setne %al
1173; SSE-NEXT:    retq
1174;
1175; AVX1-LABEL: icmp_v8i32_v8i1:
1176; AVX1:       # %bb.0:
1177; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1178; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1179; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm1, %xmm1
1180; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm0, %xmm0
1181; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1182; AVX1-NEXT:    vmovmskps %ymm0, %eax
1183; AVX1-NEXT:    testb %al, %al
1184; AVX1-NEXT:    setne %al
1185; AVX1-NEXT:    vzeroupper
1186; AVX1-NEXT:    retq
1187;
1188; AVX2-LABEL: icmp_v8i32_v8i1:
1189; AVX2:       # %bb.0:
1190; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1191; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm0, %ymm0
1192; AVX2-NEXT:    vmovmskps %ymm0, %eax
1193; AVX2-NEXT:    testb %al, %al
1194; AVX2-NEXT:    setne %al
1195; AVX2-NEXT:    vzeroupper
1196; AVX2-NEXT:    retq
1197;
1198; AVX512F-LABEL: icmp_v8i32_v8i1:
1199; AVX512F:       # %bb.0:
1200; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1201; AVX512F-NEXT:    vptestnmd %zmm0, %zmm0, %k0
1202; AVX512F-NEXT:    kmovw %k0, %eax
1203; AVX512F-NEXT:    testb %al, %al
1204; AVX512F-NEXT:    setne %al
1205; AVX512F-NEXT:    vzeroupper
1206; AVX512F-NEXT:    retq
1207;
1208; AVX512BW-LABEL: icmp_v8i32_v8i1:
1209; AVX512BW:       # %bb.0:
1210; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1211; AVX512BW-NEXT:    vptestnmd %zmm0, %zmm0, %k0
1212; AVX512BW-NEXT:    kmovd %k0, %eax
1213; AVX512BW-NEXT:    testb %al, %al
1214; AVX512BW-NEXT:    setne %al
1215; AVX512BW-NEXT:    vzeroupper
1216; AVX512BW-NEXT:    retq
1217;
1218; AVX512VL-LABEL: icmp_v8i32_v8i1:
1219; AVX512VL:       # %bb.0:
1220; AVX512VL-NEXT:    vptestnmd %ymm0, %ymm0, %k0
1221; AVX512VL-NEXT:    kmovd %k0, %eax
1222; AVX512VL-NEXT:    testb %al, %al
1223; AVX512VL-NEXT:    setne %al
1224; AVX512VL-NEXT:    vzeroupper
1225; AVX512VL-NEXT:    retq
1226  %a = icmp eq <8 x i32> %0, zeroinitializer
1227  %b = call i1 @llvm.experimental.vector.reduce.or.v8i1(<8 x i1> %a)
1228  ret i1 %b
1229}
1230
1231define i1 @icmp_v16i16_v16i1(<16 x i16>) {
1232; SSE-LABEL: icmp_v16i16_v16i1:
1233; SSE:       # %bb.0:
1234; SSE-NEXT:    pxor %xmm2, %xmm2
1235; SSE-NEXT:    pcmpeqw %xmm2, %xmm1
1236; SSE-NEXT:    pcmpeqw %xmm2, %xmm0
1237; SSE-NEXT:    packsswb %xmm1, %xmm0
1238; SSE-NEXT:    pmovmskb %xmm0, %eax
1239; SSE-NEXT:    testw %ax, %ax
1240; SSE-NEXT:    setne %al
1241; SSE-NEXT:    retq
1242;
1243; AVX1-LABEL: icmp_v16i16_v16i1:
1244; AVX1:       # %bb.0:
1245; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1246; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1247; AVX1-NEXT:    vpcmpeqw %xmm2, %xmm1, %xmm1
1248; AVX1-NEXT:    vpcmpeqw %xmm2, %xmm0, %xmm0
1249; AVX1-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
1250; AVX1-NEXT:    vpmovmskb %xmm0, %eax
1251; AVX1-NEXT:    testw %ax, %ax
1252; AVX1-NEXT:    setne %al
1253; AVX1-NEXT:    vzeroupper
1254; AVX1-NEXT:    retq
1255;
1256; AVX2-LABEL: icmp_v16i16_v16i1:
1257; AVX2:       # %bb.0:
1258; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1259; AVX2-NEXT:    vpcmpeqw %ymm1, %ymm0, %ymm0
1260; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1261; AVX2-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
1262; AVX2-NEXT:    vpmovmskb %xmm0, %eax
1263; AVX2-NEXT:    testw %ax, %ax
1264; AVX2-NEXT:    setne %al
1265; AVX2-NEXT:    vzeroupper
1266; AVX2-NEXT:    retq
1267;
1268; AVX512F-LABEL: icmp_v16i16_v16i1:
1269; AVX512F:       # %bb.0:
1270; AVX512F-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1271; AVX512F-NEXT:    vpcmpeqw %ymm1, %ymm0, %ymm0
1272; AVX512F-NEXT:    vpmovsxwd %ymm0, %zmm0
1273; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k0
1274; AVX512F-NEXT:    kortestw %k0, %k0
1275; AVX512F-NEXT:    setne %al
1276; AVX512F-NEXT:    vzeroupper
1277; AVX512F-NEXT:    retq
1278;
1279; AVX512BW-LABEL: icmp_v16i16_v16i1:
1280; AVX512BW:       # %bb.0:
1281; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1282; AVX512BW-NEXT:    vptestnmw %zmm0, %zmm0, %k0
1283; AVX512BW-NEXT:    kortestw %k0, %k0
1284; AVX512BW-NEXT:    setne %al
1285; AVX512BW-NEXT:    vzeroupper
1286; AVX512BW-NEXT:    retq
1287;
1288; AVX512VL-LABEL: icmp_v16i16_v16i1:
1289; AVX512VL:       # %bb.0:
1290; AVX512VL-NEXT:    vptestnmw %ymm0, %ymm0, %k0
1291; AVX512VL-NEXT:    kortestw %k0, %k0
1292; AVX512VL-NEXT:    setne %al
1293; AVX512VL-NEXT:    vzeroupper
1294; AVX512VL-NEXT:    retq
1295  %a = icmp eq <16 x i16> %0, zeroinitializer
1296  %b = call i1 @llvm.experimental.vector.reduce.or.v16i1(<16 x i1> %a)
1297  ret i1 %b
1298}
1299
1300define i1 @icmp_v32i8_v32i1(<32 x i8>) {
1301; SSE-LABEL: icmp_v32i8_v32i1:
1302; SSE:       # %bb.0:
1303; SSE-NEXT:    pxor %xmm2, %xmm2
1304; SSE-NEXT:    pcmpeqb %xmm2, %xmm1
1305; SSE-NEXT:    pcmpeqb %xmm2, %xmm0
1306; SSE-NEXT:    por %xmm1, %xmm0
1307; SSE-NEXT:    pmovmskb %xmm0, %eax
1308; SSE-NEXT:    testw %ax, %ax
1309; SSE-NEXT:    setne %al
1310; SSE-NEXT:    retq
1311;
1312; AVX1-LABEL: icmp_v32i8_v32i1:
1313; AVX1:       # %bb.0:
1314; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1315; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1316; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm1, %xmm1
1317; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm0, %xmm0
1318; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
1319; AVX1-NEXT:    vpmovmskb %xmm0, %eax
1320; AVX1-NEXT:    testw %ax, %ax
1321; AVX1-NEXT:    setne %al
1322; AVX1-NEXT:    vzeroupper
1323; AVX1-NEXT:    retq
1324;
1325; AVX2-LABEL: icmp_v32i8_v32i1:
1326; AVX2:       # %bb.0:
1327; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1328; AVX2-NEXT:    vpcmpeqb %ymm1, %ymm0, %ymm0
1329; AVX2-NEXT:    vpmovmskb %ymm0, %eax
1330; AVX2-NEXT:    testl %eax, %eax
1331; AVX2-NEXT:    setne %al
1332; AVX2-NEXT:    vzeroupper
1333; AVX2-NEXT:    retq
1334;
1335; AVX512F-LABEL: icmp_v32i8_v32i1:
1336; AVX512F:       # %bb.0:
1337; AVX512F-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1338; AVX512F-NEXT:    vpcmpeqb %ymm1, %ymm0, %ymm0
1339; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm1
1340; AVX512F-NEXT:    vpor %xmm1, %xmm0, %xmm0
1341; AVX512F-NEXT:    vpmovsxbd %xmm0, %zmm0
1342; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k0
1343; AVX512F-NEXT:    kshiftrw $8, %k0, %k1
1344; AVX512F-NEXT:    korw %k1, %k0, %k0
1345; AVX512F-NEXT:    kshiftrw $4, %k0, %k1
1346; AVX512F-NEXT:    korw %k1, %k0, %k0
1347; AVX512F-NEXT:    kshiftrw $2, %k0, %k1
1348; AVX512F-NEXT:    korw %k1, %k0, %k0
1349; AVX512F-NEXT:    kshiftrw $1, %k0, %k1
1350; AVX512F-NEXT:    korw %k1, %k0, %k0
1351; AVX512F-NEXT:    kmovw %k0, %eax
1352; AVX512F-NEXT:    # kill: def $al killed $al killed $eax
1353; AVX512F-NEXT:    vzeroupper
1354; AVX512F-NEXT:    retq
1355;
1356; AVX512BW-LABEL: icmp_v32i8_v32i1:
1357; AVX512BW:       # %bb.0:
1358; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1359; AVX512BW-NEXT:    vptestnmb %zmm0, %zmm0, %k0
1360; AVX512BW-NEXT:    kortestd %k0, %k0
1361; AVX512BW-NEXT:    setne %al
1362; AVX512BW-NEXT:    vzeroupper
1363; AVX512BW-NEXT:    retq
1364;
1365; AVX512VL-LABEL: icmp_v32i8_v32i1:
1366; AVX512VL:       # %bb.0:
1367; AVX512VL-NEXT:    vptestnmb %ymm0, %ymm0, %k0
1368; AVX512VL-NEXT:    kortestd %k0, %k0
1369; AVX512VL-NEXT:    setne %al
1370; AVX512VL-NEXT:    vzeroupper
1371; AVX512VL-NEXT:    retq
1372  %a = icmp eq <32 x i8> %0, zeroinitializer
1373  %b = call i1 @llvm.experimental.vector.reduce.or.v32i1(<32 x i1> %a)
1374  ret i1 %b
1375}
1376
1377define i1 @icmp_v8i64_v8i1(<8 x i64>) {
1378; SSE2-LABEL: icmp_v8i64_v8i1:
1379; SSE2:       # %bb.0:
1380; SSE2-NEXT:    pxor %xmm4, %xmm4
1381; SSE2-NEXT:    pcmpeqd %xmm4, %xmm3
1382; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[1,0,3,2]
1383; SSE2-NEXT:    pand %xmm3, %xmm5
1384; SSE2-NEXT:    pcmpeqd %xmm4, %xmm2
1385; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,0,3,2]
1386; SSE2-NEXT:    pand %xmm2, %xmm3
1387; SSE2-NEXT:    packssdw %xmm5, %xmm3
1388; SSE2-NEXT:    pcmpeqd %xmm4, %xmm1
1389; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,0,3,2]
1390; SSE2-NEXT:    pand %xmm1, %xmm2
1391; SSE2-NEXT:    pcmpeqd %xmm4, %xmm0
1392; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]
1393; SSE2-NEXT:    pand %xmm0, %xmm1
1394; SSE2-NEXT:    packssdw %xmm2, %xmm1
1395; SSE2-NEXT:    packssdw %xmm3, %xmm1
1396; SSE2-NEXT:    packsswb %xmm0, %xmm1
1397; SSE2-NEXT:    pmovmskb %xmm1, %eax
1398; SSE2-NEXT:    testb %al, %al
1399; SSE2-NEXT:    setne %al
1400; SSE2-NEXT:    retq
1401;
1402; SSE41-LABEL: icmp_v8i64_v8i1:
1403; SSE41:       # %bb.0:
1404; SSE41-NEXT:    pxor %xmm4, %xmm4
1405; SSE41-NEXT:    pcmpeqq %xmm4, %xmm3
1406; SSE41-NEXT:    pcmpeqq %xmm4, %xmm2
1407; SSE41-NEXT:    packssdw %xmm3, %xmm2
1408; SSE41-NEXT:    pcmpeqq %xmm4, %xmm1
1409; SSE41-NEXT:    pcmpeqq %xmm4, %xmm0
1410; SSE41-NEXT:    packssdw %xmm1, %xmm0
1411; SSE41-NEXT:    packssdw %xmm2, %xmm0
1412; SSE41-NEXT:    packsswb %xmm0, %xmm0
1413; SSE41-NEXT:    pmovmskb %xmm0, %eax
1414; SSE41-NEXT:    testb %al, %al
1415; SSE41-NEXT:    setne %al
1416; SSE41-NEXT:    retq
1417;
1418; AVX1-LABEL: icmp_v8i64_v8i1:
1419; AVX1:       # %bb.0:
1420; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1421; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1422; AVX1-NEXT:    vpcmpeqq %xmm3, %xmm2, %xmm2
1423; AVX1-NEXT:    vpcmpeqq %xmm3, %xmm1, %xmm1
1424; AVX1-NEXT:    vpackssdw %xmm2, %xmm1, %xmm1
1425; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1426; AVX1-NEXT:    vpcmpeqq %xmm3, %xmm2, %xmm2
1427; AVX1-NEXT:    vpcmpeqq %xmm3, %xmm0, %xmm0
1428; AVX1-NEXT:    vpackssdw %xmm2, %xmm0, %xmm0
1429; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1430; AVX1-NEXT:    vmovmskps %ymm0, %eax
1431; AVX1-NEXT:    testb %al, %al
1432; AVX1-NEXT:    setne %al
1433; AVX1-NEXT:    vzeroupper
1434; AVX1-NEXT:    retq
1435;
1436; AVX2-LABEL: icmp_v8i64_v8i1:
1437; AVX2:       # %bb.0:
1438; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1439; AVX2-NEXT:    vpcmpeqq %ymm2, %ymm1, %ymm1
1440; AVX2-NEXT:    vpcmpeqq %ymm2, %ymm0, %ymm0
1441; AVX2-NEXT:    vpackssdw %ymm1, %ymm0, %ymm0
1442; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
1443; AVX2-NEXT:    vmovmskps %ymm0, %eax
1444; AVX2-NEXT:    testb %al, %al
1445; AVX2-NEXT:    setne %al
1446; AVX2-NEXT:    vzeroupper
1447; AVX2-NEXT:    retq
1448;
1449; AVX512F-LABEL: icmp_v8i64_v8i1:
1450; AVX512F:       # %bb.0:
1451; AVX512F-NEXT:    vptestnmq %zmm0, %zmm0, %k0
1452; AVX512F-NEXT:    kmovw %k0, %eax
1453; AVX512F-NEXT:    testb %al, %al
1454; AVX512F-NEXT:    setne %al
1455; AVX512F-NEXT:    vzeroupper
1456; AVX512F-NEXT:    retq
1457;
1458; AVX512BW-LABEL: icmp_v8i64_v8i1:
1459; AVX512BW:       # %bb.0:
1460; AVX512BW-NEXT:    vptestnmq %zmm0, %zmm0, %k0
1461; AVX512BW-NEXT:    kmovd %k0, %eax
1462; AVX512BW-NEXT:    testb %al, %al
1463; AVX512BW-NEXT:    setne %al
1464; AVX512BW-NEXT:    vzeroupper
1465; AVX512BW-NEXT:    retq
1466;
1467; AVX512VL-LABEL: icmp_v8i64_v8i1:
1468; AVX512VL:       # %bb.0:
1469; AVX512VL-NEXT:    vptestnmq %zmm0, %zmm0, %k0
1470; AVX512VL-NEXT:    kmovd %k0, %eax
1471; AVX512VL-NEXT:    testb %al, %al
1472; AVX512VL-NEXT:    setne %al
1473; AVX512VL-NEXT:    vzeroupper
1474; AVX512VL-NEXT:    retq
1475  %a = icmp eq <8 x i64> %0, zeroinitializer
1476  %b = call i1 @llvm.experimental.vector.reduce.or.v8i1(<8 x i1> %a)
1477  ret i1 %b
1478}
1479
1480define i1 @icmp_v16i32_v16i1(<16 x i32>) {
1481; SSE-LABEL: icmp_v16i32_v16i1:
1482; SSE:       # %bb.0:
1483; SSE-NEXT:    pxor %xmm4, %xmm4
1484; SSE-NEXT:    pcmpeqd %xmm4, %xmm3
1485; SSE-NEXT:    pcmpeqd %xmm4, %xmm2
1486; SSE-NEXT:    packssdw %xmm3, %xmm2
1487; SSE-NEXT:    pcmpeqd %xmm4, %xmm1
1488; SSE-NEXT:    pcmpeqd %xmm4, %xmm0
1489; SSE-NEXT:    packssdw %xmm1, %xmm0
1490; SSE-NEXT:    packsswb %xmm2, %xmm0
1491; SSE-NEXT:    pmovmskb %xmm0, %eax
1492; SSE-NEXT:    testw %ax, %ax
1493; SSE-NEXT:    setne %al
1494; SSE-NEXT:    retq
1495;
1496; AVX1-LABEL: icmp_v16i32_v16i1:
1497; AVX1:       # %bb.0:
1498; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1499; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1500; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm2, %xmm2
1501; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm1, %xmm1
1502; AVX1-NEXT:    vpackssdw %xmm2, %xmm1, %xmm1
1503; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1504; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm2, %xmm2
1505; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm0, %xmm0
1506; AVX1-NEXT:    vpackssdw %xmm2, %xmm0, %xmm0
1507; AVX1-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
1508; AVX1-NEXT:    vpmovmskb %xmm0, %eax
1509; AVX1-NEXT:    testw %ax, %ax
1510; AVX1-NEXT:    setne %al
1511; AVX1-NEXT:    vzeroupper
1512; AVX1-NEXT:    retq
1513;
1514; AVX2-LABEL: icmp_v16i32_v16i1:
1515; AVX2:       # %bb.0:
1516; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1517; AVX2-NEXT:    vpcmpeqd %ymm2, %ymm1, %ymm1
1518; AVX2-NEXT:    vpcmpeqd %ymm2, %ymm0, %ymm0
1519; AVX2-NEXT:    vpackssdw %ymm1, %ymm0, %ymm0
1520; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
1521; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1522; AVX2-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
1523; AVX2-NEXT:    vpmovmskb %xmm0, %eax
1524; AVX2-NEXT:    testw %ax, %ax
1525; AVX2-NEXT:    setne %al
1526; AVX2-NEXT:    vzeroupper
1527; AVX2-NEXT:    retq
1528;
1529; AVX512-LABEL: icmp_v16i32_v16i1:
1530; AVX512:       # %bb.0:
1531; AVX512-NEXT:    vptestnmd %zmm0, %zmm0, %k0
1532; AVX512-NEXT:    kortestw %k0, %k0
1533; AVX512-NEXT:    setne %al
1534; AVX512-NEXT:    vzeroupper
1535; AVX512-NEXT:    retq
1536  %a = icmp eq <16 x i32> %0, zeroinitializer
1537  %b = call i1 @llvm.experimental.vector.reduce.or.v16i1(<16 x i1> %a)
1538  ret i1 %b
1539}
1540
1541define i1 @icmp_v32i16_v32i1(<32 x i16>) {
1542; SSE-LABEL: icmp_v32i16_v32i1:
1543; SSE:       # %bb.0:
1544; SSE-NEXT:    pxor %xmm4, %xmm4
1545; SSE-NEXT:    pcmpeqw %xmm4, %xmm1
1546; SSE-NEXT:    pcmpeqw %xmm4, %xmm0
1547; SSE-NEXT:    packsswb %xmm1, %xmm0
1548; SSE-NEXT:    pcmpeqw %xmm4, %xmm3
1549; SSE-NEXT:    pcmpeqw %xmm4, %xmm2
1550; SSE-NEXT:    packsswb %xmm3, %xmm2
1551; SSE-NEXT:    por %xmm0, %xmm2
1552; SSE-NEXT:    pmovmskb %xmm2, %eax
1553; SSE-NEXT:    testw %ax, %ax
1554; SSE-NEXT:    setne %al
1555; SSE-NEXT:    retq
1556;
1557; AVX1-LABEL: icmp_v32i16_v32i1:
1558; AVX1:       # %bb.0:
1559; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1560; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1561; AVX1-NEXT:    vpcmpeqw %xmm3, %xmm2, %xmm2
1562; AVX1-NEXT:    vpcmpeqw %xmm3, %xmm1, %xmm1
1563; AVX1-NEXT:    vpacksswb %xmm2, %xmm1, %xmm1
1564; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1565; AVX1-NEXT:    vpcmpeqw %xmm3, %xmm2, %xmm2
1566; AVX1-NEXT:    vpcmpeqw %xmm3, %xmm0, %xmm0
1567; AVX1-NEXT:    vpacksswb %xmm2, %xmm0, %xmm0
1568; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
1569; AVX1-NEXT:    vpsllw $7, %xmm0, %xmm0
1570; AVX1-NEXT:    vpmovmskb %xmm0, %eax
1571; AVX1-NEXT:    testw %ax, %ax
1572; AVX1-NEXT:    setne %al
1573; AVX1-NEXT:    vzeroupper
1574; AVX1-NEXT:    retq
1575;
1576; AVX2-LABEL: icmp_v32i16_v32i1:
1577; AVX2:       # %bb.0:
1578; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1579; AVX2-NEXT:    vpcmpeqw %ymm2, %ymm1, %ymm1
1580; AVX2-NEXT:    vpcmpeqw %ymm2, %ymm0, %ymm0
1581; AVX2-NEXT:    vpacksswb %ymm1, %ymm0, %ymm0
1582; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
1583; AVX2-NEXT:    vpmovmskb %ymm0, %eax
1584; AVX2-NEXT:    testl %eax, %eax
1585; AVX2-NEXT:    setne %al
1586; AVX2-NEXT:    vzeroupper
1587; AVX2-NEXT:    retq
1588;
1589; AVX512F-LABEL: icmp_v32i16_v32i1:
1590; AVX512F:       # %bb.0:
1591; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1592; AVX512F-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1593; AVX512F-NEXT:    vpcmpeqw %ymm2, %ymm1, %ymm1
1594; AVX512F-NEXT:    vpcmpeqw %ymm2, %ymm0, %ymm0
1595; AVX512F-NEXT:    vpor %ymm1, %ymm0, %ymm0
1596; AVX512F-NEXT:    vpmovsxwd %ymm0, %zmm0
1597; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k0
1598; AVX512F-NEXT:    kshiftrw $8, %k0, %k1
1599; AVX512F-NEXT:    korw %k1, %k0, %k0
1600; AVX512F-NEXT:    kshiftrw $4, %k0, %k1
1601; AVX512F-NEXT:    korw %k1, %k0, %k0
1602; AVX512F-NEXT:    kshiftrw $2, %k0, %k1
1603; AVX512F-NEXT:    korw %k1, %k0, %k0
1604; AVX512F-NEXT:    kshiftrw $1, %k0, %k1
1605; AVX512F-NEXT:    korw %k1, %k0, %k0
1606; AVX512F-NEXT:    kmovw %k0, %eax
1607; AVX512F-NEXT:    # kill: def $al killed $al killed $eax
1608; AVX512F-NEXT:    vzeroupper
1609; AVX512F-NEXT:    retq
1610;
1611; AVX512BW-LABEL: icmp_v32i16_v32i1:
1612; AVX512BW:       # %bb.0:
1613; AVX512BW-NEXT:    vptestnmw %zmm0, %zmm0, %k0
1614; AVX512BW-NEXT:    kortestd %k0, %k0
1615; AVX512BW-NEXT:    setne %al
1616; AVX512BW-NEXT:    vzeroupper
1617; AVX512BW-NEXT:    retq
1618;
1619; AVX512VL-LABEL: icmp_v32i16_v32i1:
1620; AVX512VL:       # %bb.0:
1621; AVX512VL-NEXT:    vptestnmw %zmm0, %zmm0, %k0
1622; AVX512VL-NEXT:    kortestd %k0, %k0
1623; AVX512VL-NEXT:    setne %al
1624; AVX512VL-NEXT:    vzeroupper
1625; AVX512VL-NEXT:    retq
1626  %a = icmp eq <32 x i16> %0, zeroinitializer
1627  %b = call i1 @llvm.experimental.vector.reduce.or.v32i1(<32 x i1> %a)
1628  ret i1 %b
1629}
1630
1631define i1 @icmp_v64i8_v64i1(<64 x i8>) {
1632; SSE-LABEL: icmp_v64i8_v64i1:
1633; SSE:       # %bb.0:
1634; SSE-NEXT:    pxor %xmm4, %xmm4
1635; SSE-NEXT:    pcmpeqb %xmm4, %xmm2
1636; SSE-NEXT:    pcmpeqb %xmm4, %xmm0
1637; SSE-NEXT:    pcmpeqb %xmm4, %xmm3
1638; SSE-NEXT:    pcmpeqb %xmm4, %xmm1
1639; SSE-NEXT:    por %xmm3, %xmm1
1640; SSE-NEXT:    por %xmm2, %xmm1
1641; SSE-NEXT:    por %xmm0, %xmm1
1642; SSE-NEXT:    psllw $7, %xmm1
1643; SSE-NEXT:    pmovmskb %xmm1, %eax
1644; SSE-NEXT:    testw %ax, %ax
1645; SSE-NEXT:    setne %al
1646; SSE-NEXT:    retq
1647;
1648; AVX1-LABEL: icmp_v64i8_v64i1:
1649; AVX1:       # %bb.0:
1650; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1651; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm1, %xmm3
1652; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm0, %xmm4
1653; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
1654; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm1, %xmm1
1655; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1656; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm0, %xmm0
1657; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
1658; AVX1-NEXT:    vpor %xmm0, %xmm3, %xmm0
1659; AVX1-NEXT:    vpor %xmm0, %xmm4, %xmm0
1660; AVX1-NEXT:    vpsllw $7, %xmm0, %xmm0
1661; AVX1-NEXT:    vpmovmskb %xmm0, %eax
1662; AVX1-NEXT:    testw %ax, %ax
1663; AVX1-NEXT:    setne %al
1664; AVX1-NEXT:    vzeroupper
1665; AVX1-NEXT:    retq
1666;
1667; AVX2-LABEL: icmp_v64i8_v64i1:
1668; AVX2:       # %bb.0:
1669; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1670; AVX2-NEXT:    vpcmpeqb %ymm2, %ymm1, %ymm1
1671; AVX2-NEXT:    vpcmpeqb %ymm2, %ymm0, %ymm0
1672; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1673; AVX2-NEXT:    vpmovmskb %ymm0, %eax
1674; AVX2-NEXT:    testl %eax, %eax
1675; AVX2-NEXT:    setne %al
1676; AVX2-NEXT:    vzeroupper
1677; AVX2-NEXT:    retq
1678;
1679; AVX512F-LABEL: icmp_v64i8_v64i1:
1680; AVX512F:       # %bb.0:
1681; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1682; AVX512F-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1683; AVX512F-NEXT:    vpcmpeqb %ymm2, %ymm1, %ymm1
1684; AVX512F-NEXT:    vpcmpeqb %ymm2, %ymm0, %ymm0
1685; AVX512F-NEXT:    vextracti128 $1, %ymm1, %xmm2
1686; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm3
1687; AVX512F-NEXT:    vpor %xmm2, %xmm3, %xmm2
1688; AVX512F-NEXT:    vpor %xmm2, %xmm1, %xmm1
1689; AVX512F-NEXT:    vpor %xmm1, %xmm0, %xmm0
1690; AVX512F-NEXT:    vpmovsxbd %xmm0, %zmm0
1691; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k0
1692; AVX512F-NEXT:    kshiftrw $8, %k0, %k1
1693; AVX512F-NEXT:    korw %k1, %k0, %k0
1694; AVX512F-NEXT:    kshiftrw $4, %k0, %k1
1695; AVX512F-NEXT:    korw %k1, %k0, %k0
1696; AVX512F-NEXT:    kshiftrw $2, %k0, %k1
1697; AVX512F-NEXT:    korw %k1, %k0, %k0
1698; AVX512F-NEXT:    kshiftrw $1, %k0, %k1
1699; AVX512F-NEXT:    korw %k1, %k0, %k0
1700; AVX512F-NEXT:    kmovw %k0, %eax
1701; AVX512F-NEXT:    # kill: def $al killed $al killed $eax
1702; AVX512F-NEXT:    vzeroupper
1703; AVX512F-NEXT:    retq
1704;
1705; AVX512BW-LABEL: icmp_v64i8_v64i1:
1706; AVX512BW:       # %bb.0:
1707; AVX512BW-NEXT:    vptestnmb %zmm0, %zmm0, %k0
1708; AVX512BW-NEXT:    kortestq %k0, %k0
1709; AVX512BW-NEXT:    setne %al
1710; AVX512BW-NEXT:    vzeroupper
1711; AVX512BW-NEXT:    retq
1712;
1713; AVX512VL-LABEL: icmp_v64i8_v64i1:
1714; AVX512VL:       # %bb.0:
1715; AVX512VL-NEXT:    vptestnmb %zmm0, %zmm0, %k0
1716; AVX512VL-NEXT:    kortestq %k0, %k0
1717; AVX512VL-NEXT:    setne %al
1718; AVX512VL-NEXT:    vzeroupper
1719; AVX512VL-NEXT:    retq
1720  %a = icmp eq <64 x i8> %0, zeroinitializer
1721  %b = call i1 @llvm.experimental.vector.reduce.or.v64i1(<64 x i1> %a)
1722  ret i1 %b
1723}
1724
1725declare i1 @llvm.experimental.vector.reduce.or.v2i1(<2 x i1>)
1726declare i1 @llvm.experimental.vector.reduce.or.v4i1(<4 x i1>)
1727declare i1 @llvm.experimental.vector.reduce.or.v8i1(<8 x i1>)
1728declare i1 @llvm.experimental.vector.reduce.or.v16i1(<16 x i1>)
1729declare i1 @llvm.experimental.vector.reduce.or.v32i1(<32 x i1>)
1730declare i1 @llvm.experimental.vector.reduce.or.v64i1(<64 x i1>)
1731