blob: 1407f71de714ef43547dde4728185044f90b4a2a [file] [log] [blame]
James Y Knight7c905062015-11-23 21:33:58 +00001; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
Simon Pilgrimbdbf8392015-10-10 22:21:05 +00002; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE41
4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.2 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE42
5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx,+xop | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX1
8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+xop | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX2
9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512F
10; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512BW
11
12;
13; Equal
14;
15
16define <2 x i64> @eq_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
17; SSE2-LABEL: eq_v2i64:
18; SSE2: # BB#0:
19; SSE2-NEXT: pcmpeqd %xmm1, %xmm0
20; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]
21; SSE2-NEXT: pand %xmm1, %xmm0
22; SSE2-NEXT: retq
23;
24; SSE41-LABEL: eq_v2i64:
25; SSE41: # BB#0:
26; SSE41-NEXT: pcmpeqq %xmm1, %xmm0
27; SSE41-NEXT: retq
28;
29; SSE42-LABEL: eq_v2i64:
30; SSE42: # BB#0:
31; SSE42-NEXT: pcmpeqq %xmm1, %xmm0
32; SSE42-NEXT: retq
33;
34; AVX-LABEL: eq_v2i64:
35; AVX: # BB#0:
36; AVX-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
37; AVX-NEXT: retq
38;
39; XOP-LABEL: eq_v2i64:
40; XOP: # BB#0:
Simon Pilgrim52d47e52015-10-11 14:15:17 +000041; XOP-NEXT: vpcomeqq %xmm1, %xmm0, %xmm0
Simon Pilgrimbdbf8392015-10-10 22:21:05 +000042; XOP-NEXT: retq
43 %1 = icmp eq <2 x i64> %a, %b
44 %2 = sext <2 x i1> %1 to <2 x i64>
45 ret <2 x i64> %2
46}
47
48define <4 x i32> @eq_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
49; SSE-LABEL: eq_v4i32:
50; SSE: # BB#0:
51; SSE-NEXT: pcmpeqd %xmm1, %xmm0
52; SSE-NEXT: retq
53;
54; AVX-LABEL: eq_v4i32:
55; AVX: # BB#0:
56; AVX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
57; AVX-NEXT: retq
58;
59; XOP-LABEL: eq_v4i32:
60; XOP: # BB#0:
Simon Pilgrim52d47e52015-10-11 14:15:17 +000061; XOP-NEXT: vpcomeqd %xmm1, %xmm0, %xmm0
Simon Pilgrimbdbf8392015-10-10 22:21:05 +000062; XOP-NEXT: retq
63 %1 = icmp eq <4 x i32> %a, %b
64 %2 = sext <4 x i1> %1 to <4 x i32>
65 ret <4 x i32> %2
66}
67
68define <8 x i16> @eq_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
69; SSE-LABEL: eq_v8i16:
70; SSE: # BB#0:
71; SSE-NEXT: pcmpeqw %xmm1, %xmm0
72; SSE-NEXT: retq
73;
74; AVX-LABEL: eq_v8i16:
75; AVX: # BB#0:
76; AVX-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0
77; AVX-NEXT: retq
78;
79; XOP-LABEL: eq_v8i16:
80; XOP: # BB#0:
Simon Pilgrim52d47e52015-10-11 14:15:17 +000081; XOP-NEXT: vpcomeqw %xmm1, %xmm0, %xmm0
Simon Pilgrimbdbf8392015-10-10 22:21:05 +000082; XOP-NEXT: retq
83 %1 = icmp eq <8 x i16> %a, %b
84 %2 = sext <8 x i1> %1 to <8 x i16>
85 ret <8 x i16> %2
86}
87
88define <16 x i8> @eq_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
89; SSE-LABEL: eq_v16i8:
90; SSE: # BB#0:
91; SSE-NEXT: pcmpeqb %xmm1, %xmm0
92; SSE-NEXT: retq
93;
94; AVX-LABEL: eq_v16i8:
95; AVX: # BB#0:
96; AVX-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
97; AVX-NEXT: retq
98;
99; XOP-LABEL: eq_v16i8:
100; XOP: # BB#0:
Simon Pilgrim52d47e52015-10-11 14:15:17 +0000101; XOP-NEXT: vpcomeqb %xmm1, %xmm0, %xmm0
Simon Pilgrimbdbf8392015-10-10 22:21:05 +0000102; XOP-NEXT: retq
103 %1 = icmp eq <16 x i8> %a, %b
104 %2 = sext <16 x i1> %1 to <16 x i8>
105 ret <16 x i8> %2
106}
107
108;
109; Not Equal
110;
111
112define <2 x i64> @ne_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
113; SSE2-LABEL: ne_v2i64:
114; SSE2: # BB#0:
115; SSE2-NEXT: pcmpeqd %xmm1, %xmm0
116; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]
117; SSE2-NEXT: pand %xmm1, %xmm0
118; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
119; SSE2-NEXT: pxor %xmm1, %xmm0
120; SSE2-NEXT: retq
121;
122; SSE41-LABEL: ne_v2i64:
123; SSE41: # BB#0:
124; SSE41-NEXT: pcmpeqq %xmm1, %xmm0
125; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
126; SSE41-NEXT: pxor %xmm1, %xmm0
127; SSE41-NEXT: retq
128;
129; SSE42-LABEL: ne_v2i64:
130; SSE42: # BB#0:
131; SSE42-NEXT: pcmpeqq %xmm1, %xmm0
132; SSE42-NEXT: pcmpeqd %xmm1, %xmm1
133; SSE42-NEXT: pxor %xmm1, %xmm0
134; SSE42-NEXT: retq
135;
136; AVX-LABEL: ne_v2i64:
137; AVX: # BB#0:
138; AVX-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
139; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
140; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
141; AVX-NEXT: retq
142;
143; XOP-LABEL: ne_v2i64:
144; XOP: # BB#0:
Simon Pilgrim52d47e52015-10-11 14:15:17 +0000145; XOP-NEXT: vpcomneqq %xmm1, %xmm0, %xmm0
Simon Pilgrimbdbf8392015-10-10 22:21:05 +0000146; XOP-NEXT: retq
147 %1 = icmp ne <2 x i64> %a, %b
148 %2 = sext <2 x i1> %1 to <2 x i64>
149 ret <2 x i64> %2
150}
151
152define <4 x i32> @ne_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
153; SSE-LABEL: ne_v4i32:
154; SSE: # BB#0:
155; SSE-NEXT: pcmpeqd %xmm1, %xmm0
156; SSE-NEXT: pcmpeqd %xmm1, %xmm1
157; SSE-NEXT: pxor %xmm1, %xmm0
158; SSE-NEXT: retq
159;
160; AVX-LABEL: ne_v4i32:
161; AVX: # BB#0:
162; AVX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
163; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
164; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
165; AVX-NEXT: retq
166;
167; XOP-LABEL: ne_v4i32:
168; XOP: # BB#0:
Simon Pilgrim52d47e52015-10-11 14:15:17 +0000169; XOP-NEXT: vpcomneqd %xmm1, %xmm0, %xmm0
Simon Pilgrimbdbf8392015-10-10 22:21:05 +0000170; XOP-NEXT: retq
171 %1 = icmp ne <4 x i32> %a, %b
172 %2 = sext <4 x i1> %1 to <4 x i32>
173 ret <4 x i32> %2
174}
175
176define <8 x i16> @ne_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
177; SSE-LABEL: ne_v8i16:
178; SSE: # BB#0:
179; SSE-NEXT: pcmpeqw %xmm1, %xmm0
180; SSE-NEXT: pcmpeqd %xmm1, %xmm1
181; SSE-NEXT: pxor %xmm1, %xmm0
182; SSE-NEXT: retq
183;
184; AVX-LABEL: ne_v8i16:
185; AVX: # BB#0:
186; AVX-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0
187; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
188; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
189; AVX-NEXT: retq
190;
191; XOP-LABEL: ne_v8i16:
192; XOP: # BB#0:
Simon Pilgrim52d47e52015-10-11 14:15:17 +0000193; XOP-NEXT: vpcomneqw %xmm1, %xmm0, %xmm0
Simon Pilgrimbdbf8392015-10-10 22:21:05 +0000194; XOP-NEXT: retq
195 %1 = icmp ne <8 x i16> %a, %b
196 %2 = sext <8 x i1> %1 to <8 x i16>
197 ret <8 x i16> %2
198}
199
200define <16 x i8> @ne_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
201; SSE-LABEL: ne_v16i8:
202; SSE: # BB#0:
203; SSE-NEXT: pcmpeqb %xmm1, %xmm0
204; SSE-NEXT: pcmpeqd %xmm1, %xmm1
205; SSE-NEXT: pxor %xmm1, %xmm0
206; SSE-NEXT: retq
207;
208; AVX-LABEL: ne_v16i8:
209; AVX: # BB#0:
210; AVX-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
211; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
212; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
213; AVX-NEXT: retq
214;
215; XOP-LABEL: ne_v16i8:
216; XOP: # BB#0:
Simon Pilgrim52d47e52015-10-11 14:15:17 +0000217; XOP-NEXT: vpcomneqb %xmm1, %xmm0, %xmm0
Simon Pilgrimbdbf8392015-10-10 22:21:05 +0000218; XOP-NEXT: retq
219 %1 = icmp ne <16 x i8> %a, %b
220 %2 = sext <16 x i1> %1 to <16 x i8>
221 ret <16 x i8> %2
222}
223
224;
225; Greater Than Or Equal
226;
227
228define <2 x i64> @ge_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
229; SSE2-LABEL: ge_v2i64:
230; SSE2: # BB#0:
231; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
232; SSE2-NEXT: pxor %xmm2, %xmm0
233; SSE2-NEXT: pxor %xmm2, %xmm1
234; SSE2-NEXT: movdqa %xmm1, %xmm2
235; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
236; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
237; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
238; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
239; SSE2-NEXT: pand %xmm3, %xmm0
240; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
241; SSE2-NEXT: por %xmm0, %xmm1
242; SSE2-NEXT: pcmpeqd %xmm0, %xmm0
243; SSE2-NEXT: pxor %xmm1, %xmm0
244; SSE2-NEXT: retq
245;
246; SSE41-LABEL: ge_v2i64:
247; SSE41: # BB#0:
248; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
249; SSE41-NEXT: pxor %xmm2, %xmm0
250; SSE41-NEXT: pxor %xmm2, %xmm1
251; SSE41-NEXT: movdqa %xmm1, %xmm2
252; SSE41-NEXT: pcmpgtd %xmm0, %xmm2
253; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
254; SSE41-NEXT: pcmpeqd %xmm0, %xmm1
255; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
256; SSE41-NEXT: pand %xmm3, %xmm0
257; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
258; SSE41-NEXT: por %xmm0, %xmm1
259; SSE41-NEXT: pcmpeqd %xmm0, %xmm0
260; SSE41-NEXT: pxor %xmm1, %xmm0
261; SSE41-NEXT: retq
262;
263; SSE42-LABEL: ge_v2i64:
264; SSE42: # BB#0:
265; SSE42-NEXT: pcmpgtq %xmm0, %xmm1
266; SSE42-NEXT: pcmpeqd %xmm0, %xmm0
267; SSE42-NEXT: pxor %xmm1, %xmm0
268; SSE42-NEXT: retq
269;
270; AVX-LABEL: ge_v2i64:
271; AVX: # BB#0:
272; AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm0
273; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
274; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
275; AVX-NEXT: retq
276;
277; XOP-LABEL: ge_v2i64:
278; XOP: # BB#0:
Simon Pilgrim52d47e52015-10-11 14:15:17 +0000279; XOP-NEXT: vpcomgeq %xmm1, %xmm0, %xmm0
Simon Pilgrimbdbf8392015-10-10 22:21:05 +0000280; XOP-NEXT: retq
281 %1 = icmp sge <2 x i64> %a, %b
282 %2 = sext <2 x i1> %1 to <2 x i64>
283 ret <2 x i64> %2
284}
285
286define <4 x i32> @ge_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
287; SSE-LABEL: ge_v4i32:
288; SSE: # BB#0:
289; SSE-NEXT: pcmpgtd %xmm0, %xmm1
290; SSE-NEXT: pcmpeqd %xmm0, %xmm0
291; SSE-NEXT: pxor %xmm1, %xmm0
292; SSE-NEXT: retq
293;
294; AVX-LABEL: ge_v4i32:
295; AVX: # BB#0:
296; AVX-NEXT: vpcmpgtd %xmm0, %xmm1, %xmm0
297; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
298; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
299; AVX-NEXT: retq
300;
301; XOP-LABEL: ge_v4i32:
302; XOP: # BB#0:
Simon Pilgrim52d47e52015-10-11 14:15:17 +0000303; XOP-NEXT: vpcomged %xmm1, %xmm0, %xmm0
Simon Pilgrimbdbf8392015-10-10 22:21:05 +0000304; XOP-NEXT: retq
305 %1 = icmp sge <4 x i32> %a, %b
306 %2 = sext <4 x i1> %1 to <4 x i32>
307 ret <4 x i32> %2
308}
309
310define <8 x i16> @ge_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
311; SSE-LABEL: ge_v8i16:
312; SSE: # BB#0:
313; SSE-NEXT: pcmpgtw %xmm0, %xmm1
314; SSE-NEXT: pcmpeqd %xmm0, %xmm0
315; SSE-NEXT: pxor %xmm1, %xmm0
316; SSE-NEXT: retq
317;
318; AVX-LABEL: ge_v8i16:
319; AVX: # BB#0:
320; AVX-NEXT: vpcmpgtw %xmm0, %xmm1, %xmm0
321; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
322; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
323; AVX-NEXT: retq
324;
325; XOP-LABEL: ge_v8i16:
326; XOP: # BB#0:
Simon Pilgrim52d47e52015-10-11 14:15:17 +0000327; XOP-NEXT: vpcomgew %xmm1, %xmm0, %xmm0
Simon Pilgrimbdbf8392015-10-10 22:21:05 +0000328; XOP-NEXT: retq
329 %1 = icmp sge <8 x i16> %a, %b
330 %2 = sext <8 x i1> %1 to <8 x i16>
331 ret <8 x i16> %2
332}
333
334define <16 x i8> @ge_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
335; SSE-LABEL: ge_v16i8:
336; SSE: # BB#0:
337; SSE-NEXT: pcmpgtb %xmm0, %xmm1
338; SSE-NEXT: pcmpeqd %xmm0, %xmm0
339; SSE-NEXT: pxor %xmm1, %xmm0
340; SSE-NEXT: retq
341;
342; AVX-LABEL: ge_v16i8:
343; AVX: # BB#0:
344; AVX-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm0
345; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
346; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
347; AVX-NEXT: retq
348;
349; XOP-LABEL: ge_v16i8:
350; XOP: # BB#0:
Simon Pilgrim52d47e52015-10-11 14:15:17 +0000351; XOP-NEXT: vpcomgeb %xmm1, %xmm0, %xmm0
Simon Pilgrimbdbf8392015-10-10 22:21:05 +0000352; XOP-NEXT: retq
353 %1 = icmp sge <16 x i8> %a, %b
354 %2 = sext <16 x i1> %1 to <16 x i8>
355 ret <16 x i8> %2
356}
357
358;
359; Greater Than
360;
361
362define <2 x i64> @gt_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
363; SSE2-LABEL: gt_v2i64:
364; SSE2: # BB#0:
365; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
366; SSE2-NEXT: pxor %xmm2, %xmm1
367; SSE2-NEXT: pxor %xmm2, %xmm0
368; SSE2-NEXT: movdqa %xmm0, %xmm2
369; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
370; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
371; SSE2-NEXT: pcmpeqd %xmm1, %xmm0
372; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
373; SSE2-NEXT: pand %xmm3, %xmm1
374; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
375; SSE2-NEXT: por %xmm1, %xmm0
376; SSE2-NEXT: retq
377;
378; SSE41-LABEL: gt_v2i64:
379; SSE41: # BB#0:
380; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
381; SSE41-NEXT: pxor %xmm2, %xmm1
382; SSE41-NEXT: pxor %xmm2, %xmm0
383; SSE41-NEXT: movdqa %xmm0, %xmm2
384; SSE41-NEXT: pcmpgtd %xmm1, %xmm2
385; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
386; SSE41-NEXT: pcmpeqd %xmm1, %xmm0
387; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
388; SSE41-NEXT: pand %xmm3, %xmm1
389; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
390; SSE41-NEXT: por %xmm1, %xmm0
391; SSE41-NEXT: retq
392;
393; SSE42-LABEL: gt_v2i64:
394; SSE42: # BB#0:
395; SSE42-NEXT: pcmpgtq %xmm1, %xmm0
396; SSE42-NEXT: retq
397;
398; AVX-LABEL: gt_v2i64:
399; AVX: # BB#0:
400; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0
401; AVX-NEXT: retq
402;
403; XOP-LABEL: gt_v2i64:
404; XOP: # BB#0:
Simon Pilgrim52d47e52015-10-11 14:15:17 +0000405; XOP-NEXT: vpcomgtq %xmm1, %xmm0, %xmm0
Simon Pilgrimbdbf8392015-10-10 22:21:05 +0000406; XOP-NEXT: retq
407 %1 = icmp sgt <2 x i64> %a, %b
408 %2 = sext <2 x i1> %1 to <2 x i64>
409 ret <2 x i64> %2
410}
411
412define <4 x i32> @gt_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
413; SSE-LABEL: gt_v4i32:
414; SSE: # BB#0:
415; SSE-NEXT: pcmpgtd %xmm1, %xmm0
416; SSE-NEXT: retq
417;
418; AVX-LABEL: gt_v4i32:
419; AVX: # BB#0:
420; AVX-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0
421; AVX-NEXT: retq
422;
423; XOP-LABEL: gt_v4i32:
424; XOP: # BB#0:
Simon Pilgrim52d47e52015-10-11 14:15:17 +0000425; XOP-NEXT: vpcomgtd %xmm1, %xmm0, %xmm0
Simon Pilgrimbdbf8392015-10-10 22:21:05 +0000426; XOP-NEXT: retq
427 %1 = icmp sgt <4 x i32> %a, %b
428 %2 = sext <4 x i1> %1 to <4 x i32>
429 ret <4 x i32> %2
430}
431
432define <8 x i16> @gt_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
433; SSE-LABEL: gt_v8i16:
434; SSE: # BB#0:
435; SSE-NEXT: pcmpgtw %xmm1, %xmm0
436; SSE-NEXT: retq
437;
438; AVX-LABEL: gt_v8i16:
439; AVX: # BB#0:
440; AVX-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm0
441; AVX-NEXT: retq
442;
443; XOP-LABEL: gt_v8i16:
444; XOP: # BB#0:
Simon Pilgrim52d47e52015-10-11 14:15:17 +0000445; XOP-NEXT: vpcomgtw %xmm1, %xmm0, %xmm0
Simon Pilgrimbdbf8392015-10-10 22:21:05 +0000446; XOP-NEXT: retq
447 %1 = icmp sgt <8 x i16> %a, %b
448 %2 = sext <8 x i1> %1 to <8 x i16>
449 ret <8 x i16> %2
450}
451
452define <16 x i8> @gt_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
453; SSE-LABEL: gt_v16i8:
454; SSE: # BB#0:
455; SSE-NEXT: pcmpgtb %xmm1, %xmm0
456; SSE-NEXT: retq
457;
458; AVX-LABEL: gt_v16i8:
459; AVX: # BB#0:
460; AVX-NEXT: vpcmpgtb %xmm1, %xmm0, %xmm0
461; AVX-NEXT: retq
462;
463; XOP-LABEL: gt_v16i8:
464; XOP: # BB#0:
Simon Pilgrim52d47e52015-10-11 14:15:17 +0000465; XOP-NEXT: vpcomgtb %xmm1, %xmm0, %xmm0
Simon Pilgrimbdbf8392015-10-10 22:21:05 +0000466; XOP-NEXT: retq
467 %1 = icmp sgt <16 x i8> %a, %b
468 %2 = sext <16 x i1> %1 to <16 x i8>
469 ret <16 x i8> %2
470}
471
472;
473; Less Than Or Equal
474;
475
476define <2 x i64> @le_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
477; SSE2-LABEL: le_v2i64:
478; SSE2: # BB#0:
479; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
480; SSE2-NEXT: pxor %xmm2, %xmm1
481; SSE2-NEXT: pxor %xmm2, %xmm0
482; SSE2-NEXT: movdqa %xmm0, %xmm2
483; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
484; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
485; SSE2-NEXT: pcmpeqd %xmm1, %xmm0
486; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
487; SSE2-NEXT: pand %xmm3, %xmm0
488; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
489; SSE2-NEXT: por %xmm0, %xmm1
490; SSE2-NEXT: pcmpeqd %xmm0, %xmm0
491; SSE2-NEXT: pxor %xmm1, %xmm0
492; SSE2-NEXT: retq
493;
494; SSE41-LABEL: le_v2i64:
495; SSE41: # BB#0:
496; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
497; SSE41-NEXT: pxor %xmm2, %xmm1
498; SSE41-NEXT: pxor %xmm2, %xmm0
499; SSE41-NEXT: movdqa %xmm0, %xmm2
500; SSE41-NEXT: pcmpgtd %xmm1, %xmm2
501; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
502; SSE41-NEXT: pcmpeqd %xmm1, %xmm0
503; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
504; SSE41-NEXT: pand %xmm3, %xmm0
505; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
506; SSE41-NEXT: por %xmm0, %xmm1
507; SSE41-NEXT: pcmpeqd %xmm0, %xmm0
508; SSE41-NEXT: pxor %xmm1, %xmm0
509; SSE41-NEXT: retq
510;
511; SSE42-LABEL: le_v2i64:
512; SSE42: # BB#0:
513; SSE42-NEXT: pcmpgtq %xmm1, %xmm0
514; SSE42-NEXT: pcmpeqd %xmm1, %xmm1
515; SSE42-NEXT: pxor %xmm1, %xmm0
516; SSE42-NEXT: retq
517;
518; AVX-LABEL: le_v2i64:
519; AVX: # BB#0:
520; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0
521; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
522; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
523; AVX-NEXT: retq
524;
525; XOP-LABEL: le_v2i64:
526; XOP: # BB#0:
Simon Pilgrim52d47e52015-10-11 14:15:17 +0000527; XOP-NEXT: vpcomleq %xmm1, %xmm0, %xmm0
Simon Pilgrimbdbf8392015-10-10 22:21:05 +0000528; XOP-NEXT: retq
529 %1 = icmp sle <2 x i64> %a, %b
530 %2 = sext <2 x i1> %1 to <2 x i64>
531 ret <2 x i64> %2
532}
533
534define <4 x i32> @le_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
535; SSE-LABEL: le_v4i32:
536; SSE: # BB#0:
537; SSE-NEXT: pcmpgtd %xmm1, %xmm0
538; SSE-NEXT: pcmpeqd %xmm1, %xmm1
539; SSE-NEXT: pxor %xmm1, %xmm0
540; SSE-NEXT: retq
541;
542; AVX-LABEL: le_v4i32:
543; AVX: # BB#0:
544; AVX-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0
545; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
546; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
547; AVX-NEXT: retq
548;
549; XOP-LABEL: le_v4i32:
550; XOP: # BB#0:
Simon Pilgrim52d47e52015-10-11 14:15:17 +0000551; XOP-NEXT: vpcomled %xmm1, %xmm0, %xmm0
Simon Pilgrimbdbf8392015-10-10 22:21:05 +0000552; XOP-NEXT: retq
553 %1 = icmp sle <4 x i32> %a, %b
554 %2 = sext <4 x i1> %1 to <4 x i32>
555 ret <4 x i32> %2
556}
557
558define <8 x i16> @le_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
559; SSE-LABEL: le_v8i16:
560; SSE: # BB#0:
561; SSE-NEXT: pcmpgtw %xmm1, %xmm0
562; SSE-NEXT: pcmpeqd %xmm1, %xmm1
563; SSE-NEXT: pxor %xmm1, %xmm0
564; SSE-NEXT: retq
565;
566; AVX-LABEL: le_v8i16:
567; AVX: # BB#0:
568; AVX-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm0
569; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
570; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
571; AVX-NEXT: retq
572;
573; XOP-LABEL: le_v8i16:
574; XOP: # BB#0:
Simon Pilgrim52d47e52015-10-11 14:15:17 +0000575; XOP-NEXT: vpcomlew %xmm1, %xmm0, %xmm0
Simon Pilgrimbdbf8392015-10-10 22:21:05 +0000576; XOP-NEXT: retq
577 %1 = icmp sle <8 x i16> %a, %b
578 %2 = sext <8 x i1> %1 to <8 x i16>
579 ret <8 x i16> %2
580}
581
582define <16 x i8> @le_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
583; SSE-LABEL: le_v16i8:
584; SSE: # BB#0:
585; SSE-NEXT: pcmpgtb %xmm1, %xmm0
586; SSE-NEXT: pcmpeqd %xmm1, %xmm1
587; SSE-NEXT: pxor %xmm1, %xmm0
588; SSE-NEXT: retq
589;
590; AVX-LABEL: le_v16i8:
591; AVX: # BB#0:
592; AVX-NEXT: vpcmpgtb %xmm1, %xmm0, %xmm0
593; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
594; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
595; AVX-NEXT: retq
596;
597; XOP-LABEL: le_v16i8:
598; XOP: # BB#0:
Simon Pilgrim52d47e52015-10-11 14:15:17 +0000599; XOP-NEXT: vpcomleb %xmm1, %xmm0, %xmm0
Simon Pilgrimbdbf8392015-10-10 22:21:05 +0000600; XOP-NEXT: retq
601 %1 = icmp sle <16 x i8> %a, %b
602 %2 = sext <16 x i1> %1 to <16 x i8>
603 ret <16 x i8> %2
604}
605
606;
607; Less Than
608;
609
610define <2 x i64> @lt_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
611; SSE2-LABEL: lt_v2i64:
612; SSE2: # BB#0:
613; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
614; SSE2-NEXT: pxor %xmm2, %xmm0
615; SSE2-NEXT: pxor %xmm2, %xmm1
616; SSE2-NEXT: movdqa %xmm1, %xmm2
617; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
618; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
619; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
620; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
621; SSE2-NEXT: pand %xmm3, %xmm1
622; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
623; SSE2-NEXT: por %xmm1, %xmm0
624; SSE2-NEXT: retq
625;
626; SSE41-LABEL: lt_v2i64:
627; SSE41: # BB#0:
628; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
629; SSE41-NEXT: pxor %xmm2, %xmm0
630; SSE41-NEXT: pxor %xmm2, %xmm1
631; SSE41-NEXT: movdqa %xmm1, %xmm2
632; SSE41-NEXT: pcmpgtd %xmm0, %xmm2
633; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
634; SSE41-NEXT: pcmpeqd %xmm0, %xmm1
635; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
636; SSE41-NEXT: pand %xmm3, %xmm1
637; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
638; SSE41-NEXT: por %xmm1, %xmm0
639; SSE41-NEXT: retq
640;
641; SSE42-LABEL: lt_v2i64:
642; SSE42: # BB#0:
643; SSE42-NEXT: pcmpgtq %xmm0, %xmm1
644; SSE42-NEXT: movdqa %xmm1, %xmm0
645; SSE42-NEXT: retq
646;
647; AVX-LABEL: lt_v2i64:
648; AVX: # BB#0:
649; AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm0
650; AVX-NEXT: retq
651;
652; XOP-LABEL: lt_v2i64:
653; XOP: # BB#0:
Simon Pilgrim52d47e52015-10-11 14:15:17 +0000654; XOP-NEXT: vpcomltq %xmm1, %xmm0, %xmm0
Simon Pilgrimbdbf8392015-10-10 22:21:05 +0000655; XOP-NEXT: retq
656 %1 = icmp slt <2 x i64> %a, %b
657 %2 = sext <2 x i1> %1 to <2 x i64>
658 ret <2 x i64> %2
659}
660
661define <4 x i32> @lt_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
662; SSE-LABEL: lt_v4i32:
663; SSE: # BB#0:
664; SSE-NEXT: pcmpgtd %xmm0, %xmm1
665; SSE-NEXT: movdqa %xmm1, %xmm0
666; SSE-NEXT: retq
667;
668; AVX-LABEL: lt_v4i32:
669; AVX: # BB#0:
670; AVX-NEXT: vpcmpgtd %xmm0, %xmm1, %xmm0
671; AVX-NEXT: retq
672;
673; XOP-LABEL: lt_v4i32:
674; XOP: # BB#0:
Simon Pilgrim52d47e52015-10-11 14:15:17 +0000675; XOP-NEXT: vpcomltd %xmm1, %xmm0, %xmm0
Simon Pilgrimbdbf8392015-10-10 22:21:05 +0000676; XOP-NEXT: retq
677 %1 = icmp slt <4 x i32> %a, %b
678 %2 = sext <4 x i1> %1 to <4 x i32>
679 ret <4 x i32> %2
680}
681
682define <8 x i16> @lt_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
683; SSE-LABEL: lt_v8i16:
684; SSE: # BB#0:
685; SSE-NEXT: pcmpgtw %xmm0, %xmm1
686; SSE-NEXT: movdqa %xmm1, %xmm0
687; SSE-NEXT: retq
688;
689; AVX-LABEL: lt_v8i16:
690; AVX: # BB#0:
691; AVX-NEXT: vpcmpgtw %xmm0, %xmm1, %xmm0
692; AVX-NEXT: retq
693;
694; XOP-LABEL: lt_v8i16:
695; XOP: # BB#0:
Simon Pilgrim52d47e52015-10-11 14:15:17 +0000696; XOP-NEXT: vpcomltw %xmm1, %xmm0, %xmm0
Simon Pilgrimbdbf8392015-10-10 22:21:05 +0000697; XOP-NEXT: retq
698 %1 = icmp slt <8 x i16> %a, %b
699 %2 = sext <8 x i1> %1 to <8 x i16>
700 ret <8 x i16> %2
701}
702
703define <16 x i8> @lt_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
704; SSE-LABEL: lt_v16i8:
705; SSE: # BB#0:
706; SSE-NEXT: pcmpgtb %xmm0, %xmm1
707; SSE-NEXT: movdqa %xmm1, %xmm0
708; SSE-NEXT: retq
709;
710; AVX-LABEL: lt_v16i8:
711; AVX: # BB#0:
712; AVX-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm0
713; AVX-NEXT: retq
714;
715; XOP-LABEL: lt_v16i8:
716; XOP: # BB#0:
Simon Pilgrim52d47e52015-10-11 14:15:17 +0000717; XOP-NEXT: vpcomltb %xmm1, %xmm0, %xmm0
Simon Pilgrimbdbf8392015-10-10 22:21:05 +0000718; XOP-NEXT: retq
719 %1 = icmp slt <16 x i8> %a, %b
720 %2 = sext <16 x i1> %1 to <16 x i8>
721 ret <16 x i8> %2
722}