blob: 9af54b8bbb13aa18304320cf676f2c2691e87975 [file] [log] [blame]
Sanjay Patel7ed93612016-02-26 01:14:27 +00001; 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-prefix=SSE --check-prefix=SSE2
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE42
4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2
6
Sanjay Patel4402a322016-02-26 16:56:03 +00007; Lower common integer comparisons such as 'isPositive' efficiently:
8; https://llvm.org/bugs/show_bug.cgi?id=26701
Sanjay Patel7ed93612016-02-26 01:14:27 +00009
Sanjay Patel4402a322016-02-26 16:56:03 +000010define <16 x i8> @test_pcmpgtb(<16 x i8> %x) {
11; SSE-LABEL: test_pcmpgtb:
Sanjay Patel7ed93612016-02-26 01:14:27 +000012; SSE: # BB#0:
Sanjay Patel4402a322016-02-26 16:56:03 +000013; SSE-NEXT: pcmpeqd %xmm1, %xmm1
14; SSE-NEXT: pcmpgtb %xmm1, %xmm0
Sanjay Patel7ed93612016-02-26 01:14:27 +000015; SSE-NEXT: retq
16;
Sanjay Patel4402a322016-02-26 16:56:03 +000017; AVX-LABEL: test_pcmpgtb:
Sanjay Patel7ed93612016-02-26 01:14:27 +000018; AVX: # BB#0:
Sanjay Patel7ed93612016-02-26 01:14:27 +000019; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
Sanjay Patel4402a322016-02-26 16:56:03 +000020; AVX-NEXT: vpcmpgtb %xmm1, %xmm0, %xmm0
Sanjay Patel7ed93612016-02-26 01:14:27 +000021; AVX-NEXT: retq
22 %sign = ashr <16 x i8> %x, <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>
23 %not = xor <16 x i8> %sign, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
24 ret <16 x i8> %not
25}
26
Sanjay Patel4402a322016-02-26 16:56:03 +000027define <8 x i16> @test_pcmpgtw(<8 x i16> %x) {
28; SSE-LABEL: test_pcmpgtw:
Sanjay Patel7ed93612016-02-26 01:14:27 +000029; SSE: # BB#0:
Sanjay Patel7ed93612016-02-26 01:14:27 +000030; SSE-NEXT: pcmpeqd %xmm1, %xmm1
Sanjay Patel4402a322016-02-26 16:56:03 +000031; SSE-NEXT: pcmpgtw %xmm1, %xmm0
Sanjay Patel7ed93612016-02-26 01:14:27 +000032; SSE-NEXT: retq
33;
Sanjay Patel4402a322016-02-26 16:56:03 +000034; AVX-LABEL: test_pcmpgtw:
Sanjay Patel7ed93612016-02-26 01:14:27 +000035; AVX: # BB#0:
Sanjay Patel7ed93612016-02-26 01:14:27 +000036; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
Sanjay Patel4402a322016-02-26 16:56:03 +000037; AVX-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm0
Sanjay Patel7ed93612016-02-26 01:14:27 +000038; AVX-NEXT: retq
39 %sign = ashr <8 x i16> %x, <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>
40 %not = xor <8 x i16> %sign, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
41 ret <8 x i16> %not
42}
43
Sanjay Patel4402a322016-02-26 16:56:03 +000044define <4 x i32> @test_pcmpgtd(<4 x i32> %x) {
45; SSE-LABEL: test_pcmpgtd:
Sanjay Patel7ed93612016-02-26 01:14:27 +000046; SSE: # BB#0:
Sanjay Patel7ed93612016-02-26 01:14:27 +000047; SSE-NEXT: pcmpeqd %xmm1, %xmm1
Sanjay Patel4402a322016-02-26 16:56:03 +000048; SSE-NEXT: pcmpgtd %xmm1, %xmm0
Sanjay Patel7ed93612016-02-26 01:14:27 +000049; SSE-NEXT: retq
50;
Sanjay Patel4402a322016-02-26 16:56:03 +000051; AVX-LABEL: test_pcmpgtd:
Sanjay Patel7ed93612016-02-26 01:14:27 +000052; AVX: # BB#0:
Sanjay Patel7ed93612016-02-26 01:14:27 +000053; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
Sanjay Patel4402a322016-02-26 16:56:03 +000054; AVX-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0
Sanjay Patel7ed93612016-02-26 01:14:27 +000055; AVX-NEXT: retq
56 %sign = ashr <4 x i32> %x, <i32 31, i32 31, i32 31, i32 31>
57 %not = xor <4 x i32> %sign, <i32 -1, i32 -1, i32 -1, i32 -1>
58 ret <4 x i32> %not
59}
60
Sanjay Patel4402a322016-02-26 16:56:03 +000061define <2 x i64> @test_pcmpgtq(<2 x i64> %x) {
62; SSE2-LABEL: test_pcmpgtq:
63; SSE2: # BB#0:
64; SSE2-NEXT: psrad $31, %xmm0
65; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
66; SSE2-NEXT: pcmpeqd %xmm0, %xmm0
67; SSE2-NEXT: pxor %xmm1, %xmm0
68; SSE2-NEXT: retq
Sanjay Patel7ed93612016-02-26 01:14:27 +000069;
Sanjay Patel4402a322016-02-26 16:56:03 +000070; SSE42-LABEL: test_pcmpgtq:
71; SSE42: # BB#0:
72; SSE42-NEXT: pcmpeqd %xmm1, %xmm1
73; SSE42-NEXT: pcmpgtq %xmm1, %xmm0
74; SSE42-NEXT: retq
75;
76; AVX-LABEL: test_pcmpgtq:
Sanjay Patel7ed93612016-02-26 01:14:27 +000077; AVX: # BB#0:
Sanjay Patel7ed93612016-02-26 01:14:27 +000078; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
Sanjay Patel4402a322016-02-26 16:56:03 +000079; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0
Sanjay Patel7ed93612016-02-26 01:14:27 +000080; AVX-NEXT: retq
81 %sign = ashr <2 x i64> %x, <i64 63, i64 63>
82 %not = xor <2 x i64> %sign, <i64 -1, i64 -1>
83 ret <2 x i64> %not
84}
85
Sanjay Patel4402a322016-02-26 16:56:03 +000086define <1 x i128> @test_strange_type(<1 x i128> %x) {
87; SSE2-LABEL: test_strange_type:
88; SSE2: # BB#0:
89; SSE2-NEXT: sarq $63, %rsi
Sanjay Patel4402a322016-02-26 16:56:03 +000090; SSE2-NEXT: movd %rsi, %xmm0
Simon Pilgrimd3df4002016-03-28 21:33:52 +000091; SSE2-NEXT: notq %rsi
Sanjay Patel4402a322016-02-26 16:56:03 +000092; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
Simon Pilgrimd3df4002016-03-28 21:33:52 +000093; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
94; SSE2-NEXT: pxor %xmm0, %xmm1
95; SSE2-NEXT: movd %xmm1, %rax
Sanjay Patel4402a322016-02-26 16:56:03 +000096; SSE2-NEXT: movq %rsi, %rdx
97; SSE2-NEXT: retq
98;
99; SSE42-LABEL: test_strange_type:
100; SSE42: # BB#0:
101; SSE42-NEXT: sarq $63, %rsi
Sanjay Patel4402a322016-02-26 16:56:03 +0000102; SSE42-NEXT: movd %rsi, %xmm0
103; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
Simon Pilgrimd3df4002016-03-28 21:33:52 +0000104; SSE42-NEXT: pcmpeqd %xmm1, %xmm1
105; SSE42-NEXT: pxor %xmm0, %xmm1
106; SSE42-NEXT: movd %xmm1, %rax
107; SSE42-NEXT: pextrq $1, %xmm1, %rdx
Sanjay Patel4402a322016-02-26 16:56:03 +0000108; SSE42-NEXT: retq
109;
110; AVX1-LABEL: test_strange_type:
111; AVX1: # BB#0:
112; AVX1-NEXT: sarq $63, %rsi
Sanjay Patel4402a322016-02-26 16:56:03 +0000113; AVX1-NEXT: vmovq %rsi, %xmm0
114; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
Simon Pilgrimd3df4002016-03-28 21:33:52 +0000115; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
116; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
Sanjay Patel4402a322016-02-26 16:56:03 +0000117; AVX1-NEXT: vmovq %xmm0, %rax
118; AVX1-NEXT: vpextrq $1, %xmm0, %rdx
119; AVX1-NEXT: retq
120;
121; AVX2-LABEL: test_strange_type:
122; AVX2: # BB#0:
123; AVX2-NEXT: sarq $63, %rsi
Sanjay Patel4402a322016-02-26 16:56:03 +0000124; AVX2-NEXT: vmovq %rsi, %xmm0
125; AVX2-NEXT: vpbroadcastq %xmm0, %xmm0
Simon Pilgrimd3df4002016-03-28 21:33:52 +0000126; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
127; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
Sanjay Patel4402a322016-02-26 16:56:03 +0000128; AVX2-NEXT: vmovq %xmm0, %rax
129; AVX2-NEXT: vpextrq $1, %xmm0, %rdx
130; AVX2-NEXT: retq
131 %sign = ashr <1 x i128> %x, <i128 127>
132 %not = xor <1 x i128> %sign, <i128 -1>
133 ret <1 x i128> %not
134}
135
Sanjay Patel334685b2016-02-26 18:07:58 +0000136define <32 x i8> @test_pcmpgtb_256(<32 x i8> %x) {
137; SSE-LABEL: test_pcmpgtb_256:
138; SSE: # BB#0:
139; SSE-NEXT: pcmpeqd %xmm2, %xmm2
140; SSE-NEXT: pcmpgtb %xmm2, %xmm0
141; SSE-NEXT: pcmpgtb %xmm2, %xmm1
142; SSE-NEXT: retq
143;
144; AVX1-LABEL: test_pcmpgtb_256:
145; AVX1: # BB#0:
146; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
147; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
148; AVX1-NEXT: vpcmpgtb %xmm1, %xmm2, %xmm1
149; AVX1-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm0
150; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
151; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
152; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm1, %ymm1
153; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0
154; AVX1-NEXT: retq
155;
156; AVX2-LABEL: test_pcmpgtb_256:
157; AVX2: # BB#0:
Sanjay Patel334685b2016-02-26 18:07:58 +0000158; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
Sanjay Patel155193c2016-02-26 18:42:50 +0000159; AVX2-NEXT: vpcmpgtb %ymm1, %ymm0, %ymm0
Sanjay Patel334685b2016-02-26 18:07:58 +0000160; AVX2-NEXT: retq
161 %sign = ashr <32 x i8> %x, <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>
162 %not = xor <32 x i8> %sign, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
163 ret <32 x i8> %not
164}
165
166define <16 x i16> @test_pcmpgtw_256(<16 x i16> %x) {
167; SSE-LABEL: test_pcmpgtw_256:
168; SSE: # BB#0:
169; SSE-NEXT: pcmpeqd %xmm2, %xmm2
170; SSE-NEXT: pcmpgtw %xmm2, %xmm0
171; SSE-NEXT: pcmpgtw %xmm2, %xmm1
172; SSE-NEXT: retq
173;
174; AVX1-LABEL: test_pcmpgtw_256:
175; AVX1: # BB#0:
176; AVX1-NEXT: vpsraw $15, %xmm0, %xmm1
177; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
178; AVX1-NEXT: vpsraw $15, %xmm0, %xmm0
179; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
180; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
181; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm1, %ymm1
182; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0
183; AVX1-NEXT: retq
184;
185; AVX2-LABEL: test_pcmpgtw_256:
186; AVX2: # BB#0:
Sanjay Patel334685b2016-02-26 18:07:58 +0000187; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
Sanjay Patel155193c2016-02-26 18:42:50 +0000188; AVX2-NEXT: vpcmpgtw %ymm1, %ymm0, %ymm0
Sanjay Patel334685b2016-02-26 18:07:58 +0000189; AVX2-NEXT: retq
190 %sign = ashr <16 x i16> %x, <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>
191 %not = xor <16 x i16> %sign, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
192 ret <16 x i16> %not
193}
194
195define <8 x i32> @test_pcmpgtd_256(<8 x i32> %x) {
196; SSE-LABEL: test_pcmpgtd_256:
197; SSE: # BB#0:
198; SSE-NEXT: pcmpeqd %xmm2, %xmm2
199; SSE-NEXT: pcmpgtd %xmm2, %xmm0
200; SSE-NEXT: pcmpgtd %xmm2, %xmm1
201; SSE-NEXT: retq
202;
203; AVX1-LABEL: test_pcmpgtd_256:
204; AVX1: # BB#0:
205; AVX1-NEXT: vpsrad $31, %xmm0, %xmm1
206; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
207; AVX1-NEXT: vpsrad $31, %xmm0, %xmm0
208; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
209; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
210; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm1, %ymm1
211; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0
212; AVX1-NEXT: retq
213;
214; AVX2-LABEL: test_pcmpgtd_256:
215; AVX2: # BB#0:
Sanjay Patel334685b2016-02-26 18:07:58 +0000216; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
Sanjay Patel155193c2016-02-26 18:42:50 +0000217; AVX2-NEXT: vpcmpgtd %ymm1, %ymm0, %ymm0
Sanjay Patel334685b2016-02-26 18:07:58 +0000218; AVX2-NEXT: retq
219 %sign = ashr <8 x i32> %x, <i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31>
220 %not = xor <8 x i32> %sign, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>
221 ret <8 x i32> %not
222}
223
224define <4 x i64> @test_pcmpgtq_256(<4 x i64> %x) {
225; SSE2-LABEL: test_pcmpgtq_256:
226; SSE2: # BB#0:
227; SSE2-NEXT: psrad $31, %xmm1
228; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
229; SSE2-NEXT: psrad $31, %xmm0
230; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
231; SSE2-NEXT: pcmpeqd %xmm2, %xmm2
232; SSE2-NEXT: pxor %xmm2, %xmm0
233; SSE2-NEXT: pxor %xmm2, %xmm1
234; SSE2-NEXT: retq
235;
236; SSE42-LABEL: test_pcmpgtq_256:
237; SSE42: # BB#0:
238; SSE42-NEXT: pcmpeqd %xmm2, %xmm2
239; SSE42-NEXT: pcmpgtq %xmm2, %xmm0
240; SSE42-NEXT: pcmpgtq %xmm2, %xmm1
241; SSE42-NEXT: retq
242;
243; AVX1-LABEL: test_pcmpgtq_256:
244; AVX1: # BB#0:
245; AVX1-NEXT: vpsrad $31, %xmm0, %xmm1
246; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
247; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
248; AVX1-NEXT: vpsrad $31, %xmm0, %xmm0
249; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
250; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
251; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
252; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm1, %ymm1
253; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0
254; AVX1-NEXT: retq
255;
256; AVX2-LABEL: test_pcmpgtq_256:
257; AVX2: # BB#0:
Sanjay Patel334685b2016-02-26 18:07:58 +0000258; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
Sanjay Patel155193c2016-02-26 18:42:50 +0000259; AVX2-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm0
Sanjay Patel334685b2016-02-26 18:07:58 +0000260; AVX2-NEXT: retq
261 %sign = ashr <4 x i64> %x, <i64 63, i64 63, i64 63, i64 63>
262 %not = xor <4 x i64> %sign, <i64 -1, i64 -1, i64 -1, i64 -1>
263 ret <4 x i64> %not
264}
265