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
15 define <2 x i64> @eq_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
16 ; SSE2-LABEL: eq_v2i64:
18 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm0
19 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]
20 ; SSE2-NEXT: pand %xmm1, %xmm0
23 ; SSE41-LABEL: eq_v2i64:
25 ; SSE41-NEXT: pcmpeqq %xmm1, %xmm0
28 ; SSE42-LABEL: eq_v2i64:
30 ; SSE42-NEXT: pcmpeqq %xmm1, %xmm0
33 ; AVX-LABEL: eq_v2i64:
35 ; AVX-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
38 ; XOP-LABEL: eq_v2i64:
40 ; XOP-NEXT: vpcomeqq %xmm1, %xmm0, %xmm0
42 %1 = icmp eq <2 x i64> %a, %b
43 %2 = sext <2 x i1> %1 to <2 x i64>
47 define <4 x i32> @eq_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
48 ; SSE-LABEL: eq_v4i32:
50 ; SSE-NEXT: pcmpeqd %xmm1, %xmm0
53 ; AVX-LABEL: eq_v4i32:
55 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
58 ; XOP-LABEL: eq_v4i32:
60 ; XOP-NEXT: vpcomeqd %xmm1, %xmm0, %xmm0
62 %1 = icmp eq <4 x i32> %a, %b
63 %2 = sext <4 x i1> %1 to <4 x i32>
67 define <8 x i16> @eq_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
68 ; SSE-LABEL: eq_v8i16:
70 ; SSE-NEXT: pcmpeqw %xmm1, %xmm0
73 ; AVX-LABEL: eq_v8i16:
75 ; AVX-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0
78 ; XOP-LABEL: eq_v8i16:
80 ; XOP-NEXT: vpcomeqw %xmm1, %xmm0, %xmm0
82 %1 = icmp eq <8 x i16> %a, %b
83 %2 = sext <8 x i1> %1 to <8 x i16>
87 define <16 x i8> @eq_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
88 ; SSE-LABEL: eq_v16i8:
90 ; SSE-NEXT: pcmpeqb %xmm1, %xmm0
93 ; AVX-LABEL: eq_v16i8:
95 ; AVX-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
98 ; XOP-LABEL: eq_v16i8:
100 ; XOP-NEXT: vpcomeqb %xmm1, %xmm0, %xmm0
102 %1 = icmp eq <16 x i8> %a, %b
103 %2 = sext <16 x i1> %1 to <16 x i8>
111 define <2 x i64> @ne_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
112 ; SSE2-LABEL: ne_v2i64:
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
121 ; SSE41-LABEL: ne_v2i64:
123 ; SSE41-NEXT: pcmpeqq %xmm1, %xmm0
124 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
125 ; SSE41-NEXT: pxor %xmm1, %xmm0
128 ; SSE42-LABEL: ne_v2i64:
130 ; SSE42-NEXT: pcmpeqq %xmm1, %xmm0
131 ; SSE42-NEXT: pcmpeqd %xmm1, %xmm1
132 ; SSE42-NEXT: pxor %xmm1, %xmm0
135 ; AVX-LABEL: ne_v2i64:
137 ; AVX-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
138 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
139 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
142 ; XOP-LABEL: ne_v2i64:
144 ; XOP-NEXT: vpcomneqq %xmm1, %xmm0, %xmm0
146 %1 = icmp ne <2 x i64> %a, %b
147 %2 = sext <2 x i1> %1 to <2 x i64>
151 define <4 x i32> @ne_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
152 ; SSE-LABEL: ne_v4i32:
154 ; SSE-NEXT: pcmpeqd %xmm1, %xmm0
155 ; SSE-NEXT: pcmpeqd %xmm1, %xmm1
156 ; SSE-NEXT: pxor %xmm1, %xmm0
159 ; AVX-LABEL: ne_v4i32:
161 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
162 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
163 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
166 ; XOP-LABEL: ne_v4i32:
168 ; XOP-NEXT: vpcomneqd %xmm1, %xmm0, %xmm0
170 %1 = icmp ne <4 x i32> %a, %b
171 %2 = sext <4 x i1> %1 to <4 x i32>
175 define <8 x i16> @ne_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
176 ; SSE-LABEL: ne_v8i16:
178 ; SSE-NEXT: pcmpeqw %xmm1, %xmm0
179 ; SSE-NEXT: pcmpeqd %xmm1, %xmm1
180 ; SSE-NEXT: pxor %xmm1, %xmm0
183 ; AVX-LABEL: ne_v8i16:
185 ; AVX-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0
186 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
187 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
190 ; XOP-LABEL: ne_v8i16:
192 ; XOP-NEXT: vpcomneqw %xmm1, %xmm0, %xmm0
194 %1 = icmp ne <8 x i16> %a, %b
195 %2 = sext <8 x i1> %1 to <8 x i16>
199 define <16 x i8> @ne_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
200 ; SSE-LABEL: ne_v16i8:
202 ; SSE-NEXT: pcmpeqb %xmm1, %xmm0
203 ; SSE-NEXT: pcmpeqd %xmm1, %xmm1
204 ; SSE-NEXT: pxor %xmm1, %xmm0
207 ; AVX-LABEL: ne_v16i8:
209 ; AVX-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
210 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
211 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
214 ; XOP-LABEL: ne_v16i8:
216 ; XOP-NEXT: vpcomneqb %xmm1, %xmm0, %xmm0
218 %1 = icmp ne <16 x i8> %a, %b
219 %2 = sext <16 x i1> %1 to <16 x i8>
224 ; Greater Than Or Equal
227 define <2 x i64> @ge_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
228 ; SSE2-LABEL: ge_v2i64:
230 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
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
245 ; SSE41-LABEL: ge_v2i64:
247 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
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
262 ; SSE42-LABEL: ge_v2i64:
264 ; SSE42-NEXT: movdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
265 ; SSE42-NEXT: pxor %xmm2, %xmm0
266 ; SSE42-NEXT: pxor %xmm1, %xmm2
267 ; SSE42-NEXT: pcmpgtq %xmm0, %xmm2
268 ; SSE42-NEXT: pcmpeqd %xmm0, %xmm0
269 ; SSE42-NEXT: pxor %xmm2, %xmm0
272 ; AVX-LABEL: ge_v2i64:
274 ; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
275 ; AVX-NEXT: vpxor %xmm2, %xmm0, %xmm0
276 ; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm1
277 ; AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm0
278 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
279 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
282 ; XOP-LABEL: ge_v2i64:
284 ; XOP-NEXT: vpcomgeuq %xmm1, %xmm0, %xmm0
286 %1 = icmp uge <2 x i64> %a, %b
287 %2 = sext <2 x i1> %1 to <2 x i64>
291 define <4 x i32> @ge_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
292 ; SSE2-LABEL: ge_v4i32:
294 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
295 ; SSE2-NEXT: pxor %xmm2, %xmm0
296 ; SSE2-NEXT: pxor %xmm1, %xmm2
297 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
298 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0
299 ; SSE2-NEXT: pxor %xmm2, %xmm0
302 ; SSE41-LABEL: ge_v4i32:
304 ; SSE41-NEXT: pmaxud %xmm0, %xmm1
305 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm0
308 ; SSE42-LABEL: ge_v4i32:
310 ; SSE42-NEXT: pmaxud %xmm0, %xmm1
311 ; SSE42-NEXT: pcmpeqd %xmm1, %xmm0
314 ; AVX-LABEL: ge_v4i32:
316 ; AVX-NEXT: vpmaxud %xmm1, %xmm0, %xmm1
317 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
320 ; XOP-LABEL: ge_v4i32:
322 ; XOP-NEXT: vpcomgeud %xmm1, %xmm0, %xmm0
324 %1 = icmp uge <4 x i32> %a, %b
325 %2 = sext <4 x i1> %1 to <4 x i32>
329 define <8 x i16> @ge_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
330 ; SSE2-LABEL: ge_v8i16:
332 ; SSE2-NEXT: psubusw %xmm0, %xmm1
333 ; SSE2-NEXT: pxor %xmm0, %xmm0
334 ; SSE2-NEXT: pcmpeqw %xmm1, %xmm0
337 ; SSE41-LABEL: ge_v8i16:
339 ; SSE41-NEXT: pmaxuw %xmm0, %xmm1
340 ; SSE41-NEXT: pcmpeqw %xmm1, %xmm0
343 ; SSE42-LABEL: ge_v8i16:
345 ; SSE42-NEXT: pmaxuw %xmm0, %xmm1
346 ; SSE42-NEXT: pcmpeqw %xmm1, %xmm0
349 ; AVX-LABEL: ge_v8i16:
351 ; AVX-NEXT: vpmaxuw %xmm1, %xmm0, %xmm1
352 ; AVX-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0
355 ; XOP-LABEL: ge_v8i16:
357 ; XOP-NEXT: vpcomgeuw %xmm1, %xmm0, %xmm0
359 %1 = icmp uge <8 x i16> %a, %b
360 %2 = sext <8 x i1> %1 to <8 x i16>
364 define <16 x i8> @ge_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
365 ; SSE-LABEL: ge_v16i8:
367 ; SSE-NEXT: pmaxub %xmm0, %xmm1
368 ; SSE-NEXT: pcmpeqb %xmm1, %xmm0
371 ; AVX-LABEL: ge_v16i8:
373 ; AVX-NEXT: vpmaxub %xmm1, %xmm0, %xmm1
374 ; AVX-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
377 ; XOP-LABEL: ge_v16i8:
379 ; XOP-NEXT: vpcomgeub %xmm1, %xmm0, %xmm0
381 %1 = icmp uge <16 x i8> %a, %b
382 %2 = sext <16 x i1> %1 to <16 x i8>
390 define <2 x i64> @gt_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
391 ; SSE2-LABEL: gt_v2i64:
393 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
394 ; SSE2-NEXT: pxor %xmm2, %xmm1
395 ; SSE2-NEXT: pxor %xmm2, %xmm0
396 ; SSE2-NEXT: movdqa %xmm0, %xmm2
397 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
398 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
399 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm0
400 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
401 ; SSE2-NEXT: pand %xmm3, %xmm1
402 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
403 ; SSE2-NEXT: por %xmm1, %xmm0
406 ; SSE41-LABEL: gt_v2i64:
408 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
409 ; SSE41-NEXT: pxor %xmm2, %xmm1
410 ; SSE41-NEXT: pxor %xmm2, %xmm0
411 ; SSE41-NEXT: movdqa %xmm0, %xmm2
412 ; SSE41-NEXT: pcmpgtd %xmm1, %xmm2
413 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
414 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm0
415 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
416 ; SSE41-NEXT: pand %xmm3, %xmm1
417 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
418 ; SSE41-NEXT: por %xmm1, %xmm0
421 ; SSE42-LABEL: gt_v2i64:
423 ; SSE42-NEXT: movdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
424 ; SSE42-NEXT: pxor %xmm2, %xmm1
425 ; SSE42-NEXT: pxor %xmm2, %xmm0
426 ; SSE42-NEXT: pcmpgtq %xmm1, %xmm0
429 ; AVX-LABEL: gt_v2i64:
431 ; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
432 ; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm1
433 ; AVX-NEXT: vpxor %xmm2, %xmm0, %xmm0
434 ; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0
437 ; XOP-LABEL: gt_v2i64:
439 ; XOP-NEXT: vpcomgtuq %xmm1, %xmm0, %xmm0
441 %1 = icmp ugt <2 x i64> %a, %b
442 %2 = sext <2 x i1> %1 to <2 x i64>
446 define <4 x i32> @gt_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
447 ; SSE-LABEL: gt_v4i32:
449 ; SSE-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
450 ; SSE-NEXT: pxor %xmm2, %xmm1
451 ; SSE-NEXT: pxor %xmm2, %xmm0
452 ; SSE-NEXT: pcmpgtd %xmm1, %xmm0
455 ; AVX1-LABEL: gt_v4i32:
457 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
458 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1
459 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
460 ; AVX1-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0
463 ; AVX2-LABEL: gt_v4i32:
465 ; AVX2-NEXT: vpbroadcastd {{.*}}(%rip), %xmm2
466 ; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1
467 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
468 ; AVX2-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0
471 ; XOP-LABEL: gt_v4i32:
473 ; XOP-NEXT: vpcomgtud %xmm1, %xmm0, %xmm0
476 ; AVX512-LABEL: gt_v4i32:
478 ; AVX512-NEXT: vpbroadcastd {{.*}}(%rip), %xmm2
479 ; AVX512-NEXT: vpxor %xmm2, %xmm1, %xmm1
480 ; AVX512-NEXT: vpxor %xmm2, %xmm0, %xmm0
481 ; AVX512-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0
483 %1 = icmp ugt <4 x i32> %a, %b
484 %2 = sext <4 x i1> %1 to <4 x i32>
488 define <8 x i16> @gt_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
489 ; SSE-LABEL: gt_v8i16:
491 ; SSE-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
492 ; SSE-NEXT: pxor %xmm2, %xmm1
493 ; SSE-NEXT: pxor %xmm2, %xmm0
494 ; SSE-NEXT: pcmpgtw %xmm1, %xmm0
497 ; AVX-LABEL: gt_v8i16:
499 ; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
500 ; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm1
501 ; AVX-NEXT: vpxor %xmm2, %xmm0, %xmm0
502 ; AVX-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm0
505 ; XOP-LABEL: gt_v8i16:
507 ; XOP-NEXT: vpcomgtuw %xmm1, %xmm0, %xmm0
509 %1 = icmp ugt <8 x i16> %a, %b
510 %2 = sext <8 x i1> %1 to <8 x i16>
514 define <16 x i8> @gt_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
515 ; SSE-LABEL: gt_v16i8:
517 ; SSE-NEXT: movdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
518 ; SSE-NEXT: pxor %xmm2, %xmm1
519 ; SSE-NEXT: pxor %xmm2, %xmm0
520 ; SSE-NEXT: pcmpgtb %xmm1, %xmm0
523 ; AVX-LABEL: gt_v16i8:
525 ; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
526 ; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm1
527 ; AVX-NEXT: vpxor %xmm2, %xmm0, %xmm0
528 ; AVX-NEXT: vpcmpgtb %xmm1, %xmm0, %xmm0
531 ; XOP-LABEL: gt_v16i8:
533 ; XOP-NEXT: vpcomgtub %xmm1, %xmm0, %xmm0
535 %1 = icmp ugt <16 x i8> %a, %b
536 %2 = sext <16 x i1> %1 to <16 x i8>
544 define <2 x i64> @le_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
545 ; SSE2-LABEL: le_v2i64:
547 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
548 ; SSE2-NEXT: pxor %xmm2, %xmm1
549 ; SSE2-NEXT: pxor %xmm2, %xmm0
550 ; SSE2-NEXT: movdqa %xmm0, %xmm2
551 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
552 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
553 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm0
554 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
555 ; SSE2-NEXT: pand %xmm3, %xmm0
556 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
557 ; SSE2-NEXT: por %xmm0, %xmm1
558 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0
559 ; SSE2-NEXT: pxor %xmm1, %xmm0
562 ; SSE41-LABEL: le_v2i64:
564 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
565 ; SSE41-NEXT: pxor %xmm2, %xmm1
566 ; SSE41-NEXT: pxor %xmm2, %xmm0
567 ; SSE41-NEXT: movdqa %xmm0, %xmm2
568 ; SSE41-NEXT: pcmpgtd %xmm1, %xmm2
569 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
570 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm0
571 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
572 ; SSE41-NEXT: pand %xmm3, %xmm0
573 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
574 ; SSE41-NEXT: por %xmm0, %xmm1
575 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm0
576 ; SSE41-NEXT: pxor %xmm1, %xmm0
579 ; SSE42-LABEL: le_v2i64:
581 ; SSE42-NEXT: movdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
582 ; SSE42-NEXT: pxor %xmm2, %xmm1
583 ; SSE42-NEXT: pxor %xmm2, %xmm0
584 ; SSE42-NEXT: pcmpgtq %xmm1, %xmm0
585 ; SSE42-NEXT: pcmpeqd %xmm1, %xmm1
586 ; SSE42-NEXT: pxor %xmm1, %xmm0
589 ; AVX-LABEL: le_v2i64:
591 ; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
592 ; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm1
593 ; AVX-NEXT: vpxor %xmm2, %xmm0, %xmm0
594 ; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0
595 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
596 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
599 ; XOP-LABEL: le_v2i64:
601 ; XOP-NEXT: vpcomleuq %xmm1, %xmm0, %xmm0
603 %1 = icmp ule <2 x i64> %a, %b
604 %2 = sext <2 x i1> %1 to <2 x i64>
608 define <4 x i32> @le_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
609 ; SSE2-LABEL: le_v4i32:
611 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
612 ; SSE2-NEXT: pxor %xmm2, %xmm1
613 ; SSE2-NEXT: pxor %xmm2, %xmm0
614 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm0
615 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
616 ; SSE2-NEXT: pxor %xmm1, %xmm0
619 ; SSE41-LABEL: le_v4i32:
621 ; SSE41-NEXT: pminud %xmm0, %xmm1
622 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm0
625 ; SSE42-LABEL: le_v4i32:
627 ; SSE42-NEXT: pminud %xmm0, %xmm1
628 ; SSE42-NEXT: pcmpeqd %xmm1, %xmm0
631 ; AVX-LABEL: le_v4i32:
633 ; AVX-NEXT: vpminud %xmm1, %xmm0, %xmm1
634 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
637 ; XOP-LABEL: le_v4i32:
639 ; XOP-NEXT: vpcomleud %xmm1, %xmm0, %xmm0
641 %1 = icmp ule <4 x i32> %a, %b
642 %2 = sext <4 x i1> %1 to <4 x i32>
646 define <8 x i16> @le_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
647 ; SSE2-LABEL: le_v8i16:
649 ; SSE2-NEXT: psubusw %xmm1, %xmm0
650 ; SSE2-NEXT: pxor %xmm1, %xmm1
651 ; SSE2-NEXT: pcmpeqw %xmm1, %xmm0
654 ; SSE41-LABEL: le_v8i16:
656 ; SSE41-NEXT: pminuw %xmm0, %xmm1
657 ; SSE41-NEXT: pcmpeqw %xmm1, %xmm0
660 ; SSE42-LABEL: le_v8i16:
662 ; SSE42-NEXT: pminuw %xmm0, %xmm1
663 ; SSE42-NEXT: pcmpeqw %xmm1, %xmm0
666 ; AVX-LABEL: le_v8i16:
668 ; AVX-NEXT: vpminuw %xmm1, %xmm0, %xmm1
669 ; AVX-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0
672 ; XOP-LABEL: le_v8i16:
674 ; XOP-NEXT: vpcomleuw %xmm1, %xmm0, %xmm0
676 %1 = icmp ule <8 x i16> %a, %b
677 %2 = sext <8 x i1> %1 to <8 x i16>
681 define <16 x i8> @le_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
682 ; SSE-LABEL: le_v16i8:
684 ; SSE-NEXT: pminub %xmm0, %xmm1
685 ; SSE-NEXT: pcmpeqb %xmm1, %xmm0
688 ; AVX-LABEL: le_v16i8:
690 ; AVX-NEXT: vpminub %xmm1, %xmm0, %xmm1
691 ; AVX-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
694 ; XOP-LABEL: le_v16i8:
696 ; XOP-NEXT: vpcomleub %xmm1, %xmm0, %xmm0
698 %1 = icmp ule <16 x i8> %a, %b
699 %2 = sext <16 x i1> %1 to <16 x i8>
707 define <2 x i64> @lt_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
708 ; SSE2-LABEL: lt_v2i64:
710 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
711 ; SSE2-NEXT: pxor %xmm2, %xmm0
712 ; SSE2-NEXT: pxor %xmm2, %xmm1
713 ; SSE2-NEXT: movdqa %xmm1, %xmm2
714 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
715 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
716 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
717 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
718 ; SSE2-NEXT: pand %xmm3, %xmm1
719 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
720 ; SSE2-NEXT: por %xmm1, %xmm0
723 ; SSE41-LABEL: lt_v2i64:
725 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
726 ; SSE41-NEXT: pxor %xmm2, %xmm0
727 ; SSE41-NEXT: pxor %xmm2, %xmm1
728 ; SSE41-NEXT: movdqa %xmm1, %xmm2
729 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm2
730 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
731 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm1
732 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
733 ; SSE41-NEXT: pand %xmm3, %xmm1
734 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
735 ; SSE41-NEXT: por %xmm1, %xmm0
738 ; SSE42-LABEL: lt_v2i64:
740 ; SSE42-NEXT: movdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
741 ; SSE42-NEXT: pxor %xmm2, %xmm0
742 ; SSE42-NEXT: pxor %xmm1, %xmm2
743 ; SSE42-NEXT: pcmpgtq %xmm0, %xmm2
744 ; SSE42-NEXT: movdqa %xmm2, %xmm0
747 ; AVX-LABEL: lt_v2i64:
749 ; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
750 ; AVX-NEXT: vpxor %xmm2, %xmm0, %xmm0
751 ; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm1
752 ; AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm0
755 ; XOP-LABEL: lt_v2i64:
757 ; XOP-NEXT: vpcomltuq %xmm1, %xmm0, %xmm0
759 %1 = icmp ult <2 x i64> %a, %b
760 %2 = sext <2 x i1> %1 to <2 x i64>
764 define <4 x i32> @lt_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
765 ; SSE-LABEL: lt_v4i32:
767 ; SSE-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
768 ; SSE-NEXT: pxor %xmm2, %xmm0
769 ; SSE-NEXT: pxor %xmm1, %xmm2
770 ; SSE-NEXT: pcmpgtd %xmm0, %xmm2
771 ; SSE-NEXT: movdqa %xmm2, %xmm0
774 ; AVX1-LABEL: lt_v4i32:
776 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
777 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
778 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1
779 ; AVX1-NEXT: vpcmpgtd %xmm0, %xmm1, %xmm0
782 ; AVX2-LABEL: lt_v4i32:
784 ; AVX2-NEXT: vpbroadcastd {{.*}}(%rip), %xmm2
785 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
786 ; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1
787 ; AVX2-NEXT: vpcmpgtd %xmm0, %xmm1, %xmm0
790 ; XOP-LABEL: lt_v4i32:
792 ; XOP-NEXT: vpcomltud %xmm1, %xmm0, %xmm0
795 ; AVX512-LABEL: lt_v4i32:
797 ; AVX512-NEXT: vpbroadcastd {{.*}}(%rip), %xmm2
798 ; AVX512-NEXT: vpxor %xmm2, %xmm0, %xmm0
799 ; AVX512-NEXT: vpxor %xmm2, %xmm1, %xmm1
800 ; AVX512-NEXT: vpcmpgtd %xmm0, %xmm1, %xmm0
802 %1 = icmp ult <4 x i32> %a, %b
803 %2 = sext <4 x i1> %1 to <4 x i32>
807 define <8 x i16> @lt_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
808 ; SSE-LABEL: lt_v8i16:
810 ; SSE-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
811 ; SSE-NEXT: pxor %xmm2, %xmm0
812 ; SSE-NEXT: pxor %xmm1, %xmm2
813 ; SSE-NEXT: pcmpgtw %xmm0, %xmm2
814 ; SSE-NEXT: movdqa %xmm2, %xmm0
817 ; AVX-LABEL: lt_v8i16:
819 ; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
820 ; AVX-NEXT: vpxor %xmm2, %xmm0, %xmm0
821 ; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm1
822 ; AVX-NEXT: vpcmpgtw %xmm0, %xmm1, %xmm0
825 ; XOP-LABEL: lt_v8i16:
827 ; XOP-NEXT: vpcomltuw %xmm1, %xmm0, %xmm0
829 %1 = icmp ult <8 x i16> %a, %b
830 %2 = sext <8 x i1> %1 to <8 x i16>
834 define <16 x i8> @lt_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
835 ; SSE-LABEL: lt_v16i8:
837 ; SSE-NEXT: movdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
838 ; SSE-NEXT: pxor %xmm2, %xmm0
839 ; SSE-NEXT: pxor %xmm1, %xmm2
840 ; SSE-NEXT: pcmpgtb %xmm0, %xmm2
841 ; SSE-NEXT: movdqa %xmm2, %xmm0
844 ; AVX-LABEL: lt_v16i8:
846 ; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
847 ; AVX-NEXT: vpxor %xmm2, %xmm0, %xmm0
848 ; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm1
849 ; AVX-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm0
852 ; XOP-LABEL: lt_v16i8:
854 ; XOP-NEXT: vpcomltub %xmm1, %xmm0, %xmm0
856 %1 = icmp ult <16 x i8> %a, %b
857 %2 = sext <16 x i1> %1 to <16 x i8>