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