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