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:    testl %eax, %eax
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:    testl %eax, %eax
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.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:    testl %eax, %eax
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:    testl %eax, %eax
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.vector.reduce.or.v4i1(<4 x i1> %a)
111  ret i1 %b
112}
113
114define i1 @trunc_v8i16_v8i1(<8 x i16>) {
115; SSE-LABEL: trunc_v8i16_v8i1:
116; SSE:       # %bb.0:
117; SSE-NEXT:    psllw $15, %xmm0
118; SSE-NEXT:    pmovmskb %xmm0, %eax
119; SSE-NEXT:    testl $43690, %eax # imm = 0xAAAA
120; SSE-NEXT:    setne %al
121; SSE-NEXT:    retq
122;
123; AVX-LABEL: trunc_v8i16_v8i1:
124; AVX:       # %bb.0:
125; AVX-NEXT:    vpsllw $15, %xmm0, %xmm0
126; AVX-NEXT:    vpmovmskb %xmm0, %eax
127; AVX-NEXT:    testl $43690, %eax # imm = 0xAAAA
128; AVX-NEXT:    setne %al
129; AVX-NEXT:    retq
130;
131; AVX512F-LABEL: trunc_v8i16_v8i1:
132; AVX512F:       # %bb.0:
133; AVX512F-NEXT:    vpmovsxwq %xmm0, %zmm0
134; AVX512F-NEXT:    vpsllq $63, %zmm0, %zmm0
135; AVX512F-NEXT:    vptestmq %zmm0, %zmm0, %k0
136; AVX512F-NEXT:    kmovw %k0, %eax
137; AVX512F-NEXT:    testb %al, %al
138; AVX512F-NEXT:    setne %al
139; AVX512F-NEXT:    vzeroupper
140; AVX512F-NEXT:    retq
141;
142; AVX512BW-LABEL: trunc_v8i16_v8i1:
143; AVX512BW:       # %bb.0:
144; AVX512BW-NEXT:    vpsllw $15, %xmm0, %xmm0
145; AVX512BW-NEXT:    vpmovw2m %zmm0, %k0
146; AVX512BW-NEXT:    kmovd %k0, %eax
147; AVX512BW-NEXT:    testb %al, %al
148; AVX512BW-NEXT:    setne %al
149; AVX512BW-NEXT:    vzeroupper
150; AVX512BW-NEXT:    retq
151;
152; AVX512VL-LABEL: trunc_v8i16_v8i1:
153; AVX512VL:       # %bb.0:
154; AVX512VL-NEXT:    vpsllw $15, %xmm0, %xmm0
155; AVX512VL-NEXT:    vpmovw2m %xmm0, %k0
156; AVX512VL-NEXT:    kmovd %k0, %eax
157; AVX512VL-NEXT:    testb %al, %al
158; AVX512VL-NEXT:    setne %al
159; AVX512VL-NEXT:    retq
160  %a = trunc <8 x i16> %0 to <8 x i1>
161  %b = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> %a)
162  ret i1 %b
163}
164
165define i1 @trunc_v16i8_v16i1(<16 x i8>) {
166; SSE-LABEL: trunc_v16i8_v16i1:
167; SSE:       # %bb.0:
168; SSE-NEXT:    psllw $7, %xmm0
169; SSE-NEXT:    pmovmskb %xmm0, %eax
170; SSE-NEXT:    testl %eax, %eax
171; SSE-NEXT:    setne %al
172; SSE-NEXT:    retq
173;
174; AVX-LABEL: trunc_v16i8_v16i1:
175; AVX:       # %bb.0:
176; AVX-NEXT:    vpsllw $7, %xmm0, %xmm0
177; AVX-NEXT:    vpmovmskb %xmm0, %eax
178; AVX-NEXT:    testl %eax, %eax
179; AVX-NEXT:    setne %al
180; AVX-NEXT:    retq
181;
182; AVX512-LABEL: trunc_v16i8_v16i1:
183; AVX512:       # %bb.0:
184; AVX512-NEXT:    vpsllw $7, %xmm0, %xmm0
185; AVX512-NEXT:    vpmovmskb %xmm0, %eax
186; AVX512-NEXT:    testl %eax, %eax
187; AVX512-NEXT:    setne %al
188; AVX512-NEXT:    retq
189  %a = trunc <16 x i8> %0 to <16 x i1>
190  %b = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> %a)
191  ret i1 %b
192}
193
194define i1 @trunc_v4i64_v4i1(<4 x i64>) {
195; SSE-LABEL: trunc_v4i64_v4i1:
196; SSE:       # %bb.0:
197; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
198; SSE-NEXT:    pslld $31, %xmm0
199; SSE-NEXT:    movmskps %xmm0, %eax
200; SSE-NEXT:    testl %eax, %eax
201; SSE-NEXT:    setne %al
202; SSE-NEXT:    retq
203;
204; AVX1-LABEL: trunc_v4i64_v4i1:
205; AVX1:       # %bb.0:
206; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
207; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
208; AVX1-NEXT:    vpslld $31, %xmm0, %xmm0
209; AVX1-NEXT:    vmovmskps %xmm0, %eax
210; AVX1-NEXT:    testl %eax, %eax
211; AVX1-NEXT:    setne %al
212; AVX1-NEXT:    vzeroupper
213; AVX1-NEXT:    retq
214;
215; AVX2-LABEL: trunc_v4i64_v4i1:
216; AVX2:       # %bb.0:
217; AVX2-NEXT:    vpsllq $63, %ymm0, %ymm0
218; AVX2-NEXT:    vmovmskpd %ymm0, %eax
219; AVX2-NEXT:    testl %eax, %eax
220; AVX2-NEXT:    setne %al
221; AVX2-NEXT:    vzeroupper
222; AVX2-NEXT:    retq
223;
224; AVX512F-LABEL: trunc_v4i64_v4i1:
225; AVX512F:       # %bb.0:
226; AVX512F-NEXT:    vpsllq $63, %ymm0, %ymm0
227; AVX512F-NEXT:    vptestmq %zmm0, %zmm0, %k0
228; AVX512F-NEXT:    kmovw %k0, %eax
229; AVX512F-NEXT:    testb $15, %al
230; AVX512F-NEXT:    setne %al
231; AVX512F-NEXT:    vzeroupper
232; AVX512F-NEXT:    retq
233;
234; AVX512BW-LABEL: trunc_v4i64_v4i1:
235; AVX512BW:       # %bb.0:
236; AVX512BW-NEXT:    vpsllq $63, %ymm0, %ymm0
237; AVX512BW-NEXT:    vptestmq %zmm0, %zmm0, %k0
238; AVX512BW-NEXT:    kmovd %k0, %eax
239; AVX512BW-NEXT:    testb $15, %al
240; AVX512BW-NEXT:    setne %al
241; AVX512BW-NEXT:    vzeroupper
242; AVX512BW-NEXT:    retq
243;
244; AVX512VL-LABEL: trunc_v4i64_v4i1:
245; AVX512VL:       # %bb.0:
246; AVX512VL-NEXT:    vpsllq $63, %ymm0, %ymm0
247; AVX512VL-NEXT:    vptestmq %ymm0, %ymm0, %k0
248; AVX512VL-NEXT:    kmovd %k0, %eax
249; AVX512VL-NEXT:    testb %al, %al
250; AVX512VL-NEXT:    setne %al
251; AVX512VL-NEXT:    vzeroupper
252; AVX512VL-NEXT:    retq
253  %a = trunc <4 x i64> %0 to <4 x i1>
254  %b = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> %a)
255  ret i1 %b
256}
257
258define i1 @trunc_v8i32_v8i1(<8 x i32>) {
259; SSE2-LABEL: trunc_v8i32_v8i1:
260; SSE2:       # %bb.0:
261; SSE2-NEXT:    pslld $16, %xmm1
262; SSE2-NEXT:    psrad $16, %xmm1
263; SSE2-NEXT:    pslld $16, %xmm0
264; SSE2-NEXT:    psrad $16, %xmm0
265; SSE2-NEXT:    packssdw %xmm1, %xmm0
266; SSE2-NEXT:    psllw $15, %xmm0
267; SSE2-NEXT:    pmovmskb %xmm0, %eax
268; SSE2-NEXT:    testl $43690, %eax # imm = 0xAAAA
269; SSE2-NEXT:    setne %al
270; SSE2-NEXT:    retq
271;
272; SSE41-LABEL: trunc_v8i32_v8i1:
273; SSE41:       # %bb.0:
274; SSE41-NEXT:    pxor %xmm2, %xmm2
275; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3],xmm1[4],xmm2[5],xmm1[6],xmm2[7]
276; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7]
277; SSE41-NEXT:    packusdw %xmm1, %xmm0
278; SSE41-NEXT:    psllw $15, %xmm0
279; SSE41-NEXT:    pmovmskb %xmm0, %eax
280; SSE41-NEXT:    testl $43690, %eax # imm = 0xAAAA
281; SSE41-NEXT:    setne %al
282; SSE41-NEXT:    retq
283;
284; AVX1-LABEL: trunc_v8i32_v8i1:
285; AVX1:       # %bb.0:
286; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
287; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
288; AVX1-NEXT:    vpslld $31, %xmm0, %xmm0
289; AVX1-NEXT:    vmovmskps %xmm0, %eax
290; AVX1-NEXT:    testl %eax, %eax
291; AVX1-NEXT:    setne %al
292; AVX1-NEXT:    vzeroupper
293; AVX1-NEXT:    retq
294;
295; AVX2-LABEL: trunc_v8i32_v8i1:
296; AVX2:       # %bb.0:
297; AVX2-NEXT:    vpslld $31, %ymm0, %ymm0
298; AVX2-NEXT:    vmovmskps %ymm0, %eax
299; AVX2-NEXT:    testl %eax, %eax
300; AVX2-NEXT:    setne %al
301; AVX2-NEXT:    vzeroupper
302; AVX2-NEXT:    retq
303;
304; AVX512F-LABEL: trunc_v8i32_v8i1:
305; AVX512F:       # %bb.0:
306; AVX512F-NEXT:    vpslld $31, %ymm0, %ymm0
307; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k0
308; AVX512F-NEXT:    kmovw %k0, %eax
309; AVX512F-NEXT:    testb %al, %al
310; AVX512F-NEXT:    setne %al
311; AVX512F-NEXT:    vzeroupper
312; AVX512F-NEXT:    retq
313;
314; AVX512BW-LABEL: trunc_v8i32_v8i1:
315; AVX512BW:       # %bb.0:
316; AVX512BW-NEXT:    vpslld $31, %ymm0, %ymm0
317; AVX512BW-NEXT:    vptestmd %zmm0, %zmm0, %k0
318; AVX512BW-NEXT:    kmovd %k0, %eax
319; AVX512BW-NEXT:    testb %al, %al
320; AVX512BW-NEXT:    setne %al
321; AVX512BW-NEXT:    vzeroupper
322; AVX512BW-NEXT:    retq
323;
324; AVX512VL-LABEL: trunc_v8i32_v8i1:
325; AVX512VL:       # %bb.0:
326; AVX512VL-NEXT:    vpslld $31, %ymm0, %ymm0
327; AVX512VL-NEXT:    vptestmd %ymm0, %ymm0, %k0
328; AVX512VL-NEXT:    kmovd %k0, %eax
329; AVX512VL-NEXT:    testb %al, %al
330; AVX512VL-NEXT:    setne %al
331; AVX512VL-NEXT:    vzeroupper
332; AVX512VL-NEXT:    retq
333  %a = trunc <8 x i32> %0 to <8 x i1>
334  %b = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> %a)
335  ret i1 %b
336}
337
338define i1 @trunc_v16i16_v16i1(<16 x i16>) {
339; SSE-LABEL: trunc_v16i16_v16i1:
340; SSE:       # %bb.0:
341; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]
342; SSE-NEXT:    pand %xmm2, %xmm1
343; SSE-NEXT:    pand %xmm2, %xmm0
344; SSE-NEXT:    packuswb %xmm1, %xmm0
345; SSE-NEXT:    psllw $7, %xmm0
346; SSE-NEXT:    pmovmskb %xmm0, %eax
347; SSE-NEXT:    testl %eax, %eax
348; SSE-NEXT:    setne %al
349; SSE-NEXT:    retq
350;
351; AVX1-LABEL: trunc_v16i16_v16i1:
352; AVX1:       # %bb.0:
353; AVX1-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
354; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
355; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
356; AVX1-NEXT:    vpsllw $7, %xmm0, %xmm0
357; AVX1-NEXT:    vpmovmskb %xmm0, %eax
358; AVX1-NEXT:    testl %eax, %eax
359; AVX1-NEXT:    setne %al
360; AVX1-NEXT:    vzeroupper
361; AVX1-NEXT:    retq
362;
363; AVX2-LABEL: trunc_v16i16_v16i1:
364; AVX2:       # %bb.0:
365; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
366; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
367; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
368; AVX2-NEXT:    vpsllw $7, %xmm0, %xmm0
369; AVX2-NEXT:    vpmovmskb %xmm0, %eax
370; AVX2-NEXT:    testl %eax, %eax
371; AVX2-NEXT:    setne %al
372; AVX2-NEXT:    vzeroupper
373; AVX2-NEXT:    retq
374;
375; AVX512F-LABEL: trunc_v16i16_v16i1:
376; AVX512F:       # %bb.0:
377; AVX512F-NEXT:    vpmovsxwd %ymm0, %zmm0
378; AVX512F-NEXT:    vpslld $31, %zmm0, %zmm0
379; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k0
380; AVX512F-NEXT:    kortestw %k0, %k0
381; AVX512F-NEXT:    setne %al
382; AVX512F-NEXT:    vzeroupper
383; AVX512F-NEXT:    retq
384;
385; AVX512BW-LABEL: trunc_v16i16_v16i1:
386; AVX512BW:       # %bb.0:
387; AVX512BW-NEXT:    vpsllw $15, %ymm0, %ymm0
388; AVX512BW-NEXT:    vpmovw2m %zmm0, %k0
389; AVX512BW-NEXT:    kortestw %k0, %k0
390; AVX512BW-NEXT:    setne %al
391; AVX512BW-NEXT:    vzeroupper
392; AVX512BW-NEXT:    retq
393;
394; AVX512VL-LABEL: trunc_v16i16_v16i1:
395; AVX512VL:       # %bb.0:
396; AVX512VL-NEXT:    vpsllw $15, %ymm0, %ymm0
397; AVX512VL-NEXT:    vpmovw2m %ymm0, %k0
398; AVX512VL-NEXT:    kortestw %k0, %k0
399; AVX512VL-NEXT:    setne %al
400; AVX512VL-NEXT:    vzeroupper
401; AVX512VL-NEXT:    retq
402  %a = trunc <16 x i16> %0 to <16 x i1>
403  %b = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> %a)
404  ret i1 %b
405}
406
407define i1 @trunc_v32i8_v32i1(<32 x i8>) {
408; SSE-LABEL: trunc_v32i8_v32i1:
409; SSE:       # %bb.0:
410; SSE-NEXT:    por %xmm1, %xmm0
411; SSE-NEXT:    psllw $7, %xmm0
412; SSE-NEXT:    pmovmskb %xmm0, %eax
413; SSE-NEXT:    testl %eax, %eax
414; SSE-NEXT:    setne %al
415; SSE-NEXT:    retq
416;
417; AVX1-LABEL: trunc_v32i8_v32i1:
418; AVX1:       # %bb.0:
419; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
420; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
421; AVX1-NEXT:    vpsllw $7, %xmm0, %xmm0
422; AVX1-NEXT:    vpmovmskb %xmm0, %eax
423; AVX1-NEXT:    testl %eax, %eax
424; AVX1-NEXT:    setne %al
425; AVX1-NEXT:    vzeroupper
426; AVX1-NEXT:    retq
427;
428; AVX2-LABEL: trunc_v32i8_v32i1:
429; AVX2:       # %bb.0:
430; AVX2-NEXT:    vpsllw $7, %ymm0, %ymm0
431; AVX2-NEXT:    vpmovmskb %ymm0, %eax
432; AVX2-NEXT:    testl %eax, %eax
433; AVX2-NEXT:    setne %al
434; AVX2-NEXT:    vzeroupper
435; AVX2-NEXT:    retq
436;
437; AVX512F-LABEL: trunc_v32i8_v32i1:
438; AVX512F:       # %bb.0:
439; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm1
440; AVX512F-NEXT:    vpor %xmm1, %xmm0, %xmm0
441; AVX512F-NEXT:    vpmovsxbd %xmm0, %zmm0
442; AVX512F-NEXT:    vpslld $31, %zmm0, %zmm0
443; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k0
444; AVX512F-NEXT:    kshiftrw $8, %k0, %k1
445; AVX512F-NEXT:    korw %k1, %k0, %k0
446; AVX512F-NEXT:    kshiftrw $4, %k0, %k1
447; AVX512F-NEXT:    korw %k1, %k0, %k0
448; AVX512F-NEXT:    kshiftrw $2, %k0, %k1
449; AVX512F-NEXT:    korw %k1, %k0, %k0
450; AVX512F-NEXT:    kshiftrw $1, %k0, %k1
451; AVX512F-NEXT:    korw %k1, %k0, %k0
452; AVX512F-NEXT:    kmovw %k0, %eax
453; AVX512F-NEXT:    # kill: def $al killed $al killed $eax
454; AVX512F-NEXT:    vzeroupper
455; AVX512F-NEXT:    retq
456;
457; AVX512BW-LABEL: trunc_v32i8_v32i1:
458; AVX512BW:       # %bb.0:
459; AVX512BW-NEXT:    vpsllw $7, %ymm0, %ymm0
460; AVX512BW-NEXT:    vpmovmskb %ymm0, %eax
461; AVX512BW-NEXT:    testl %eax, %eax
462; AVX512BW-NEXT:    setne %al
463; AVX512BW-NEXT:    vzeroupper
464; AVX512BW-NEXT:    retq
465;
466; AVX512VL-LABEL: trunc_v32i8_v32i1:
467; AVX512VL:       # %bb.0:
468; AVX512VL-NEXT:    vpsllw $7, %ymm0, %ymm0
469; AVX512VL-NEXT:    vpmovmskb %ymm0, %eax
470; AVX512VL-NEXT:    testl %eax, %eax
471; AVX512VL-NEXT:    setne %al
472; AVX512VL-NEXT:    vzeroupper
473; AVX512VL-NEXT:    retq
474  %a = trunc <32 x i8> %0 to <32 x i1>
475  %b = call i1 @llvm.vector.reduce.or.v32i1(<32 x i1> %a)
476  ret i1 %b
477}
478
479define i1 @trunc_v8i64_v8i1(<8 x i64>) {
480; SSE2-LABEL: trunc_v8i64_v8i1:
481; SSE2:       # %bb.0:
482; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
483; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
484; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
485; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
486; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
487; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[0,2,2,3]
488; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,1,0,2,4,5,6,7]
489; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
490; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[0,1,0,2,4,5,6,7]
491; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
492; SSE2-NEXT:    movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
493; SSE2-NEXT:    psllw $15, %xmm2
494; SSE2-NEXT:    pmovmskb %xmm2, %eax
495; SSE2-NEXT:    testl $43690, %eax # imm = 0xAAAA
496; SSE2-NEXT:    setne %al
497; SSE2-NEXT:    retq
498;
499; SSE41-LABEL: trunc_v8i64_v8i1:
500; SSE41:       # %bb.0:
501; SSE41-NEXT:    pxor %xmm4, %xmm4
502; SSE41-NEXT:    pblendw {{.*#+}} xmm3 = xmm3[0],xmm4[1,2,3],xmm3[4],xmm4[5,6,7]
503; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0],xmm4[1,2,3],xmm2[4],xmm4[5,6,7]
504; SSE41-NEXT:    packusdw %xmm3, %xmm2
505; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0],xmm4[1,2,3],xmm1[4],xmm4[5,6,7]
506; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0],xmm4[1,2,3],xmm0[4],xmm4[5,6,7]
507; SSE41-NEXT:    packusdw %xmm1, %xmm0
508; SSE41-NEXT:    packusdw %xmm2, %xmm0
509; SSE41-NEXT:    psllw $15, %xmm0
510; SSE41-NEXT:    pmovmskb %xmm0, %eax
511; SSE41-NEXT:    testl $43690, %eax # imm = 0xAAAA
512; SSE41-NEXT:    setne %al
513; SSE41-NEXT:    retq
514;
515; AVX1-LABEL: trunc_v8i64_v8i1:
516; AVX1:       # %bb.0:
517; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
518; AVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2]
519; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
520; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2]
521; AVX1-NEXT:    vorps %xmm1, %xmm0, %xmm0
522; AVX1-NEXT:    vpslld $31, %xmm0, %xmm0
523; AVX1-NEXT:    vmovmskps %xmm0, %eax
524; AVX1-NEXT:    testl %eax, %eax
525; AVX1-NEXT:    setne %al
526; AVX1-NEXT:    vzeroupper
527; AVX1-NEXT:    retq
528;
529; AVX2-LABEL: trunc_v8i64_v8i1:
530; AVX2:       # %bb.0:
531; AVX2-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]
532; AVX2-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
533; AVX2-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6]
534; AVX2-NEXT:    vpslld $31, %ymm0, %ymm0
535; AVX2-NEXT:    vmovmskps %ymm0, %eax
536; AVX2-NEXT:    testl %eax, %eax
537; AVX2-NEXT:    setne %al
538; AVX2-NEXT:    vzeroupper
539; AVX2-NEXT:    retq
540;
541; AVX512F-LABEL: trunc_v8i64_v8i1:
542; AVX512F:       # %bb.0:
543; AVX512F-NEXT:    vpsllq $63, %zmm0, %zmm0
544; AVX512F-NEXT:    vptestmq %zmm0, %zmm0, %k0
545; AVX512F-NEXT:    kmovw %k0, %eax
546; AVX512F-NEXT:    testb %al, %al
547; AVX512F-NEXT:    setne %al
548; AVX512F-NEXT:    vzeroupper
549; AVX512F-NEXT:    retq
550;
551; AVX512BW-LABEL: trunc_v8i64_v8i1:
552; AVX512BW:       # %bb.0:
553; AVX512BW-NEXT:    vpsllq $63, %zmm0, %zmm0
554; AVX512BW-NEXT:    vptestmq %zmm0, %zmm0, %k0
555; AVX512BW-NEXT:    kmovd %k0, %eax
556; AVX512BW-NEXT:    testb %al, %al
557; AVX512BW-NEXT:    setne %al
558; AVX512BW-NEXT:    vzeroupper
559; AVX512BW-NEXT:    retq
560;
561; AVX512VL-LABEL: trunc_v8i64_v8i1:
562; AVX512VL:       # %bb.0:
563; AVX512VL-NEXT:    vpsllq $63, %zmm0, %zmm0
564; AVX512VL-NEXT:    vptestmq %zmm0, %zmm0, %k0
565; AVX512VL-NEXT:    kmovd %k0, %eax
566; AVX512VL-NEXT:    testb %al, %al
567; AVX512VL-NEXT:    setne %al
568; AVX512VL-NEXT:    vzeroupper
569; AVX512VL-NEXT:    retq
570  %a = trunc <8 x i64> %0 to <8 x i1>
571  %b = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> %a)
572  ret i1 %b
573}
574
575define i1 @trunc_v16i32_v16i1(<16 x i32>) {
576; SSE2-LABEL: trunc_v16i32_v16i1:
577; SSE2:       # %bb.0:
578; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]
579; SSE2-NEXT:    pand %xmm4, %xmm3
580; SSE2-NEXT:    pand %xmm4, %xmm2
581; SSE2-NEXT:    packuswb %xmm3, %xmm2
582; SSE2-NEXT:    pand %xmm4, %xmm1
583; SSE2-NEXT:    pand %xmm4, %xmm0
584; SSE2-NEXT:    packuswb %xmm1, %xmm0
585; SSE2-NEXT:    packuswb %xmm2, %xmm0
586; SSE2-NEXT:    psllw $7, %xmm0
587; SSE2-NEXT:    pmovmskb %xmm0, %eax
588; SSE2-NEXT:    testl %eax, %eax
589; SSE2-NEXT:    setne %al
590; SSE2-NEXT:    retq
591;
592; SSE41-LABEL: trunc_v16i32_v16i1:
593; SSE41:       # %bb.0:
594; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]
595; SSE41-NEXT:    pand %xmm4, %xmm3
596; SSE41-NEXT:    pand %xmm4, %xmm2
597; SSE41-NEXT:    packusdw %xmm3, %xmm2
598; SSE41-NEXT:    pand %xmm4, %xmm1
599; SSE41-NEXT:    pand %xmm4, %xmm0
600; SSE41-NEXT:    packusdw %xmm1, %xmm0
601; SSE41-NEXT:    packuswb %xmm2, %xmm0
602; SSE41-NEXT:    psllw $7, %xmm0
603; SSE41-NEXT:    pmovmskb %xmm0, %eax
604; SSE41-NEXT:    testl %eax, %eax
605; SSE41-NEXT:    setne %al
606; SSE41-NEXT:    retq
607;
608; AVX1-LABEL: trunc_v16i32_v16i1:
609; AVX1:       # %bb.0:
610; AVX1-NEXT:    vmovaps {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255]
611; AVX1-NEXT:    vandps %ymm2, %ymm1, %ymm1
612; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
613; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
614; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
615; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
616; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
617; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
618; AVX1-NEXT:    vpsllw $7, %xmm0, %xmm0
619; AVX1-NEXT:    vpmovmskb %xmm0, %eax
620; AVX1-NEXT:    testl %eax, %eax
621; AVX1-NEXT:    setne %al
622; AVX1-NEXT:    vzeroupper
623; AVX1-NEXT:    retq
624;
625; AVX2-LABEL: trunc_v16i32_v16i1:
626; AVX2:       # %bb.0:
627; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255]
628; AVX2-NEXT:    vpand %ymm2, %ymm1, %ymm1
629; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0
630; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
631; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
632; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
633; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
634; AVX2-NEXT:    vpsllw $7, %xmm0, %xmm0
635; AVX2-NEXT:    vpmovmskb %xmm0, %eax
636; AVX2-NEXT:    testl %eax, %eax
637; AVX2-NEXT:    setne %al
638; AVX2-NEXT:    vzeroupper
639; AVX2-NEXT:    retq
640;
641; AVX512-LABEL: trunc_v16i32_v16i1:
642; AVX512:       # %bb.0:
643; AVX512-NEXT:    vpslld $31, %zmm0, %zmm0
644; AVX512-NEXT:    vptestmd %zmm0, %zmm0, %k0
645; AVX512-NEXT:    kortestw %k0, %k0
646; AVX512-NEXT:    setne %al
647; AVX512-NEXT:    vzeroupper
648; AVX512-NEXT:    retq
649  %a = trunc <16 x i32> %0 to <16 x i1>
650  %b = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> %a)
651  ret i1 %b
652}
653
654define i1 @trunc_v32i16_v32i1(<32 x i16>) {
655; SSE-LABEL: trunc_v32i16_v32i1:
656; SSE:       # %bb.0:
657; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
658; SSE-NEXT:    pand %xmm4, %xmm3
659; SSE-NEXT:    pand %xmm4, %xmm2
660; SSE-NEXT:    packuswb %xmm3, %xmm2
661; SSE-NEXT:    pand %xmm4, %xmm1
662; SSE-NEXT:    pand %xmm4, %xmm0
663; SSE-NEXT:    packuswb %xmm1, %xmm0
664; SSE-NEXT:    por %xmm2, %xmm0
665; SSE-NEXT:    psllw $7, %xmm0
666; SSE-NEXT:    pmovmskb %xmm0, %eax
667; SSE-NEXT:    testl %eax, %eax
668; SSE-NEXT:    setne %al
669; SSE-NEXT:    retq
670;
671; AVX1-LABEL: trunc_v32i16_v32i1:
672; AVX1:       # %bb.0:
673; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
674; AVX1-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
675; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
676; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
677; AVX1-NEXT:    vpsllw $7, %xmm0, %xmm0
678; AVX1-NEXT:    vpmovmskb %xmm0, %eax
679; AVX1-NEXT:    testl %eax, %eax
680; AVX1-NEXT:    setne %al
681; AVX1-NEXT:    vzeroupper
682; AVX1-NEXT:    retq
683;
684; AVX2-LABEL: trunc_v32i16_v32i1:
685; AVX2:       # %bb.0:
686; AVX2-NEXT:    vpbroadcastw {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
687; AVX2-NEXT:    vpand %ymm2, %ymm1, %ymm1
688; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0
689; AVX2-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
690; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
691; AVX2-NEXT:    vpsllw $7, %ymm0, %ymm0
692; AVX2-NEXT:    vpmovmskb %ymm0, %eax
693; AVX2-NEXT:    testl %eax, %eax
694; AVX2-NEXT:    setne %al
695; AVX2-NEXT:    vzeroupper
696; AVX2-NEXT:    retq
697;
698; AVX512F-LABEL: trunc_v32i16_v32i1:
699; AVX512F:       # %bb.0:
700; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
701; AVX512F-NEXT:    vpor %ymm1, %ymm0, %ymm0
702; AVX512F-NEXT:    vpmovsxwd %ymm0, %zmm0
703; AVX512F-NEXT:    vpslld $31, %zmm0, %zmm0
704; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k0
705; AVX512F-NEXT:    kshiftrw $8, %k0, %k1
706; AVX512F-NEXT:    korw %k1, %k0, %k0
707; AVX512F-NEXT:    kshiftrw $4, %k0, %k1
708; AVX512F-NEXT:    korw %k1, %k0, %k0
709; AVX512F-NEXT:    kshiftrw $2, %k0, %k1
710; AVX512F-NEXT:    korw %k1, %k0, %k0
711; AVX512F-NEXT:    kshiftrw $1, %k0, %k1
712; AVX512F-NEXT:    korw %k1, %k0, %k0
713; AVX512F-NEXT:    kmovw %k0, %eax
714; AVX512F-NEXT:    # kill: def $al killed $al killed $eax
715; AVX512F-NEXT:    vzeroupper
716; AVX512F-NEXT:    retq
717;
718; AVX512BW-LABEL: trunc_v32i16_v32i1:
719; AVX512BW:       # %bb.0:
720; AVX512BW-NEXT:    vpsllw $15, %zmm0, %zmm0
721; AVX512BW-NEXT:    vpmovw2m %zmm0, %k0
722; AVX512BW-NEXT:    kortestd %k0, %k0
723; AVX512BW-NEXT:    setne %al
724; AVX512BW-NEXT:    vzeroupper
725; AVX512BW-NEXT:    retq
726;
727; AVX512VL-LABEL: trunc_v32i16_v32i1:
728; AVX512VL:       # %bb.0:
729; AVX512VL-NEXT:    vpsllw $15, %zmm0, %zmm0
730; AVX512VL-NEXT:    vpmovw2m %zmm0, %k0
731; AVX512VL-NEXT:    kortestd %k0, %k0
732; AVX512VL-NEXT:    setne %al
733; AVX512VL-NEXT:    vzeroupper
734; AVX512VL-NEXT:    retq
735  %a = trunc <32 x i16> %0 to <32 x i1>
736  %b = call i1 @llvm.vector.reduce.or.v32i1(<32 x i1> %a)
737  ret i1 %b
738}
739
740define i1 @trunc_v64i8_v64i1(<64 x i8>) {
741; SSE-LABEL: trunc_v64i8_v64i1:
742; SSE:       # %bb.0:
743; SSE-NEXT:    por %xmm3, %xmm1
744; SSE-NEXT:    por %xmm2, %xmm1
745; SSE-NEXT:    por %xmm0, %xmm1
746; SSE-NEXT:    psllw $7, %xmm1
747; SSE-NEXT:    pmovmskb %xmm1, %eax
748; SSE-NEXT:    testl %eax, %eax
749; SSE-NEXT:    setne %al
750; SSE-NEXT:    retq
751;
752; AVX1-LABEL: trunc_v64i8_v64i1:
753; AVX1:       # %bb.0:
754; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
755; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
756; AVX1-NEXT:    vorps %xmm1, %xmm0, %xmm0
757; AVX1-NEXT:    vpsllw $7, %xmm0, %xmm0
758; AVX1-NEXT:    vpmovmskb %xmm0, %eax
759; AVX1-NEXT:    testl %eax, %eax
760; AVX1-NEXT:    setne %al
761; AVX1-NEXT:    vzeroupper
762; AVX1-NEXT:    retq
763;
764; AVX2-LABEL: trunc_v64i8_v64i1:
765; AVX2:       # %bb.0:
766; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
767; AVX2-NEXT:    vpsllw $7, %ymm0, %ymm0
768; AVX2-NEXT:    vpmovmskb %ymm0, %eax
769; AVX2-NEXT:    testl %eax, %eax
770; AVX2-NEXT:    setne %al
771; AVX2-NEXT:    vzeroupper
772; AVX2-NEXT:    retq
773;
774; AVX512F-LABEL: trunc_v64i8_v64i1:
775; AVX512F:       # %bb.0:
776; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
777; AVX512F-NEXT:    vextracti128 $1, %ymm1, %xmm2
778; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm3
779; AVX512F-NEXT:    vpor %xmm2, %xmm3, %xmm2
780; AVX512F-NEXT:    vpor %xmm2, %xmm1, %xmm1
781; AVX512F-NEXT:    vpor %xmm1, %xmm0, %xmm0
782; AVX512F-NEXT:    vpmovsxbd %xmm0, %zmm0
783; AVX512F-NEXT:    vpslld $31, %zmm0, %zmm0
784; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k0
785; AVX512F-NEXT:    kshiftrw $8, %k0, %k1
786; AVX512F-NEXT:    korw %k1, %k0, %k0
787; AVX512F-NEXT:    kshiftrw $4, %k0, %k1
788; AVX512F-NEXT:    korw %k1, %k0, %k0
789; AVX512F-NEXT:    kshiftrw $2, %k0, %k1
790; AVX512F-NEXT:    korw %k1, %k0, %k0
791; AVX512F-NEXT:    kshiftrw $1, %k0, %k1
792; AVX512F-NEXT:    korw %k1, %k0, %k0
793; AVX512F-NEXT:    kmovw %k0, %eax
794; AVX512F-NEXT:    # kill: def $al killed $al killed $eax
795; AVX512F-NEXT:    vzeroupper
796; AVX512F-NEXT:    retq
797;
798; AVX512BW-LABEL: trunc_v64i8_v64i1:
799; AVX512BW:       # %bb.0:
800; AVX512BW-NEXT:    vpsllw $7, %zmm0, %zmm0
801; AVX512BW-NEXT:    vpmovb2m %zmm0, %k0
802; AVX512BW-NEXT:    kortestq %k0, %k0
803; AVX512BW-NEXT:    setne %al
804; AVX512BW-NEXT:    vzeroupper
805; AVX512BW-NEXT:    retq
806;
807; AVX512VL-LABEL: trunc_v64i8_v64i1:
808; AVX512VL:       # %bb.0:
809; AVX512VL-NEXT:    vpsllw $7, %zmm0, %zmm0
810; AVX512VL-NEXT:    vpmovb2m %zmm0, %k0
811; AVX512VL-NEXT:    kortestq %k0, %k0
812; AVX512VL-NEXT:    setne %al
813; AVX512VL-NEXT:    vzeroupper
814; AVX512VL-NEXT:    retq
815  %a = trunc <64 x i8> %0 to <64 x i1>
816  %b = call i1 @llvm.vector.reduce.or.v64i1(<64 x i1> %a)
817  ret i1 %b
818}
819
820;
821; Comparison With Zero
822;
823
824define i1 @icmp0_v2i64_v2i1(<2 x i64>) {
825; SSE2-LABEL: icmp0_v2i64_v2i1:
826; SSE2:       # %bb.0:
827; SSE2-NEXT:    pxor %xmm1, %xmm1
828; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
829; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,0,3,2]
830; SSE2-NEXT:    pand %xmm1, %xmm0
831; SSE2-NEXT:    movmskpd %xmm0, %eax
832; SSE2-NEXT:    testl %eax, %eax
833; SSE2-NEXT:    setne %al
834; SSE2-NEXT:    retq
835;
836; SSE41-LABEL: icmp0_v2i64_v2i1:
837; SSE41:       # %bb.0:
838; SSE41-NEXT:    pxor %xmm1, %xmm1
839; SSE41-NEXT:    pcmpeqq %xmm0, %xmm1
840; SSE41-NEXT:    movmskpd %xmm1, %eax
841; SSE41-NEXT:    testl %eax, %eax
842; SSE41-NEXT:    setne %al
843; SSE41-NEXT:    retq
844;
845; AVX-LABEL: icmp0_v2i64_v2i1:
846; AVX:       # %bb.0:
847; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
848; AVX-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm0
849; AVX-NEXT:    vmovmskpd %xmm0, %eax
850; AVX-NEXT:    testl %eax, %eax
851; AVX-NEXT:    setne %al
852; AVX-NEXT:    retq
853;
854; AVX512F-LABEL: icmp0_v2i64_v2i1:
855; AVX512F:       # %bb.0:
856; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
857; AVX512F-NEXT:    vptestnmq %zmm0, %zmm0, %k0
858; AVX512F-NEXT:    kmovw %k0, %eax
859; AVX512F-NEXT:    testb $3, %al
860; AVX512F-NEXT:    setne %al
861; AVX512F-NEXT:    vzeroupper
862; AVX512F-NEXT:    retq
863;
864; AVX512BW-LABEL: icmp0_v2i64_v2i1:
865; AVX512BW:       # %bb.0:
866; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
867; AVX512BW-NEXT:    vptestnmq %zmm0, %zmm0, %k0
868; AVX512BW-NEXT:    kmovd %k0, %eax
869; AVX512BW-NEXT:    testb $3, %al
870; AVX512BW-NEXT:    setne %al
871; AVX512BW-NEXT:    vzeroupper
872; AVX512BW-NEXT:    retq
873;
874; AVX512VL-LABEL: icmp0_v2i64_v2i1:
875; AVX512VL:       # %bb.0:
876; AVX512VL-NEXT:    vptestnmq %xmm0, %xmm0, %k0
877; AVX512VL-NEXT:    kmovd %k0, %eax
878; AVX512VL-NEXT:    testb %al, %al
879; AVX512VL-NEXT:    setne %al
880; AVX512VL-NEXT:    retq
881  %a = icmp eq <2 x i64> %0, zeroinitializer
882  %b = call i1 @llvm.vector.reduce.or.v2i1(<2 x i1> %a)
883  ret i1 %b
884}
885
886define i1 @icmp0_v4i32_v4i1(<4 x i32>) {
887; SSE-LABEL: icmp0_v4i32_v4i1:
888; SSE:       # %bb.0:
889; SSE-NEXT:    pxor %xmm1, %xmm1
890; SSE-NEXT:    pcmpeqd %xmm0, %xmm1
891; SSE-NEXT:    movmskps %xmm1, %eax
892; SSE-NEXT:    testl %eax, %eax
893; SSE-NEXT:    setne %al
894; SSE-NEXT:    retq
895;
896; AVX-LABEL: icmp0_v4i32_v4i1:
897; AVX:       # %bb.0:
898; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
899; AVX-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
900; AVX-NEXT:    vmovmskps %xmm0, %eax
901; AVX-NEXT:    testl %eax, %eax
902; AVX-NEXT:    setne %al
903; AVX-NEXT:    retq
904;
905; AVX512F-LABEL: icmp0_v4i32_v4i1:
906; AVX512F:       # %bb.0:
907; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
908; AVX512F-NEXT:    vptestnmd %zmm0, %zmm0, %k0
909; AVX512F-NEXT:    kmovw %k0, %eax
910; AVX512F-NEXT:    testb $15, %al
911; AVX512F-NEXT:    setne %al
912; AVX512F-NEXT:    vzeroupper
913; AVX512F-NEXT:    retq
914;
915; AVX512BW-LABEL: icmp0_v4i32_v4i1:
916; AVX512BW:       # %bb.0:
917; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
918; AVX512BW-NEXT:    vptestnmd %zmm0, %zmm0, %k0
919; AVX512BW-NEXT:    kmovd %k0, %eax
920; AVX512BW-NEXT:    testb $15, %al
921; AVX512BW-NEXT:    setne %al
922; AVX512BW-NEXT:    vzeroupper
923; AVX512BW-NEXT:    retq
924;
925; AVX512VL-LABEL: icmp0_v4i32_v4i1:
926; AVX512VL:       # %bb.0:
927; AVX512VL-NEXT:    vptestnmd %xmm0, %xmm0, %k0
928; AVX512VL-NEXT:    kmovd %k0, %eax
929; AVX512VL-NEXT:    testb %al, %al
930; AVX512VL-NEXT:    setne %al
931; AVX512VL-NEXT:    retq
932  %a = icmp eq <4 x i32> %0, zeroinitializer
933  %b = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> %a)
934  ret i1 %b
935}
936
937define i1 @icmp0_v8i16_v8i1(<8 x i16>) {
938; SSE-LABEL: icmp0_v8i16_v8i1:
939; SSE:       # %bb.0:
940; SSE-NEXT:    pxor %xmm1, %xmm1
941; SSE-NEXT:    pcmpeqw %xmm0, %xmm1
942; SSE-NEXT:    pmovmskb %xmm1, %eax
943; SSE-NEXT:    testl %eax, %eax
944; SSE-NEXT:    setne %al
945; SSE-NEXT:    retq
946;
947; AVX-LABEL: icmp0_v8i16_v8i1:
948; AVX:       # %bb.0:
949; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
950; AVX-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm0
951; AVX-NEXT:    vpmovmskb %xmm0, %eax
952; AVX-NEXT:    testl %eax, %eax
953; AVX-NEXT:    setne %al
954; AVX-NEXT:    retq
955;
956; AVX512F-LABEL: icmp0_v8i16_v8i1:
957; AVX512F:       # %bb.0:
958; AVX512F-NEXT:    vpxor %xmm1, %xmm1, %xmm1
959; AVX512F-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm0
960; AVX512F-NEXT:    vpmovsxwq %xmm0, %zmm0
961; AVX512F-NEXT:    vptestmq %zmm0, %zmm0, %k0
962; AVX512F-NEXT:    kmovw %k0, %eax
963; AVX512F-NEXT:    testb %al, %al
964; AVX512F-NEXT:    setne %al
965; AVX512F-NEXT:    vzeroupper
966; AVX512F-NEXT:    retq
967;
968; AVX512BW-LABEL: icmp0_v8i16_v8i1:
969; AVX512BW:       # %bb.0:
970; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
971; AVX512BW-NEXT:    vptestnmw %zmm0, %zmm0, %k0
972; AVX512BW-NEXT:    kmovd %k0, %eax
973; AVX512BW-NEXT:    testb %al, %al
974; AVX512BW-NEXT:    setne %al
975; AVX512BW-NEXT:    vzeroupper
976; AVX512BW-NEXT:    retq
977;
978; AVX512VL-LABEL: icmp0_v8i16_v8i1:
979; AVX512VL:       # %bb.0:
980; AVX512VL-NEXT:    vptestnmw %xmm0, %xmm0, %k0
981; AVX512VL-NEXT:    kmovd %k0, %eax
982; AVX512VL-NEXT:    testb %al, %al
983; AVX512VL-NEXT:    setne %al
984; AVX512VL-NEXT:    retq
985  %a = icmp eq <8 x i16> %0, zeroinitializer
986  %b = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> %a)
987  ret i1 %b
988}
989
990define i1 @icmp0_v16i8_v16i1(<16 x i8>) {
991; SSE-LABEL: icmp0_v16i8_v16i1:
992; SSE:       # %bb.0:
993; SSE-NEXT:    pxor %xmm1, %xmm1
994; SSE-NEXT:    pcmpeqb %xmm0, %xmm1
995; SSE-NEXT:    pmovmskb %xmm1, %eax
996; SSE-NEXT:    testl %eax, %eax
997; SSE-NEXT:    setne %al
998; SSE-NEXT:    retq
999;
1000; AVX-LABEL: icmp0_v16i8_v16i1:
1001; AVX:       # %bb.0:
1002; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1003; AVX-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
1004; AVX-NEXT:    vpmovmskb %xmm0, %eax
1005; AVX-NEXT:    testl %eax, %eax
1006; AVX-NEXT:    setne %al
1007; AVX-NEXT:    retq
1008;
1009; AVX512F-LABEL: icmp0_v16i8_v16i1:
1010; AVX512F:       # %bb.0:
1011; AVX512F-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1012; AVX512F-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
1013; AVX512F-NEXT:    vpmovmskb %xmm0, %eax
1014; AVX512F-NEXT:    testl %eax, %eax
1015; AVX512F-NEXT:    setne %al
1016; AVX512F-NEXT:    retq
1017;
1018; AVX512BW-LABEL: icmp0_v16i8_v16i1:
1019; AVX512BW:       # %bb.0:
1020; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1021; AVX512BW-NEXT:    vptestnmb %zmm0, %zmm0, %k0
1022; AVX512BW-NEXT:    kortestw %k0, %k0
1023; AVX512BW-NEXT:    setne %al
1024; AVX512BW-NEXT:    vzeroupper
1025; AVX512BW-NEXT:    retq
1026;
1027; AVX512VL-LABEL: icmp0_v16i8_v16i1:
1028; AVX512VL:       # %bb.0:
1029; AVX512VL-NEXT:    vptestnmb %xmm0, %xmm0, %k0
1030; AVX512VL-NEXT:    kortestw %k0, %k0
1031; AVX512VL-NEXT:    setne %al
1032; AVX512VL-NEXT:    retq
1033  %a = icmp eq <16 x i8> %0, zeroinitializer
1034  %b = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> %a)
1035  ret i1 %b
1036}
1037
1038define i1 @icmp0_v4i64_v4i1(<4 x i64>) {
1039; SSE2-LABEL: icmp0_v4i64_v4i1:
1040; SSE2:       # %bb.0:
1041; SSE2-NEXT:    pxor %xmm2, %xmm2
1042; SSE2-NEXT:    pcmpeqd %xmm2, %xmm1
1043; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,0,3,2]
1044; SSE2-NEXT:    pand %xmm1, %xmm3
1045; SSE2-NEXT:    pcmpeqd %xmm2, %xmm0
1046; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]
1047; SSE2-NEXT:    pand %xmm0, %xmm1
1048; SSE2-NEXT:    packssdw %xmm3, %xmm1
1049; SSE2-NEXT:    movmskps %xmm1, %eax
1050; SSE2-NEXT:    testl %eax, %eax
1051; SSE2-NEXT:    setne %al
1052; SSE2-NEXT:    retq
1053;
1054; SSE41-LABEL: icmp0_v4i64_v4i1:
1055; SSE41:       # %bb.0:
1056; SSE41-NEXT:    pxor %xmm2, %xmm2
1057; SSE41-NEXT:    pcmpeqq %xmm2, %xmm1
1058; SSE41-NEXT:    pcmpeqq %xmm2, %xmm0
1059; SSE41-NEXT:    packssdw %xmm1, %xmm0
1060; SSE41-NEXT:    movmskps %xmm0, %eax
1061; SSE41-NEXT:    testl %eax, %eax
1062; SSE41-NEXT:    setne %al
1063; SSE41-NEXT:    retq
1064;
1065; AVX1-LABEL: icmp0_v4i64_v4i1:
1066; AVX1:       # %bb.0:
1067; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1068; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1069; AVX1-NEXT:    vpcmpeqq %xmm2, %xmm1, %xmm1
1070; AVX1-NEXT:    vpcmpeqq %xmm2, %xmm0, %xmm0
1071; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
1072; AVX1-NEXT:    vmovmskpd %xmm0, %eax
1073; AVX1-NEXT:    testl %eax, %eax
1074; AVX1-NEXT:    setne %al
1075; AVX1-NEXT:    vzeroupper
1076; AVX1-NEXT:    retq
1077;
1078; AVX2-LABEL: icmp0_v4i64_v4i1:
1079; AVX2:       # %bb.0:
1080; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1081; AVX2-NEXT:    vpcmpeqq %ymm1, %ymm0, %ymm0
1082; AVX2-NEXT:    vmovmskpd %ymm0, %eax
1083; AVX2-NEXT:    testl %eax, %eax
1084; AVX2-NEXT:    setne %al
1085; AVX2-NEXT:    vzeroupper
1086; AVX2-NEXT:    retq
1087;
1088; AVX512F-LABEL: icmp0_v4i64_v4i1:
1089; AVX512F:       # %bb.0:
1090; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1091; AVX512F-NEXT:    vptestnmq %zmm0, %zmm0, %k0
1092; AVX512F-NEXT:    kmovw %k0, %eax
1093; AVX512F-NEXT:    testb $15, %al
1094; AVX512F-NEXT:    setne %al
1095; AVX512F-NEXT:    vzeroupper
1096; AVX512F-NEXT:    retq
1097;
1098; AVX512BW-LABEL: icmp0_v4i64_v4i1:
1099; AVX512BW:       # %bb.0:
1100; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1101; AVX512BW-NEXT:    vptestnmq %zmm0, %zmm0, %k0
1102; AVX512BW-NEXT:    kmovd %k0, %eax
1103; AVX512BW-NEXT:    testb $15, %al
1104; AVX512BW-NEXT:    setne %al
1105; AVX512BW-NEXT:    vzeroupper
1106; AVX512BW-NEXT:    retq
1107;
1108; AVX512VL-LABEL: icmp0_v4i64_v4i1:
1109; AVX512VL:       # %bb.0:
1110; AVX512VL-NEXT:    vptestnmq %ymm0, %ymm0, %k0
1111; AVX512VL-NEXT:    kmovd %k0, %eax
1112; AVX512VL-NEXT:    testb %al, %al
1113; AVX512VL-NEXT:    setne %al
1114; AVX512VL-NEXT:    vzeroupper
1115; AVX512VL-NEXT:    retq
1116  %a = icmp eq <4 x i64> %0, zeroinitializer
1117  %b = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> %a)
1118  ret i1 %b
1119}
1120
1121define i1 @icmp0_v8i32_v8i1(<8 x i32>) {
1122; SSE-LABEL: icmp0_v8i32_v8i1:
1123; SSE:       # %bb.0:
1124; SSE-NEXT:    pxor %xmm2, %xmm2
1125; SSE-NEXT:    pcmpeqd %xmm2, %xmm1
1126; SSE-NEXT:    pcmpeqd %xmm2, %xmm0
1127; SSE-NEXT:    packssdw %xmm1, %xmm0
1128; SSE-NEXT:    pmovmskb %xmm0, %eax
1129; SSE-NEXT:    testl %eax, %eax
1130; SSE-NEXT:    setne %al
1131; SSE-NEXT:    retq
1132;
1133; AVX1-LABEL: icmp0_v8i32_v8i1:
1134; AVX1:       # %bb.0:
1135; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1136; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1137; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm1, %xmm1
1138; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm0, %xmm0
1139; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
1140; AVX1-NEXT:    vmovmskps %xmm0, %eax
1141; AVX1-NEXT:    testl %eax, %eax
1142; AVX1-NEXT:    setne %al
1143; AVX1-NEXT:    vzeroupper
1144; AVX1-NEXT:    retq
1145;
1146; AVX2-LABEL: icmp0_v8i32_v8i1:
1147; AVX2:       # %bb.0:
1148; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1149; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm0, %ymm0
1150; AVX2-NEXT:    vmovmskps %ymm0, %eax
1151; AVX2-NEXT:    testl %eax, %eax
1152; AVX2-NEXT:    setne %al
1153; AVX2-NEXT:    vzeroupper
1154; AVX2-NEXT:    retq
1155;
1156; AVX512F-LABEL: icmp0_v8i32_v8i1:
1157; AVX512F:       # %bb.0:
1158; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1159; AVX512F-NEXT:    vptestnmd %zmm0, %zmm0, %k0
1160; AVX512F-NEXT:    kmovw %k0, %eax
1161; AVX512F-NEXT:    testb %al, %al
1162; AVX512F-NEXT:    setne %al
1163; AVX512F-NEXT:    vzeroupper
1164; AVX512F-NEXT:    retq
1165;
1166; AVX512BW-LABEL: icmp0_v8i32_v8i1:
1167; AVX512BW:       # %bb.0:
1168; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1169; AVX512BW-NEXT:    vptestnmd %zmm0, %zmm0, %k0
1170; AVX512BW-NEXT:    kmovd %k0, %eax
1171; AVX512BW-NEXT:    testb %al, %al
1172; AVX512BW-NEXT:    setne %al
1173; AVX512BW-NEXT:    vzeroupper
1174; AVX512BW-NEXT:    retq
1175;
1176; AVX512VL-LABEL: icmp0_v8i32_v8i1:
1177; AVX512VL:       # %bb.0:
1178; AVX512VL-NEXT:    vptestnmd %ymm0, %ymm0, %k0
1179; AVX512VL-NEXT:    kmovd %k0, %eax
1180; AVX512VL-NEXT:    testb %al, %al
1181; AVX512VL-NEXT:    setne %al
1182; AVX512VL-NEXT:    vzeroupper
1183; AVX512VL-NEXT:    retq
1184  %a = icmp eq <8 x i32> %0, zeroinitializer
1185  %b = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> %a)
1186  ret i1 %b
1187}
1188
1189define i1 @icmp0_v16i16_v16i1(<16 x i16>) {
1190; SSE-LABEL: icmp0_v16i16_v16i1:
1191; SSE:       # %bb.0:
1192; SSE-NEXT:    pxor %xmm2, %xmm2
1193; SSE-NEXT:    pcmpeqw %xmm2, %xmm1
1194; SSE-NEXT:    pcmpeqw %xmm2, %xmm0
1195; SSE-NEXT:    packsswb %xmm1, %xmm0
1196; SSE-NEXT:    pmovmskb %xmm0, %eax
1197; SSE-NEXT:    testl %eax, %eax
1198; SSE-NEXT:    setne %al
1199; SSE-NEXT:    retq
1200;
1201; AVX1-LABEL: icmp0_v16i16_v16i1:
1202; AVX1:       # %bb.0:
1203; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1204; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1205; AVX1-NEXT:    vpcmpeqw %xmm2, %xmm1, %xmm1
1206; AVX1-NEXT:    vpcmpeqw %xmm2, %xmm0, %xmm0
1207; AVX1-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
1208; AVX1-NEXT:    vpmovmskb %xmm0, %eax
1209; AVX1-NEXT:    testl %eax, %eax
1210; AVX1-NEXT:    setne %al
1211; AVX1-NEXT:    vzeroupper
1212; AVX1-NEXT:    retq
1213;
1214; AVX2-LABEL: icmp0_v16i16_v16i1:
1215; AVX2:       # %bb.0:
1216; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1217; AVX2-NEXT:    vpcmpeqw %ymm1, %ymm0, %ymm0
1218; AVX2-NEXT:    vpmovmskb %ymm0, %eax
1219; AVX2-NEXT:    testl %eax, %eax
1220; AVX2-NEXT:    setne %al
1221; AVX2-NEXT:    vzeroupper
1222; AVX2-NEXT:    retq
1223;
1224; AVX512F-LABEL: icmp0_v16i16_v16i1:
1225; AVX512F:       # %bb.0:
1226; AVX512F-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1227; AVX512F-NEXT:    vpcmpeqw %ymm1, %ymm0, %ymm0
1228; AVX512F-NEXT:    vpmovsxwd %ymm0, %zmm0
1229; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k0
1230; AVX512F-NEXT:    kortestw %k0, %k0
1231; AVX512F-NEXT:    setne %al
1232; AVX512F-NEXT:    vzeroupper
1233; AVX512F-NEXT:    retq
1234;
1235; AVX512BW-LABEL: icmp0_v16i16_v16i1:
1236; AVX512BW:       # %bb.0:
1237; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1238; AVX512BW-NEXT:    vptestnmw %zmm0, %zmm0, %k0
1239; AVX512BW-NEXT:    kortestw %k0, %k0
1240; AVX512BW-NEXT:    setne %al
1241; AVX512BW-NEXT:    vzeroupper
1242; AVX512BW-NEXT:    retq
1243;
1244; AVX512VL-LABEL: icmp0_v16i16_v16i1:
1245; AVX512VL:       # %bb.0:
1246; AVX512VL-NEXT:    vptestnmw %ymm0, %ymm0, %k0
1247; AVX512VL-NEXT:    kortestw %k0, %k0
1248; AVX512VL-NEXT:    setne %al
1249; AVX512VL-NEXT:    vzeroupper
1250; AVX512VL-NEXT:    retq
1251  %a = icmp eq <16 x i16> %0, zeroinitializer
1252  %b = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> %a)
1253  ret i1 %b
1254}
1255
1256define i1 @icmp0_v32i8_v32i1(<32 x i8>) {
1257; SSE-LABEL: icmp0_v32i8_v32i1:
1258; SSE:       # %bb.0:
1259; SSE-NEXT:    pxor %xmm2, %xmm2
1260; SSE-NEXT:    pcmpeqb %xmm2, %xmm1
1261; SSE-NEXT:    pcmpeqb %xmm2, %xmm0
1262; SSE-NEXT:    por %xmm1, %xmm0
1263; SSE-NEXT:    pmovmskb %xmm0, %eax
1264; SSE-NEXT:    testl %eax, %eax
1265; SSE-NEXT:    setne %al
1266; SSE-NEXT:    retq
1267;
1268; AVX1-LABEL: icmp0_v32i8_v32i1:
1269; AVX1:       # %bb.0:
1270; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1271; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1272; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm1, %xmm1
1273; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm0, %xmm0
1274; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
1275; AVX1-NEXT:    vpmovmskb %xmm0, %eax
1276; AVX1-NEXT:    testl %eax, %eax
1277; AVX1-NEXT:    setne %al
1278; AVX1-NEXT:    vzeroupper
1279; AVX1-NEXT:    retq
1280;
1281; AVX2-LABEL: icmp0_v32i8_v32i1:
1282; AVX2:       # %bb.0:
1283; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1284; AVX2-NEXT:    vpcmpeqb %ymm1, %ymm0, %ymm0
1285; AVX2-NEXT:    vpmovmskb %ymm0, %eax
1286; AVX2-NEXT:    testl %eax, %eax
1287; AVX2-NEXT:    setne %al
1288; AVX2-NEXT:    vzeroupper
1289; AVX2-NEXT:    retq
1290;
1291; AVX512F-LABEL: icmp0_v32i8_v32i1:
1292; AVX512F:       # %bb.0:
1293; AVX512F-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1294; AVX512F-NEXT:    vpcmpeqb %ymm1, %ymm0, %ymm0
1295; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm1
1296; AVX512F-NEXT:    vpor %xmm1, %xmm0, %xmm0
1297; AVX512F-NEXT:    vpmovsxbd %xmm0, %zmm0
1298; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k0
1299; AVX512F-NEXT:    kshiftrw $8, %k0, %k1
1300; AVX512F-NEXT:    korw %k1, %k0, %k0
1301; AVX512F-NEXT:    kshiftrw $4, %k0, %k1
1302; AVX512F-NEXT:    korw %k1, %k0, %k0
1303; AVX512F-NEXT:    kshiftrw $2, %k0, %k1
1304; AVX512F-NEXT:    korw %k1, %k0, %k0
1305; AVX512F-NEXT:    kshiftrw $1, %k0, %k1
1306; AVX512F-NEXT:    korw %k1, %k0, %k0
1307; AVX512F-NEXT:    kmovw %k0, %eax
1308; AVX512F-NEXT:    # kill: def $al killed $al killed $eax
1309; AVX512F-NEXT:    vzeroupper
1310; AVX512F-NEXT:    retq
1311;
1312; AVX512BW-LABEL: icmp0_v32i8_v32i1:
1313; AVX512BW:       # %bb.0:
1314; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1315; AVX512BW-NEXT:    vptestnmb %zmm0, %zmm0, %k0
1316; AVX512BW-NEXT:    kortestd %k0, %k0
1317; AVX512BW-NEXT:    setne %al
1318; AVX512BW-NEXT:    vzeroupper
1319; AVX512BW-NEXT:    retq
1320;
1321; AVX512VL-LABEL: icmp0_v32i8_v32i1:
1322; AVX512VL:       # %bb.0:
1323; AVX512VL-NEXT:    vptestnmb %ymm0, %ymm0, %k0
1324; AVX512VL-NEXT:    kortestd %k0, %k0
1325; AVX512VL-NEXT:    setne %al
1326; AVX512VL-NEXT:    vzeroupper
1327; AVX512VL-NEXT:    retq
1328  %a = icmp eq <32 x i8> %0, zeroinitializer
1329  %b = call i1 @llvm.vector.reduce.or.v32i1(<32 x i1> %a)
1330  ret i1 %b
1331}
1332
1333define i1 @icmp0_v8i64_v8i1(<8 x i64>) {
1334; SSE2-LABEL: icmp0_v8i64_v8i1:
1335; SSE2:       # %bb.0:
1336; SSE2-NEXT:    pxor %xmm4, %xmm4
1337; SSE2-NEXT:    pcmpeqd %xmm4, %xmm3
1338; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[1,0,3,2]
1339; SSE2-NEXT:    pand %xmm3, %xmm5
1340; SSE2-NEXT:    pcmpeqd %xmm4, %xmm2
1341; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,0,3,2]
1342; SSE2-NEXT:    pand %xmm2, %xmm3
1343; SSE2-NEXT:    packssdw %xmm5, %xmm3
1344; SSE2-NEXT:    pcmpeqd %xmm4, %xmm1
1345; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,0,3,2]
1346; SSE2-NEXT:    pand %xmm1, %xmm2
1347; SSE2-NEXT:    pcmpeqd %xmm4, %xmm0
1348; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]
1349; SSE2-NEXT:    pand %xmm0, %xmm1
1350; SSE2-NEXT:    packssdw %xmm2, %xmm1
1351; SSE2-NEXT:    packssdw %xmm3, %xmm1
1352; SSE2-NEXT:    pmovmskb %xmm1, %eax
1353; SSE2-NEXT:    testl $43690, %eax # imm = 0xAAAA
1354; SSE2-NEXT:    setne %al
1355; SSE2-NEXT:    retq
1356;
1357; SSE41-LABEL: icmp0_v8i64_v8i1:
1358; SSE41:       # %bb.0:
1359; SSE41-NEXT:    pxor %xmm4, %xmm4
1360; SSE41-NEXT:    pcmpeqq %xmm4, %xmm3
1361; SSE41-NEXT:    pcmpeqq %xmm4, %xmm2
1362; SSE41-NEXT:    packssdw %xmm3, %xmm2
1363; SSE41-NEXT:    pcmpeqq %xmm4, %xmm1
1364; SSE41-NEXT:    pcmpeqq %xmm4, %xmm0
1365; SSE41-NEXT:    packssdw %xmm1, %xmm0
1366; SSE41-NEXT:    packssdw %xmm2, %xmm0
1367; SSE41-NEXT:    pmovmskb %xmm0, %eax
1368; SSE41-NEXT:    testl $43690, %eax # imm = 0xAAAA
1369; SSE41-NEXT:    setne %al
1370; SSE41-NEXT:    retq
1371;
1372; AVX1-LABEL: icmp0_v8i64_v8i1:
1373; AVX1:       # %bb.0:
1374; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1375; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1376; AVX1-NEXT:    vpcmpeqq %xmm3, %xmm2, %xmm2
1377; AVX1-NEXT:    vpcmpeqq %xmm3, %xmm1, %xmm1
1378; AVX1-NEXT:    vpackssdw %xmm2, %xmm1, %xmm1
1379; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1380; AVX1-NEXT:    vpcmpeqq %xmm3, %xmm2, %xmm2
1381; AVX1-NEXT:    vpcmpeqq %xmm3, %xmm0, %xmm0
1382; AVX1-NEXT:    vpackssdw %xmm2, %xmm0, %xmm0
1383; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
1384; AVX1-NEXT:    vmovmskps %xmm0, %eax
1385; AVX1-NEXT:    testl %eax, %eax
1386; AVX1-NEXT:    setne %al
1387; AVX1-NEXT:    vzeroupper
1388; AVX1-NEXT:    retq
1389;
1390; AVX2-LABEL: icmp0_v8i64_v8i1:
1391; AVX2:       # %bb.0:
1392; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1393; AVX2-NEXT:    vpcmpeqq %ymm2, %ymm1, %ymm1
1394; AVX2-NEXT:    vpcmpeqq %ymm2, %ymm0, %ymm0
1395; AVX2-NEXT:    vpackssdw %ymm1, %ymm0, %ymm0
1396; AVX2-NEXT:    vmovmskps %ymm0, %eax
1397; AVX2-NEXT:    testl %eax, %eax
1398; AVX2-NEXT:    setne %al
1399; AVX2-NEXT:    vzeroupper
1400; AVX2-NEXT:    retq
1401;
1402; AVX512F-LABEL: icmp0_v8i64_v8i1:
1403; AVX512F:       # %bb.0:
1404; AVX512F-NEXT:    vptestnmq %zmm0, %zmm0, %k0
1405; AVX512F-NEXT:    kmovw %k0, %eax
1406; AVX512F-NEXT:    testb %al, %al
1407; AVX512F-NEXT:    setne %al
1408; AVX512F-NEXT:    vzeroupper
1409; AVX512F-NEXT:    retq
1410;
1411; AVX512BW-LABEL: icmp0_v8i64_v8i1:
1412; AVX512BW:       # %bb.0:
1413; AVX512BW-NEXT:    vptestnmq %zmm0, %zmm0, %k0
1414; AVX512BW-NEXT:    kmovd %k0, %eax
1415; AVX512BW-NEXT:    testb %al, %al
1416; AVX512BW-NEXT:    setne %al
1417; AVX512BW-NEXT:    vzeroupper
1418; AVX512BW-NEXT:    retq
1419;
1420; AVX512VL-LABEL: icmp0_v8i64_v8i1:
1421; AVX512VL:       # %bb.0:
1422; AVX512VL-NEXT:    vptestnmq %zmm0, %zmm0, %k0
1423; AVX512VL-NEXT:    kmovd %k0, %eax
1424; AVX512VL-NEXT:    testb %al, %al
1425; AVX512VL-NEXT:    setne %al
1426; AVX512VL-NEXT:    vzeroupper
1427; AVX512VL-NEXT:    retq
1428  %a = icmp eq <8 x i64> %0, zeroinitializer
1429  %b = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> %a)
1430  ret i1 %b
1431}
1432
1433define i1 @icmp0_v16i32_v16i1(<16 x i32>) {
1434; SSE-LABEL: icmp0_v16i32_v16i1:
1435; SSE:       # %bb.0:
1436; SSE-NEXT:    pxor %xmm4, %xmm4
1437; SSE-NEXT:    pcmpeqd %xmm4, %xmm3
1438; SSE-NEXT:    pcmpeqd %xmm4, %xmm2
1439; SSE-NEXT:    packssdw %xmm3, %xmm2
1440; SSE-NEXT:    pcmpeqd %xmm4, %xmm1
1441; SSE-NEXT:    pcmpeqd %xmm4, %xmm0
1442; SSE-NEXT:    packssdw %xmm1, %xmm0
1443; SSE-NEXT:    packsswb %xmm2, %xmm0
1444; SSE-NEXT:    pmovmskb %xmm0, %eax
1445; SSE-NEXT:    testl %eax, %eax
1446; SSE-NEXT:    setne %al
1447; SSE-NEXT:    retq
1448;
1449; AVX1-LABEL: icmp0_v16i32_v16i1:
1450; AVX1:       # %bb.0:
1451; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1452; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1453; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm2, %xmm2
1454; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm1, %xmm1
1455; AVX1-NEXT:    vpackssdw %xmm2, %xmm1, %xmm1
1456; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1457; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm2, %xmm2
1458; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm0, %xmm0
1459; AVX1-NEXT:    vpackssdw %xmm2, %xmm0, %xmm0
1460; AVX1-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
1461; AVX1-NEXT:    vpmovmskb %xmm0, %eax
1462; AVX1-NEXT:    testl %eax, %eax
1463; AVX1-NEXT:    setne %al
1464; AVX1-NEXT:    vzeroupper
1465; AVX1-NEXT:    retq
1466;
1467; AVX2-LABEL: icmp0_v16i32_v16i1:
1468; AVX2:       # %bb.0:
1469; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1470; AVX2-NEXT:    vpcmpeqd %ymm2, %ymm1, %ymm1
1471; AVX2-NEXT:    vpcmpeqd %ymm2, %ymm0, %ymm0
1472; AVX2-NEXT:    vpackssdw %ymm1, %ymm0, %ymm0
1473; AVX2-NEXT:    vpmovmskb %ymm0, %eax
1474; AVX2-NEXT:    testl %eax, %eax
1475; AVX2-NEXT:    setne %al
1476; AVX2-NEXT:    vzeroupper
1477; AVX2-NEXT:    retq
1478;
1479; AVX512-LABEL: icmp0_v16i32_v16i1:
1480; AVX512:       # %bb.0:
1481; AVX512-NEXT:    vptestnmd %zmm0, %zmm0, %k0
1482; AVX512-NEXT:    kortestw %k0, %k0
1483; AVX512-NEXT:    setne %al
1484; AVX512-NEXT:    vzeroupper
1485; AVX512-NEXT:    retq
1486  %a = icmp eq <16 x i32> %0, zeroinitializer
1487  %b = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> %a)
1488  ret i1 %b
1489}
1490
1491define i1 @icmp0_v32i16_v32i1(<32 x i16>) {
1492; SSE-LABEL: icmp0_v32i16_v32i1:
1493; SSE:       # %bb.0:
1494; SSE-NEXT:    pxor %xmm4, %xmm4
1495; SSE-NEXT:    pcmpeqw %xmm4, %xmm1
1496; SSE-NEXT:    pcmpeqw %xmm4, %xmm0
1497; SSE-NEXT:    packsswb %xmm1, %xmm0
1498; SSE-NEXT:    pcmpeqw %xmm4, %xmm3
1499; SSE-NEXT:    pcmpeqw %xmm4, %xmm2
1500; SSE-NEXT:    packsswb %xmm3, %xmm2
1501; SSE-NEXT:    por %xmm0, %xmm2
1502; SSE-NEXT:    pmovmskb %xmm2, %eax
1503; SSE-NEXT:    testl %eax, %eax
1504; SSE-NEXT:    setne %al
1505; SSE-NEXT:    retq
1506;
1507; AVX1-LABEL: icmp0_v32i16_v32i1:
1508; AVX1:       # %bb.0:
1509; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1510; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1511; AVX1-NEXT:    vpcmpeqw %xmm3, %xmm2, %xmm2
1512; AVX1-NEXT:    vpcmpeqw %xmm3, %xmm1, %xmm1
1513; AVX1-NEXT:    vpacksswb %xmm2, %xmm1, %xmm1
1514; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1515; AVX1-NEXT:    vpcmpeqw %xmm3, %xmm2, %xmm2
1516; AVX1-NEXT:    vpcmpeqw %xmm3, %xmm0, %xmm0
1517; AVX1-NEXT:    vpacksswb %xmm2, %xmm0, %xmm0
1518; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
1519; AVX1-NEXT:    vpmovmskb %xmm0, %eax
1520; AVX1-NEXT:    testl %eax, %eax
1521; AVX1-NEXT:    setne %al
1522; AVX1-NEXT:    vzeroupper
1523; AVX1-NEXT:    retq
1524;
1525; AVX2-LABEL: icmp0_v32i16_v32i1:
1526; AVX2:       # %bb.0:
1527; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1528; AVX2-NEXT:    vpcmpeqw %ymm2, %ymm1, %ymm1
1529; AVX2-NEXT:    vpcmpeqw %ymm2, %ymm0, %ymm0
1530; AVX2-NEXT:    vpacksswb %ymm1, %ymm0, %ymm0
1531; AVX2-NEXT:    vpmovmskb %ymm0, %eax
1532; AVX2-NEXT:    testl %eax, %eax
1533; AVX2-NEXT:    setne %al
1534; AVX2-NEXT:    vzeroupper
1535; AVX2-NEXT:    retq
1536;
1537; AVX512F-LABEL: icmp0_v32i16_v32i1:
1538; AVX512F:       # %bb.0:
1539; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1540; AVX512F-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1541; AVX512F-NEXT:    vpcmpeqw %ymm2, %ymm1, %ymm1
1542; AVX512F-NEXT:    vpcmpeqw %ymm2, %ymm0, %ymm0
1543; AVX512F-NEXT:    vpor %ymm1, %ymm0, %ymm0
1544; AVX512F-NEXT:    vpmovsxwd %ymm0, %zmm0
1545; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k0
1546; AVX512F-NEXT:    kshiftrw $8, %k0, %k1
1547; AVX512F-NEXT:    korw %k1, %k0, %k0
1548; AVX512F-NEXT:    kshiftrw $4, %k0, %k1
1549; AVX512F-NEXT:    korw %k1, %k0, %k0
1550; AVX512F-NEXT:    kshiftrw $2, %k0, %k1
1551; AVX512F-NEXT:    korw %k1, %k0, %k0
1552; AVX512F-NEXT:    kshiftrw $1, %k0, %k1
1553; AVX512F-NEXT:    korw %k1, %k0, %k0
1554; AVX512F-NEXT:    kmovw %k0, %eax
1555; AVX512F-NEXT:    # kill: def $al killed $al killed $eax
1556; AVX512F-NEXT:    vzeroupper
1557; AVX512F-NEXT:    retq
1558;
1559; AVX512BW-LABEL: icmp0_v32i16_v32i1:
1560; AVX512BW:       # %bb.0:
1561; AVX512BW-NEXT:    vptestnmw %zmm0, %zmm0, %k0
1562; AVX512BW-NEXT:    kortestd %k0, %k0
1563; AVX512BW-NEXT:    setne %al
1564; AVX512BW-NEXT:    vzeroupper
1565; AVX512BW-NEXT:    retq
1566;
1567; AVX512VL-LABEL: icmp0_v32i16_v32i1:
1568; AVX512VL:       # %bb.0:
1569; AVX512VL-NEXT:    vptestnmw %zmm0, %zmm0, %k0
1570; AVX512VL-NEXT:    kortestd %k0, %k0
1571; AVX512VL-NEXT:    setne %al
1572; AVX512VL-NEXT:    vzeroupper
1573; AVX512VL-NEXT:    retq
1574  %a = icmp eq <32 x i16> %0, zeroinitializer
1575  %b = call i1 @llvm.vector.reduce.or.v32i1(<32 x i1> %a)
1576  ret i1 %b
1577}
1578
1579define i1 @icmp0_v64i8_v64i1(<64 x i8>) {
1580; SSE-LABEL: icmp0_v64i8_v64i1:
1581; SSE:       # %bb.0:
1582; SSE-NEXT:    pxor %xmm4, %xmm4
1583; SSE-NEXT:    pcmpeqb %xmm4, %xmm2
1584; SSE-NEXT:    pcmpeqb %xmm4, %xmm0
1585; SSE-NEXT:    pcmpeqb %xmm4, %xmm3
1586; SSE-NEXT:    pcmpeqb %xmm4, %xmm1
1587; SSE-NEXT:    por %xmm3, %xmm1
1588; SSE-NEXT:    por %xmm2, %xmm1
1589; SSE-NEXT:    por %xmm0, %xmm1
1590; SSE-NEXT:    pmovmskb %xmm1, %eax
1591; SSE-NEXT:    testl %eax, %eax
1592; SSE-NEXT:    setne %al
1593; SSE-NEXT:    retq
1594;
1595; AVX1-LABEL: icmp0_v64i8_v64i1:
1596; AVX1:       # %bb.0:
1597; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1598; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm1, %xmm3
1599; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm0, %xmm4
1600; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
1601; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm1, %xmm1
1602; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1603; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm0, %xmm0
1604; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
1605; AVX1-NEXT:    vpor %xmm0, %xmm3, %xmm0
1606; AVX1-NEXT:    vpor %xmm0, %xmm4, %xmm0
1607; AVX1-NEXT:    vpmovmskb %xmm0, %eax
1608; AVX1-NEXT:    testl %eax, %eax
1609; AVX1-NEXT:    setne %al
1610; AVX1-NEXT:    vzeroupper
1611; AVX1-NEXT:    retq
1612;
1613; AVX2-LABEL: icmp0_v64i8_v64i1:
1614; AVX2:       # %bb.0:
1615; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1616; AVX2-NEXT:    vpcmpeqb %ymm2, %ymm1, %ymm1
1617; AVX2-NEXT:    vpcmpeqb %ymm2, %ymm0, %ymm0
1618; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1619; AVX2-NEXT:    vpmovmskb %ymm0, %eax
1620; AVX2-NEXT:    testl %eax, %eax
1621; AVX2-NEXT:    setne %al
1622; AVX2-NEXT:    vzeroupper
1623; AVX2-NEXT:    retq
1624;
1625; AVX512F-LABEL: icmp0_v64i8_v64i1:
1626; AVX512F:       # %bb.0:
1627; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1628; AVX512F-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1629; AVX512F-NEXT:    vpcmpeqb %ymm2, %ymm1, %ymm1
1630; AVX512F-NEXT:    vpcmpeqb %ymm2, %ymm0, %ymm0
1631; AVX512F-NEXT:    vextracti128 $1, %ymm1, %xmm2
1632; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm3
1633; AVX512F-NEXT:    vpor %xmm2, %xmm3, %xmm2
1634; AVX512F-NEXT:    vpor %xmm2, %xmm1, %xmm1
1635; AVX512F-NEXT:    vpor %xmm1, %xmm0, %xmm0
1636; AVX512F-NEXT:    vpmovsxbd %xmm0, %zmm0
1637; AVX512F-NEXT:    vpslld $31, %zmm0, %zmm0
1638; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k0
1639; AVX512F-NEXT:    kshiftrw $8, %k0, %k1
1640; AVX512F-NEXT:    korw %k1, %k0, %k0
1641; AVX512F-NEXT:    kshiftrw $4, %k0, %k1
1642; AVX512F-NEXT:    korw %k1, %k0, %k0
1643; AVX512F-NEXT:    kshiftrw $2, %k0, %k1
1644; AVX512F-NEXT:    korw %k1, %k0, %k0
1645; AVX512F-NEXT:    kshiftrw $1, %k0, %k1
1646; AVX512F-NEXT:    korw %k1, %k0, %k0
1647; AVX512F-NEXT:    kmovw %k0, %eax
1648; AVX512F-NEXT:    # kill: def $al killed $al killed $eax
1649; AVX512F-NEXT:    vzeroupper
1650; AVX512F-NEXT:    retq
1651;
1652; AVX512BW-LABEL: icmp0_v64i8_v64i1:
1653; AVX512BW:       # %bb.0:
1654; AVX512BW-NEXT:    vptestnmb %zmm0, %zmm0, %k0
1655; AVX512BW-NEXT:    kortestq %k0, %k0
1656; AVX512BW-NEXT:    setne %al
1657; AVX512BW-NEXT:    vzeroupper
1658; AVX512BW-NEXT:    retq
1659;
1660; AVX512VL-LABEL: icmp0_v64i8_v64i1:
1661; AVX512VL:       # %bb.0:
1662; AVX512VL-NEXT:    vptestnmb %zmm0, %zmm0, %k0
1663; AVX512VL-NEXT:    kortestq %k0, %k0
1664; AVX512VL-NEXT:    setne %al
1665; AVX512VL-NEXT:    vzeroupper
1666; AVX512VL-NEXT:    retq
1667  %a = icmp eq <64 x i8> %0, zeroinitializer
1668  %b = call i1 @llvm.vector.reduce.or.v64i1(<64 x i1> %a)
1669  ret i1 %b
1670}
1671
1672; Comparison
1673;
1674
1675define i1 @icmp_v2i64_v2i1(<2 x i64>, <2 x i64>) {
1676; SSE2-LABEL: icmp_v2i64_v2i1:
1677; SSE2:       # %bb.0:
1678; SSE2-NEXT:    pcmpeqd %xmm1, %xmm0
1679; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]
1680; SSE2-NEXT:    pand %xmm0, %xmm1
1681; SSE2-NEXT:    movmskpd %xmm1, %eax
1682; SSE2-NEXT:    testl %eax, %eax
1683; SSE2-NEXT:    setne %al
1684; SSE2-NEXT:    retq
1685;
1686; SSE41-LABEL: icmp_v2i64_v2i1:
1687; SSE41:       # %bb.0:
1688; SSE41-NEXT:    pcmpeqq %xmm1, %xmm0
1689; SSE41-NEXT:    movmskpd %xmm0, %eax
1690; SSE41-NEXT:    testl %eax, %eax
1691; SSE41-NEXT:    setne %al
1692; SSE41-NEXT:    retq
1693;
1694; AVX-LABEL: icmp_v2i64_v2i1:
1695; AVX:       # %bb.0:
1696; AVX-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm0
1697; AVX-NEXT:    vmovmskpd %xmm0, %eax
1698; AVX-NEXT:    testl %eax, %eax
1699; AVX-NEXT:    setne %al
1700; AVX-NEXT:    retq
1701;
1702; AVX512F-LABEL: icmp_v2i64_v2i1:
1703; AVX512F:       # %bb.0:
1704; AVX512F-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
1705; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1706; AVX512F-NEXT:    vpcmpeqq %zmm1, %zmm0, %k0
1707; AVX512F-NEXT:    kmovw %k0, %eax
1708; AVX512F-NEXT:    testb $3, %al
1709; AVX512F-NEXT:    setne %al
1710; AVX512F-NEXT:    vzeroupper
1711; AVX512F-NEXT:    retq
1712;
1713; AVX512BW-LABEL: icmp_v2i64_v2i1:
1714; AVX512BW:       # %bb.0:
1715; AVX512BW-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
1716; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1717; AVX512BW-NEXT:    vpcmpeqq %zmm1, %zmm0, %k0
1718; AVX512BW-NEXT:    kmovd %k0, %eax
1719; AVX512BW-NEXT:    testb $3, %al
1720; AVX512BW-NEXT:    setne %al
1721; AVX512BW-NEXT:    vzeroupper
1722; AVX512BW-NEXT:    retq
1723;
1724; AVX512VL-LABEL: icmp_v2i64_v2i1:
1725; AVX512VL:       # %bb.0:
1726; AVX512VL-NEXT:    vpcmpeqq %xmm1, %xmm0, %k0
1727; AVX512VL-NEXT:    kmovd %k0, %eax
1728; AVX512VL-NEXT:    testb %al, %al
1729; AVX512VL-NEXT:    setne %al
1730; AVX512VL-NEXT:    retq
1731  %a = icmp eq <2 x i64> %0, %1
1732  %b = call i1 @llvm.vector.reduce.or.v2i1(<2 x i1> %a)
1733  ret i1 %b
1734}
1735
1736define i1 @icmp_v4i32_v4i1(<4 x i32>, <4 x i32>) {
1737; SSE-LABEL: icmp_v4i32_v4i1:
1738; SSE:       # %bb.0:
1739; SSE-NEXT:    pcmpeqd %xmm1, %xmm0
1740; SSE-NEXT:    movmskps %xmm0, %eax
1741; SSE-NEXT:    testl %eax, %eax
1742; SSE-NEXT:    setne %al
1743; SSE-NEXT:    retq
1744;
1745; AVX-LABEL: icmp_v4i32_v4i1:
1746; AVX:       # %bb.0:
1747; AVX-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
1748; AVX-NEXT:    vmovmskps %xmm0, %eax
1749; AVX-NEXT:    testl %eax, %eax
1750; AVX-NEXT:    setne %al
1751; AVX-NEXT:    retq
1752;
1753; AVX512F-LABEL: icmp_v4i32_v4i1:
1754; AVX512F:       # %bb.0:
1755; AVX512F-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
1756; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1757; AVX512F-NEXT:    vpcmpeqd %zmm1, %zmm0, %k0
1758; AVX512F-NEXT:    kmovw %k0, %eax
1759; AVX512F-NEXT:    testb $15, %al
1760; AVX512F-NEXT:    setne %al
1761; AVX512F-NEXT:    vzeroupper
1762; AVX512F-NEXT:    retq
1763;
1764; AVX512BW-LABEL: icmp_v4i32_v4i1:
1765; AVX512BW:       # %bb.0:
1766; AVX512BW-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
1767; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1768; AVX512BW-NEXT:    vpcmpeqd %zmm1, %zmm0, %k0
1769; AVX512BW-NEXT:    kmovd %k0, %eax
1770; AVX512BW-NEXT:    testb $15, %al
1771; AVX512BW-NEXT:    setne %al
1772; AVX512BW-NEXT:    vzeroupper
1773; AVX512BW-NEXT:    retq
1774;
1775; AVX512VL-LABEL: icmp_v4i32_v4i1:
1776; AVX512VL:       # %bb.0:
1777; AVX512VL-NEXT:    vpcmpeqd %xmm1, %xmm0, %k0
1778; AVX512VL-NEXT:    kmovd %k0, %eax
1779; AVX512VL-NEXT:    testb %al, %al
1780; AVX512VL-NEXT:    setne %al
1781; AVX512VL-NEXT:    retq
1782  %a = icmp eq <4 x i32> %0, %1
1783  %b = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> %a)
1784  ret i1 %b
1785}
1786
1787define i1 @icmp_v8i16_v8i1(<8 x i16>, <8 x i16>) {
1788; SSE-LABEL: icmp_v8i16_v8i1:
1789; SSE:       # %bb.0:
1790; SSE-NEXT:    pcmpeqw %xmm1, %xmm0
1791; SSE-NEXT:    pmovmskb %xmm0, %eax
1792; SSE-NEXT:    testl %eax, %eax
1793; SSE-NEXT:    setne %al
1794; SSE-NEXT:    retq
1795;
1796; AVX-LABEL: icmp_v8i16_v8i1:
1797; AVX:       # %bb.0:
1798; AVX-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm0
1799; AVX-NEXT:    vpmovmskb %xmm0, %eax
1800; AVX-NEXT:    testl %eax, %eax
1801; AVX-NEXT:    setne %al
1802; AVX-NEXT:    retq
1803;
1804; AVX512F-LABEL: icmp_v8i16_v8i1:
1805; AVX512F:       # %bb.0:
1806; AVX512F-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm0
1807; AVX512F-NEXT:    vpmovsxwq %xmm0, %zmm0
1808; AVX512F-NEXT:    vptestmq %zmm0, %zmm0, %k0
1809; AVX512F-NEXT:    kmovw %k0, %eax
1810; AVX512F-NEXT:    testb %al, %al
1811; AVX512F-NEXT:    setne %al
1812; AVX512F-NEXT:    vzeroupper
1813; AVX512F-NEXT:    retq
1814;
1815; AVX512BW-LABEL: icmp_v8i16_v8i1:
1816; AVX512BW:       # %bb.0:
1817; AVX512BW-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
1818; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1819; AVX512BW-NEXT:    vpcmpeqw %zmm1, %zmm0, %k0
1820; AVX512BW-NEXT:    kmovd %k0, %eax
1821; AVX512BW-NEXT:    testb %al, %al
1822; AVX512BW-NEXT:    setne %al
1823; AVX512BW-NEXT:    vzeroupper
1824; AVX512BW-NEXT:    retq
1825;
1826; AVX512VL-LABEL: icmp_v8i16_v8i1:
1827; AVX512VL:       # %bb.0:
1828; AVX512VL-NEXT:    vpcmpeqw %xmm1, %xmm0, %k0
1829; AVX512VL-NEXT:    kmovd %k0, %eax
1830; AVX512VL-NEXT:    testb %al, %al
1831; AVX512VL-NEXT:    setne %al
1832; AVX512VL-NEXT:    retq
1833  %a = icmp eq <8 x i16> %0, %1
1834  %b = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> %a)
1835  ret i1 %b
1836}
1837
1838define i1 @icmp_v16i8_v16i1(<16 x i8>, <16 x i8>) {
1839; SSE-LABEL: icmp_v16i8_v16i1:
1840; SSE:       # %bb.0:
1841; SSE-NEXT:    pcmpeqb %xmm1, %xmm0
1842; SSE-NEXT:    pmovmskb %xmm0, %eax
1843; SSE-NEXT:    testl %eax, %eax
1844; SSE-NEXT:    setne %al
1845; SSE-NEXT:    retq
1846;
1847; AVX-LABEL: icmp_v16i8_v16i1:
1848; AVX:       # %bb.0:
1849; AVX-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
1850; AVX-NEXT:    vpmovmskb %xmm0, %eax
1851; AVX-NEXT:    testl %eax, %eax
1852; AVX-NEXT:    setne %al
1853; AVX-NEXT:    retq
1854;
1855; AVX512F-LABEL: icmp_v16i8_v16i1:
1856; AVX512F:       # %bb.0:
1857; AVX512F-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
1858; AVX512F-NEXT:    vpmovmskb %xmm0, %eax
1859; AVX512F-NEXT:    testl %eax, %eax
1860; AVX512F-NEXT:    setne %al
1861; AVX512F-NEXT:    retq
1862;
1863; AVX512BW-LABEL: icmp_v16i8_v16i1:
1864; AVX512BW:       # %bb.0:
1865; AVX512BW-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
1866; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1867; AVX512BW-NEXT:    vpcmpeqb %zmm1, %zmm0, %k0
1868; AVX512BW-NEXT:    kortestw %k0, %k0
1869; AVX512BW-NEXT:    setne %al
1870; AVX512BW-NEXT:    vzeroupper
1871; AVX512BW-NEXT:    retq
1872;
1873; AVX512VL-LABEL: icmp_v16i8_v16i1:
1874; AVX512VL:       # %bb.0:
1875; AVX512VL-NEXT:    vpcmpeqb %xmm1, %xmm0, %k0
1876; AVX512VL-NEXT:    kortestw %k0, %k0
1877; AVX512VL-NEXT:    setne %al
1878; AVX512VL-NEXT:    retq
1879  %a = icmp eq <16 x i8> %0, %1
1880  %b = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> %a)
1881  ret i1 %b
1882}
1883
1884define i1 @icmp_v4i64_v4i1(<4 x i64>, <4 x i64>) {
1885; SSE2-LABEL: icmp_v4i64_v4i1:
1886; SSE2:       # %bb.0:
1887; SSE2-NEXT:    pcmpeqd %xmm3, %xmm1
1888; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,0,3,2]
1889; SSE2-NEXT:    pand %xmm1, %xmm3
1890; SSE2-NEXT:    pcmpeqd %xmm2, %xmm0
1891; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]
1892; SSE2-NEXT:    pand %xmm0, %xmm1
1893; SSE2-NEXT:    packssdw %xmm3, %xmm1
1894; SSE2-NEXT:    movmskps %xmm1, %eax
1895; SSE2-NEXT:    testl %eax, %eax
1896; SSE2-NEXT:    setne %al
1897; SSE2-NEXT:    retq
1898;
1899; SSE41-LABEL: icmp_v4i64_v4i1:
1900; SSE41:       # %bb.0:
1901; SSE41-NEXT:    pcmpeqq %xmm3, %xmm1
1902; SSE41-NEXT:    pcmpeqq %xmm2, %xmm0
1903; SSE41-NEXT:    packssdw %xmm1, %xmm0
1904; SSE41-NEXT:    movmskps %xmm0, %eax
1905; SSE41-NEXT:    testl %eax, %eax
1906; SSE41-NEXT:    setne %al
1907; SSE41-NEXT:    retq
1908;
1909; AVX1-LABEL: icmp_v4i64_v4i1:
1910; AVX1:       # %bb.0:
1911; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1912; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1913; AVX1-NEXT:    vpcmpeqq %xmm2, %xmm3, %xmm2
1914; AVX1-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm0
1915; AVX1-NEXT:    vpor %xmm2, %xmm0, %xmm0
1916; AVX1-NEXT:    vmovmskpd %xmm0, %eax
1917; AVX1-NEXT:    testl %eax, %eax
1918; AVX1-NEXT:    setne %al
1919; AVX1-NEXT:    vzeroupper
1920; AVX1-NEXT:    retq
1921;
1922; AVX2-LABEL: icmp_v4i64_v4i1:
1923; AVX2:       # %bb.0:
1924; AVX2-NEXT:    vpcmpeqq %ymm1, %ymm0, %ymm0
1925; AVX2-NEXT:    vmovmskpd %ymm0, %eax
1926; AVX2-NEXT:    testl %eax, %eax
1927; AVX2-NEXT:    setne %al
1928; AVX2-NEXT:    vzeroupper
1929; AVX2-NEXT:    retq
1930;
1931; AVX512F-LABEL: icmp_v4i64_v4i1:
1932; AVX512F:       # %bb.0:
1933; AVX512F-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
1934; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1935; AVX512F-NEXT:    vpcmpeqq %zmm1, %zmm0, %k0
1936; AVX512F-NEXT:    kmovw %k0, %eax
1937; AVX512F-NEXT:    testb $15, %al
1938; AVX512F-NEXT:    setne %al
1939; AVX512F-NEXT:    vzeroupper
1940; AVX512F-NEXT:    retq
1941;
1942; AVX512BW-LABEL: icmp_v4i64_v4i1:
1943; AVX512BW:       # %bb.0:
1944; AVX512BW-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
1945; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1946; AVX512BW-NEXT:    vpcmpeqq %zmm1, %zmm0, %k0
1947; AVX512BW-NEXT:    kmovd %k0, %eax
1948; AVX512BW-NEXT:    testb $15, %al
1949; AVX512BW-NEXT:    setne %al
1950; AVX512BW-NEXT:    vzeroupper
1951; AVX512BW-NEXT:    retq
1952;
1953; AVX512VL-LABEL: icmp_v4i64_v4i1:
1954; AVX512VL:       # %bb.0:
1955; AVX512VL-NEXT:    vpcmpeqq %ymm1, %ymm0, %k0
1956; AVX512VL-NEXT:    kmovd %k0, %eax
1957; AVX512VL-NEXT:    testb %al, %al
1958; AVX512VL-NEXT:    setne %al
1959; AVX512VL-NEXT:    vzeroupper
1960; AVX512VL-NEXT:    retq
1961  %a = icmp eq <4 x i64> %0, %1
1962  %b = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> %a)
1963  ret i1 %b
1964}
1965
1966define i1 @icmp_v8i32_v8i1(<8 x i32>, <8 x i32>) {
1967; SSE-LABEL: icmp_v8i32_v8i1:
1968; SSE:       # %bb.0:
1969; SSE-NEXT:    pcmpeqd %xmm3, %xmm1
1970; SSE-NEXT:    pcmpeqd %xmm2, %xmm0
1971; SSE-NEXT:    packssdw %xmm1, %xmm0
1972; SSE-NEXT:    pmovmskb %xmm0, %eax
1973; SSE-NEXT:    testl %eax, %eax
1974; SSE-NEXT:    setne %al
1975; SSE-NEXT:    retq
1976;
1977; AVX1-LABEL: icmp_v8i32_v8i1:
1978; AVX1:       # %bb.0:
1979; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1980; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1981; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm3, %xmm2
1982; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
1983; AVX1-NEXT:    vpor %xmm2, %xmm0, %xmm0
1984; AVX1-NEXT:    vmovmskps %xmm0, %eax
1985; AVX1-NEXT:    testl %eax, %eax
1986; AVX1-NEXT:    setne %al
1987; AVX1-NEXT:    vzeroupper
1988; AVX1-NEXT:    retq
1989;
1990; AVX2-LABEL: icmp_v8i32_v8i1:
1991; AVX2:       # %bb.0:
1992; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm0, %ymm0
1993; AVX2-NEXT:    vmovmskps %ymm0, %eax
1994; AVX2-NEXT:    testl %eax, %eax
1995; AVX2-NEXT:    setne %al
1996; AVX2-NEXT:    vzeroupper
1997; AVX2-NEXT:    retq
1998;
1999; AVX512F-LABEL: icmp_v8i32_v8i1:
2000; AVX512F:       # %bb.0:
2001; AVX512F-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
2002; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2003; AVX512F-NEXT:    vpcmpeqd %zmm1, %zmm0, %k0
2004; AVX512F-NEXT:    kmovw %k0, %eax
2005; AVX512F-NEXT:    testb %al, %al
2006; AVX512F-NEXT:    setne %al
2007; AVX512F-NEXT:    vzeroupper
2008; AVX512F-NEXT:    retq
2009;
2010; AVX512BW-LABEL: icmp_v8i32_v8i1:
2011; AVX512BW:       # %bb.0:
2012; AVX512BW-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
2013; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2014; AVX512BW-NEXT:    vpcmpeqd %zmm1, %zmm0, %k0
2015; AVX512BW-NEXT:    kmovd %k0, %eax
2016; AVX512BW-NEXT:    testb %al, %al
2017; AVX512BW-NEXT:    setne %al
2018; AVX512BW-NEXT:    vzeroupper
2019; AVX512BW-NEXT:    retq
2020;
2021; AVX512VL-LABEL: icmp_v8i32_v8i1:
2022; AVX512VL:       # %bb.0:
2023; AVX512VL-NEXT:    vpcmpeqd %ymm1, %ymm0, %k0
2024; AVX512VL-NEXT:    kmovd %k0, %eax
2025; AVX512VL-NEXT:    testb %al, %al
2026; AVX512VL-NEXT:    setne %al
2027; AVX512VL-NEXT:    vzeroupper
2028; AVX512VL-NEXT:    retq
2029  %a = icmp eq <8 x i32> %0, %1
2030  %b = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> %a)
2031  ret i1 %b
2032}
2033
2034define i1 @icmp_v16i16_v16i1(<16 x i16>, <16 x i16>) {
2035; SSE-LABEL: icmp_v16i16_v16i1:
2036; SSE:       # %bb.0:
2037; SSE-NEXT:    pcmpeqw %xmm3, %xmm1
2038; SSE-NEXT:    pcmpeqw %xmm2, %xmm0
2039; SSE-NEXT:    packsswb %xmm1, %xmm0
2040; SSE-NEXT:    pmovmskb %xmm0, %eax
2041; SSE-NEXT:    testl %eax, %eax
2042; SSE-NEXT:    setne %al
2043; SSE-NEXT:    retq
2044;
2045; AVX1-LABEL: icmp_v16i16_v16i1:
2046; AVX1:       # %bb.0:
2047; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2048; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
2049; AVX1-NEXT:    vpcmpeqw %xmm2, %xmm3, %xmm2
2050; AVX1-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm0
2051; AVX1-NEXT:    vpacksswb %xmm2, %xmm0, %xmm0
2052; AVX1-NEXT:    vpmovmskb %xmm0, %eax
2053; AVX1-NEXT:    testl %eax, %eax
2054; AVX1-NEXT:    setne %al
2055; AVX1-NEXT:    vzeroupper
2056; AVX1-NEXT:    retq
2057;
2058; AVX2-LABEL: icmp_v16i16_v16i1:
2059; AVX2:       # %bb.0:
2060; AVX2-NEXT:    vpcmpeqw %ymm1, %ymm0, %ymm0
2061; AVX2-NEXT:    vpmovmskb %ymm0, %eax
2062; AVX2-NEXT:    testl %eax, %eax
2063; AVX2-NEXT:    setne %al
2064; AVX2-NEXT:    vzeroupper
2065; AVX2-NEXT:    retq
2066;
2067; AVX512F-LABEL: icmp_v16i16_v16i1:
2068; AVX512F:       # %bb.0:
2069; AVX512F-NEXT:    vpcmpeqw %ymm1, %ymm0, %ymm0
2070; AVX512F-NEXT:    vpmovsxwd %ymm0, %zmm0
2071; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k0
2072; AVX512F-NEXT:    kortestw %k0, %k0
2073; AVX512F-NEXT:    setne %al
2074; AVX512F-NEXT:    vzeroupper
2075; AVX512F-NEXT:    retq
2076;
2077; AVX512BW-LABEL: icmp_v16i16_v16i1:
2078; AVX512BW:       # %bb.0:
2079; AVX512BW-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
2080; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2081; AVX512BW-NEXT:    vpcmpeqw %zmm1, %zmm0, %k0
2082; AVX512BW-NEXT:    kortestw %k0, %k0
2083; AVX512BW-NEXT:    setne %al
2084; AVX512BW-NEXT:    vzeroupper
2085; AVX512BW-NEXT:    retq
2086;
2087; AVX512VL-LABEL: icmp_v16i16_v16i1:
2088; AVX512VL:       # %bb.0:
2089; AVX512VL-NEXT:    vpcmpeqw %ymm1, %ymm0, %k0
2090; AVX512VL-NEXT:    kortestw %k0, %k0
2091; AVX512VL-NEXT:    setne %al
2092; AVX512VL-NEXT:    vzeroupper
2093; AVX512VL-NEXT:    retq
2094  %a = icmp eq <16 x i16> %0, %1
2095  %b = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> %a)
2096  ret i1 %b
2097}
2098
2099define i1 @icmp_v32i8_v32i1(<32 x i8>, <32 x i8>) {
2100; SSE-LABEL: icmp_v32i8_v32i1:
2101; SSE:       # %bb.0:
2102; SSE-NEXT:    pcmpeqb %xmm3, %xmm1
2103; SSE-NEXT:    pcmpeqb %xmm2, %xmm0
2104; SSE-NEXT:    por %xmm1, %xmm0
2105; SSE-NEXT:    pmovmskb %xmm0, %eax
2106; SSE-NEXT:    testl %eax, %eax
2107; SSE-NEXT:    setne %al
2108; SSE-NEXT:    retq
2109;
2110; AVX1-LABEL: icmp_v32i8_v32i1:
2111; AVX1:       # %bb.0:
2112; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2113; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
2114; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm3, %xmm2
2115; AVX1-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
2116; AVX1-NEXT:    vpor %xmm2, %xmm0, %xmm0
2117; AVX1-NEXT:    vpmovmskb %xmm0, %eax
2118; AVX1-NEXT:    testl %eax, %eax
2119; AVX1-NEXT:    setne %al
2120; AVX1-NEXT:    vzeroupper
2121; AVX1-NEXT:    retq
2122;
2123; AVX2-LABEL: icmp_v32i8_v32i1:
2124; AVX2:       # %bb.0:
2125; AVX2-NEXT:    vpcmpeqb %ymm1, %ymm0, %ymm0
2126; AVX2-NEXT:    vpmovmskb %ymm0, %eax
2127; AVX2-NEXT:    testl %eax, %eax
2128; AVX2-NEXT:    setne %al
2129; AVX2-NEXT:    vzeroupper
2130; AVX2-NEXT:    retq
2131;
2132; AVX512F-LABEL: icmp_v32i8_v32i1:
2133; AVX512F:       # %bb.0:
2134; AVX512F-NEXT:    vpcmpeqb %ymm1, %ymm0, %ymm0
2135; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm1
2136; AVX512F-NEXT:    vpor %xmm1, %xmm0, %xmm0
2137; AVX512F-NEXT:    vpmovsxbd %xmm0, %zmm0
2138; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k0
2139; AVX512F-NEXT:    kshiftrw $8, %k0, %k1
2140; AVX512F-NEXT:    korw %k1, %k0, %k0
2141; AVX512F-NEXT:    kshiftrw $4, %k0, %k1
2142; AVX512F-NEXT:    korw %k1, %k0, %k0
2143; AVX512F-NEXT:    kshiftrw $2, %k0, %k1
2144; AVX512F-NEXT:    korw %k1, %k0, %k0
2145; AVX512F-NEXT:    kshiftrw $1, %k0, %k1
2146; AVX512F-NEXT:    korw %k1, %k0, %k0
2147; AVX512F-NEXT:    kmovw %k0, %eax
2148; AVX512F-NEXT:    # kill: def $al killed $al killed $eax
2149; AVX512F-NEXT:    vzeroupper
2150; AVX512F-NEXT:    retq
2151;
2152; AVX512BW-LABEL: icmp_v32i8_v32i1:
2153; AVX512BW:       # %bb.0:
2154; AVX512BW-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
2155; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2156; AVX512BW-NEXT:    vpcmpeqb %zmm1, %zmm0, %k0
2157; AVX512BW-NEXT:    kortestd %k0, %k0
2158; AVX512BW-NEXT:    setne %al
2159; AVX512BW-NEXT:    vzeroupper
2160; AVX512BW-NEXT:    retq
2161;
2162; AVX512VL-LABEL: icmp_v32i8_v32i1:
2163; AVX512VL:       # %bb.0:
2164; AVX512VL-NEXT:    vpcmpeqb %ymm1, %ymm0, %k0
2165; AVX512VL-NEXT:    kortestd %k0, %k0
2166; AVX512VL-NEXT:    setne %al
2167; AVX512VL-NEXT:    vzeroupper
2168; AVX512VL-NEXT:    retq
2169  %a = icmp eq <32 x i8> %0, %1
2170  %b = call i1 @llvm.vector.reduce.or.v32i1(<32 x i1> %a)
2171  ret i1 %b
2172}
2173
2174define i1 @icmp_v8i64_v8i1(<8 x i64>, <8 x i64>) {
2175; SSE2-LABEL: icmp_v8i64_v8i1:
2176; SSE2:       # %bb.0:
2177; SSE2-NEXT:    pcmpeqd %xmm7, %xmm3
2178; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm3[1,0,3,2]
2179; SSE2-NEXT:    pand %xmm3, %xmm7
2180; SSE2-NEXT:    pcmpeqd %xmm6, %xmm2
2181; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,0,3,2]
2182; SSE2-NEXT:    pand %xmm2, %xmm3
2183; SSE2-NEXT:    packssdw %xmm7, %xmm3
2184; SSE2-NEXT:    pcmpeqd %xmm5, %xmm1
2185; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,0,3,2]
2186; SSE2-NEXT:    pand %xmm1, %xmm2
2187; SSE2-NEXT:    pcmpeqd %xmm4, %xmm0
2188; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]
2189; SSE2-NEXT:    pand %xmm0, %xmm1
2190; SSE2-NEXT:    packssdw %xmm2, %xmm1
2191; SSE2-NEXT:    packssdw %xmm3, %xmm1
2192; SSE2-NEXT:    pmovmskb %xmm1, %eax
2193; SSE2-NEXT:    testl $43690, %eax # imm = 0xAAAA
2194; SSE2-NEXT:    setne %al
2195; SSE2-NEXT:    retq
2196;
2197; SSE41-LABEL: icmp_v8i64_v8i1:
2198; SSE41:       # %bb.0:
2199; SSE41-NEXT:    pcmpeqq %xmm7, %xmm3
2200; SSE41-NEXT:    pcmpeqq %xmm6, %xmm2
2201; SSE41-NEXT:    packssdw %xmm3, %xmm2
2202; SSE41-NEXT:    pcmpeqq %xmm5, %xmm1
2203; SSE41-NEXT:    pcmpeqq %xmm4, %xmm0
2204; SSE41-NEXT:    packssdw %xmm1, %xmm0
2205; SSE41-NEXT:    packssdw %xmm2, %xmm0
2206; SSE41-NEXT:    pmovmskb %xmm0, %eax
2207; SSE41-NEXT:    testl $43690, %eax # imm = 0xAAAA
2208; SSE41-NEXT:    setne %al
2209; SSE41-NEXT:    retq
2210;
2211; AVX1-LABEL: icmp_v8i64_v8i1:
2212; AVX1:       # %bb.0:
2213; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
2214; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
2215; AVX1-NEXT:    vpcmpeqq %xmm4, %xmm5, %xmm4
2216; AVX1-NEXT:    vpcmpeqq %xmm3, %xmm1, %xmm1
2217; AVX1-NEXT:    vpackssdw %xmm4, %xmm1, %xmm1
2218; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
2219; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
2220; AVX1-NEXT:    vpcmpeqq %xmm3, %xmm4, %xmm3
2221; AVX1-NEXT:    vpcmpeqq %xmm2, %xmm0, %xmm0
2222; AVX1-NEXT:    vpackssdw %xmm3, %xmm0, %xmm0
2223; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
2224; AVX1-NEXT:    vmovmskps %xmm0, %eax
2225; AVX1-NEXT:    testl %eax, %eax
2226; AVX1-NEXT:    setne %al
2227; AVX1-NEXT:    vzeroupper
2228; AVX1-NEXT:    retq
2229;
2230; AVX2-LABEL: icmp_v8i64_v8i1:
2231; AVX2:       # %bb.0:
2232; AVX2-NEXT:    vpcmpeqq %ymm3, %ymm1, %ymm1
2233; AVX2-NEXT:    vpcmpeqq %ymm2, %ymm0, %ymm0
2234; AVX2-NEXT:    vpackssdw %ymm1, %ymm0, %ymm0
2235; AVX2-NEXT:    vmovmskps %ymm0, %eax
2236; AVX2-NEXT:    testl %eax, %eax
2237; AVX2-NEXT:    setne %al
2238; AVX2-NEXT:    vzeroupper
2239; AVX2-NEXT:    retq
2240;
2241; AVX512F-LABEL: icmp_v8i64_v8i1:
2242; AVX512F:       # %bb.0:
2243; AVX512F-NEXT:    vpcmpeqq %zmm1, %zmm0, %k0
2244; AVX512F-NEXT:    kmovw %k0, %eax
2245; AVX512F-NEXT:    testb %al, %al
2246; AVX512F-NEXT:    setne %al
2247; AVX512F-NEXT:    vzeroupper
2248; AVX512F-NEXT:    retq
2249;
2250; AVX512BW-LABEL: icmp_v8i64_v8i1:
2251; AVX512BW:       # %bb.0:
2252; AVX512BW-NEXT:    vpcmpeqq %zmm1, %zmm0, %k0
2253; AVX512BW-NEXT:    kmovd %k0, %eax
2254; AVX512BW-NEXT:    testb %al, %al
2255; AVX512BW-NEXT:    setne %al
2256; AVX512BW-NEXT:    vzeroupper
2257; AVX512BW-NEXT:    retq
2258;
2259; AVX512VL-LABEL: icmp_v8i64_v8i1:
2260; AVX512VL:       # %bb.0:
2261; AVX512VL-NEXT:    vpcmpeqq %zmm1, %zmm0, %k0
2262; AVX512VL-NEXT:    kmovd %k0, %eax
2263; AVX512VL-NEXT:    testb %al, %al
2264; AVX512VL-NEXT:    setne %al
2265; AVX512VL-NEXT:    vzeroupper
2266; AVX512VL-NEXT:    retq
2267  %a = icmp eq <8 x i64> %0, %1
2268  %b = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> %a)
2269  ret i1 %b
2270}
2271
2272define i1 @icmp_v16i32_v16i1(<16 x i32>, <16 x i32>) {
2273; SSE-LABEL: icmp_v16i32_v16i1:
2274; SSE:       # %bb.0:
2275; SSE-NEXT:    pcmpeqd %xmm7, %xmm3
2276; SSE-NEXT:    pcmpeqd %xmm6, %xmm2
2277; SSE-NEXT:    packssdw %xmm3, %xmm2
2278; SSE-NEXT:    pcmpeqd %xmm5, %xmm1
2279; SSE-NEXT:    pcmpeqd %xmm4, %xmm0
2280; SSE-NEXT:    packssdw %xmm1, %xmm0
2281; SSE-NEXT:    packsswb %xmm2, %xmm0
2282; SSE-NEXT:    pmovmskb %xmm0, %eax
2283; SSE-NEXT:    testl %eax, %eax
2284; SSE-NEXT:    setne %al
2285; SSE-NEXT:    retq
2286;
2287; AVX1-LABEL: icmp_v16i32_v16i1:
2288; AVX1:       # %bb.0:
2289; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
2290; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
2291; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm5, %xmm4
2292; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm1, %xmm1
2293; AVX1-NEXT:    vpackssdw %xmm4, %xmm1, %xmm1
2294; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
2295; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
2296; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm4, %xmm3
2297; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm0, %xmm0
2298; AVX1-NEXT:    vpackssdw %xmm3, %xmm0, %xmm0
2299; AVX1-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
2300; AVX1-NEXT:    vpmovmskb %xmm0, %eax
2301; AVX1-NEXT:    testl %eax, %eax
2302; AVX1-NEXT:    setne %al
2303; AVX1-NEXT:    vzeroupper
2304; AVX1-NEXT:    retq
2305;
2306; AVX2-LABEL: icmp_v16i32_v16i1:
2307; AVX2:       # %bb.0:
2308; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm1, %ymm1
2309; AVX2-NEXT:    vpcmpeqd %ymm2, %ymm0, %ymm0
2310; AVX2-NEXT:    vpackssdw %ymm1, %ymm0, %ymm0
2311; AVX2-NEXT:    vpmovmskb %ymm0, %eax
2312; AVX2-NEXT:    testl %eax, %eax
2313; AVX2-NEXT:    setne %al
2314; AVX2-NEXT:    vzeroupper
2315; AVX2-NEXT:    retq
2316;
2317; AVX512-LABEL: icmp_v16i32_v16i1:
2318; AVX512:       # %bb.0:
2319; AVX512-NEXT:    vpcmpeqd %zmm1, %zmm0, %k0
2320; AVX512-NEXT:    kortestw %k0, %k0
2321; AVX512-NEXT:    setne %al
2322; AVX512-NEXT:    vzeroupper
2323; AVX512-NEXT:    retq
2324  %a = icmp eq <16 x i32> %0, %1
2325  %b = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> %a)
2326  ret i1 %b
2327}
2328
2329define i1 @icmp_v32i16_v32i1(<32 x i16>, <32 x i16>) {
2330; SSE-LABEL: icmp_v32i16_v32i1:
2331; SSE:       # %bb.0:
2332; SSE-NEXT:    pcmpeqw %xmm5, %xmm1
2333; SSE-NEXT:    pcmpeqw %xmm4, %xmm0
2334; SSE-NEXT:    packsswb %xmm1, %xmm0
2335; SSE-NEXT:    pcmpeqw %xmm7, %xmm3
2336; SSE-NEXT:    pcmpeqw %xmm6, %xmm2
2337; SSE-NEXT:    packsswb %xmm3, %xmm2
2338; SSE-NEXT:    por %xmm0, %xmm2
2339; SSE-NEXT:    pmovmskb %xmm2, %eax
2340; SSE-NEXT:    testl %eax, %eax
2341; SSE-NEXT:    setne %al
2342; SSE-NEXT:    retq
2343;
2344; AVX1-LABEL: icmp_v32i16_v32i1:
2345; AVX1:       # %bb.0:
2346; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
2347; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
2348; AVX1-NEXT:    vpcmpeqw %xmm4, %xmm5, %xmm4
2349; AVX1-NEXT:    vpcmpeqw %xmm3, %xmm1, %xmm1
2350; AVX1-NEXT:    vpacksswb %xmm4, %xmm1, %xmm1
2351; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
2352; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
2353; AVX1-NEXT:    vpcmpeqw %xmm3, %xmm4, %xmm3
2354; AVX1-NEXT:    vpcmpeqw %xmm2, %xmm0, %xmm0
2355; AVX1-NEXT:    vpacksswb %xmm3, %xmm0, %xmm0
2356; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
2357; AVX1-NEXT:    vpmovmskb %xmm0, %eax
2358; AVX1-NEXT:    testl %eax, %eax
2359; AVX1-NEXT:    setne %al
2360; AVX1-NEXT:    vzeroupper
2361; AVX1-NEXT:    retq
2362;
2363; AVX2-LABEL: icmp_v32i16_v32i1:
2364; AVX2:       # %bb.0:
2365; AVX2-NEXT:    vpcmpeqw %ymm3, %ymm1, %ymm1
2366; AVX2-NEXT:    vpcmpeqw %ymm2, %ymm0, %ymm0
2367; AVX2-NEXT:    vpacksswb %ymm1, %ymm0, %ymm0
2368; AVX2-NEXT:    vpmovmskb %ymm0, %eax
2369; AVX2-NEXT:    testl %eax, %eax
2370; AVX2-NEXT:    setne %al
2371; AVX2-NEXT:    vzeroupper
2372; AVX2-NEXT:    retq
2373;
2374; AVX512F-LABEL: icmp_v32i16_v32i1:
2375; AVX512F:       # %bb.0:
2376; AVX512F-NEXT:    vextracti64x4 $1, %zmm1, %ymm2
2377; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm3
2378; AVX512F-NEXT:    vpcmpeqw %ymm2, %ymm3, %ymm2
2379; AVX512F-NEXT:    vpcmpeqw %ymm1, %ymm0, %ymm0
2380; AVX512F-NEXT:    vpor %ymm2, %ymm0, %ymm0
2381; AVX512F-NEXT:    vpmovsxwd %ymm0, %zmm0
2382; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k0
2383; AVX512F-NEXT:    kshiftrw $8, %k0, %k1
2384; AVX512F-NEXT:    korw %k1, %k0, %k0
2385; AVX512F-NEXT:    kshiftrw $4, %k0, %k1
2386; AVX512F-NEXT:    korw %k1, %k0, %k0
2387; AVX512F-NEXT:    kshiftrw $2, %k0, %k1
2388; AVX512F-NEXT:    korw %k1, %k0, %k0
2389; AVX512F-NEXT:    kshiftrw $1, %k0, %k1
2390; AVX512F-NEXT:    korw %k1, %k0, %k0
2391; AVX512F-NEXT:    kmovw %k0, %eax
2392; AVX512F-NEXT:    # kill: def $al killed $al killed $eax
2393; AVX512F-NEXT:    vzeroupper
2394; AVX512F-NEXT:    retq
2395;
2396; AVX512BW-LABEL: icmp_v32i16_v32i1:
2397; AVX512BW:       # %bb.0:
2398; AVX512BW-NEXT:    vpcmpeqw %zmm1, %zmm0, %k0
2399; AVX512BW-NEXT:    kortestd %k0, %k0
2400; AVX512BW-NEXT:    setne %al
2401; AVX512BW-NEXT:    vzeroupper
2402; AVX512BW-NEXT:    retq
2403;
2404; AVX512VL-LABEL: icmp_v32i16_v32i1:
2405; AVX512VL:       # %bb.0:
2406; AVX512VL-NEXT:    vpcmpeqw %zmm1, %zmm0, %k0
2407; AVX512VL-NEXT:    kortestd %k0, %k0
2408; AVX512VL-NEXT:    setne %al
2409; AVX512VL-NEXT:    vzeroupper
2410; AVX512VL-NEXT:    retq
2411  %a = icmp eq <32 x i16> %0, %1
2412  %b = call i1 @llvm.vector.reduce.or.v32i1(<32 x i1> %a)
2413  ret i1 %b
2414}
2415
2416define i1 @icmp_v64i8_v64i1(<64 x i8>, <64 x i8>) {
2417; SSE-LABEL: icmp_v64i8_v64i1:
2418; SSE:       # %bb.0:
2419; SSE-NEXT:    pcmpeqb %xmm6, %xmm2
2420; SSE-NEXT:    pcmpeqb %xmm4, %xmm0
2421; SSE-NEXT:    pcmpeqb %xmm7, %xmm3
2422; SSE-NEXT:    pcmpeqb %xmm5, %xmm1
2423; SSE-NEXT:    por %xmm3, %xmm1
2424; SSE-NEXT:    por %xmm2, %xmm1
2425; SSE-NEXT:    por %xmm0, %xmm1
2426; SSE-NEXT:    pmovmskb %xmm1, %eax
2427; SSE-NEXT:    testl %eax, %eax
2428; SSE-NEXT:    setne %al
2429; SSE-NEXT:    retq
2430;
2431; AVX1-LABEL: icmp_v64i8_v64i1:
2432; AVX1:       # %bb.0:
2433; AVX1-NEXT:    vpcmpeqb %xmm3, %xmm1, %xmm4
2434; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm0, %xmm5
2435; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm3
2436; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
2437; AVX1-NEXT:    vpcmpeqb %xmm3, %xmm1, %xmm1
2438; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm2
2439; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2440; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm0, %xmm0
2441; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
2442; AVX1-NEXT:    vpor %xmm0, %xmm4, %xmm0
2443; AVX1-NEXT:    vpor %xmm0, %xmm5, %xmm0
2444; AVX1-NEXT:    vpmovmskb %xmm0, %eax
2445; AVX1-NEXT:    testl %eax, %eax
2446; AVX1-NEXT:    setne %al
2447; AVX1-NEXT:    vzeroupper
2448; AVX1-NEXT:    retq
2449;
2450; AVX2-LABEL: icmp_v64i8_v64i1:
2451; AVX2:       # %bb.0:
2452; AVX2-NEXT:    vpcmpeqb %ymm3, %ymm1, %ymm1
2453; AVX2-NEXT:    vpcmpeqb %ymm2, %ymm0, %ymm0
2454; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
2455; AVX2-NEXT:    vpmovmskb %ymm0, %eax
2456; AVX2-NEXT:    testl %eax, %eax
2457; AVX2-NEXT:    setne %al
2458; AVX2-NEXT:    vzeroupper
2459; AVX2-NEXT:    retq
2460;
2461; AVX512F-LABEL: icmp_v64i8_v64i1:
2462; AVX512F:       # %bb.0:
2463; AVX512F-NEXT:    vextracti64x4 $1, %zmm1, %ymm2
2464; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm3
2465; AVX512F-NEXT:    vpcmpeqb %ymm2, %ymm3, %ymm2
2466; AVX512F-NEXT:    vpcmpeqb %ymm1, %ymm0, %ymm0
2467; AVX512F-NEXT:    vextracti128 $1, %ymm2, %xmm1
2468; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm3
2469; AVX512F-NEXT:    vpor %xmm1, %xmm3, %xmm1
2470; AVX512F-NEXT:    vpor %xmm1, %xmm2, %xmm1
2471; AVX512F-NEXT:    vpor %xmm1, %xmm0, %xmm0
2472; AVX512F-NEXT:    vpmovsxbd %xmm0, %zmm0
2473; AVX512F-NEXT:    vpslld $31, %zmm0, %zmm0
2474; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k0
2475; AVX512F-NEXT:    kshiftrw $8, %k0, %k1
2476; AVX512F-NEXT:    korw %k1, %k0, %k0
2477; AVX512F-NEXT:    kshiftrw $4, %k0, %k1
2478; AVX512F-NEXT:    korw %k1, %k0, %k0
2479; AVX512F-NEXT:    kshiftrw $2, %k0, %k1
2480; AVX512F-NEXT:    korw %k1, %k0, %k0
2481; AVX512F-NEXT:    kshiftrw $1, %k0, %k1
2482; AVX512F-NEXT:    korw %k1, %k0, %k0
2483; AVX512F-NEXT:    kmovw %k0, %eax
2484; AVX512F-NEXT:    # kill: def $al killed $al killed $eax
2485; AVX512F-NEXT:    vzeroupper
2486; AVX512F-NEXT:    retq
2487;
2488; AVX512BW-LABEL: icmp_v64i8_v64i1:
2489; AVX512BW:       # %bb.0:
2490; AVX512BW-NEXT:    vpcmpeqb %zmm1, %zmm0, %k0
2491; AVX512BW-NEXT:    kortestq %k0, %k0
2492; AVX512BW-NEXT:    setne %al
2493; AVX512BW-NEXT:    vzeroupper
2494; AVX512BW-NEXT:    retq
2495;
2496; AVX512VL-LABEL: icmp_v64i8_v64i1:
2497; AVX512VL:       # %bb.0:
2498; AVX512VL-NEXT:    vpcmpeqb %zmm1, %zmm0, %k0
2499; AVX512VL-NEXT:    kortestq %k0, %k0
2500; AVX512VL-NEXT:    setne %al
2501; AVX512VL-NEXT:    vzeroupper
2502; AVX512VL-NEXT:    retq
2503  %a = icmp eq <64 x i8> %0, %1
2504  %b = call i1 @llvm.vector.reduce.or.v64i1(<64 x i1> %a)
2505  ret i1 %b
2506}
2507
2508declare i1 @llvm.vector.reduce.or.v2i1(<2 x i1>)
2509declare i1 @llvm.vector.reduce.or.v4i1(<4 x i1>)
2510declare i1 @llvm.vector.reduce.or.v8i1(<8 x i1>)
2511declare i1 @llvm.vector.reduce.or.v16i1(<16 x i1>)
2512declare i1 @llvm.vector.reduce.or.v32i1(<32 x i1>)
2513declare i1 @llvm.vector.reduce.or.v64i1(<64 x i1>)
2514