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