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
16 define <2 x i64> @eq_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
17 ; SSE2-LABEL: eq_v2i64:
19 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm0
20 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]
21 ; SSE2-NEXT: pand %xmm1, %xmm0
24 ; SSE41-LABEL: eq_v2i64:
26 ; SSE41-NEXT: pcmpeqq %xmm1, %xmm0
29 ; SSE42-LABEL: eq_v2i64:
31 ; SSE42-NEXT: pcmpeqq %xmm1, %xmm0
34 ; AVX-LABEL: eq_v2i64:
36 ; AVX-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
39 ; XOP-LABEL: eq_v2i64:
41 ; XOP-NEXT: vpcomeqq %xmm1, %xmm0, %xmm0
43 %1 = icmp eq <2 x i64> %a, %b
44 %2 = sext <2 x i1> %1 to <2 x i64>
48 define <4 x i32> @eq_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
49 ; SSE-LABEL: eq_v4i32:
51 ; SSE-NEXT: pcmpeqd %xmm1, %xmm0
54 ; AVX-LABEL: eq_v4i32:
56 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
59 ; XOP-LABEL: eq_v4i32:
61 ; XOP-NEXT: vpcomeqd %xmm1, %xmm0, %xmm0
63 %1 = icmp eq <4 x i32> %a, %b
64 %2 = sext <4 x i1> %1 to <4 x i32>
68 define <8 x i16> @eq_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
69 ; SSE-LABEL: eq_v8i16:
71 ; SSE-NEXT: pcmpeqw %xmm1, %xmm0
74 ; AVX-LABEL: eq_v8i16:
76 ; AVX-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0
79 ; XOP-LABEL: eq_v8i16:
81 ; XOP-NEXT: vpcomeqw %xmm1, %xmm0, %xmm0
83 %1 = icmp eq <8 x i16> %a, %b
84 %2 = sext <8 x i1> %1 to <8 x i16>
88 define <16 x i8> @eq_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
89 ; SSE-LABEL: eq_v16i8:
91 ; SSE-NEXT: pcmpeqb %xmm1, %xmm0
94 ; AVX-LABEL: eq_v16i8:
96 ; AVX-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
99 ; XOP-LABEL: eq_v16i8:
101 ; XOP-NEXT: vpcomeqb %xmm1, %xmm0, %xmm0
103 %1 = icmp eq <16 x i8> %a, %b
104 %2 = sext <16 x i1> %1 to <16 x i8>
112 define <2 x i64> @ne_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
113 ; SSE2-LABEL: ne_v2i64:
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
122 ; SSE41-LABEL: ne_v2i64:
124 ; SSE41-NEXT: pcmpeqq %xmm1, %xmm0
125 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
126 ; SSE41-NEXT: pxor %xmm1, %xmm0
129 ; SSE42-LABEL: ne_v2i64:
131 ; SSE42-NEXT: pcmpeqq %xmm1, %xmm0
132 ; SSE42-NEXT: pcmpeqd %xmm1, %xmm1
133 ; SSE42-NEXT: pxor %xmm1, %xmm0
136 ; AVX-LABEL: ne_v2i64:
138 ; AVX-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
139 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
140 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
143 ; XOP-LABEL: ne_v2i64:
145 ; XOP-NEXT: vpcomneqq %xmm1, %xmm0, %xmm0
147 %1 = icmp ne <2 x i64> %a, %b
148 %2 = sext <2 x i1> %1 to <2 x i64>
152 define <4 x i32> @ne_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
153 ; SSE-LABEL: ne_v4i32:
155 ; SSE-NEXT: pcmpeqd %xmm1, %xmm0
156 ; SSE-NEXT: pcmpeqd %xmm1, %xmm1
157 ; SSE-NEXT: pxor %xmm1, %xmm0
160 ; AVX-LABEL: ne_v4i32:
162 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
163 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
164 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
167 ; XOP-LABEL: ne_v4i32:
169 ; XOP-NEXT: vpcomneqd %xmm1, %xmm0, %xmm0
171 %1 = icmp ne <4 x i32> %a, %b
172 %2 = sext <4 x i1> %1 to <4 x i32>
176 define <8 x i16> @ne_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
177 ; SSE-LABEL: ne_v8i16:
179 ; SSE-NEXT: pcmpeqw %xmm1, %xmm0
180 ; SSE-NEXT: pcmpeqd %xmm1, %xmm1
181 ; SSE-NEXT: pxor %xmm1, %xmm0
184 ; AVX-LABEL: ne_v8i16:
186 ; AVX-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0
187 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
188 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
191 ; XOP-LABEL: ne_v8i16:
193 ; XOP-NEXT: vpcomneqw %xmm1, %xmm0, %xmm0
195 %1 = icmp ne <8 x i16> %a, %b
196 %2 = sext <8 x i1> %1 to <8 x i16>
200 define <16 x i8> @ne_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
201 ; SSE-LABEL: ne_v16i8:
203 ; SSE-NEXT: pcmpeqb %xmm1, %xmm0
204 ; SSE-NEXT: pcmpeqd %xmm1, %xmm1
205 ; SSE-NEXT: pxor %xmm1, %xmm0
208 ; AVX-LABEL: ne_v16i8:
210 ; AVX-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
211 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
212 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
215 ; XOP-LABEL: ne_v16i8:
217 ; XOP-NEXT: vpcomneqb %xmm1, %xmm0, %xmm0
219 %1 = icmp ne <16 x i8> %a, %b
220 %2 = sext <16 x i1> %1 to <16 x i8>
225 ; Greater Than Or Equal
228 define <2 x i64> @ge_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
229 ; SSE2-LABEL: ge_v2i64:
231 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
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
246 ; SSE41-LABEL: ge_v2i64:
248 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
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
263 ; SSE42-LABEL: ge_v2i64:
265 ; SSE42-NEXT: movdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
266 ; SSE42-NEXT: pxor %xmm2, %xmm0
267 ; SSE42-NEXT: pxor %xmm1, %xmm2
268 ; SSE42-NEXT: pcmpgtq %xmm0, %xmm2
269 ; SSE42-NEXT: pcmpeqd %xmm0, %xmm0
270 ; SSE42-NEXT: pxor %xmm2, %xmm0
273 ; AVX-LABEL: ge_v2i64:
275 ; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
276 ; AVX-NEXT: vpxor %xmm2, %xmm0, %xmm0
277 ; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm1
278 ; AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm0
279 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
280 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
283 ; XOP-LABEL: ge_v2i64:
285 ; XOP-NEXT: vpcomgeuq %xmm1, %xmm0, %xmm0
287 %1 = icmp uge <2 x i64> %a, %b
288 %2 = sext <2 x i1> %1 to <2 x i64>
292 define <4 x i32> @ge_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
293 ; SSE2-LABEL: ge_v4i32:
295 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
296 ; SSE2-NEXT: pxor %xmm2, %xmm0
297 ; SSE2-NEXT: pxor %xmm1, %xmm2
298 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
299 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0
300 ; SSE2-NEXT: pxor %xmm2, %xmm0
303 ; SSE41-LABEL: ge_v4i32:
305 ; SSE41-NEXT: pmaxud %xmm0, %xmm1
306 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm0
309 ; SSE42-LABEL: ge_v4i32:
311 ; SSE42-NEXT: pmaxud %xmm0, %xmm1
312 ; SSE42-NEXT: pcmpeqd %xmm1, %xmm0
315 ; AVX-LABEL: ge_v4i32:
317 ; AVX-NEXT: vpmaxud %xmm1, %xmm0, %xmm1
318 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
321 ; XOP-LABEL: ge_v4i32:
323 ; XOP-NEXT: vpcomgeud %xmm1, %xmm0, %xmm0
325 %1 = icmp uge <4 x i32> %a, %b
326 %2 = sext <4 x i1> %1 to <4 x i32>
330 define <8 x i16> @ge_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
331 ; SSE2-LABEL: ge_v8i16:
333 ; SSE2-NEXT: psubusw %xmm0, %xmm1
334 ; SSE2-NEXT: pxor %xmm0, %xmm0
335 ; SSE2-NEXT: pcmpeqw %xmm1, %xmm0
338 ; SSE41-LABEL: ge_v8i16:
340 ; SSE41-NEXT: pmaxuw %xmm0, %xmm1
341 ; SSE41-NEXT: pcmpeqw %xmm1, %xmm0
344 ; SSE42-LABEL: ge_v8i16:
346 ; SSE42-NEXT: pmaxuw %xmm0, %xmm1
347 ; SSE42-NEXT: pcmpeqw %xmm1, %xmm0
350 ; AVX-LABEL: ge_v8i16:
352 ; AVX-NEXT: vpmaxuw %xmm1, %xmm0, %xmm1
353 ; AVX-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0
356 ; XOP-LABEL: ge_v8i16:
358 ; XOP-NEXT: vpcomgeuw %xmm1, %xmm0, %xmm0
360 %1 = icmp uge <8 x i16> %a, %b
361 %2 = sext <8 x i1> %1 to <8 x i16>
365 define <16 x i8> @ge_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
366 ; SSE-LABEL: ge_v16i8:
368 ; SSE-NEXT: pmaxub %xmm0, %xmm1
369 ; SSE-NEXT: pcmpeqb %xmm1, %xmm0
372 ; AVX-LABEL: ge_v16i8:
374 ; AVX-NEXT: vpmaxub %xmm1, %xmm0, %xmm1
375 ; AVX-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
378 ; XOP-LABEL: ge_v16i8:
380 ; XOP-NEXT: vpcomgeub %xmm1, %xmm0, %xmm0
382 %1 = icmp uge <16 x i8> %a, %b
383 %2 = sext <16 x i1> %1 to <16 x i8>
391 define <2 x i64> @gt_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
392 ; SSE2-LABEL: gt_v2i64:
394 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
395 ; SSE2-NEXT: pxor %xmm2, %xmm1
396 ; SSE2-NEXT: pxor %xmm2, %xmm0
397 ; SSE2-NEXT: movdqa %xmm0, %xmm2
398 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
399 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
400 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm0
401 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
402 ; SSE2-NEXT: pand %xmm3, %xmm1
403 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
404 ; SSE2-NEXT: por %xmm1, %xmm0
407 ; SSE41-LABEL: gt_v2i64:
409 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
410 ; SSE41-NEXT: pxor %xmm2, %xmm1
411 ; SSE41-NEXT: pxor %xmm2, %xmm0
412 ; SSE41-NEXT: movdqa %xmm0, %xmm2
413 ; SSE41-NEXT: pcmpgtd %xmm1, %xmm2
414 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
415 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm0
416 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
417 ; SSE41-NEXT: pand %xmm3, %xmm1
418 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
419 ; SSE41-NEXT: por %xmm1, %xmm0
422 ; SSE42-LABEL: gt_v2i64:
424 ; SSE42-NEXT: movdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
425 ; SSE42-NEXT: pxor %xmm2, %xmm1
426 ; SSE42-NEXT: pxor %xmm2, %xmm0
427 ; SSE42-NEXT: pcmpgtq %xmm1, %xmm0
430 ; AVX-LABEL: gt_v2i64:
432 ; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
433 ; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm1
434 ; AVX-NEXT: vpxor %xmm2, %xmm0, %xmm0
435 ; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0
438 ; XOP-LABEL: gt_v2i64:
440 ; XOP-NEXT: vpcomgtuq %xmm1, %xmm0, %xmm0
442 %1 = icmp ugt <2 x i64> %a, %b
443 %2 = sext <2 x i1> %1 to <2 x i64>
447 define <4 x i32> @gt_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
448 ; SSE-LABEL: gt_v4i32:
450 ; SSE-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
451 ; SSE-NEXT: pxor %xmm2, %xmm1
452 ; SSE-NEXT: pxor %xmm2, %xmm0
453 ; SSE-NEXT: pcmpgtd %xmm1, %xmm0
456 ; AVX1-LABEL: gt_v4i32:
458 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
459 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1
460 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
461 ; AVX1-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0
464 ; AVX2-LABEL: gt_v4i32:
466 ; AVX2-NEXT: vpbroadcastd {{.*}}(%rip), %xmm2
467 ; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1
468 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
469 ; AVX2-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0
472 ; XOP-LABEL: gt_v4i32:
474 ; XOP-NEXT: vpcomgtud %xmm1, %xmm0, %xmm0
477 ; AVX512-LABEL: gt_v4i32:
479 ; AVX512-NEXT: vpbroadcastd {{.*}}(%rip), %xmm2
480 ; AVX512-NEXT: vpxor %xmm2, %xmm1, %xmm1
481 ; AVX512-NEXT: vpxor %xmm2, %xmm0, %xmm0
482 ; AVX512-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0
484 %1 = icmp ugt <4 x i32> %a, %b
485 %2 = sext <4 x i1> %1 to <4 x i32>
489 define <8 x i16> @gt_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
490 ; SSE-LABEL: gt_v8i16:
492 ; SSE-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
493 ; SSE-NEXT: pxor %xmm2, %xmm1
494 ; SSE-NEXT: pxor %xmm2, %xmm0
495 ; SSE-NEXT: pcmpgtw %xmm1, %xmm0
498 ; AVX-LABEL: gt_v8i16:
500 ; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
501 ; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm1
502 ; AVX-NEXT: vpxor %xmm2, %xmm0, %xmm0
503 ; AVX-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm0
506 ; XOP-LABEL: gt_v8i16:
508 ; XOP-NEXT: vpcomgtuw %xmm1, %xmm0, %xmm0
510 %1 = icmp ugt <8 x i16> %a, %b
511 %2 = sext <8 x i1> %1 to <8 x i16>
515 define <16 x i8> @gt_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
516 ; SSE-LABEL: gt_v16i8:
518 ; SSE-NEXT: movdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
519 ; SSE-NEXT: pxor %xmm2, %xmm1
520 ; SSE-NEXT: pxor %xmm2, %xmm0
521 ; SSE-NEXT: pcmpgtb %xmm1, %xmm0
524 ; AVX-LABEL: gt_v16i8:
526 ; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
527 ; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm1
528 ; AVX-NEXT: vpxor %xmm2, %xmm0, %xmm0
529 ; AVX-NEXT: vpcmpgtb %xmm1, %xmm0, %xmm0
532 ; XOP-LABEL: gt_v16i8:
534 ; XOP-NEXT: vpcomgtub %xmm1, %xmm0, %xmm0
536 %1 = icmp ugt <16 x i8> %a, %b
537 %2 = sext <16 x i1> %1 to <16 x i8>
545 define <2 x i64> @le_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
546 ; SSE2-LABEL: le_v2i64:
548 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
549 ; SSE2-NEXT: pxor %xmm2, %xmm1
550 ; SSE2-NEXT: pxor %xmm2, %xmm0
551 ; SSE2-NEXT: movdqa %xmm0, %xmm2
552 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
553 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
554 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm0
555 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
556 ; SSE2-NEXT: pand %xmm3, %xmm0
557 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
558 ; SSE2-NEXT: por %xmm0, %xmm1
559 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0
560 ; SSE2-NEXT: pxor %xmm1, %xmm0
563 ; SSE41-LABEL: le_v2i64:
565 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
566 ; SSE41-NEXT: pxor %xmm2, %xmm1
567 ; SSE41-NEXT: pxor %xmm2, %xmm0
568 ; SSE41-NEXT: movdqa %xmm0, %xmm2
569 ; SSE41-NEXT: pcmpgtd %xmm1, %xmm2
570 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
571 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm0
572 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
573 ; SSE41-NEXT: pand %xmm3, %xmm0
574 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
575 ; SSE41-NEXT: por %xmm0, %xmm1
576 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm0
577 ; SSE41-NEXT: pxor %xmm1, %xmm0
580 ; SSE42-LABEL: le_v2i64:
582 ; SSE42-NEXT: movdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
583 ; SSE42-NEXT: pxor %xmm2, %xmm1
584 ; SSE42-NEXT: pxor %xmm2, %xmm0
585 ; SSE42-NEXT: pcmpgtq %xmm1, %xmm0
586 ; SSE42-NEXT: pcmpeqd %xmm1, %xmm1
587 ; SSE42-NEXT: pxor %xmm1, %xmm0
590 ; AVX-LABEL: le_v2i64:
592 ; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
593 ; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm1
594 ; AVX-NEXT: vpxor %xmm2, %xmm0, %xmm0
595 ; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0
596 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
597 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
600 ; XOP-LABEL: le_v2i64:
602 ; XOP-NEXT: vpcomleuq %xmm1, %xmm0, %xmm0
604 %1 = icmp ule <2 x i64> %a, %b
605 %2 = sext <2 x i1> %1 to <2 x i64>
609 define <4 x i32> @le_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
610 ; SSE2-LABEL: le_v4i32:
612 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
613 ; SSE2-NEXT: pxor %xmm2, %xmm1
614 ; SSE2-NEXT: pxor %xmm2, %xmm0
615 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm0
616 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
617 ; SSE2-NEXT: pxor %xmm1, %xmm0
620 ; SSE41-LABEL: le_v4i32:
622 ; SSE41-NEXT: pminud %xmm0, %xmm1
623 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm0
626 ; SSE42-LABEL: le_v4i32:
628 ; SSE42-NEXT: pminud %xmm0, %xmm1
629 ; SSE42-NEXT: pcmpeqd %xmm1, %xmm0
632 ; AVX-LABEL: le_v4i32:
634 ; AVX-NEXT: vpminud %xmm1, %xmm0, %xmm1
635 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
638 ; XOP-LABEL: le_v4i32:
640 ; XOP-NEXT: vpcomleud %xmm1, %xmm0, %xmm0
642 %1 = icmp ule <4 x i32> %a, %b
643 %2 = sext <4 x i1> %1 to <4 x i32>
647 define <8 x i16> @le_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
648 ; SSE2-LABEL: le_v8i16:
650 ; SSE2-NEXT: psubusw %xmm1, %xmm0
651 ; SSE2-NEXT: pxor %xmm1, %xmm1
652 ; SSE2-NEXT: pcmpeqw %xmm1, %xmm0
655 ; SSE41-LABEL: le_v8i16:
657 ; SSE41-NEXT: pminuw %xmm0, %xmm1
658 ; SSE41-NEXT: pcmpeqw %xmm1, %xmm0
661 ; SSE42-LABEL: le_v8i16:
663 ; SSE42-NEXT: pminuw %xmm0, %xmm1
664 ; SSE42-NEXT: pcmpeqw %xmm1, %xmm0
667 ; AVX-LABEL: le_v8i16:
669 ; AVX-NEXT: vpminuw %xmm1, %xmm0, %xmm1
670 ; AVX-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0
673 ; XOP-LABEL: le_v8i16:
675 ; XOP-NEXT: vpcomleuw %xmm1, %xmm0, %xmm0
677 %1 = icmp ule <8 x i16> %a, %b
678 %2 = sext <8 x i1> %1 to <8 x i16>
682 define <16 x i8> @le_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
683 ; SSE-LABEL: le_v16i8:
685 ; SSE-NEXT: pminub %xmm0, %xmm1
686 ; SSE-NEXT: pcmpeqb %xmm1, %xmm0
689 ; AVX-LABEL: le_v16i8:
691 ; AVX-NEXT: vpminub %xmm1, %xmm0, %xmm1
692 ; AVX-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
695 ; XOP-LABEL: le_v16i8:
697 ; XOP-NEXT: vpcomleub %xmm1, %xmm0, %xmm0
699 %1 = icmp ule <16 x i8> %a, %b
700 %2 = sext <16 x i1> %1 to <16 x i8>
708 define <2 x i64> @lt_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
709 ; SSE2-LABEL: lt_v2i64:
711 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
712 ; SSE2-NEXT: pxor %xmm2, %xmm0
713 ; SSE2-NEXT: pxor %xmm2, %xmm1
714 ; SSE2-NEXT: movdqa %xmm1, %xmm2
715 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
716 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
717 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
718 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
719 ; SSE2-NEXT: pand %xmm3, %xmm1
720 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
721 ; SSE2-NEXT: por %xmm1, %xmm0
724 ; SSE41-LABEL: lt_v2i64:
726 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
727 ; SSE41-NEXT: pxor %xmm2, %xmm0
728 ; SSE41-NEXT: pxor %xmm2, %xmm1
729 ; SSE41-NEXT: movdqa %xmm1, %xmm2
730 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm2
731 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
732 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm1
733 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
734 ; SSE41-NEXT: pand %xmm3, %xmm1
735 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
736 ; SSE41-NEXT: por %xmm1, %xmm0
739 ; SSE42-LABEL: lt_v2i64:
741 ; SSE42-NEXT: movdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
742 ; SSE42-NEXT: pxor %xmm2, %xmm0
743 ; SSE42-NEXT: pxor %xmm1, %xmm2
744 ; SSE42-NEXT: pcmpgtq %xmm0, %xmm2
745 ; SSE42-NEXT: movdqa %xmm2, %xmm0
748 ; AVX-LABEL: lt_v2i64:
750 ; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
751 ; AVX-NEXT: vpxor %xmm2, %xmm0, %xmm0
752 ; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm1
753 ; AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm0
756 ; XOP-LABEL: lt_v2i64:
758 ; XOP-NEXT: vpcomltuq %xmm1, %xmm0, %xmm0
760 %1 = icmp ult <2 x i64> %a, %b
761 %2 = sext <2 x i1> %1 to <2 x i64>
765 define <4 x i32> @lt_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
766 ; SSE-LABEL: lt_v4i32:
768 ; SSE-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
769 ; SSE-NEXT: pxor %xmm2, %xmm0
770 ; SSE-NEXT: pxor %xmm1, %xmm2
771 ; SSE-NEXT: pcmpgtd %xmm0, %xmm2
772 ; SSE-NEXT: movdqa %xmm2, %xmm0
775 ; AVX1-LABEL: lt_v4i32:
777 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
778 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
779 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1
780 ; AVX1-NEXT: vpcmpgtd %xmm0, %xmm1, %xmm0
783 ; AVX2-LABEL: lt_v4i32:
785 ; AVX2-NEXT: vpbroadcastd {{.*}}(%rip), %xmm2
786 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
787 ; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1
788 ; AVX2-NEXT: vpcmpgtd %xmm0, %xmm1, %xmm0
791 ; XOP-LABEL: lt_v4i32:
793 ; XOP-NEXT: vpcomltud %xmm1, %xmm0, %xmm0
796 ; AVX512-LABEL: lt_v4i32:
798 ; AVX512-NEXT: vpbroadcastd {{.*}}(%rip), %xmm2
799 ; AVX512-NEXT: vpxor %xmm2, %xmm0, %xmm0
800 ; AVX512-NEXT: vpxor %xmm2, %xmm1, %xmm1
801 ; AVX512-NEXT: vpcmpgtd %xmm0, %xmm1, %xmm0
803 %1 = icmp ult <4 x i32> %a, %b
804 %2 = sext <4 x i1> %1 to <4 x i32>
808 define <8 x i16> @lt_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
809 ; SSE-LABEL: lt_v8i16:
811 ; SSE-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
812 ; SSE-NEXT: pxor %xmm2, %xmm0
813 ; SSE-NEXT: pxor %xmm1, %xmm2
814 ; SSE-NEXT: pcmpgtw %xmm0, %xmm2
815 ; SSE-NEXT: movdqa %xmm2, %xmm0
818 ; AVX-LABEL: lt_v8i16:
820 ; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
821 ; AVX-NEXT: vpxor %xmm2, %xmm0, %xmm0
822 ; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm1
823 ; AVX-NEXT: vpcmpgtw %xmm0, %xmm1, %xmm0
826 ; XOP-LABEL: lt_v8i16:
828 ; XOP-NEXT: vpcomltuw %xmm1, %xmm0, %xmm0
830 %1 = icmp ult <8 x i16> %a, %b
831 %2 = sext <8 x i1> %1 to <8 x i16>
835 define <16 x i8> @lt_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
836 ; SSE-LABEL: lt_v16i8:
838 ; SSE-NEXT: movdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
839 ; SSE-NEXT: pxor %xmm2, %xmm0
840 ; SSE-NEXT: pxor %xmm1, %xmm2
841 ; SSE-NEXT: pcmpgtb %xmm0, %xmm2
842 ; SSE-NEXT: movdqa %xmm2, %xmm0
845 ; AVX-LABEL: lt_v16i8:
847 ; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
848 ; AVX-NEXT: vpxor %xmm2, %xmm0, %xmm0
849 ; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm1
850 ; AVX-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm0
853 ; XOP-LABEL: lt_v16i8:
855 ; XOP-NEXT: vpcomltub %xmm1, %xmm0, %xmm0
857 %1 = icmp ult <16 x i8> %a, %b
858 %2 = sext <16 x i1> %1 to <16 x i8>