xref: /llvm-project/llvm/test/CodeGen/X86/vec_cmp_sint-128.ll (revision 69ffa7be3bda5547d7a41233f86b88539616e386)
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=+sse4.2 | FileCheck %s --check-prefixes=SSE,SSE42
5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1
6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2
7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx,+xop | FileCheck %s --check-prefix=XOP
8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+xop | FileCheck %s --check-prefix=XOP
9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX,AVX512
10; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefixes=AVX,AVX512
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:
41; XOP-NEXT:    vpcomeqq %xmm1, %xmm0, %xmm0
42; 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:
61; XOP-NEXT:    vpcomeqd %xmm1, %xmm0, %xmm0
62; 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:
81; XOP-NEXT:    vpcomeqw %xmm1, %xmm0, %xmm0
82; 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:
101; XOP-NEXT:    vpcomeqb %xmm1, %xmm0, %xmm0
102; 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; AVX1-LABEL: ne_v2i64:
137; AVX1:       # %bb.0:
138; AVX1-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm0
139; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
140; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
141; AVX1-NEXT:    retq
142;
143; AVX2-LABEL: ne_v2i64:
144; AVX2:       # %bb.0:
145; AVX2-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm0
146; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
147; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
148; AVX2-NEXT:    retq
149;
150; XOP-LABEL: ne_v2i64:
151; XOP:       # %bb.0:
152; XOP-NEXT:    vpcomneqq %xmm1, %xmm0, %xmm0
153; XOP-NEXT:    retq
154;
155; AVX512-LABEL: ne_v2i64:
156; AVX512:       # %bb.0:
157; AVX512-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm0
158; AVX512-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
159; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
160; AVX512-NEXT:    vzeroupper
161; AVX512-NEXT:    retq
162  %1 = icmp ne <2 x i64> %a, %b
163  %2 = sext <2 x i1> %1 to <2 x i64>
164  ret <2 x i64> %2
165}
166
167define <4 x i32> @ne_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
168; SSE-LABEL: ne_v4i32:
169; SSE:       # %bb.0:
170; SSE-NEXT:    pcmpeqd %xmm1, %xmm0
171; SSE-NEXT:    pcmpeqd %xmm1, %xmm1
172; SSE-NEXT:    pxor %xmm1, %xmm0
173; SSE-NEXT:    retq
174;
175; AVX1-LABEL: ne_v4i32:
176; AVX1:       # %bb.0:
177; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
178; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
179; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
180; AVX1-NEXT:    retq
181;
182; AVX2-LABEL: ne_v4i32:
183; AVX2:       # %bb.0:
184; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
185; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
186; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
187; AVX2-NEXT:    retq
188;
189; XOP-LABEL: ne_v4i32:
190; XOP:       # %bb.0:
191; XOP-NEXT:    vpcomneqd %xmm1, %xmm0, %xmm0
192; XOP-NEXT:    retq
193;
194; AVX512-LABEL: ne_v4i32:
195; AVX512:       # %bb.0:
196; AVX512-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
197; AVX512-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
198; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
199; AVX512-NEXT:    vzeroupper
200; AVX512-NEXT:    retq
201  %1 = icmp ne <4 x i32> %a, %b
202  %2 = sext <4 x i1> %1 to <4 x i32>
203  ret <4 x i32> %2
204}
205
206define <8 x i16> @ne_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
207; SSE-LABEL: ne_v8i16:
208; SSE:       # %bb.0:
209; SSE-NEXT:    pcmpeqw %xmm1, %xmm0
210; SSE-NEXT:    pcmpeqd %xmm1, %xmm1
211; SSE-NEXT:    pxor %xmm1, %xmm0
212; SSE-NEXT:    retq
213;
214; AVX1-LABEL: ne_v8i16:
215; AVX1:       # %bb.0:
216; AVX1-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm0
217; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
218; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
219; AVX1-NEXT:    retq
220;
221; AVX2-LABEL: ne_v8i16:
222; AVX2:       # %bb.0:
223; AVX2-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm0
224; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
225; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
226; AVX2-NEXT:    retq
227;
228; XOP-LABEL: ne_v8i16:
229; XOP:       # %bb.0:
230; XOP-NEXT:    vpcomneqw %xmm1, %xmm0, %xmm0
231; XOP-NEXT:    retq
232;
233; AVX512-LABEL: ne_v8i16:
234; AVX512:       # %bb.0:
235; AVX512-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm0
236; AVX512-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
237; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
238; AVX512-NEXT:    vzeroupper
239; AVX512-NEXT:    retq
240  %1 = icmp ne <8 x i16> %a, %b
241  %2 = sext <8 x i1> %1 to <8 x i16>
242  ret <8 x i16> %2
243}
244
245define <16 x i8> @ne_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
246; SSE-LABEL: ne_v16i8:
247; SSE:       # %bb.0:
248; SSE-NEXT:    pcmpeqb %xmm1, %xmm0
249; SSE-NEXT:    pcmpeqd %xmm1, %xmm1
250; SSE-NEXT:    pxor %xmm1, %xmm0
251; SSE-NEXT:    retq
252;
253; AVX1-LABEL: ne_v16i8:
254; AVX1:       # %bb.0:
255; AVX1-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
256; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
257; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
258; AVX1-NEXT:    retq
259;
260; AVX2-LABEL: ne_v16i8:
261; AVX2:       # %bb.0:
262; AVX2-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
263; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
264; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
265; AVX2-NEXT:    retq
266;
267; XOP-LABEL: ne_v16i8:
268; XOP:       # %bb.0:
269; XOP-NEXT:    vpcomneqb %xmm1, %xmm0, %xmm0
270; XOP-NEXT:    retq
271;
272; AVX512-LABEL: ne_v16i8:
273; AVX512:       # %bb.0:
274; AVX512-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
275; AVX512-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
276; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
277; AVX512-NEXT:    vzeroupper
278; AVX512-NEXT:    retq
279  %1 = icmp ne <16 x i8> %a, %b
280  %2 = sext <16 x i1> %1 to <16 x i8>
281  ret <16 x i8> %2
282}
283
284;
285; Greater Than Or Equal
286;
287
288define <2 x i64> @ge_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
289; SSE2-LABEL: ge_v2i64:
290; SSE2:       # %bb.0:
291; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
292; SSE2-NEXT:    pxor %xmm2, %xmm0
293; SSE2-NEXT:    pxor %xmm2, %xmm1
294; SSE2-NEXT:    movdqa %xmm1, %xmm2
295; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
296; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
297; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
298; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
299; SSE2-NEXT:    pand %xmm3, %xmm0
300; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
301; SSE2-NEXT:    por %xmm0, %xmm1
302; SSE2-NEXT:    pcmpeqd %xmm0, %xmm0
303; SSE2-NEXT:    pxor %xmm1, %xmm0
304; SSE2-NEXT:    retq
305;
306; SSE41-LABEL: ge_v2i64:
307; SSE41:       # %bb.0:
308; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm2 = [2147483648,2147483648]
309; SSE41-NEXT:    pxor %xmm2, %xmm0
310; SSE41-NEXT:    pxor %xmm2, %xmm1
311; SSE41-NEXT:    movdqa %xmm1, %xmm2
312; SSE41-NEXT:    pcmpgtd %xmm0, %xmm2
313; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
314; SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
315; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
316; SSE41-NEXT:    pand %xmm3, %xmm0
317; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
318; SSE41-NEXT:    por %xmm0, %xmm1
319; SSE41-NEXT:    pcmpeqd %xmm0, %xmm0
320; SSE41-NEXT:    pxor %xmm1, %xmm0
321; SSE41-NEXT:    retq
322;
323; SSE42-LABEL: ge_v2i64:
324; SSE42:       # %bb.0:
325; SSE42-NEXT:    pcmpgtq %xmm0, %xmm1
326; SSE42-NEXT:    pcmpeqd %xmm0, %xmm0
327; SSE42-NEXT:    pxor %xmm1, %xmm0
328; SSE42-NEXT:    retq
329;
330; AVX1-LABEL: ge_v2i64:
331; AVX1:       # %bb.0:
332; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm0
333; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
334; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
335; AVX1-NEXT:    retq
336;
337; AVX2-LABEL: ge_v2i64:
338; AVX2:       # %bb.0:
339; AVX2-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm0
340; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
341; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
342; AVX2-NEXT:    retq
343;
344; XOP-LABEL: ge_v2i64:
345; XOP:       # %bb.0:
346; XOP-NEXT:    vpcomgeq %xmm1, %xmm0, %xmm0
347; XOP-NEXT:    retq
348;
349; AVX512-LABEL: ge_v2i64:
350; AVX512:       # %bb.0:
351; AVX512-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm0
352; AVX512-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
353; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
354; AVX512-NEXT:    vzeroupper
355; AVX512-NEXT:    retq
356  %1 = icmp sge <2 x i64> %a, %b
357  %2 = sext <2 x i1> %1 to <2 x i64>
358  ret <2 x i64> %2
359}
360
361define <4 x i32> @ge_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
362; SSE-LABEL: ge_v4i32:
363; SSE:       # %bb.0:
364; SSE-NEXT:    pcmpgtd %xmm0, %xmm1
365; SSE-NEXT:    pcmpeqd %xmm0, %xmm0
366; SSE-NEXT:    pxor %xmm1, %xmm0
367; SSE-NEXT:    retq
368;
369; AVX1-LABEL: ge_v4i32:
370; AVX1:       # %bb.0:
371; AVX1-NEXT:    vpcmpgtd %xmm0, %xmm1, %xmm0
372; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
373; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
374; AVX1-NEXT:    retq
375;
376; AVX2-LABEL: ge_v4i32:
377; AVX2:       # %bb.0:
378; AVX2-NEXT:    vpcmpgtd %xmm0, %xmm1, %xmm0
379; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
380; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
381; AVX2-NEXT:    retq
382;
383; XOP-LABEL: ge_v4i32:
384; XOP:       # %bb.0:
385; XOP-NEXT:    vpcomged %xmm1, %xmm0, %xmm0
386; XOP-NEXT:    retq
387;
388; AVX512-LABEL: ge_v4i32:
389; AVX512:       # %bb.0:
390; AVX512-NEXT:    vpcmpgtd %xmm0, %xmm1, %xmm0
391; AVX512-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
392; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
393; AVX512-NEXT:    vzeroupper
394; AVX512-NEXT:    retq
395  %1 = icmp sge <4 x i32> %a, %b
396  %2 = sext <4 x i1> %1 to <4 x i32>
397  ret <4 x i32> %2
398}
399
400define <8 x i16> @ge_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
401; SSE-LABEL: ge_v8i16:
402; SSE:       # %bb.0:
403; SSE-NEXT:    pcmpgtw %xmm0, %xmm1
404; SSE-NEXT:    pcmpeqd %xmm0, %xmm0
405; SSE-NEXT:    pxor %xmm1, %xmm0
406; SSE-NEXT:    retq
407;
408; AVX1-LABEL: ge_v8i16:
409; AVX1:       # %bb.0:
410; AVX1-NEXT:    vpcmpgtw %xmm0, %xmm1, %xmm0
411; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
412; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
413; AVX1-NEXT:    retq
414;
415; AVX2-LABEL: ge_v8i16:
416; AVX2:       # %bb.0:
417; AVX2-NEXT:    vpcmpgtw %xmm0, %xmm1, %xmm0
418; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
419; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
420; AVX2-NEXT:    retq
421;
422; XOP-LABEL: ge_v8i16:
423; XOP:       # %bb.0:
424; XOP-NEXT:    vpcomgew %xmm1, %xmm0, %xmm0
425; XOP-NEXT:    retq
426;
427; AVX512-LABEL: ge_v8i16:
428; AVX512:       # %bb.0:
429; AVX512-NEXT:    vpcmpgtw %xmm0, %xmm1, %xmm0
430; AVX512-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
431; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
432; AVX512-NEXT:    vzeroupper
433; AVX512-NEXT:    retq
434  %1 = icmp sge <8 x i16> %a, %b
435  %2 = sext <8 x i1> %1 to <8 x i16>
436  ret <8 x i16> %2
437}
438
439define <16 x i8> @ge_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
440; SSE-LABEL: ge_v16i8:
441; SSE:       # %bb.0:
442; SSE-NEXT:    pcmpgtb %xmm0, %xmm1
443; SSE-NEXT:    pcmpeqd %xmm0, %xmm0
444; SSE-NEXT:    pxor %xmm1, %xmm0
445; SSE-NEXT:    retq
446;
447; AVX1-LABEL: ge_v16i8:
448; AVX1:       # %bb.0:
449; AVX1-NEXT:    vpcmpgtb %xmm0, %xmm1, %xmm0
450; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
451; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
452; AVX1-NEXT:    retq
453;
454; AVX2-LABEL: ge_v16i8:
455; AVX2:       # %bb.0:
456; AVX2-NEXT:    vpcmpgtb %xmm0, %xmm1, %xmm0
457; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
458; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
459; AVX2-NEXT:    retq
460;
461; XOP-LABEL: ge_v16i8:
462; XOP:       # %bb.0:
463; XOP-NEXT:    vpcomgeb %xmm1, %xmm0, %xmm0
464; XOP-NEXT:    retq
465;
466; AVX512-LABEL: ge_v16i8:
467; AVX512:       # %bb.0:
468; AVX512-NEXT:    vpcmpgtb %xmm0, %xmm1, %xmm0
469; AVX512-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
470; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
471; AVX512-NEXT:    vzeroupper
472; AVX512-NEXT:    retq
473  %1 = icmp sge <16 x i8> %a, %b
474  %2 = sext <16 x i1> %1 to <16 x i8>
475  ret <16 x i8> %2
476}
477
478;
479; Greater Than
480;
481
482define <2 x i64> @gt_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
483; SSE2-LABEL: gt_v2i64:
484; SSE2:       # %bb.0:
485; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
486; SSE2-NEXT:    pxor %xmm2, %xmm1
487; SSE2-NEXT:    pxor %xmm2, %xmm0
488; SSE2-NEXT:    movdqa %xmm0, %xmm2
489; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
490; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
491; SSE2-NEXT:    pcmpeqd %xmm1, %xmm0
492; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
493; SSE2-NEXT:    pand %xmm3, %xmm1
494; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
495; SSE2-NEXT:    por %xmm1, %xmm0
496; SSE2-NEXT:    retq
497;
498; SSE41-LABEL: gt_v2i64:
499; SSE41:       # %bb.0:
500; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm2 = [2147483648,2147483648]
501; SSE41-NEXT:    pxor %xmm2, %xmm1
502; SSE41-NEXT:    pxor %xmm2, %xmm0
503; SSE41-NEXT:    movdqa %xmm0, %xmm2
504; SSE41-NEXT:    pcmpgtd %xmm1, %xmm2
505; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
506; SSE41-NEXT:    pcmpeqd %xmm1, %xmm0
507; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
508; SSE41-NEXT:    pand %xmm3, %xmm1
509; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
510; SSE41-NEXT:    por %xmm1, %xmm0
511; SSE41-NEXT:    retq
512;
513; SSE42-LABEL: gt_v2i64:
514; SSE42:       # %bb.0:
515; SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
516; SSE42-NEXT:    retq
517;
518; AVX-LABEL: gt_v2i64:
519; AVX:       # %bb.0:
520; AVX-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0
521; AVX-NEXT:    retq
522;
523; XOP-LABEL: gt_v2i64:
524; XOP:       # %bb.0:
525; XOP-NEXT:    vpcomgtq %xmm1, %xmm0, %xmm0
526; XOP-NEXT:    retq
527  %1 = icmp sgt <2 x i64> %a, %b
528  %2 = sext <2 x i1> %1 to <2 x i64>
529  ret <2 x i64> %2
530}
531
532define <4 x i32> @gt_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
533; SSE-LABEL: gt_v4i32:
534; SSE:       # %bb.0:
535; SSE-NEXT:    pcmpgtd %xmm1, %xmm0
536; SSE-NEXT:    retq
537;
538; AVX-LABEL: gt_v4i32:
539; AVX:       # %bb.0:
540; AVX-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm0
541; AVX-NEXT:    retq
542;
543; XOP-LABEL: gt_v4i32:
544; XOP:       # %bb.0:
545; XOP-NEXT:    vpcomgtd %xmm1, %xmm0, %xmm0
546; XOP-NEXT:    retq
547  %1 = icmp sgt <4 x i32> %a, %b
548  %2 = sext <4 x i1> %1 to <4 x i32>
549  ret <4 x i32> %2
550}
551
552define <8 x i16> @gt_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
553; SSE-LABEL: gt_v8i16:
554; SSE:       # %bb.0:
555; SSE-NEXT:    pcmpgtw %xmm1, %xmm0
556; SSE-NEXT:    retq
557;
558; AVX-LABEL: gt_v8i16:
559; AVX:       # %bb.0:
560; AVX-NEXT:    vpcmpgtw %xmm1, %xmm0, %xmm0
561; AVX-NEXT:    retq
562;
563; XOP-LABEL: gt_v8i16:
564; XOP:       # %bb.0:
565; XOP-NEXT:    vpcomgtw %xmm1, %xmm0, %xmm0
566; XOP-NEXT:    retq
567  %1 = icmp sgt <8 x i16> %a, %b
568  %2 = sext <8 x i1> %1 to <8 x i16>
569  ret <8 x i16> %2
570}
571
572define <16 x i8> @gt_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
573; SSE-LABEL: gt_v16i8:
574; SSE:       # %bb.0:
575; SSE-NEXT:    pcmpgtb %xmm1, %xmm0
576; SSE-NEXT:    retq
577;
578; AVX-LABEL: gt_v16i8:
579; AVX:       # %bb.0:
580; AVX-NEXT:    vpcmpgtb %xmm1, %xmm0, %xmm0
581; AVX-NEXT:    retq
582;
583; XOP-LABEL: gt_v16i8:
584; XOP:       # %bb.0:
585; XOP-NEXT:    vpcomgtb %xmm1, %xmm0, %xmm0
586; XOP-NEXT:    retq
587  %1 = icmp sgt <16 x i8> %a, %b
588  %2 = sext <16 x i1> %1 to <16 x i8>
589  ret <16 x i8> %2
590}
591
592;
593; Less Than Or Equal
594;
595
596define <2 x i64> @le_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
597; SSE2-LABEL: le_v2i64:
598; SSE2:       # %bb.0:
599; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
600; SSE2-NEXT:    pxor %xmm2, %xmm1
601; SSE2-NEXT:    pxor %xmm2, %xmm0
602; SSE2-NEXT:    movdqa %xmm0, %xmm2
603; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
604; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
605; SSE2-NEXT:    pcmpeqd %xmm1, %xmm0
606; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
607; SSE2-NEXT:    pand %xmm3, %xmm0
608; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
609; SSE2-NEXT:    por %xmm0, %xmm1
610; SSE2-NEXT:    pcmpeqd %xmm0, %xmm0
611; SSE2-NEXT:    pxor %xmm1, %xmm0
612; SSE2-NEXT:    retq
613;
614; SSE41-LABEL: le_v2i64:
615; SSE41:       # %bb.0:
616; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm2 = [2147483648,2147483648]
617; SSE41-NEXT:    pxor %xmm2, %xmm1
618; SSE41-NEXT:    pxor %xmm2, %xmm0
619; SSE41-NEXT:    movdqa %xmm0, %xmm2
620; SSE41-NEXT:    pcmpgtd %xmm1, %xmm2
621; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
622; SSE41-NEXT:    pcmpeqd %xmm1, %xmm0
623; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
624; SSE41-NEXT:    pand %xmm3, %xmm0
625; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
626; SSE41-NEXT:    por %xmm0, %xmm1
627; SSE41-NEXT:    pcmpeqd %xmm0, %xmm0
628; SSE41-NEXT:    pxor %xmm1, %xmm0
629; SSE41-NEXT:    retq
630;
631; SSE42-LABEL: le_v2i64:
632; SSE42:       # %bb.0:
633; SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
634; SSE42-NEXT:    pcmpeqd %xmm1, %xmm1
635; SSE42-NEXT:    pxor %xmm1, %xmm0
636; SSE42-NEXT:    retq
637;
638; AVX1-LABEL: le_v2i64:
639; AVX1:       # %bb.0:
640; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0
641; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
642; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
643; AVX1-NEXT:    retq
644;
645; AVX2-LABEL: le_v2i64:
646; AVX2:       # %bb.0:
647; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0
648; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
649; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
650; AVX2-NEXT:    retq
651;
652; XOP-LABEL: le_v2i64:
653; XOP:       # %bb.0:
654; XOP-NEXT:    vpcomleq %xmm1, %xmm0, %xmm0
655; XOP-NEXT:    retq
656;
657; AVX512-LABEL: le_v2i64:
658; AVX512:       # %bb.0:
659; AVX512-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0
660; AVX512-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
661; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
662; AVX512-NEXT:    vzeroupper
663; AVX512-NEXT:    retq
664  %1 = icmp sle <2 x i64> %a, %b
665  %2 = sext <2 x i1> %1 to <2 x i64>
666  ret <2 x i64> %2
667}
668
669define <4 x i32> @le_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
670; SSE-LABEL: le_v4i32:
671; SSE:       # %bb.0:
672; SSE-NEXT:    pcmpgtd %xmm1, %xmm0
673; SSE-NEXT:    pcmpeqd %xmm1, %xmm1
674; SSE-NEXT:    pxor %xmm1, %xmm0
675; SSE-NEXT:    retq
676;
677; AVX1-LABEL: le_v4i32:
678; AVX1:       # %bb.0:
679; AVX1-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm0
680; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
681; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
682; AVX1-NEXT:    retq
683;
684; AVX2-LABEL: le_v4i32:
685; AVX2:       # %bb.0:
686; AVX2-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm0
687; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
688; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
689; AVX2-NEXT:    retq
690;
691; XOP-LABEL: le_v4i32:
692; XOP:       # %bb.0:
693; XOP-NEXT:    vpcomled %xmm1, %xmm0, %xmm0
694; XOP-NEXT:    retq
695;
696; AVX512-LABEL: le_v4i32:
697; AVX512:       # %bb.0:
698; AVX512-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm0
699; AVX512-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
700; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
701; AVX512-NEXT:    vzeroupper
702; AVX512-NEXT:    retq
703  %1 = icmp sle <4 x i32> %a, %b
704  %2 = sext <4 x i1> %1 to <4 x i32>
705  ret <4 x i32> %2
706}
707
708define <8 x i16> @le_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
709; SSE-LABEL: le_v8i16:
710; SSE:       # %bb.0:
711; SSE-NEXT:    pcmpgtw %xmm1, %xmm0
712; SSE-NEXT:    pcmpeqd %xmm1, %xmm1
713; SSE-NEXT:    pxor %xmm1, %xmm0
714; SSE-NEXT:    retq
715;
716; AVX1-LABEL: le_v8i16:
717; AVX1:       # %bb.0:
718; AVX1-NEXT:    vpcmpgtw %xmm1, %xmm0, %xmm0
719; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
720; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
721; AVX1-NEXT:    retq
722;
723; AVX2-LABEL: le_v8i16:
724; AVX2:       # %bb.0:
725; AVX2-NEXT:    vpcmpgtw %xmm1, %xmm0, %xmm0
726; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
727; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
728; AVX2-NEXT:    retq
729;
730; XOP-LABEL: le_v8i16:
731; XOP:       # %bb.0:
732; XOP-NEXT:    vpcomlew %xmm1, %xmm0, %xmm0
733; XOP-NEXT:    retq
734;
735; AVX512-LABEL: le_v8i16:
736; AVX512:       # %bb.0:
737; AVX512-NEXT:    vpcmpgtw %xmm1, %xmm0, %xmm0
738; AVX512-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
739; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
740; AVX512-NEXT:    vzeroupper
741; AVX512-NEXT:    retq
742  %1 = icmp sle <8 x i16> %a, %b
743  %2 = sext <8 x i1> %1 to <8 x i16>
744  ret <8 x i16> %2
745}
746
747define <16 x i8> @le_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
748; SSE-LABEL: le_v16i8:
749; SSE:       # %bb.0:
750; SSE-NEXT:    pcmpgtb %xmm1, %xmm0
751; SSE-NEXT:    pcmpeqd %xmm1, %xmm1
752; SSE-NEXT:    pxor %xmm1, %xmm0
753; SSE-NEXT:    retq
754;
755; AVX1-LABEL: le_v16i8:
756; AVX1:       # %bb.0:
757; AVX1-NEXT:    vpcmpgtb %xmm1, %xmm0, %xmm0
758; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
759; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
760; AVX1-NEXT:    retq
761;
762; AVX2-LABEL: le_v16i8:
763; AVX2:       # %bb.0:
764; AVX2-NEXT:    vpcmpgtb %xmm1, %xmm0, %xmm0
765; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
766; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
767; AVX2-NEXT:    retq
768;
769; XOP-LABEL: le_v16i8:
770; XOP:       # %bb.0:
771; XOP-NEXT:    vpcomleb %xmm1, %xmm0, %xmm0
772; XOP-NEXT:    retq
773;
774; AVX512-LABEL: le_v16i8:
775; AVX512:       # %bb.0:
776; AVX512-NEXT:    vpcmpgtb %xmm1, %xmm0, %xmm0
777; AVX512-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
778; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
779; AVX512-NEXT:    vzeroupper
780; AVX512-NEXT:    retq
781  %1 = icmp sle <16 x i8> %a, %b
782  %2 = sext <16 x i1> %1 to <16 x i8>
783  ret <16 x i8> %2
784}
785
786;
787; Less Than
788;
789
790define <2 x i64> @lt_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
791; SSE2-LABEL: lt_v2i64:
792; SSE2:       # %bb.0:
793; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
794; SSE2-NEXT:    pxor %xmm2, %xmm0
795; SSE2-NEXT:    pxor %xmm2, %xmm1
796; SSE2-NEXT:    movdqa %xmm1, %xmm2
797; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
798; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
799; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
800; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
801; SSE2-NEXT:    pand %xmm3, %xmm1
802; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
803; SSE2-NEXT:    por %xmm1, %xmm0
804; SSE2-NEXT:    retq
805;
806; SSE41-LABEL: lt_v2i64:
807; SSE41:       # %bb.0:
808; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm2 = [2147483648,2147483648]
809; SSE41-NEXT:    pxor %xmm2, %xmm0
810; SSE41-NEXT:    pxor %xmm2, %xmm1
811; SSE41-NEXT:    movdqa %xmm1, %xmm2
812; SSE41-NEXT:    pcmpgtd %xmm0, %xmm2
813; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
814; SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
815; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
816; SSE41-NEXT:    pand %xmm3, %xmm1
817; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
818; SSE41-NEXT:    por %xmm1, %xmm0
819; SSE41-NEXT:    retq
820;
821; SSE42-LABEL: lt_v2i64:
822; SSE42:       # %bb.0:
823; SSE42-NEXT:    pcmpgtq %xmm0, %xmm1
824; SSE42-NEXT:    movdqa %xmm1, %xmm0
825; SSE42-NEXT:    retq
826;
827; AVX-LABEL: lt_v2i64:
828; AVX:       # %bb.0:
829; AVX-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm0
830; AVX-NEXT:    retq
831;
832; XOP-LABEL: lt_v2i64:
833; XOP:       # %bb.0:
834; XOP-NEXT:    vpcomltq %xmm1, %xmm0, %xmm0
835; XOP-NEXT:    retq
836  %1 = icmp slt <2 x i64> %a, %b
837  %2 = sext <2 x i1> %1 to <2 x i64>
838  ret <2 x i64> %2
839}
840
841define <4 x i32> @lt_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
842; SSE-LABEL: lt_v4i32:
843; SSE:       # %bb.0:
844; SSE-NEXT:    pcmpgtd %xmm0, %xmm1
845; SSE-NEXT:    movdqa %xmm1, %xmm0
846; SSE-NEXT:    retq
847;
848; AVX-LABEL: lt_v4i32:
849; AVX:       # %bb.0:
850; AVX-NEXT:    vpcmpgtd %xmm0, %xmm1, %xmm0
851; AVX-NEXT:    retq
852;
853; XOP-LABEL: lt_v4i32:
854; XOP:       # %bb.0:
855; XOP-NEXT:    vpcomltd %xmm1, %xmm0, %xmm0
856; XOP-NEXT:    retq
857  %1 = icmp slt <4 x i32> %a, %b
858  %2 = sext <4 x i1> %1 to <4 x i32>
859  ret <4 x i32> %2
860}
861
862define <8 x i16> @lt_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
863; SSE-LABEL: lt_v8i16:
864; SSE:       # %bb.0:
865; SSE-NEXT:    pcmpgtw %xmm0, %xmm1
866; SSE-NEXT:    movdqa %xmm1, %xmm0
867; SSE-NEXT:    retq
868;
869; AVX-LABEL: lt_v8i16:
870; AVX:       # %bb.0:
871; AVX-NEXT:    vpcmpgtw %xmm0, %xmm1, %xmm0
872; AVX-NEXT:    retq
873;
874; XOP-LABEL: lt_v8i16:
875; XOP:       # %bb.0:
876; XOP-NEXT:    vpcomltw %xmm1, %xmm0, %xmm0
877; XOP-NEXT:    retq
878  %1 = icmp slt <8 x i16> %a, %b
879  %2 = sext <8 x i1> %1 to <8 x i16>
880  ret <8 x i16> %2
881}
882
883define <16 x i8> @lt_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
884; SSE-LABEL: lt_v16i8:
885; SSE:       # %bb.0:
886; SSE-NEXT:    pcmpgtb %xmm0, %xmm1
887; SSE-NEXT:    movdqa %xmm1, %xmm0
888; SSE-NEXT:    retq
889;
890; AVX-LABEL: lt_v16i8:
891; AVX:       # %bb.0:
892; AVX-NEXT:    vpcmpgtb %xmm0, %xmm1, %xmm0
893; AVX-NEXT:    retq
894;
895; XOP-LABEL: lt_v16i8:
896; XOP:       # %bb.0:
897; XOP-NEXT:    vpcomltb %xmm1, %xmm0, %xmm0
898; XOP-NEXT:    retq
899  %1 = icmp slt <16 x i8> %a, %b
900  %2 = sext <16 x i1> %1 to <16 x i8>
901  ret <16 x i8> %2
902}
903