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