xref: /llvm-project/llvm/test/CodeGen/X86/bitcast-and-setcc-128.ll (revision 6cf8bde056f3ff58bde54dbe3b320d81ad5d66d6)
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=SSE2-SSSE3,SSE2
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefixes=SSE2-SSSE3,SSSE3
4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX12
5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX12
6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl | FileCheck %s --check-prefix=AVX512F
7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl,+avx512bw | FileCheck %s --check-prefix=AVX512BW
8
9define i8 @v8i16(<8 x i16> %a, <8 x i16> %b, <8 x i16> %c, <8 x i16> %d) {
10; SSE2-SSSE3-LABEL: v8i16:
11; SSE2-SSSE3:       # %bb.0:
12; SSE2-SSSE3-NEXT:    pcmpgtw %xmm1, %xmm0
13; SSE2-SSSE3-NEXT:    pcmpgtw %xmm3, %xmm2
14; SSE2-SSSE3-NEXT:    pand %xmm0, %xmm2
15; SSE2-SSSE3-NEXT:    packsswb %xmm2, %xmm2
16; SSE2-SSSE3-NEXT:    pmovmskb %xmm2, %eax
17; SSE2-SSSE3-NEXT:    # kill: def $al killed $al killed $eax
18; SSE2-SSSE3-NEXT:    retq
19;
20; AVX12-LABEL: v8i16:
21; AVX12:       # %bb.0:
22; AVX12-NEXT:    vpcmpgtw %xmm1, %xmm0, %xmm0
23; AVX12-NEXT:    vpcmpgtw %xmm3, %xmm2, %xmm1
24; AVX12-NEXT:    vpand %xmm1, %xmm0, %xmm0
25; AVX12-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
26; AVX12-NEXT:    vpmovmskb %xmm0, %eax
27; AVX12-NEXT:    # kill: def $al killed $al killed $eax
28; AVX12-NEXT:    retq
29;
30; AVX512F-LABEL: v8i16:
31; AVX512F:       # %bb.0:
32; AVX512F-NEXT:    vpcmpgtw %xmm1, %xmm0, %xmm0
33; AVX512F-NEXT:    vpcmpgtw %xmm3, %xmm2, %xmm1
34; AVX512F-NEXT:    vpand %xmm1, %xmm0, %xmm0
35; AVX512F-NEXT:    vpmovsxwd %xmm0, %ymm0
36; AVX512F-NEXT:    vptestmd %ymm0, %ymm0, %k0
37; AVX512F-NEXT:    kmovw %k0, %eax
38; AVX512F-NEXT:    # kill: def $al killed $al killed $eax
39; AVX512F-NEXT:    vzeroupper
40; AVX512F-NEXT:    retq
41;
42; AVX512BW-LABEL: v8i16:
43; AVX512BW:       # %bb.0:
44; AVX512BW-NEXT:    vpcmpgtw %xmm1, %xmm0, %k1
45; AVX512BW-NEXT:    vpcmpgtw %xmm3, %xmm2, %k0 {%k1}
46; AVX512BW-NEXT:    kmovd %k0, %eax
47; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
48; AVX512BW-NEXT:    retq
49  %x0 = icmp sgt <8 x i16> %a, %b
50  %x1 = icmp sgt <8 x i16> %c, %d
51  %y = and <8 x i1> %x0, %x1
52  %res = bitcast <8 x i1> %y to i8
53  ret i8 %res
54}
55
56define i4 @v4i32(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c, <4 x i32> %d) {
57; SSE2-SSSE3-LABEL: v4i32:
58; SSE2-SSSE3:       # %bb.0:
59; SSE2-SSSE3-NEXT:    pcmpgtd %xmm1, %xmm0
60; SSE2-SSSE3-NEXT:    pcmpgtd %xmm3, %xmm2
61; SSE2-SSSE3-NEXT:    pand %xmm0, %xmm2
62; SSE2-SSSE3-NEXT:    movmskps %xmm2, %eax
63; SSE2-SSSE3-NEXT:    # kill: def $al killed $al killed $eax
64; SSE2-SSSE3-NEXT:    retq
65;
66; AVX12-LABEL: v4i32:
67; AVX12:       # %bb.0:
68; AVX12-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm0
69; AVX12-NEXT:    vpcmpgtd %xmm3, %xmm2, %xmm1
70; AVX12-NEXT:    vpand %xmm1, %xmm0, %xmm0
71; AVX12-NEXT:    vmovmskps %xmm0, %eax
72; AVX12-NEXT:    # kill: def $al killed $al killed $eax
73; AVX12-NEXT:    retq
74;
75; AVX512F-LABEL: v4i32:
76; AVX512F:       # %bb.0:
77; AVX512F-NEXT:    vpcmpgtd %xmm1, %xmm0, %k1
78; AVX512F-NEXT:    vpcmpgtd %xmm3, %xmm2, %k0 {%k1}
79; AVX512F-NEXT:    kmovw %k0, %eax
80; AVX512F-NEXT:    # kill: def $al killed $al killed $eax
81; AVX512F-NEXT:    retq
82;
83; AVX512BW-LABEL: v4i32:
84; AVX512BW:       # %bb.0:
85; AVX512BW-NEXT:    vpcmpgtd %xmm1, %xmm0, %k1
86; AVX512BW-NEXT:    vpcmpgtd %xmm3, %xmm2, %k0 {%k1}
87; AVX512BW-NEXT:    kmovd %k0, %eax
88; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
89; AVX512BW-NEXT:    retq
90  %x0 = icmp sgt <4 x i32> %a, %b
91  %x1 = icmp sgt <4 x i32> %c, %d
92  %y = and <4 x i1> %x0, %x1
93  %res = bitcast <4 x i1> %y to i4
94  ret i4 %res
95}
96
97define i4 @v4f32(<4 x float> %a, <4 x float> %b, <4 x float> %c, <4 x float> %d) {
98; SSE2-SSSE3-LABEL: v4f32:
99; SSE2-SSSE3:       # %bb.0:
100; SSE2-SSSE3-NEXT:    cmpltps %xmm0, %xmm1
101; SSE2-SSSE3-NEXT:    cmpltps %xmm2, %xmm3
102; SSE2-SSSE3-NEXT:    andps %xmm1, %xmm3
103; SSE2-SSSE3-NEXT:    movmskps %xmm3, %eax
104; SSE2-SSSE3-NEXT:    # kill: def $al killed $al killed $eax
105; SSE2-SSSE3-NEXT:    retq
106;
107; AVX12-LABEL: v4f32:
108; AVX12:       # %bb.0:
109; AVX12-NEXT:    vcmpltps %xmm0, %xmm1, %xmm0
110; AVX12-NEXT:    vcmpltps %xmm2, %xmm3, %xmm1
111; AVX12-NEXT:    vandps %xmm1, %xmm0, %xmm0
112; AVX12-NEXT:    vmovmskps %xmm0, %eax
113; AVX12-NEXT:    # kill: def $al killed $al killed $eax
114; AVX12-NEXT:    retq
115;
116; AVX512F-LABEL: v4f32:
117; AVX512F:       # %bb.0:
118; AVX512F-NEXT:    vcmpltps %xmm0, %xmm1, %k1
119; AVX512F-NEXT:    vcmpltps %xmm2, %xmm3, %k0 {%k1}
120; AVX512F-NEXT:    kmovw %k0, %eax
121; AVX512F-NEXT:    # kill: def $al killed $al killed $eax
122; AVX512F-NEXT:    retq
123;
124; AVX512BW-LABEL: v4f32:
125; AVX512BW:       # %bb.0:
126; AVX512BW-NEXT:    vcmpltps %xmm0, %xmm1, %k1
127; AVX512BW-NEXT:    vcmpltps %xmm2, %xmm3, %k0 {%k1}
128; AVX512BW-NEXT:    kmovd %k0, %eax
129; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
130; AVX512BW-NEXT:    retq
131  %x0 = fcmp ogt <4 x float> %a, %b
132  %x1 = fcmp ogt <4 x float> %c, %d
133  %y = and <4 x i1> %x0, %x1
134  %res = bitcast <4 x i1> %y to i4
135  ret i4 %res
136}
137
138define i16 @v16i8(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c, <16 x i8> %d) {
139; SSE2-SSSE3-LABEL: v16i8:
140; SSE2-SSSE3:       # %bb.0:
141; SSE2-SSSE3-NEXT:    pcmpgtb %xmm1, %xmm0
142; SSE2-SSSE3-NEXT:    pcmpgtb %xmm3, %xmm2
143; SSE2-SSSE3-NEXT:    pand %xmm0, %xmm2
144; SSE2-SSSE3-NEXT:    pmovmskb %xmm2, %eax
145; SSE2-SSSE3-NEXT:    # kill: def $ax killed $ax killed $eax
146; SSE2-SSSE3-NEXT:    retq
147;
148; AVX12-LABEL: v16i8:
149; AVX12:       # %bb.0:
150; AVX12-NEXT:    vpcmpgtb %xmm1, %xmm0, %xmm0
151; AVX12-NEXT:    vpcmpgtb %xmm3, %xmm2, %xmm1
152; AVX12-NEXT:    vpand %xmm1, %xmm0, %xmm0
153; AVX12-NEXT:    vpmovmskb %xmm0, %eax
154; AVX12-NEXT:    # kill: def $ax killed $ax killed $eax
155; AVX12-NEXT:    retq
156;
157; AVX512F-LABEL: v16i8:
158; AVX512F:       # %bb.0:
159; AVX512F-NEXT:    vpcmpgtb %xmm1, %xmm0, %xmm0
160; AVX512F-NEXT:    vpcmpgtb %xmm3, %xmm2, %xmm1
161; AVX512F-NEXT:    vpand %xmm1, %xmm0, %xmm0
162; AVX512F-NEXT:    vpmovmskb %xmm0, %eax
163; AVX512F-NEXT:    # kill: def $ax killed $ax killed $eax
164; AVX512F-NEXT:    retq
165;
166; AVX512BW-LABEL: v16i8:
167; AVX512BW:       # %bb.0:
168; AVX512BW-NEXT:    vpcmpgtb %xmm1, %xmm0, %k1
169; AVX512BW-NEXT:    vpcmpgtb %xmm3, %xmm2, %k0 {%k1}
170; AVX512BW-NEXT:    kmovd %k0, %eax
171; AVX512BW-NEXT:    # kill: def $ax killed $ax killed $eax
172; AVX512BW-NEXT:    retq
173  %x0 = icmp sgt <16 x i8> %a, %b
174  %x1 = icmp sgt <16 x i8> %c, %d
175  %y = and <16 x i1> %x0, %x1
176  %res = bitcast <16 x i1> %y to i16
177  ret i16 %res
178}
179
180define i2 @v2i8(<2 x i8> %a, <2 x i8> %b, <2 x i8> %c, <2 x i8> %d) {
181; SSE2-LABEL: v2i8:
182; SSE2:       # %bb.0:
183; SSE2-NEXT:    pcmpgtb %xmm1, %xmm0
184; SSE2-NEXT:    pcmpgtb %xmm3, %xmm2
185; SSE2-NEXT:    pand %xmm0, %xmm2
186; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
187; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm2[0,0,1,1,4,5,6,7]
188; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
189; SSE2-NEXT:    movmskpd %xmm0, %eax
190; SSE2-NEXT:    # kill: def $al killed $al killed $eax
191; SSE2-NEXT:    retq
192;
193; SSSE3-LABEL: v2i8:
194; SSSE3:       # %bb.0:
195; SSSE3-NEXT:    pcmpgtb %xmm1, %xmm0
196; SSSE3-NEXT:    pcmpgtb %xmm3, %xmm2
197; SSSE3-NEXT:    pand %xmm0, %xmm2
198; SSSE3-NEXT:    pshufb {{.*#+}} xmm2 = xmm2[u,u,u,u,u,u,u,0,u,u,u,u,u,u,u,1]
199; SSSE3-NEXT:    movmskpd %xmm2, %eax
200; SSSE3-NEXT:    # kill: def $al killed $al killed $eax
201; SSSE3-NEXT:    retq
202;
203; AVX12-LABEL: v2i8:
204; AVX12:       # %bb.0:
205; AVX12-NEXT:    vpcmpgtb %xmm1, %xmm0, %xmm0
206; AVX12-NEXT:    vpcmpgtb %xmm3, %xmm2, %xmm1
207; AVX12-NEXT:    vpand %xmm1, %xmm0, %xmm0
208; AVX12-NEXT:    vpmovsxbq %xmm0, %xmm0
209; AVX12-NEXT:    vmovmskpd %xmm0, %eax
210; AVX12-NEXT:    # kill: def $al killed $al killed $eax
211; AVX12-NEXT:    retq
212;
213; AVX512F-LABEL: v2i8:
214; AVX512F:       # %bb.0:
215; AVX512F-NEXT:    vpcmpgtb %xmm1, %xmm0, %xmm0
216; AVX512F-NEXT:    vpmovsxbd %xmm0, %zmm0
217; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k0
218; AVX512F-NEXT:    vpcmpgtb %xmm3, %xmm2, %xmm0
219; AVX512F-NEXT:    vpmovsxbd %xmm0, %zmm0
220; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k1
221; AVX512F-NEXT:    kandw %k1, %k0, %k0
222; AVX512F-NEXT:    kmovw %k0, %eax
223; AVX512F-NEXT:    # kill: def $al killed $al killed $eax
224; AVX512F-NEXT:    vzeroupper
225; AVX512F-NEXT:    retq
226;
227; AVX512BW-LABEL: v2i8:
228; AVX512BW:       # %bb.0:
229; AVX512BW-NEXT:    vpcmpgtb %xmm1, %xmm0, %k0
230; AVX512BW-NEXT:    vpcmpgtb %xmm3, %xmm2, %k1
231; AVX512BW-NEXT:    kandw %k1, %k0, %k0
232; AVX512BW-NEXT:    kmovd %k0, %eax
233; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
234; AVX512BW-NEXT:    retq
235  %x0 = icmp sgt <2 x i8> %a, %b
236  %x1 = icmp sgt <2 x i8> %c, %d
237  %y = and <2 x i1> %x0, %x1
238  %res = bitcast <2 x i1> %y to i2
239  ret i2 %res
240}
241
242define i2 @v2i16(<2 x i16> %a, <2 x i16> %b, <2 x i16> %c, <2 x i16> %d) {
243; SSE2-SSSE3-LABEL: v2i16:
244; SSE2-SSSE3:       # %bb.0:
245; SSE2-SSSE3-NEXT:    pcmpgtw %xmm1, %xmm0
246; SSE2-SSSE3-NEXT:    pcmpgtw %xmm3, %xmm2
247; SSE2-SSSE3-NEXT:    pand %xmm0, %xmm2
248; SSE2-SSSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm2[0,0,1,1,4,5,6,7]
249; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
250; SSE2-SSSE3-NEXT:    movmskpd %xmm0, %eax
251; SSE2-SSSE3-NEXT:    # kill: def $al killed $al killed $eax
252; SSE2-SSSE3-NEXT:    retq
253;
254; AVX12-LABEL: v2i16:
255; AVX12:       # %bb.0:
256; AVX12-NEXT:    vpcmpgtw %xmm1, %xmm0, %xmm0
257; AVX12-NEXT:    vpcmpgtw %xmm3, %xmm2, %xmm1
258; AVX12-NEXT:    vpand %xmm1, %xmm0, %xmm0
259; AVX12-NEXT:    vpmovsxwq %xmm0, %xmm0
260; AVX12-NEXT:    vmovmskpd %xmm0, %eax
261; AVX12-NEXT:    # kill: def $al killed $al killed $eax
262; AVX12-NEXT:    retq
263;
264; AVX512F-LABEL: v2i16:
265; AVX512F:       # %bb.0:
266; AVX512F-NEXT:    vpcmpgtw %xmm1, %xmm0, %xmm0
267; AVX512F-NEXT:    vpmovsxwd %xmm0, %ymm0
268; AVX512F-NEXT:    vptestmd %ymm0, %ymm0, %k0
269; AVX512F-NEXT:    vpcmpgtw %xmm3, %xmm2, %xmm0
270; AVX512F-NEXT:    vpmovsxwd %xmm0, %ymm0
271; AVX512F-NEXT:    vptestmd %ymm0, %ymm0, %k1
272; AVX512F-NEXT:    kandw %k1, %k0, %k0
273; AVX512F-NEXT:    kmovw %k0, %eax
274; AVX512F-NEXT:    # kill: def $al killed $al killed $eax
275; AVX512F-NEXT:    vzeroupper
276; AVX512F-NEXT:    retq
277;
278; AVX512BW-LABEL: v2i16:
279; AVX512BW:       # %bb.0:
280; AVX512BW-NEXT:    vpcmpgtw %xmm1, %xmm0, %k0
281; AVX512BW-NEXT:    vpcmpgtw %xmm3, %xmm2, %k1
282; AVX512BW-NEXT:    kandw %k1, %k0, %k0
283; AVX512BW-NEXT:    kmovd %k0, %eax
284; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
285; AVX512BW-NEXT:    retq
286  %x0 = icmp sgt <2 x i16> %a, %b
287  %x1 = icmp sgt <2 x i16> %c, %d
288  %y = and <2 x i1> %x0, %x1
289  %res = bitcast <2 x i1> %y to i2
290  ret i2 %res
291}
292
293define i2 @v2i32(<2 x i32> %a, <2 x i32> %b, <2 x i32> %c, <2 x i32> %d) {
294; SSE2-SSSE3-LABEL: v2i32:
295; SSE2-SSSE3:       # %bb.0:
296; SSE2-SSSE3-NEXT:    pcmpgtd %xmm1, %xmm0
297; SSE2-SSSE3-NEXT:    pcmpgtd %xmm3, %xmm2
298; SSE2-SSSE3-NEXT:    pand %xmm0, %xmm2
299; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,0,1,1]
300; SSE2-SSSE3-NEXT:    movmskpd %xmm0, %eax
301; SSE2-SSSE3-NEXT:    # kill: def $al killed $al killed $eax
302; SSE2-SSSE3-NEXT:    retq
303;
304; AVX12-LABEL: v2i32:
305; AVX12:       # %bb.0:
306; AVX12-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm0
307; AVX12-NEXT:    vpcmpgtd %xmm3, %xmm2, %xmm1
308; AVX12-NEXT:    vpand %xmm1, %xmm0, %xmm0
309; AVX12-NEXT:    vpmovsxdq %xmm0, %xmm0
310; AVX12-NEXT:    vmovmskpd %xmm0, %eax
311; AVX12-NEXT:    # kill: def $al killed $al killed $eax
312; AVX12-NEXT:    retq
313;
314; AVX512F-LABEL: v2i32:
315; AVX512F:       # %bb.0:
316; AVX512F-NEXT:    vpcmpgtd %xmm1, %xmm0, %k0
317; AVX512F-NEXT:    vpcmpgtd %xmm3, %xmm2, %k1
318; AVX512F-NEXT:    kandw %k1, %k0, %k0
319; AVX512F-NEXT:    kmovw %k0, %eax
320; AVX512F-NEXT:    # kill: def $al killed $al killed $eax
321; AVX512F-NEXT:    retq
322;
323; AVX512BW-LABEL: v2i32:
324; AVX512BW:       # %bb.0:
325; AVX512BW-NEXT:    vpcmpgtd %xmm1, %xmm0, %k0
326; AVX512BW-NEXT:    vpcmpgtd %xmm3, %xmm2, %k1
327; AVX512BW-NEXT:    kandw %k1, %k0, %k0
328; AVX512BW-NEXT:    kmovd %k0, %eax
329; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
330; AVX512BW-NEXT:    retq
331  %x0 = icmp sgt <2 x i32> %a, %b
332  %x1 = icmp sgt <2 x i32> %c, %d
333  %y = and <2 x i1> %x0, %x1
334  %res = bitcast <2 x i1> %y to i2
335  ret i2 %res
336}
337
338define i2 @v2i64(<2 x i64> %a, <2 x i64> %b, <2 x i64> %c, <2 x i64> %d) {
339; SSE2-SSSE3-LABEL: v2i64:
340; SSE2-SSSE3:       # %bb.0:
341; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648]
342; SSE2-SSSE3-NEXT:    pxor %xmm4, %xmm1
343; SSE2-SSSE3-NEXT:    pxor %xmm4, %xmm0
344; SSE2-SSSE3-NEXT:    movdqa %xmm0, %xmm5
345; SSE2-SSSE3-NEXT:    pcmpeqd %xmm1, %xmm5
346; SSE2-SSSE3-NEXT:    pcmpgtd %xmm1, %xmm0
347; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,0,2,2]
348; SSE2-SSSE3-NEXT:    pand %xmm5, %xmm1
349; SSE2-SSSE3-NEXT:    por %xmm0, %xmm1
350; SSE2-SSSE3-NEXT:    pxor %xmm4, %xmm3
351; SSE2-SSSE3-NEXT:    pxor %xmm4, %xmm2
352; SSE2-SSSE3-NEXT:    movdqa %xmm2, %xmm0
353; SSE2-SSSE3-NEXT:    pcmpeqd %xmm3, %xmm0
354; SSE2-SSSE3-NEXT:    pcmpgtd %xmm3, %xmm2
355; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
356; SSE2-SSSE3-NEXT:    pand %xmm0, %xmm3
357; SSE2-SSSE3-NEXT:    por %xmm2, %xmm3
358; SSE2-SSSE3-NEXT:    pand %xmm1, %xmm3
359; SSE2-SSSE3-NEXT:    movmskpd %xmm3, %eax
360; SSE2-SSSE3-NEXT:    # kill: def $al killed $al killed $eax
361; SSE2-SSSE3-NEXT:    retq
362;
363; AVX12-LABEL: v2i64:
364; AVX12:       # %bb.0:
365; AVX12-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0
366; AVX12-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm1
367; AVX12-NEXT:    vpand %xmm1, %xmm0, %xmm0
368; AVX12-NEXT:    vmovmskpd %xmm0, %eax
369; AVX12-NEXT:    # kill: def $al killed $al killed $eax
370; AVX12-NEXT:    retq
371;
372; AVX512F-LABEL: v2i64:
373; AVX512F:       # %bb.0:
374; AVX512F-NEXT:    vpcmpgtq %xmm1, %xmm0, %k1
375; AVX512F-NEXT:    vpcmpgtq %xmm3, %xmm2, %k0 {%k1}
376; AVX512F-NEXT:    kmovw %k0, %eax
377; AVX512F-NEXT:    # kill: def $al killed $al killed $eax
378; AVX512F-NEXT:    retq
379;
380; AVX512BW-LABEL: v2i64:
381; AVX512BW:       # %bb.0:
382; AVX512BW-NEXT:    vpcmpgtq %xmm1, %xmm0, %k1
383; AVX512BW-NEXT:    vpcmpgtq %xmm3, %xmm2, %k0 {%k1}
384; AVX512BW-NEXT:    kmovd %k0, %eax
385; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
386; AVX512BW-NEXT:    retq
387  %x0 = icmp sgt <2 x i64> %a, %b
388  %x1 = icmp sgt <2 x i64> %c, %d
389  %y = and <2 x i1> %x0, %x1
390  %res = bitcast <2 x i1> %y to i2
391  ret i2 %res
392}
393
394define i2 @v2f64(<2 x double> %a, <2 x double> %b, <2 x double> %c, <2 x double> %d) {
395; SSE2-SSSE3-LABEL: v2f64:
396; SSE2-SSSE3:       # %bb.0:
397; SSE2-SSSE3-NEXT:    cmpltpd %xmm0, %xmm1
398; SSE2-SSSE3-NEXT:    cmpltpd %xmm2, %xmm3
399; SSE2-SSSE3-NEXT:    andpd %xmm1, %xmm3
400; SSE2-SSSE3-NEXT:    movmskpd %xmm3, %eax
401; SSE2-SSSE3-NEXT:    # kill: def $al killed $al killed $eax
402; SSE2-SSSE3-NEXT:    retq
403;
404; AVX12-LABEL: v2f64:
405; AVX12:       # %bb.0:
406; AVX12-NEXT:    vcmpltpd %xmm0, %xmm1, %xmm0
407; AVX12-NEXT:    vcmpltpd %xmm2, %xmm3, %xmm1
408; AVX12-NEXT:    vandpd %xmm1, %xmm0, %xmm0
409; AVX12-NEXT:    vmovmskpd %xmm0, %eax
410; AVX12-NEXT:    # kill: def $al killed $al killed $eax
411; AVX12-NEXT:    retq
412;
413; AVX512F-LABEL: v2f64:
414; AVX512F:       # %bb.0:
415; AVX512F-NEXT:    vcmpltpd %xmm0, %xmm1, %k1
416; AVX512F-NEXT:    vcmpltpd %xmm2, %xmm3, %k0 {%k1}
417; AVX512F-NEXT:    kmovw %k0, %eax
418; AVX512F-NEXT:    # kill: def $al killed $al killed $eax
419; AVX512F-NEXT:    retq
420;
421; AVX512BW-LABEL: v2f64:
422; AVX512BW:       # %bb.0:
423; AVX512BW-NEXT:    vcmpltpd %xmm0, %xmm1, %k1
424; AVX512BW-NEXT:    vcmpltpd %xmm2, %xmm3, %k0 {%k1}
425; AVX512BW-NEXT:    kmovd %k0, %eax
426; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
427; AVX512BW-NEXT:    retq
428  %x0 = fcmp ogt <2 x double> %a, %b
429  %x1 = fcmp ogt <2 x double> %c, %d
430  %y = and <2 x i1> %x0, %x1
431  %res = bitcast <2 x i1> %y to i2
432  ret i2 %res
433}
434
435define i4 @v4i8(<4 x i8> %a, <4 x i8> %b, <4 x i8> %c, <4 x i8> %d) {
436; SSE2-SSSE3-LABEL: v4i8:
437; SSE2-SSSE3:       # %bb.0:
438; SSE2-SSSE3-NEXT:    pcmpgtb %xmm1, %xmm0
439; SSE2-SSSE3-NEXT:    pcmpgtb %xmm3, %xmm2
440; SSE2-SSSE3-NEXT:    pand %xmm0, %xmm2
441; SSE2-SSSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
442; SSE2-SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]
443; SSE2-SSSE3-NEXT:    movmskps %xmm2, %eax
444; SSE2-SSSE3-NEXT:    # kill: def $al killed $al killed $eax
445; SSE2-SSSE3-NEXT:    retq
446;
447; AVX12-LABEL: v4i8:
448; AVX12:       # %bb.0:
449; AVX12-NEXT:    vpcmpgtb %xmm1, %xmm0, %xmm0
450; AVX12-NEXT:    vpcmpgtb %xmm3, %xmm2, %xmm1
451; AVX12-NEXT:    vpand %xmm1, %xmm0, %xmm0
452; AVX12-NEXT:    vpmovsxbd %xmm0, %xmm0
453; AVX12-NEXT:    vmovmskps %xmm0, %eax
454; AVX12-NEXT:    # kill: def $al killed $al killed $eax
455; AVX12-NEXT:    retq
456;
457; AVX512F-LABEL: v4i8:
458; AVX512F:       # %bb.0:
459; AVX512F-NEXT:    vpcmpgtb %xmm1, %xmm0, %xmm0
460; AVX512F-NEXT:    vpmovsxbd %xmm0, %zmm0
461; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k0
462; AVX512F-NEXT:    vpcmpgtb %xmm3, %xmm2, %xmm0
463; AVX512F-NEXT:    vpmovsxbd %xmm0, %zmm0
464; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k1
465; AVX512F-NEXT:    kandw %k1, %k0, %k0
466; AVX512F-NEXT:    kmovw %k0, %eax
467; AVX512F-NEXT:    # kill: def $al killed $al killed $eax
468; AVX512F-NEXT:    vzeroupper
469; AVX512F-NEXT:    retq
470;
471; AVX512BW-LABEL: v4i8:
472; AVX512BW:       # %bb.0:
473; AVX512BW-NEXT:    vpcmpgtb %xmm1, %xmm0, %k0
474; AVX512BW-NEXT:    vpcmpgtb %xmm3, %xmm2, %k1
475; AVX512BW-NEXT:    kandw %k1, %k0, %k0
476; AVX512BW-NEXT:    kmovd %k0, %eax
477; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
478; AVX512BW-NEXT:    retq
479  %x0 = icmp sgt <4 x i8> %a, %b
480  %x1 = icmp sgt <4 x i8> %c, %d
481  %y = and <4 x i1> %x0, %x1
482  %res = bitcast <4 x i1> %y to i4
483  ret i4 %res
484}
485
486define i4 @v4i16(<4 x i16> %a, <4 x i16> %b, <4 x i16> %c, <4 x i16> %d) {
487; SSE2-SSSE3-LABEL: v4i16:
488; SSE2-SSSE3:       # %bb.0:
489; SSE2-SSSE3-NEXT:    pcmpgtw %xmm1, %xmm0
490; SSE2-SSSE3-NEXT:    pcmpgtw %xmm3, %xmm2
491; SSE2-SSSE3-NEXT:    pand %xmm0, %xmm2
492; SSE2-SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]
493; SSE2-SSSE3-NEXT:    movmskps %xmm2, %eax
494; SSE2-SSSE3-NEXT:    # kill: def $al killed $al killed $eax
495; SSE2-SSSE3-NEXT:    retq
496;
497; AVX12-LABEL: v4i16:
498; AVX12:       # %bb.0:
499; AVX12-NEXT:    vpcmpgtw %xmm1, %xmm0, %xmm0
500; AVX12-NEXT:    vpcmpgtw %xmm3, %xmm2, %xmm1
501; AVX12-NEXT:    vpand %xmm1, %xmm0, %xmm0
502; AVX12-NEXT:    vpmovsxwd %xmm0, %xmm0
503; AVX12-NEXT:    vmovmskps %xmm0, %eax
504; AVX12-NEXT:    # kill: def $al killed $al killed $eax
505; AVX12-NEXT:    retq
506;
507; AVX512F-LABEL: v4i16:
508; AVX512F:       # %bb.0:
509; AVX512F-NEXT:    vpcmpgtw %xmm1, %xmm0, %xmm0
510; AVX512F-NEXT:    vpmovsxwd %xmm0, %ymm0
511; AVX512F-NEXT:    vptestmd %ymm0, %ymm0, %k0
512; AVX512F-NEXT:    vpcmpgtw %xmm3, %xmm2, %xmm0
513; AVX512F-NEXT:    vpmovsxwd %xmm0, %ymm0
514; AVX512F-NEXT:    vptestmd %ymm0, %ymm0, %k1
515; AVX512F-NEXT:    kandw %k1, %k0, %k0
516; AVX512F-NEXT:    kmovw %k0, %eax
517; AVX512F-NEXT:    # kill: def $al killed $al killed $eax
518; AVX512F-NEXT:    vzeroupper
519; AVX512F-NEXT:    retq
520;
521; AVX512BW-LABEL: v4i16:
522; AVX512BW:       # %bb.0:
523; AVX512BW-NEXT:    vpcmpgtw %xmm1, %xmm0, %k0
524; AVX512BW-NEXT:    vpcmpgtw %xmm3, %xmm2, %k1
525; AVX512BW-NEXT:    kandw %k1, %k0, %k0
526; AVX512BW-NEXT:    kmovd %k0, %eax
527; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
528; AVX512BW-NEXT:    retq
529  %x0 = icmp sgt <4 x i16> %a, %b
530  %x1 = icmp sgt <4 x i16> %c, %d
531  %y = and <4 x i1> %x0, %x1
532  %res = bitcast <4 x i1> %y to i4
533  ret i4 %res
534}
535
536define i8 @v8i8(<8 x i8> %a, <8 x i8> %b, <8 x i8> %c, <8 x i8> %d) {
537; SSE2-SSSE3-LABEL: v8i8:
538; SSE2-SSSE3:       # %bb.0:
539; SSE2-SSSE3-NEXT:    pcmpgtb %xmm1, %xmm0
540; SSE2-SSSE3-NEXT:    pcmpgtb %xmm3, %xmm2
541; SSE2-SSSE3-NEXT:    pand %xmm0, %xmm2
542; SSE2-SSSE3-NEXT:    pmovmskb %xmm2, %eax
543; SSE2-SSSE3-NEXT:    # kill: def $al killed $al killed $eax
544; SSE2-SSSE3-NEXT:    retq
545;
546; AVX12-LABEL: v8i8:
547; AVX12:       # %bb.0:
548; AVX12-NEXT:    vpcmpgtb %xmm1, %xmm0, %xmm0
549; AVX12-NEXT:    vpcmpgtb %xmm3, %xmm2, %xmm1
550; AVX12-NEXT:    vpand %xmm1, %xmm0, %xmm0
551; AVX12-NEXT:    vpmovmskb %xmm0, %eax
552; AVX12-NEXT:    # kill: def $al killed $al killed $eax
553; AVX12-NEXT:    retq
554;
555; AVX512F-LABEL: v8i8:
556; AVX512F:       # %bb.0:
557; AVX512F-NEXT:    vpcmpgtb %xmm1, %xmm0, %xmm0
558; AVX512F-NEXT:    vpmovsxbd %xmm0, %zmm0
559; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k0
560; AVX512F-NEXT:    vpcmpgtb %xmm3, %xmm2, %xmm0
561; AVX512F-NEXT:    vpmovsxbd %xmm0, %zmm0
562; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k1
563; AVX512F-NEXT:    kandw %k1, %k0, %k0
564; AVX512F-NEXT:    kmovw %k0, %eax
565; AVX512F-NEXT:    # kill: def $al killed $al killed $eax
566; AVX512F-NEXT:    vzeroupper
567; AVX512F-NEXT:    retq
568;
569; AVX512BW-LABEL: v8i8:
570; AVX512BW:       # %bb.0:
571; AVX512BW-NEXT:    vpcmpgtb %xmm1, %xmm0, %k0
572; AVX512BW-NEXT:    vpcmpgtb %xmm3, %xmm2, %k1
573; AVX512BW-NEXT:    kandw %k1, %k0, %k0
574; AVX512BW-NEXT:    kmovd %k0, %eax
575; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
576; AVX512BW-NEXT:    retq
577  %x0 = icmp sgt <8 x i8> %a, %b
578  %x1 = icmp sgt <8 x i8> %c, %d
579  %y = and <8 x i1> %x0, %x1
580  %res = bitcast <8 x i1> %y to i8
581  ret i8 %res
582}
583