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