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