xref: /llvm-project/llvm/test/CodeGen/X86/vec_cmp_uint-128.ll (revision f6ff2cc7e0ae4fd9b14583a998ddeada256a954f)
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 = [9223372039002259456,9223372039002259456]
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:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
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:    movdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
326; SSE42-NEXT:    pxor %xmm2, %xmm0
327; SSE42-NEXT:    pxor %xmm1, %xmm2
328; SSE42-NEXT:    pcmpgtq %xmm0, %xmm2
329; SSE42-NEXT:    pcmpeqd %xmm0, %xmm0
330; SSE42-NEXT:    pxor %xmm2, %xmm0
331; SSE42-NEXT:    retq
332;
333; AVX1-LABEL: ge_v2i64:
334; AVX1:       # %bb.0:
335; AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
336; AVX1-NEXT:    # xmm2 = mem[0,0]
337; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
338; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm1
339; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm0
340; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
341; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
342; AVX1-NEXT:    retq
343;
344; AVX2-LABEL: ge_v2i64:
345; AVX2:       # %bb.0:
346; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
347; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm0
348; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm1
349; AVX2-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm0
350; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
351; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
352; AVX2-NEXT:    retq
353;
354; XOP-LABEL: ge_v2i64:
355; XOP:       # %bb.0:
356; XOP-NEXT:    vpcomgeuq %xmm1, %xmm0, %xmm0
357; XOP-NEXT:    retq
358;
359; AVX512-LABEL: ge_v2i64:
360; AVX512:       # %bb.0:
361; AVX512-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
362; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
363; AVX512-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm1
364; AVX512-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm0
365; AVX512-NEXT:    vzeroupper
366; AVX512-NEXT:    retq
367  %1 = icmp uge <2 x i64> %a, %b
368  %2 = sext <2 x i1> %1 to <2 x i64>
369  ret <2 x i64> %2
370}
371
372define <4 x i32> @ge_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
373; SSE2-LABEL: ge_v4i32:
374; SSE2:       # %bb.0:
375; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
376; SSE2-NEXT:    pxor %xmm2, %xmm0
377; SSE2-NEXT:    pxor %xmm1, %xmm2
378; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
379; SSE2-NEXT:    pcmpeqd %xmm0, %xmm0
380; SSE2-NEXT:    pxor %xmm2, %xmm0
381; SSE2-NEXT:    retq
382;
383; SSE41-LABEL: ge_v4i32:
384; SSE41:       # %bb.0:
385; SSE41-NEXT:    pmaxud %xmm0, %xmm1
386; SSE41-NEXT:    pcmpeqd %xmm1, %xmm0
387; SSE41-NEXT:    retq
388;
389; SSE42-LABEL: ge_v4i32:
390; SSE42:       # %bb.0:
391; SSE42-NEXT:    pmaxud %xmm0, %xmm1
392; SSE42-NEXT:    pcmpeqd %xmm1, %xmm0
393; SSE42-NEXT:    retq
394;
395; AVX-LABEL: ge_v4i32:
396; AVX:       # %bb.0:
397; AVX-NEXT:    vpmaxud %xmm1, %xmm0, %xmm1
398; AVX-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
399; AVX-NEXT:    retq
400;
401; XOP-LABEL: ge_v4i32:
402; XOP:       # %bb.0:
403; XOP-NEXT:    vpcomgeud %xmm1, %xmm0, %xmm0
404; XOP-NEXT:    retq
405  %1 = icmp uge <4 x i32> %a, %b
406  %2 = sext <4 x i1> %1 to <4 x i32>
407  ret <4 x i32> %2
408}
409
410define <8 x i16> @ge_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
411; SSE2-LABEL: ge_v8i16:
412; SSE2:       # %bb.0:
413; SSE2-NEXT:    psubusw %xmm0, %xmm1
414; SSE2-NEXT:    pxor %xmm0, %xmm0
415; SSE2-NEXT:    pcmpeqw %xmm1, %xmm0
416; SSE2-NEXT:    retq
417;
418; SSE41-LABEL: ge_v8i16:
419; SSE41:       # %bb.0:
420; SSE41-NEXT:    pmaxuw %xmm0, %xmm1
421; SSE41-NEXT:    pcmpeqw %xmm1, %xmm0
422; SSE41-NEXT:    retq
423;
424; SSE42-LABEL: ge_v8i16:
425; SSE42:       # %bb.0:
426; SSE42-NEXT:    pmaxuw %xmm0, %xmm1
427; SSE42-NEXT:    pcmpeqw %xmm1, %xmm0
428; SSE42-NEXT:    retq
429;
430; AVX-LABEL: ge_v8i16:
431; AVX:       # %bb.0:
432; AVX-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm1
433; AVX-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm0
434; AVX-NEXT:    retq
435;
436; XOP-LABEL: ge_v8i16:
437; XOP:       # %bb.0:
438; XOP-NEXT:    vpcomgeuw %xmm1, %xmm0, %xmm0
439; XOP-NEXT:    retq
440  %1 = icmp uge <8 x i16> %a, %b
441  %2 = sext <8 x i1> %1 to <8 x i16>
442  ret <8 x i16> %2
443}
444
445define <16 x i8> @ge_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
446; SSE-LABEL: ge_v16i8:
447; SSE:       # %bb.0:
448; SSE-NEXT:    pmaxub %xmm0, %xmm1
449; SSE-NEXT:    pcmpeqb %xmm1, %xmm0
450; SSE-NEXT:    retq
451;
452; AVX-LABEL: ge_v16i8:
453; AVX:       # %bb.0:
454; AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm1
455; AVX-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
456; AVX-NEXT:    retq
457;
458; XOP-LABEL: ge_v16i8:
459; XOP:       # %bb.0:
460; XOP-NEXT:    vpcomgeub %xmm1, %xmm0, %xmm0
461; XOP-NEXT:    retq
462  %1 = icmp uge <16 x i8> %a, %b
463  %2 = sext <16 x i1> %1 to <16 x i8>
464  ret <16 x i8> %2
465}
466
467;
468; Greater Than
469;
470
471define <2 x i64> @gt_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
472; SSE2-LABEL: gt_v2i64:
473; SSE2:       # %bb.0:
474; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
475; SSE2-NEXT:    pxor %xmm2, %xmm1
476; SSE2-NEXT:    pxor %xmm2, %xmm0
477; SSE2-NEXT:    movdqa %xmm0, %xmm2
478; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
479; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
480; SSE2-NEXT:    pcmpeqd %xmm1, %xmm0
481; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
482; SSE2-NEXT:    pand %xmm3, %xmm1
483; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
484; SSE2-NEXT:    por %xmm1, %xmm0
485; SSE2-NEXT:    retq
486;
487; SSE41-LABEL: gt_v2i64:
488; SSE41:       # %bb.0:
489; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
490; SSE41-NEXT:    pxor %xmm2, %xmm1
491; SSE41-NEXT:    pxor %xmm2, %xmm0
492; SSE41-NEXT:    movdqa %xmm0, %xmm2
493; SSE41-NEXT:    pcmpgtd %xmm1, %xmm2
494; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
495; SSE41-NEXT:    pcmpeqd %xmm1, %xmm0
496; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
497; SSE41-NEXT:    pand %xmm3, %xmm1
498; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
499; SSE41-NEXT:    por %xmm1, %xmm0
500; SSE41-NEXT:    retq
501;
502; SSE42-LABEL: gt_v2i64:
503; SSE42:       # %bb.0:
504; SSE42-NEXT:    movdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
505; SSE42-NEXT:    pxor %xmm2, %xmm1
506; SSE42-NEXT:    pxor %xmm2, %xmm0
507; SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
508; SSE42-NEXT:    retq
509;
510; AVX1-LABEL: gt_v2i64:
511; AVX1:       # %bb.0:
512; AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
513; AVX1-NEXT:    # xmm2 = mem[0,0]
514; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm1
515; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
516; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0
517; AVX1-NEXT:    retq
518;
519; AVX2-LABEL: gt_v2i64:
520; AVX2:       # %bb.0:
521; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
522; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm1
523; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm0
524; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0
525; AVX2-NEXT:    retq
526;
527; XOP-LABEL: gt_v2i64:
528; XOP:       # %bb.0:
529; XOP-NEXT:    vpcomgtuq %xmm1, %xmm0, %xmm0
530; XOP-NEXT:    retq
531;
532; AVX512-LABEL: gt_v2i64:
533; AVX512:       # %bb.0:
534; AVX512-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
535; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
536; AVX512-NEXT:    vpminuq %zmm1, %zmm0, %zmm1
537; AVX512-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm0
538; AVX512-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
539; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
540; AVX512-NEXT:    vzeroupper
541; AVX512-NEXT:    retq
542  %1 = icmp ugt <2 x i64> %a, %b
543  %2 = sext <2 x i1> %1 to <2 x i64>
544  ret <2 x i64> %2
545}
546
547define <4 x i32> @gt_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
548; SSE2-LABEL: gt_v4i32:
549; SSE2:       # %bb.0:
550; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
551; SSE2-NEXT:    pxor %xmm2, %xmm1
552; SSE2-NEXT:    pxor %xmm2, %xmm0
553; SSE2-NEXT:    pcmpgtd %xmm1, %xmm0
554; SSE2-NEXT:    retq
555;
556; SSE41-LABEL: gt_v4i32:
557; SSE41:       # %bb.0:
558; SSE41-NEXT:    pminud %xmm0, %xmm1
559; SSE41-NEXT:    pcmpeqd %xmm1, %xmm0
560; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
561; SSE41-NEXT:    pxor %xmm1, %xmm0
562; SSE41-NEXT:    retq
563;
564; SSE42-LABEL: gt_v4i32:
565; SSE42:       # %bb.0:
566; SSE42-NEXT:    pminud %xmm0, %xmm1
567; SSE42-NEXT:    pcmpeqd %xmm1, %xmm0
568; SSE42-NEXT:    pcmpeqd %xmm1, %xmm1
569; SSE42-NEXT:    pxor %xmm1, %xmm0
570; SSE42-NEXT:    retq
571;
572; AVX1-LABEL: gt_v4i32:
573; AVX1:       # %bb.0:
574; AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm1
575; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
576; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
577; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
578; AVX1-NEXT:    retq
579;
580; AVX2-LABEL: gt_v4i32:
581; AVX2:       # %bb.0:
582; AVX2-NEXT:    vpminud %xmm1, %xmm0, %xmm1
583; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
584; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
585; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
586; AVX2-NEXT:    retq
587;
588; XOP-LABEL: gt_v4i32:
589; XOP:       # %bb.0:
590; XOP-NEXT:    vpcomgtud %xmm1, %xmm0, %xmm0
591; XOP-NEXT:    retq
592;
593; AVX512-LABEL: gt_v4i32:
594; AVX512:       # %bb.0:
595; AVX512-NEXT:    vpminud %xmm1, %xmm0, %xmm1
596; AVX512-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
597; AVX512-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
598; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
599; AVX512-NEXT:    vzeroupper
600; AVX512-NEXT:    retq
601  %1 = icmp ugt <4 x i32> %a, %b
602  %2 = sext <4 x i1> %1 to <4 x i32>
603  ret <4 x i32> %2
604}
605
606define <8 x i16> @gt_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
607; SSE2-LABEL: gt_v8i16:
608; SSE2:       # %bb.0:
609; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
610; SSE2-NEXT:    pxor %xmm2, %xmm1
611; SSE2-NEXT:    pxor %xmm2, %xmm0
612; SSE2-NEXT:    pcmpgtw %xmm1, %xmm0
613; SSE2-NEXT:    retq
614;
615; SSE41-LABEL: gt_v8i16:
616; SSE41:       # %bb.0:
617; SSE41-NEXT:    pminuw %xmm0, %xmm1
618; SSE41-NEXT:    pcmpeqw %xmm1, %xmm0
619; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
620; SSE41-NEXT:    pxor %xmm1, %xmm0
621; SSE41-NEXT:    retq
622;
623; SSE42-LABEL: gt_v8i16:
624; SSE42:       # %bb.0:
625; SSE42-NEXT:    pminuw %xmm0, %xmm1
626; SSE42-NEXT:    pcmpeqw %xmm1, %xmm0
627; SSE42-NEXT:    pcmpeqd %xmm1, %xmm1
628; SSE42-NEXT:    pxor %xmm1, %xmm0
629; SSE42-NEXT:    retq
630;
631; AVX1-LABEL: gt_v8i16:
632; AVX1:       # %bb.0:
633; AVX1-NEXT:    vpminuw %xmm1, %xmm0, %xmm1
634; AVX1-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm0
635; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
636; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
637; AVX1-NEXT:    retq
638;
639; AVX2-LABEL: gt_v8i16:
640; AVX2:       # %bb.0:
641; AVX2-NEXT:    vpminuw %xmm1, %xmm0, %xmm1
642; AVX2-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm0
643; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
644; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
645; AVX2-NEXT:    retq
646;
647; XOP-LABEL: gt_v8i16:
648; XOP:       # %bb.0:
649; XOP-NEXT:    vpcomgtuw %xmm1, %xmm0, %xmm0
650; XOP-NEXT:    retq
651;
652; AVX512-LABEL: gt_v8i16:
653; AVX512:       # %bb.0:
654; AVX512-NEXT:    vpminuw %xmm1, %xmm0, %xmm1
655; AVX512-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm0
656; AVX512-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
657; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
658; AVX512-NEXT:    vzeroupper
659; AVX512-NEXT:    retq
660  %1 = icmp ugt <8 x i16> %a, %b
661  %2 = sext <8 x i1> %1 to <8 x i16>
662  ret <8 x i16> %2
663}
664
665define <16 x i8> @gt_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
666; SSE-LABEL: gt_v16i8:
667; SSE:       # %bb.0:
668; SSE-NEXT:    pminub %xmm0, %xmm1
669; SSE-NEXT:    pcmpeqb %xmm1, %xmm0
670; SSE-NEXT:    pcmpeqd %xmm1, %xmm1
671; SSE-NEXT:    pxor %xmm1, %xmm0
672; SSE-NEXT:    retq
673;
674; AVX1-LABEL: gt_v16i8:
675; AVX1:       # %bb.0:
676; AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm1
677; AVX1-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
678; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
679; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
680; AVX1-NEXT:    retq
681;
682; AVX2-LABEL: gt_v16i8:
683; AVX2:       # %bb.0:
684; AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm1
685; AVX2-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
686; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
687; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
688; AVX2-NEXT:    retq
689;
690; XOP-LABEL: gt_v16i8:
691; XOP:       # %bb.0:
692; XOP-NEXT:    vpcomgtub %xmm1, %xmm0, %xmm0
693; XOP-NEXT:    retq
694;
695; AVX512-LABEL: gt_v16i8:
696; AVX512:       # %bb.0:
697; AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm1
698; AVX512-NEXT:    vpcmpeqb %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 ugt <16 x i8> %a, %b
704  %2 = sext <16 x i1> %1 to <16 x i8>
705  ret <16 x i8> %2
706}
707
708;
709; Less Than Or Equal
710;
711
712define <2 x i64> @le_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
713; SSE2-LABEL: le_v2i64:
714; SSE2:       # %bb.0:
715; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
716; SSE2-NEXT:    pxor %xmm2, %xmm1
717; SSE2-NEXT:    pxor %xmm2, %xmm0
718; SSE2-NEXT:    movdqa %xmm0, %xmm2
719; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
720; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
721; SSE2-NEXT:    pcmpeqd %xmm1, %xmm0
722; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
723; SSE2-NEXT:    pand %xmm3, %xmm0
724; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
725; SSE2-NEXT:    por %xmm0, %xmm1
726; SSE2-NEXT:    pcmpeqd %xmm0, %xmm0
727; SSE2-NEXT:    pxor %xmm1, %xmm0
728; SSE2-NEXT:    retq
729;
730; SSE41-LABEL: le_v2i64:
731; SSE41:       # %bb.0:
732; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
733; SSE41-NEXT:    pxor %xmm2, %xmm1
734; SSE41-NEXT:    pxor %xmm2, %xmm0
735; SSE41-NEXT:    movdqa %xmm0, %xmm2
736; SSE41-NEXT:    pcmpgtd %xmm1, %xmm2
737; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
738; SSE41-NEXT:    pcmpeqd %xmm1, %xmm0
739; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
740; SSE41-NEXT:    pand %xmm3, %xmm0
741; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
742; SSE41-NEXT:    por %xmm0, %xmm1
743; SSE41-NEXT:    pcmpeqd %xmm0, %xmm0
744; SSE41-NEXT:    pxor %xmm1, %xmm0
745; SSE41-NEXT:    retq
746;
747; SSE42-LABEL: le_v2i64:
748; SSE42:       # %bb.0:
749; SSE42-NEXT:    movdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
750; SSE42-NEXT:    pxor %xmm2, %xmm1
751; SSE42-NEXT:    pxor %xmm2, %xmm0
752; SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
753; SSE42-NEXT:    pcmpeqd %xmm1, %xmm1
754; SSE42-NEXT:    pxor %xmm1, %xmm0
755; SSE42-NEXT:    retq
756;
757; AVX1-LABEL: le_v2i64:
758; AVX1:       # %bb.0:
759; AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
760; AVX1-NEXT:    # xmm2 = mem[0,0]
761; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm1
762; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
763; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0
764; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
765; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
766; AVX1-NEXT:    retq
767;
768; AVX2-LABEL: le_v2i64:
769; AVX2:       # %bb.0:
770; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
771; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm1
772; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm0
773; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0
774; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
775; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
776; AVX2-NEXT:    retq
777;
778; XOP-LABEL: le_v2i64:
779; XOP:       # %bb.0:
780; XOP-NEXT:    vpcomleuq %xmm1, %xmm0, %xmm0
781; XOP-NEXT:    retq
782;
783; AVX512-LABEL: le_v2i64:
784; AVX512:       # %bb.0:
785; AVX512-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
786; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
787; AVX512-NEXT:    vpminuq %zmm1, %zmm0, %zmm1
788; AVX512-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm0
789; AVX512-NEXT:    vzeroupper
790; AVX512-NEXT:    retq
791  %1 = icmp ule <2 x i64> %a, %b
792  %2 = sext <2 x i1> %1 to <2 x i64>
793  ret <2 x i64> %2
794}
795
796define <4 x i32> @le_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
797; SSE2-LABEL: le_v4i32:
798; SSE2:       # %bb.0:
799; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
800; SSE2-NEXT:    pxor %xmm2, %xmm1
801; SSE2-NEXT:    pxor %xmm2, %xmm0
802; SSE2-NEXT:    pcmpgtd %xmm1, %xmm0
803; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
804; SSE2-NEXT:    pxor %xmm1, %xmm0
805; SSE2-NEXT:    retq
806;
807; SSE41-LABEL: le_v4i32:
808; SSE41:       # %bb.0:
809; SSE41-NEXT:    pminud %xmm0, %xmm1
810; SSE41-NEXT:    pcmpeqd %xmm1, %xmm0
811; SSE41-NEXT:    retq
812;
813; SSE42-LABEL: le_v4i32:
814; SSE42:       # %bb.0:
815; SSE42-NEXT:    pminud %xmm0, %xmm1
816; SSE42-NEXT:    pcmpeqd %xmm1, %xmm0
817; SSE42-NEXT:    retq
818;
819; AVX-LABEL: le_v4i32:
820; AVX:       # %bb.0:
821; AVX-NEXT:    vpminud %xmm1, %xmm0, %xmm1
822; AVX-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
823; AVX-NEXT:    retq
824;
825; XOP-LABEL: le_v4i32:
826; XOP:       # %bb.0:
827; XOP-NEXT:    vpcomleud %xmm1, %xmm0, %xmm0
828; XOP-NEXT:    retq
829  %1 = icmp ule <4 x i32> %a, %b
830  %2 = sext <4 x i1> %1 to <4 x i32>
831  ret <4 x i32> %2
832}
833
834define <8 x i16> @le_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
835; SSE2-LABEL: le_v8i16:
836; SSE2:       # %bb.0:
837; SSE2-NEXT:    psubusw %xmm1, %xmm0
838; SSE2-NEXT:    pxor %xmm1, %xmm1
839; SSE2-NEXT:    pcmpeqw %xmm1, %xmm0
840; SSE2-NEXT:    retq
841;
842; SSE41-LABEL: le_v8i16:
843; SSE41:       # %bb.0:
844; SSE41-NEXT:    pminuw %xmm0, %xmm1
845; SSE41-NEXT:    pcmpeqw %xmm1, %xmm0
846; SSE41-NEXT:    retq
847;
848; SSE42-LABEL: le_v8i16:
849; SSE42:       # %bb.0:
850; SSE42-NEXT:    pminuw %xmm0, %xmm1
851; SSE42-NEXT:    pcmpeqw %xmm1, %xmm0
852; SSE42-NEXT:    retq
853;
854; AVX-LABEL: le_v8i16:
855; AVX:       # %bb.0:
856; AVX-NEXT:    vpminuw %xmm1, %xmm0, %xmm1
857; AVX-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm0
858; AVX-NEXT:    retq
859;
860; XOP-LABEL: le_v8i16:
861; XOP:       # %bb.0:
862; XOP-NEXT:    vpcomleuw %xmm1, %xmm0, %xmm0
863; XOP-NEXT:    retq
864  %1 = icmp ule <8 x i16> %a, %b
865  %2 = sext <8 x i1> %1 to <8 x i16>
866  ret <8 x i16> %2
867}
868
869define <16 x i8> @le_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
870; SSE-LABEL: le_v16i8:
871; SSE:       # %bb.0:
872; SSE-NEXT:    pminub %xmm0, %xmm1
873; SSE-NEXT:    pcmpeqb %xmm1, %xmm0
874; SSE-NEXT:    retq
875;
876; AVX-LABEL: le_v16i8:
877; AVX:       # %bb.0:
878; AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm1
879; AVX-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
880; AVX-NEXT:    retq
881;
882; XOP-LABEL: le_v16i8:
883; XOP:       # %bb.0:
884; XOP-NEXT:    vpcomleub %xmm1, %xmm0, %xmm0
885; XOP-NEXT:    retq
886  %1 = icmp ule <16 x i8> %a, %b
887  %2 = sext <16 x i1> %1 to <16 x i8>
888  ret <16 x i8> %2
889}
890
891;
892; Less Than
893;
894
895define <2 x i64> @lt_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
896; SSE2-LABEL: lt_v2i64:
897; SSE2:       # %bb.0:
898; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
899; SSE2-NEXT:    pxor %xmm2, %xmm0
900; SSE2-NEXT:    pxor %xmm2, %xmm1
901; SSE2-NEXT:    movdqa %xmm1, %xmm2
902; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
903; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
904; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
905; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
906; SSE2-NEXT:    pand %xmm3, %xmm1
907; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
908; SSE2-NEXT:    por %xmm1, %xmm0
909; SSE2-NEXT:    retq
910;
911; SSE41-LABEL: lt_v2i64:
912; SSE41:       # %bb.0:
913; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
914; SSE41-NEXT:    pxor %xmm2, %xmm0
915; SSE41-NEXT:    pxor %xmm2, %xmm1
916; SSE41-NEXT:    movdqa %xmm1, %xmm2
917; SSE41-NEXT:    pcmpgtd %xmm0, %xmm2
918; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
919; SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
920; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
921; SSE41-NEXT:    pand %xmm3, %xmm1
922; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
923; SSE41-NEXT:    por %xmm1, %xmm0
924; SSE41-NEXT:    retq
925;
926; SSE42-LABEL: lt_v2i64:
927; SSE42:       # %bb.0:
928; SSE42-NEXT:    movdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
929; SSE42-NEXT:    pxor %xmm2, %xmm0
930; SSE42-NEXT:    pxor %xmm1, %xmm2
931; SSE42-NEXT:    pcmpgtq %xmm0, %xmm2
932; SSE42-NEXT:    movdqa %xmm2, %xmm0
933; SSE42-NEXT:    retq
934;
935; AVX1-LABEL: lt_v2i64:
936; AVX1:       # %bb.0:
937; AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
938; AVX1-NEXT:    # xmm2 = mem[0,0]
939; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
940; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm1
941; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm0
942; AVX1-NEXT:    retq
943;
944; AVX2-LABEL: lt_v2i64:
945; AVX2:       # %bb.0:
946; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
947; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm0
948; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm1
949; AVX2-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm0
950; AVX2-NEXT:    retq
951;
952; XOP-LABEL: lt_v2i64:
953; XOP:       # %bb.0:
954; XOP-NEXT:    vpcomltuq %xmm1, %xmm0, %xmm0
955; XOP-NEXT:    retq
956;
957; AVX512-LABEL: lt_v2i64:
958; AVX512:       # %bb.0:
959; AVX512-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
960; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
961; AVX512-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm1
962; AVX512-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm0
963; AVX512-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
964; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
965; AVX512-NEXT:    vzeroupper
966; AVX512-NEXT:    retq
967  %1 = icmp ult <2 x i64> %a, %b
968  %2 = sext <2 x i1> %1 to <2 x i64>
969  ret <2 x i64> %2
970}
971
972define <4 x i32> @lt_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
973; SSE2-LABEL: lt_v4i32:
974; SSE2:       # %bb.0:
975; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
976; SSE2-NEXT:    pxor %xmm2, %xmm0
977; SSE2-NEXT:    pxor %xmm1, %xmm2
978; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
979; SSE2-NEXT:    movdqa %xmm2, %xmm0
980; SSE2-NEXT:    retq
981;
982; SSE41-LABEL: lt_v4i32:
983; SSE41:       # %bb.0:
984; SSE41-NEXT:    pmaxud %xmm0, %xmm1
985; SSE41-NEXT:    pcmpeqd %xmm1, %xmm0
986; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
987; SSE41-NEXT:    pxor %xmm1, %xmm0
988; SSE41-NEXT:    retq
989;
990; SSE42-LABEL: lt_v4i32:
991; SSE42:       # %bb.0:
992; SSE42-NEXT:    pmaxud %xmm0, %xmm1
993; SSE42-NEXT:    pcmpeqd %xmm1, %xmm0
994; SSE42-NEXT:    pcmpeqd %xmm1, %xmm1
995; SSE42-NEXT:    pxor %xmm1, %xmm0
996; SSE42-NEXT:    retq
997;
998; AVX1-LABEL: lt_v4i32:
999; AVX1:       # %bb.0:
1000; AVX1-NEXT:    vpmaxud %xmm1, %xmm0, %xmm1
1001; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
1002; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1003; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1004; AVX1-NEXT:    retq
1005;
1006; AVX2-LABEL: lt_v4i32:
1007; AVX2:       # %bb.0:
1008; AVX2-NEXT:    vpmaxud %xmm1, %xmm0, %xmm1
1009; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
1010; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1011; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1012; AVX2-NEXT:    retq
1013;
1014; XOP-LABEL: lt_v4i32:
1015; XOP:       # %bb.0:
1016; XOP-NEXT:    vpcomltud %xmm1, %xmm0, %xmm0
1017; XOP-NEXT:    retq
1018;
1019; AVX512-LABEL: lt_v4i32:
1020; AVX512:       # %bb.0:
1021; AVX512-NEXT:    vpmaxud %xmm1, %xmm0, %xmm1
1022; AVX512-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
1023; AVX512-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
1024; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1025; AVX512-NEXT:    vzeroupper
1026; AVX512-NEXT:    retq
1027  %1 = icmp ult <4 x i32> %a, %b
1028  %2 = sext <4 x i1> %1 to <4 x i32>
1029  ret <4 x i32> %2
1030}
1031
1032define <8 x i16> @lt_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
1033; SSE2-LABEL: lt_v8i16:
1034; SSE2:       # %bb.0:
1035; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
1036; SSE2-NEXT:    pxor %xmm2, %xmm0
1037; SSE2-NEXT:    pxor %xmm1, %xmm2
1038; SSE2-NEXT:    pcmpgtw %xmm0, %xmm2
1039; SSE2-NEXT:    movdqa %xmm2, %xmm0
1040; SSE2-NEXT:    retq
1041;
1042; SSE41-LABEL: lt_v8i16:
1043; SSE41:       # %bb.0:
1044; SSE41-NEXT:    pmaxuw %xmm0, %xmm1
1045; SSE41-NEXT:    pcmpeqw %xmm1, %xmm0
1046; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
1047; SSE41-NEXT:    pxor %xmm1, %xmm0
1048; SSE41-NEXT:    retq
1049;
1050; SSE42-LABEL: lt_v8i16:
1051; SSE42:       # %bb.0:
1052; SSE42-NEXT:    pmaxuw %xmm0, %xmm1
1053; SSE42-NEXT:    pcmpeqw %xmm1, %xmm0
1054; SSE42-NEXT:    pcmpeqd %xmm1, %xmm1
1055; SSE42-NEXT:    pxor %xmm1, %xmm0
1056; SSE42-NEXT:    retq
1057;
1058; AVX1-LABEL: lt_v8i16:
1059; AVX1:       # %bb.0:
1060; AVX1-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm1
1061; AVX1-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm0
1062; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1063; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1064; AVX1-NEXT:    retq
1065;
1066; AVX2-LABEL: lt_v8i16:
1067; AVX2:       # %bb.0:
1068; AVX2-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm1
1069; AVX2-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm0
1070; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1071; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1072; AVX2-NEXT:    retq
1073;
1074; XOP-LABEL: lt_v8i16:
1075; XOP:       # %bb.0:
1076; XOP-NEXT:    vpcomltuw %xmm1, %xmm0, %xmm0
1077; XOP-NEXT:    retq
1078;
1079; AVX512-LABEL: lt_v8i16:
1080; AVX512:       # %bb.0:
1081; AVX512-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm1
1082; AVX512-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm0
1083; AVX512-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
1084; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1085; AVX512-NEXT:    vzeroupper
1086; AVX512-NEXT:    retq
1087  %1 = icmp ult <8 x i16> %a, %b
1088  %2 = sext <8 x i1> %1 to <8 x i16>
1089  ret <8 x i16> %2
1090}
1091
1092define <16 x i8> @lt_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
1093; SSE-LABEL: lt_v16i8:
1094; SSE:       # %bb.0:
1095; SSE-NEXT:    pmaxub %xmm0, %xmm1
1096; SSE-NEXT:    pcmpeqb %xmm1, %xmm0
1097; SSE-NEXT:    pcmpeqd %xmm1, %xmm1
1098; SSE-NEXT:    pxor %xmm1, %xmm0
1099; SSE-NEXT:    retq
1100;
1101; AVX1-LABEL: lt_v16i8:
1102; AVX1:       # %bb.0:
1103; AVX1-NEXT:    vpmaxub %xmm1, %xmm0, %xmm1
1104; AVX1-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
1105; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1106; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1107; AVX1-NEXT:    retq
1108;
1109; AVX2-LABEL: lt_v16i8:
1110; AVX2:       # %bb.0:
1111; AVX2-NEXT:    vpmaxub %xmm1, %xmm0, %xmm1
1112; AVX2-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
1113; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1114; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1115; AVX2-NEXT:    retq
1116;
1117; XOP-LABEL: lt_v16i8:
1118; XOP:       # %bb.0:
1119; XOP-NEXT:    vpcomltub %xmm1, %xmm0, %xmm0
1120; XOP-NEXT:    retq
1121;
1122; AVX512-LABEL: lt_v16i8:
1123; AVX512:       # %bb.0:
1124; AVX512-NEXT:    vpmaxub %xmm1, %xmm0, %xmm1
1125; AVX512-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
1126; AVX512-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
1127; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1128; AVX512-NEXT:    vzeroupper
1129; AVX512-NEXT:    retq
1130  %1 = icmp ult <16 x i8> %a, %b
1131  %2 = sext <16 x i1> %1 to <16 x i8>
1132  ret <16 x i8> %2
1133}
1134