blob: 5728aead4aa9f60cd776050aa59d2454194472c8 [file] [log] [blame]
Zvi Rackoverc20c6d02017-05-18 07:04:48 +00001; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
Simon Pilgrim0fee3372017-07-06 18:27:34 +00002; 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-prefixes=AVX12,AVX1
5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX12,AVX2
6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl,+avx512bw | FileCheck %s --check-prefix=AVX512
Zvi Rackoverc20c6d02017-05-18 07:04:48 +00007
8define i16 @v16i16(<16 x i16> %a, <16 x i16> %b) {
Simon Pilgrim0fee3372017-07-06 18:27:34 +00009; SSE2-SSSE3-LABEL: v16i16:
10; SSE2-SSSE3: # BB#0:
11; SSE2-SSSE3-NEXT: pcmpgtw %xmm3, %xmm1
12; SSE2-SSSE3-NEXT: pcmpgtw %xmm2, %xmm0
13; SSE2-SSSE3-NEXT: packsswb %xmm1, %xmm0
14; SSE2-SSSE3-NEXT: pmovmskb %xmm0, %eax
15; SSE2-SSSE3-NEXT: # kill: %AX<def> %AX<kill> %EAX<kill>
16; SSE2-SSSE3-NEXT: retq
17;
18; AVX1-LABEL: v16i16:
19; AVX1: # BB#0:
20; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
21; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
22; AVX1-NEXT: vpcmpgtw %xmm2, %xmm3, %xmm2
23; AVX1-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm0
24; AVX1-NEXT: vpacksswb %xmm2, %xmm0, %xmm0
25; AVX1-NEXT: vpmovmskb %xmm0, %eax
26; AVX1-NEXT: # kill: %AX<def> %AX<kill> %EAX<kill>
27; AVX1-NEXT: vzeroupper
28; AVX1-NEXT: retq
29;
Zvi Rackoverc20c6d02017-05-18 07:04:48 +000030; AVX2-LABEL: v16i16:
Simon Pilgrim0fee3372017-07-06 18:27:34 +000031; AVX2: # BB#0:
Zvi Rackoverc20c6d02017-05-18 07:04:48 +000032; AVX2-NEXT: vpcmpgtw %ymm1, %ymm0, %ymm0
33; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
34; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm0
Zvi Rackover76937332017-06-01 11:27:57 +000035; AVX2-NEXT: vpmovmskb %xmm0, %eax
Simon Pilgrim0fee3372017-07-06 18:27:34 +000036; AVX2-NEXT: # kill: %AX<def> %AX<kill> %EAX<kill>
Zvi Rackoverc20c6d02017-05-18 07:04:48 +000037; AVX2-NEXT: vzeroupper
38; AVX2-NEXT: retq
39;
40; AVX512-LABEL: v16i16:
Simon Pilgrim0fee3372017-07-06 18:27:34 +000041; AVX512: # BB#0:
Zvi Rackoverc20c6d02017-05-18 07:04:48 +000042; AVX512-NEXT: vpcmpgtw %ymm1, %ymm0, %k0
43; AVX512-NEXT: kmovd %k0, %eax
Simon Pilgrim0fee3372017-07-06 18:27:34 +000044; AVX512-NEXT: # kill: %AX<def> %AX<kill> %EAX<kill>
Zvi Rackoverc20c6d02017-05-18 07:04:48 +000045; AVX512-NEXT: vzeroupper
46; AVX512-NEXT: retq
47 %x = icmp sgt <16 x i16> %a, %b
48 %res = bitcast <16 x i1> %x to i16
49 ret i16 %res
50}
51
52define i8 @v8i32(<8 x i32> %a, <8 x i32> %b) {
Simon Pilgrim321e54f2017-10-23 22:05:02 +000053; SSE2-SSSE3-LABEL: v8i32:
54; SSE2-SSSE3: # BB#0:
55; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm1
56; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm0
57; SSE2-SSSE3-NEXT: packsswb %xmm1, %xmm0
58; SSE2-SSSE3-NEXT: packsswb %xmm0, %xmm0
59; SSE2-SSSE3-NEXT: pmovmskb %xmm0, %eax
60; SSE2-SSSE3-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill>
61; SSE2-SSSE3-NEXT: retq
Simon Pilgrim0fee3372017-07-06 18:27:34 +000062;
63; AVX1-LABEL: v8i32:
64; AVX1: # BB#0:
65; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
66; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
67; AVX1-NEXT: vpcmpgtd %xmm2, %xmm3, %xmm2
68; AVX1-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0
Simon Pilgrim4aa28b92017-09-18 17:58:31 +000069; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
70; AVX1-NEXT: vmovmskps %ymm0, %eax
Simon Pilgrim0fee3372017-07-06 18:27:34 +000071; AVX1-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill>
72; AVX1-NEXT: vzeroupper
73; AVX1-NEXT: retq
74;
Zvi Rackoverc20c6d02017-05-18 07:04:48 +000075; AVX2-LABEL: v8i32:
Simon Pilgrim0fee3372017-07-06 18:27:34 +000076; AVX2: # BB#0:
Zvi Rackoverc20c6d02017-05-18 07:04:48 +000077; AVX2-NEXT: vpcmpgtd %ymm1, %ymm0, %ymm0
Zvi Rackover76937332017-06-01 11:27:57 +000078; AVX2-NEXT: vmovmskps %ymm0, %eax
Simon Pilgrim0fee3372017-07-06 18:27:34 +000079; AVX2-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill>
Zvi Rackoverc20c6d02017-05-18 07:04:48 +000080; AVX2-NEXT: vzeroupper
81; AVX2-NEXT: retq
82;
83; AVX512-LABEL: v8i32:
Simon Pilgrim0fee3372017-07-06 18:27:34 +000084; AVX512: # BB#0:
Zvi Rackoverc20c6d02017-05-18 07:04:48 +000085; AVX512-NEXT: vpcmpgtd %ymm1, %ymm0, %k0
86; AVX512-NEXT: kmovd %k0, %eax
Simon Pilgrim0fee3372017-07-06 18:27:34 +000087; AVX512-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill>
Zvi Rackoverc20c6d02017-05-18 07:04:48 +000088; AVX512-NEXT: vzeroupper
89; AVX512-NEXT: retq
90 %x = icmp sgt <8 x i32> %a, %b
91 %res = bitcast <8 x i1> %x to i8
92 ret i8 %res
93}
94
95define i8 @v8f32(<8 x float> %a, <8 x float> %b) {
Simon Pilgrim321e54f2017-10-23 22:05:02 +000096; SSE2-SSSE3-LABEL: v8f32:
97; SSE2-SSSE3: # BB#0:
98; SSE2-SSSE3-NEXT: cmpltps %xmm1, %xmm3
99; SSE2-SSSE3-NEXT: cmpltps %xmm0, %xmm2
100; SSE2-SSSE3-NEXT: packsswb %xmm3, %xmm2
101; SSE2-SSSE3-NEXT: packsswb %xmm0, %xmm2
102; SSE2-SSSE3-NEXT: pmovmskb %xmm2, %eax
103; SSE2-SSSE3-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill>
104; SSE2-SSSE3-NEXT: retq
Simon Pilgrim0fee3372017-07-06 18:27:34 +0000105;
Simon Pilgrim4aa28b92017-09-18 17:58:31 +0000106; AVX12-LABEL: v8f32:
107; AVX12: # BB#0:
108; AVX12-NEXT: vcmpltps %ymm0, %ymm1, %ymm0
109; AVX12-NEXT: vmovmskps %ymm0, %eax
110; AVX12-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill>
111; AVX12-NEXT: vzeroupper
112; AVX12-NEXT: retq
Zvi Rackoverc20c6d02017-05-18 07:04:48 +0000113;
114; AVX512-LABEL: v8f32:
Simon Pilgrim0fee3372017-07-06 18:27:34 +0000115; AVX512: # BB#0:
Zvi Rackoverc20c6d02017-05-18 07:04:48 +0000116; AVX512-NEXT: vcmpltps %ymm0, %ymm1, %k0
117; AVX512-NEXT: kmovd %k0, %eax
Simon Pilgrim0fee3372017-07-06 18:27:34 +0000118; AVX512-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill>
Zvi Rackoverc20c6d02017-05-18 07:04:48 +0000119; AVX512-NEXT: vzeroupper
120; AVX512-NEXT: retq
121 %x = fcmp ogt <8 x float> %a, %b
122 %res = bitcast <8 x i1> %x to i8
123 ret i8 %res
124}
125
126define i32 @v32i8(<32 x i8> %a, <32 x i8> %b) {
Simon Pilgrim0fee3372017-07-06 18:27:34 +0000127; SSE2-SSSE3-LABEL: v32i8:
128; SSE2-SSSE3: # BB#0:
Simon Pilgrim0fee3372017-07-06 18:27:34 +0000129; SSE2-SSSE3-NEXT: pcmpgtb %xmm2, %xmm0
Simon Pilgrim32c377a2017-07-21 09:58:50 +0000130; SSE2-SSSE3-NEXT: pmovmskb %xmm0, %ecx
131; SSE2-SSSE3-NEXT: pcmpgtb %xmm3, %xmm1
132; SSE2-SSSE3-NEXT: pmovmskb %xmm1, %eax
133; SSE2-SSSE3-NEXT: shll $16, %eax
Simon Pilgrim0fee3372017-07-06 18:27:34 +0000134; SSE2-SSSE3-NEXT: orl %ecx, %eax
135; SSE2-SSSE3-NEXT: retq
136;
137; AVX1-LABEL: v32i8:
138; AVX1: # BB#0:
Simon Pilgrim32c377a2017-07-21 09:58:50 +0000139; AVX1-NEXT: vpcmpgtb %xmm1, %xmm0, %xmm2
140; AVX1-NEXT: vpmovmskb %xmm2, %ecx
141; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
142; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
Simon Pilgrim0fee3372017-07-06 18:27:34 +0000143; AVX1-NEXT: vpcmpgtb %xmm1, %xmm0, %xmm0
Simon Pilgrim32c377a2017-07-21 09:58:50 +0000144; AVX1-NEXT: vpmovmskb %xmm0, %eax
145; AVX1-NEXT: shll $16, %eax
146; AVX1-NEXT: orl %ecx, %eax
Simon Pilgrim0fee3372017-07-06 18:27:34 +0000147; AVX1-NEXT: vzeroupper
148; AVX1-NEXT: retq
149;
Zvi Rackoverc20c6d02017-05-18 07:04:48 +0000150; AVX2-LABEL: v32i8:
Simon Pilgrim0fee3372017-07-06 18:27:34 +0000151; AVX2: # BB#0:
Zvi Rackoverc20c6d02017-05-18 07:04:48 +0000152; AVX2-NEXT: vpcmpgtb %ymm1, %ymm0, %ymm0
Zvi Rackover76937332017-06-01 11:27:57 +0000153; AVX2-NEXT: vpmovmskb %ymm0, %eax
Zvi Rackoverc20c6d02017-05-18 07:04:48 +0000154; AVX2-NEXT: vzeroupper
155; AVX2-NEXT: retq
156;
157; AVX512-LABEL: v32i8:
Simon Pilgrim0fee3372017-07-06 18:27:34 +0000158; AVX512: # BB#0:
Zvi Rackoverc20c6d02017-05-18 07:04:48 +0000159; AVX512-NEXT: vpcmpgtb %ymm1, %ymm0, %k0
160; AVX512-NEXT: kmovd %k0, %eax
161; AVX512-NEXT: vzeroupper
162; AVX512-NEXT: retq
163 %x = icmp sgt <32 x i8> %a, %b
164 %res = bitcast <32 x i1> %x to i32
165 ret i32 %res
166}
167
168define i4 @v4i64(<4 x i64> %a, <4 x i64> %b) {
Simon Pilgrim0fee3372017-07-06 18:27:34 +0000169; SSE2-SSSE3-LABEL: v4i64:
170; SSE2-SSSE3: # BB#0:
171; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,0,2147483648,0]
172; SSE2-SSSE3-NEXT: pxor %xmm4, %xmm3
173; SSE2-SSSE3-NEXT: pxor %xmm4, %xmm1
174; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm5
175; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm5
176; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
177; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm1
178; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
179; SSE2-SSSE3-NEXT: pand %xmm6, %xmm1
180; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm5[1,1,3,3]
181; SSE2-SSSE3-NEXT: por %xmm1, %xmm3
182; SSE2-SSSE3-NEXT: pxor %xmm4, %xmm2
183; SSE2-SSSE3-NEXT: pxor %xmm4, %xmm0
184; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm1
185; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm1
186; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm1[0,0,2,2]
187; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm0
188; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
189; SSE2-SSSE3-NEXT: pand %xmm4, %xmm0
190; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
191; SSE2-SSSE3-NEXT: por %xmm0, %xmm1
192; SSE2-SSSE3-NEXT: packsswb %xmm3, %xmm1
193; SSE2-SSSE3-NEXT: movmskps %xmm1, %eax
194; SSE2-SSSE3-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill>
195; SSE2-SSSE3-NEXT: retq
196;
197; AVX1-LABEL: v4i64:
198; AVX1: # BB#0:
199; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
200; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
201; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
202; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0
Simon Pilgrim3b0d9e72017-09-27 10:10:17 +0000203; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
204; AVX1-NEXT: vmovmskpd %ymm0, %eax
Simon Pilgrim0fee3372017-07-06 18:27:34 +0000205; AVX1-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill>
206; AVX1-NEXT: vzeroupper
207; AVX1-NEXT: retq
208;
Zvi Rackoverc20c6d02017-05-18 07:04:48 +0000209; AVX2-LABEL: v4i64:
Simon Pilgrim0fee3372017-07-06 18:27:34 +0000210; AVX2: # BB#0:
Zvi Rackoverc20c6d02017-05-18 07:04:48 +0000211; AVX2-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm0
Zvi Rackover76937332017-06-01 11:27:57 +0000212; AVX2-NEXT: vmovmskpd %ymm0, %eax
Simon Pilgrim0fee3372017-07-06 18:27:34 +0000213; AVX2-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill>
Zvi Rackoverc20c6d02017-05-18 07:04:48 +0000214; AVX2-NEXT: vzeroupper
215; AVX2-NEXT: retq
216;
217; AVX512-LABEL: v4i64:
Simon Pilgrim0fee3372017-07-06 18:27:34 +0000218; AVX512: # BB#0:
Zvi Rackoverc20c6d02017-05-18 07:04:48 +0000219; AVX512-NEXT: vpcmpgtq %ymm1, %ymm0, %k0
220; AVX512-NEXT: kmovd %k0, %eax
221; AVX512-NEXT: movb %al, -{{[0-9]+}}(%rsp)
222; AVX512-NEXT: movb -{{[0-9]+}}(%rsp), %al
223; AVX512-NEXT: vzeroupper
224; AVX512-NEXT: retq
225 %x = icmp sgt <4 x i64> %a, %b
226 %res = bitcast <4 x i1> %x to i4
227 ret i4 %res
228}
229
230define i4 @v4f64(<4 x double> %a, <4 x double> %b) {
Simon Pilgrim0fee3372017-07-06 18:27:34 +0000231; SSE2-SSSE3-LABEL: v4f64:
232; SSE2-SSSE3: # BB#0:
233; SSE2-SSSE3-NEXT: cmpltpd %xmm1, %xmm3
234; SSE2-SSSE3-NEXT: cmpltpd %xmm0, %xmm2
235; SSE2-SSSE3-NEXT: packsswb %xmm3, %xmm2
236; SSE2-SSSE3-NEXT: movmskps %xmm2, %eax
237; SSE2-SSSE3-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill>
238; SSE2-SSSE3-NEXT: retq
239;
Simon Pilgrim3b0d9e72017-09-27 10:10:17 +0000240; AVX12-LABEL: v4f64:
241; AVX12: # BB#0:
242; AVX12-NEXT: vcmpltpd %ymm0, %ymm1, %ymm0
243; AVX12-NEXT: vmovmskpd %ymm0, %eax
244; AVX12-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill>
245; AVX12-NEXT: vzeroupper
246; AVX12-NEXT: retq
Zvi Rackoverc20c6d02017-05-18 07:04:48 +0000247;
248; AVX512-LABEL: v4f64:
Simon Pilgrim0fee3372017-07-06 18:27:34 +0000249; AVX512: # BB#0:
Zvi Rackoverc20c6d02017-05-18 07:04:48 +0000250; AVX512-NEXT: vcmpltpd %ymm0, %ymm1, %k0
251; AVX512-NEXT: kmovd %k0, %eax
252; AVX512-NEXT: movb %al, -{{[0-9]+}}(%rsp)
253; AVX512-NEXT: movb -{{[0-9]+}}(%rsp), %al
254; AVX512-NEXT: vzeroupper
255; AVX512-NEXT: retq
256 %x = fcmp ogt <4 x double> %a, %b
257 %res = bitcast <4 x i1> %x to i4
258 ret i4 %res
259}