llvm.org GIT mirror llvm / 079e93a
[X86] Allow VPMAXUQ/VPMAXSQ/VPMINUQ/VPMINSQ to be used with 128/256 bit vectors when AVX512 is enabled. These instructions can be used by widening to 512-bits and extracting back to 128/256. We do similar to several other instructions already. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@319641 91177308-0d34-0410-b5e6-96231b3b80d8 Craig Topper 2 years ago
5 changed file(s) with 338 addition(s) and 122 deletion(s). Raw diff Collapse all Expand all
13261326 }
13271327
13281328 // NonVLX sub-targets extend 128/256 vectors to use the 512 version.
1329 for (auto VT : { MVT::v2i64, MVT::v4i64 }) {
1330 setOperationAction(ISD::SMAX, VT, Legal);
1331 setOperationAction(ISD::UMAX, VT, Legal);
1332 setOperationAction(ISD::SMIN, VT, Legal);
1333 setOperationAction(ISD::UMIN, VT, Legal);
1334 }
1335
1336 // NonVLX sub-targets extend 128/256 vectors to use the 512 version.
13291337 for (auto VT : {MVT::v4i32, MVT::v8i32, MVT::v16i32, MVT::v2i64, MVT::v4i64,
13301338 MVT::v8i64}) {
13311339 setOperationAction(ISD::ROTL, VT, Custom);
15311539 setOperationAction(ISD::CONCAT_VECTORS, MVT::v4i1, Custom);
15321540 setOperationAction(ISD::INSERT_SUBVECTOR, MVT::v8i1, Custom);
15331541 setOperationAction(ISD::INSERT_SUBVECTOR, MVT::v4i1, Custom);
1534
1535 for (auto VT : { MVT::v2i64, MVT::v4i64 }) {
1536 setOperationAction(ISD::SMAX, VT, Legal);
1537 setOperationAction(ISD::UMAX, VT, Legal);
1538 setOperationAction(ISD::SMIN, VT, Legal);
1539 setOperationAction(ISD::UMIN, VT, Legal);
1540 }
15411542 }
15421543
15431544 // We want to custom lower some of our intrinsics.
1769517696 // Special case: Use min/max operations for SETULE/SETUGE
1769617697 MVT VET = VT.getVectorElementType();
1769717698 bool HasMinMax =
17698 (Subtarget.hasSSE41() && (VET >= MVT::i8 && VET <= MVT::i32)) ||
17699 (Subtarget.hasAVX512() && VET == MVT::i64) ||
17700 (Subtarget.hasSSE41() && (VET == MVT::i16 || VET == MVT::i32)) ||
1769917701 (Subtarget.hasSSE2() && (VET == MVT::i8));
1770017702 bool MinMax = false;
1770117703 if (HasMinMax) {
45254525 (INSERT_SUBREG (v8i64 (IMPLICIT_DEF)), VR128X:$src1, sub_xmm),
45264526 (INSERT_SUBREG (v8i64 (IMPLICIT_DEF)), VR128X:$src2, sub_xmm)),
45274527 sub_xmm)>;
4528 }
4529
4530 // PMULLQ: Use 512bit version to implement 128/256 bit in case NoVLX.
4531 let Predicates = [HasDQI, NoVLX] in {
4532 def : Pat<(v4i64 (mul (v4i64 VR256X:$src1), (v4i64 VR256X:$src2))),
4533 (EXTRACT_SUBREG
4534 (VPMULLQZrr
4535 (INSERT_SUBREG (v8i64 (IMPLICIT_DEF)), VR256X:$src1, sub_ymm),
4536 (INSERT_SUBREG (v8i64 (IMPLICIT_DEF)), VR256X:$src2, sub_ymm)),
4537 sub_ymm)>;
4538
4539 def : Pat<(v2i64 (mul (v2i64 VR128X:$src1), (v2i64 VR128X:$src2))),
4540 (EXTRACT_SUBREG
4541 (VPMULLQZrr
4542 (INSERT_SUBREG (v8i64 (IMPLICIT_DEF)), VR128X:$src1, sub_xmm),
4543 (INSERT_SUBREG (v8i64 (IMPLICIT_DEF)), VR128X:$src2, sub_xmm)),
4544 sub_xmm)>;
4545 }
4546
4547 multiclass avx512_min_max_lowering {
4548 def : Pat<(v4i64 (OpNode VR256X:$src1, VR256X:$src2)),
4549 (EXTRACT_SUBREG
4550 (Instr
4551 (INSERT_SUBREG (v8i64 (IMPLICIT_DEF)), VR256X:$src1, sub_ymm),
4552 (INSERT_SUBREG (v8i64 (IMPLICIT_DEF)), VR256X:$src2, sub_ymm)),
4553 sub_ymm)>;
4554
4555 def : Pat<(v2i64 (OpNode VR128X:$src1, VR128X:$src2)),
4556 (EXTRACT_SUBREG
4557 (Instr
4558 (INSERT_SUBREG (v8i64 (IMPLICIT_DEF)), VR128X:$src1, sub_xmm),
4559 (INSERT_SUBREG (v8i64 (IMPLICIT_DEF)), VR128X:$src2, sub_xmm)),
4560 sub_xmm)>;
4561 }
4562
4563 let Predicates = [HasAVX512] in {
4564 defm : avx512_min_max_lowering;
4565 defm : avx512_min_max_lowering;
4566 defm : avx512_min_max_lowering;
4567 defm : avx512_min_max_lowering;
45284568 }
45294569
45304570 //===----------------------------------------------------------------------===//
269269 ; SSE42-NEXT: pxor %xmm2, %xmm0
270270 ; SSE42-NEXT: retq
271271 ;
272 ; AVX-LABEL: ge_v2i64:
273 ; AVX: # BB#0:
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
280 ; AVX-NEXT: retq
272 ; AVX1-LABEL: ge_v2i64:
273 ; AVX1: # BB#0:
274 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
275 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
276 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1
277 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm0
278 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
279 ; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
280 ; AVX1-NEXT: retq
281 ;
282 ; AVX2-LABEL: ge_v2i64:
283 ; AVX2: # BB#0:
284 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
285 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
286 ; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1
287 ; AVX2-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm0
288 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
289 ; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
290 ; AVX2-NEXT: retq
281291 ;
282292 ; XOP-LABEL: ge_v2i64:
283293 ; XOP: # BB#0:
284294 ; XOP-NEXT: vpcomgeuq %xmm1, %xmm0, %xmm0
285295 ; XOP-NEXT: retq
296 ;
297 ; AVX512-LABEL: ge_v2i64:
298 ; AVX512: # BB#0:
299 ; AVX512-NEXT: # kill: %xmm1 %xmm1 %zmm1
300 ; AVX512-NEXT: # kill: %xmm0 %xmm0 %zmm0
301 ; AVX512-NEXT: vpmaxuq %zmm1, %zmm0, %zmm1
302 ; AVX512-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
303 ; AVX512-NEXT: vzeroupper
304 ; AVX512-NEXT: retq
286305 %1 = icmp uge <2 x i64> %a, %b
287306 %2 = sext <2 x i1> %1 to <2 x i64>
288307 ret <2 x i64> %2
586605 ; SSE42-NEXT: pxor %xmm1, %xmm0
587606 ; SSE42-NEXT: retq
588607 ;
589 ; AVX-LABEL: le_v2i64:
590 ; AVX: # BB#0:
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
597 ; AVX-NEXT: retq
608 ; AVX1-LABEL: le_v2i64:
609 ; AVX1: # BB#0:
610 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
611 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1
612 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
613 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0
614 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
615 ; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
616 ; AVX1-NEXT: retq
617 ;
618 ; AVX2-LABEL: le_v2i64:
619 ; AVX2: # BB#0:
620 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
621 ; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1
622 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
623 ; AVX2-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0
624 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
625 ; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
626 ; AVX2-NEXT: retq
598627 ;
599628 ; XOP-LABEL: le_v2i64:
600629 ; XOP: # BB#0:
601630 ; XOP-NEXT: vpcomleuq %xmm1, %xmm0, %xmm0
602631 ; XOP-NEXT: retq
632 ;
633 ; AVX512-LABEL: le_v2i64:
634 ; AVX512: # BB#0:
635 ; AVX512-NEXT: # kill: %xmm1 %xmm1 %zmm1
636 ; AVX512-NEXT: # kill: %xmm0 %xmm0 %zmm0
637 ; AVX512-NEXT: vpminuq %zmm1, %zmm0, %zmm1
638 ; AVX512-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
639 ; AVX512-NEXT: vzeroupper
640 ; AVX512-NEXT: retq
603641 %1 = icmp ule <2 x i64> %a, %b
604642 %2 = sext <2 x i1> %1 to <2 x i64>
605643 ret <2 x i64> %2
5757 ; SSE42-NEXT: movapd %xmm1, %xmm0
5858 ; SSE42-NEXT: retq
5959 ;
60 ; AVX-LABEL: max_gt_v2i64:
61 ; AVX: # BB#0:
62 ; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2
63 ; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
64 ; AVX-NEXT: retq
60 ; AVX1-LABEL: max_gt_v2i64:
61 ; AVX1: # BB#0:
62 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2
63 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
64 ; AVX1-NEXT: retq
65 ;
66 ; AVX2-LABEL: max_gt_v2i64:
67 ; AVX2: # BB#0:
68 ; AVX2-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2
69 ; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
70 ; AVX2-NEXT: retq
71 ;
72 ; AVX512-LABEL: max_gt_v2i64:
73 ; AVX512: # BB#0:
74 ; AVX512-NEXT: # kill: %xmm1 %xmm1 %zmm1
75 ; AVX512-NEXT: # kill: %xmm0 %xmm0 %zmm0
76 ; AVX512-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0
77 ; AVX512-NEXT: # kill: %xmm0 %xmm0 %zmm0
78 ; AVX512-NEXT: vzeroupper
79 ; AVX512-NEXT: retq
6580 %1 = icmp sgt <2 x i64> %a, %b
6681 %2 = select <2 x i1> %1, <2 x i64> %a, <2 x i64> %b
6782 ret <2 x i64> %2
167182 ;
168183 ; AVX512-LABEL: max_gt_v4i64:
169184 ; AVX512: # BB#0:
170 ; AVX512-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm2
171 ; AVX512-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
185 ; AVX512-NEXT: # kill: %ymm1 %ymm1 %zmm1
186 ; AVX512-NEXT: # kill: %ymm0 %ymm0 %zmm0
187 ; AVX512-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0
188 ; AVX512-NEXT: # kill: %ymm0 %ymm0 %zmm0
172189 ; AVX512-NEXT: retq
173190 %1 = icmp sgt <4 x i64> %a, %b
174191 %2 = select <4 x i1> %1, <4 x i64> %a, <4 x i64> %b
443460 ; SSE42-NEXT: movapd %xmm1, %xmm0
444461 ; SSE42-NEXT: retq
445462 ;
446 ; AVX-LABEL: max_ge_v2i64:
447 ; AVX: # BB#0:
448 ; AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
449 ; AVX-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
450 ; AVX-NEXT: vpxor %xmm3, %xmm2, %xmm2
451 ; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
452 ; AVX-NEXT: retq
463 ; AVX1-LABEL: max_ge_v2i64:
464 ; AVX1: # BB#0:
465 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
466 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
467 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2
468 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
469 ; AVX1-NEXT: retq
470 ;
471 ; AVX2-LABEL: max_ge_v2i64:
472 ; AVX2: # BB#0:
473 ; AVX2-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
474 ; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
475 ; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2
476 ; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
477 ; AVX2-NEXT: retq
478 ;
479 ; AVX512-LABEL: max_ge_v2i64:
480 ; AVX512: # BB#0:
481 ; AVX512-NEXT: # kill: %xmm1 %xmm1 %zmm1
482 ; AVX512-NEXT: # kill: %xmm0 %xmm0 %zmm0
483 ; AVX512-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0
484 ; AVX512-NEXT: # kill: %xmm0 %xmm0 %zmm0
485 ; AVX512-NEXT: vzeroupper
486 ; AVX512-NEXT: retq
453487 %1 = icmp sge <2 x i64> %a, %b
454488 %2 = select <2 x i1> %1, <2 x i64> %a, <2 x i64> %b
455489 ret <2 x i64> %2
573607 ;
574608 ; AVX512-LABEL: max_ge_v4i64:
575609 ; AVX512: # BB#0:
576 ; AVX512-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm2
577 ; AVX512-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
578 ; AVX512-NEXT: vpxor %ymm3, %ymm2, %ymm2
579 ; AVX512-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
610 ; AVX512-NEXT: # kill: %ymm1 %ymm1 %zmm1
611 ; AVX512-NEXT: # kill: %ymm0 %ymm0 %zmm0
612 ; AVX512-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0
613 ; AVX512-NEXT: # kill: %ymm0 %ymm0 %zmm0
580614 ; AVX512-NEXT: retq
581615 %1 = icmp sge <4 x i64> %a, %b
582616 %2 = select <4 x i1> %1, <4 x i64> %a, <4 x i64> %b
856890 ; SSE42-NEXT: movapd %xmm1, %xmm0
857891 ; SSE42-NEXT: retq
858892 ;
859 ; AVX-LABEL: min_lt_v2i64:
860 ; AVX: # BB#0:
861 ; AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
862 ; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
863 ; AVX-NEXT: retq
893 ; AVX1-LABEL: min_lt_v2i64:
894 ; AVX1: # BB#0:
895 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
896 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
897 ; AVX1-NEXT: retq
898 ;
899 ; AVX2-LABEL: min_lt_v2i64:
900 ; AVX2: # BB#0:
901 ; AVX2-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
902 ; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
903 ; AVX2-NEXT: retq
904 ;
905 ; AVX512-LABEL: min_lt_v2i64:
906 ; AVX512: # BB#0:
907 ; AVX512-NEXT: # kill: %xmm1 %xmm1 %zmm1
908 ; AVX512-NEXT: # kill: %xmm0 %xmm0 %zmm0
909 ; AVX512-NEXT: vpminsq %zmm1, %zmm0, %zmm0
910 ; AVX512-NEXT: # kill: %xmm0 %xmm0 %zmm0
911 ; AVX512-NEXT: vzeroupper
912 ; AVX512-NEXT: retq
864913 %1 = icmp slt <2 x i64> %a, %b
865914 %2 = select <2 x i1> %1, <2 x i64> %a, <2 x i64> %b
866915 ret <2 x i64> %2
9671016 ;
9681017 ; AVX512-LABEL: min_lt_v4i64:
9691018 ; AVX512: # BB#0:
970 ; AVX512-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm2
971 ; AVX512-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1019 ; AVX512-NEXT: # kill: %ymm1 %ymm1 %zmm1
1020 ; AVX512-NEXT: # kill: %ymm0 %ymm0 %zmm0
1021 ; AVX512-NEXT: vpminsq %zmm1, %zmm0, %zmm0
1022 ; AVX512-NEXT: # kill: %ymm0 %ymm0 %zmm0
9721023 ; AVX512-NEXT: retq
9731024 %1 = icmp slt <4 x i64> %a, %b
9741025 %2 = select <4 x i1> %1, <4 x i64> %a, <4 x i64> %b
12361287 ; SSE42-NEXT: movapd %xmm1, %xmm0
12371288 ; SSE42-NEXT: retq
12381289 ;
1239 ; AVX-LABEL: min_le_v2i64:
1240 ; AVX: # BB#0:
1241 ; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2
1242 ; AVX-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
1243 ; AVX-NEXT: vpxor %xmm3, %xmm2, %xmm2
1244 ; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1245 ; AVX-NEXT: retq
1290 ; AVX1-LABEL: min_le_v2i64:
1291 ; AVX1: # BB#0:
1292 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2
1293 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
1294 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2
1295 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1296 ; AVX1-NEXT: retq
1297 ;
1298 ; AVX2-LABEL: min_le_v2i64:
1299 ; AVX2: # BB#0:
1300 ; AVX2-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2
1301 ; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
1302 ; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2
1303 ; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1304 ; AVX2-NEXT: retq
1305 ;
1306 ; AVX512-LABEL: min_le_v2i64:
1307 ; AVX512: # BB#0:
1308 ; AVX512-NEXT: # kill: %xmm1 %xmm1 %zmm1
1309 ; AVX512-NEXT: # kill: %xmm0 %xmm0 %zmm0
1310 ; AVX512-NEXT: vpminsq %zmm1, %zmm0, %zmm0
1311 ; AVX512-NEXT: # kill: %xmm0 %xmm0 %zmm0
1312 ; AVX512-NEXT: vzeroupper
1313 ; AVX512-NEXT: retq
12461314 %1 = icmp sle <2 x i64> %a, %b
12471315 %2 = select <2 x i1> %1, <2 x i64> %a, <2 x i64> %b
12481316 ret <2 x i64> %2
13651433 ;
13661434 ; AVX512-LABEL: min_le_v4i64:
13671435 ; AVX512: # BB#0:
1368 ; AVX512-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm2
1369 ; AVX512-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
1370 ; AVX512-NEXT: vpxor %ymm3, %ymm2, %ymm2
1371 ; AVX512-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1436 ; AVX512-NEXT: # kill: %ymm1 %ymm1 %zmm1
1437 ; AVX512-NEXT: # kill: %ymm0 %ymm0 %zmm0
1438 ; AVX512-NEXT: vpminsq %zmm1, %zmm0, %zmm0
1439 ; AVX512-NEXT: # kill: %ymm0 %ymm0 %zmm0
13721440 ; AVX512-NEXT: retq
13731441 %1 = icmp sle <4 x i64> %a, %b
13741442 %2 = select <4 x i1> %1, <4 x i64> %a, <4 x i64> %b
6161 ; SSE42-NEXT: movapd %xmm1, %xmm0
6262 ; SSE42-NEXT: retq
6363 ;
64 ; AVX-LABEL: max_gt_v2i64:
65 ; AVX: # BB#0:
66 ; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
67 ; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm3
68 ; AVX-NEXT: vpxor %xmm2, %xmm0, %xmm2
69 ; AVX-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2
70 ; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
71 ; AVX-NEXT: retq
64 ; AVX1-LABEL: max_gt_v2i64:
65 ; AVX1: # BB#0:
66 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
67 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm3
68 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm2
69 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2
70 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
71 ; AVX1-NEXT: retq
72 ;
73 ; AVX2-LABEL: max_gt_v2i64:
74 ; AVX2: # BB#0:
75 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
76 ; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm3
77 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm2
78 ; AVX2-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2
79 ; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
80 ; AVX2-NEXT: retq
81 ;
82 ; AVX512-LABEL: max_gt_v2i64:
83 ; AVX512: # BB#0:
84 ; AVX512-NEXT: # kill: %xmm1 %xmm1 %zmm1
85 ; AVX512-NEXT: # kill: %xmm0 %xmm0 %zmm0
86 ; AVX512-NEXT: vpmaxuq %zmm1, %zmm0, %zmm0
87 ; AVX512-NEXT: # kill: %xmm0 %xmm0 %zmm0
88 ; AVX512-NEXT: vzeroupper
89 ; AVX512-NEXT: retq
7290 %1 = icmp ugt <2 x i64> %a, %b
7391 %2 = select <2 x i1> %1, <2 x i64> %a, <2 x i64> %b
7492 ret <2 x i64> %2
189207 ;
190208 ; AVX512-LABEL: max_gt_v4i64:
191209 ; AVX512: # BB#0:
192 ; AVX512-NEXT: vpbroadcastq {{.*}}(%rip), %ymm2
193 ; AVX512-NEXT: vpxor %ymm2, %ymm1, %ymm3
194 ; AVX512-NEXT: vpxor %ymm2, %ymm0, %ymm2
195 ; AVX512-NEXT: vpcmpgtq %ymm3, %ymm2, %ymm2
196 ; AVX512-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
210 ; AVX512-NEXT: # kill: %ymm1 %ymm1 %zmm1
211 ; AVX512-NEXT: # kill: %ymm0 %ymm0 %zmm0
212 ; AVX512-NEXT: vpmaxuq %zmm1, %zmm0, %zmm0
213 ; AVX512-NEXT: # kill: %ymm0 %ymm0 %zmm0
197214 ; AVX512-NEXT: retq
198215 %1 = icmp ugt <4 x i64> %a, %b
199216 %2 = select <4 x i1> %1, <4 x i64> %a, <4 x i64> %b
484501 ; SSE42-NEXT: movapd %xmm1, %xmm0
485502 ; SSE42-NEXT: retq
486503 ;
487 ; AVX-LABEL: max_ge_v2i64:
488 ; AVX: # BB#0:
489 ; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
490 ; AVX-NEXT: vpxor %xmm2, %xmm0, %xmm3
491 ; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm2
492 ; AVX-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2
493 ; AVX-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
494 ; AVX-NEXT: vpxor %xmm3, %xmm2, %xmm2
495 ; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
496 ; AVX-NEXT: retq
504 ; AVX1-LABEL: max_ge_v2i64:
505 ; AVX1: # BB#0:
506 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
507 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm3
508 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm2
509 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2
510 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
511 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2
512 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
513 ; AVX1-NEXT: retq
514 ;
515 ; AVX2-LABEL: max_ge_v2i64:
516 ; AVX2: # BB#0:
517 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
518 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm3
519 ; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm2
520 ; AVX2-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2
521 ; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
522 ; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2
523 ; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
524 ; AVX2-NEXT: retq
525 ;
526 ; AVX512-LABEL: max_ge_v2i64:
527 ; AVX512: # BB#0:
528 ; AVX512-NEXT: # kill: %xmm1 %xmm1 %zmm1
529 ; AVX512-NEXT: # kill: %xmm0 %xmm0 %zmm0
530 ; AVX512-NEXT: vpmaxuq %zmm1, %zmm0, %zmm0
531 ; AVX512-NEXT: # kill: %xmm0 %xmm0 %zmm0
532 ; AVX512-NEXT: vzeroupper
533 ; AVX512-NEXT: retq
497534 %1 = icmp uge <2 x i64> %a, %b
498535 %2 = select <2 x i1> %1, <2 x i64> %a, <2 x i64> %b
499536 ret <2 x i64> %2
631668 ;
632669 ; AVX512-LABEL: max_ge_v4i64:
633670 ; AVX512: # BB#0:
634 ; AVX512-NEXT: vpbroadcastq {{.*}}(%rip), %ymm2
635 ; AVX512-NEXT: vpxor %ymm2, %ymm0, %ymm3
636 ; AVX512-NEXT: vpxor %ymm2, %ymm1, %ymm2
637 ; AVX512-NEXT: vpcmpgtq %ymm3, %ymm2, %ymm2
638 ; AVX512-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
639 ; AVX512-NEXT: vpxor %ymm3, %ymm2, %ymm2
640 ; AVX512-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
671 ; AVX512-NEXT: # kill: %ymm1 %ymm1 %zmm1
672 ; AVX512-NEXT: # kill: %ymm0 %ymm0 %zmm0
673 ; AVX512-NEXT: vpmaxuq %zmm1, %zmm0, %zmm0
674 ; AVX512-NEXT: # kill: %ymm0 %ymm0 %zmm0
641675 ; AVX512-NEXT: retq
642676 %1 = icmp uge <4 x i64> %a, %b
643677 %2 = select <4 x i1> %1, <4 x i64> %a, <4 x i64> %b
925959 ; SSE42-NEXT: movapd %xmm1, %xmm0
926960 ; SSE42-NEXT: retq
927961 ;
928 ; AVX-LABEL: min_lt_v2i64:
929 ; AVX: # BB#0:
930 ; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
931 ; AVX-NEXT: vpxor %xmm2, %xmm0, %xmm3
932 ; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm2
933 ; AVX-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2
934 ; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
935 ; AVX-NEXT: retq
962 ; AVX1-LABEL: min_lt_v2i64:
963 ; AVX1: # BB#0:
964 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
965 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm3
966 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm2
967 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2
968 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
969 ; AVX1-NEXT: retq
970 ;
971 ; AVX2-LABEL: min_lt_v2i64:
972 ; AVX2: # BB#0:
973 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
974 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm3
975 ; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm2
976 ; AVX2-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2
977 ; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
978 ; AVX2-NEXT: retq
979 ;
980 ; AVX512-LABEL: min_lt_v2i64:
981 ; AVX512: # BB#0:
982 ; AVX512-NEXT: # kill: %xmm1 %xmm1 %zmm1
983 ; AVX512-NEXT: # kill: %xmm0 %xmm0 %zmm0
984 ; AVX512-NEXT: vpminuq %zmm1, %zmm0, %zmm0
985 ; AVX512-NEXT: # kill: %xmm0 %xmm0 %zmm0
986 ; AVX512-NEXT: vzeroupper
987 ; AVX512-NEXT: retq
936988 %1 = icmp ult <2 x i64> %a, %b
937989 %2 = select <2 x i1> %1, <2 x i64> %a, <2 x i64> %b
938990 ret <2 x i64> %2
10531105 ;
10541106 ; AVX512-LABEL: min_lt_v4i64:
10551107 ; AVX512: # BB#0:
1056 ; AVX512-NEXT: vpbroadcastq {{.*}}(%rip), %ymm2
1057 ; AVX512-NEXT: vpxor %ymm2, %ymm0, %ymm3
1058 ; AVX512-NEXT: vpxor %ymm2, %ymm1, %ymm2
1059 ; AVX512-NEXT: vpcmpgtq %ymm3, %ymm2, %ymm2
1060 ; AVX512-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1108 ; AVX512-NEXT: # kill: %ymm1 %ymm1 %zmm1
1109 ; AVX512-NEXT: # kill: %ymm0 %ymm0 %zmm0
1110 ; AVX512-NEXT: vpminuq %zmm1, %zmm0, %zmm0
1111 ; AVX512-NEXT: # kill: %ymm0 %ymm0 %zmm0
10611112 ; AVX512-NEXT: retq
10621113 %1 = icmp ult <4 x i64> %a, %b
10631114 %2 = select <4 x i1> %1, <4 x i64> %a, <4 x i64> %b
13471398 ; SSE42-NEXT: movapd %xmm1, %xmm0
13481399 ; SSE42-NEXT: retq
13491400 ;
1350 ; AVX-LABEL: min_le_v2i64:
1351 ; AVX: # BB#0:
1352 ; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
1353 ; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm3
1354 ; AVX-NEXT: vpxor %xmm2, %xmm0, %xmm2
1355 ; AVX-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2
1356 ; AVX-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
1357 ; AVX-NEXT: vpxor %xmm3, %xmm2, %xmm2
1358 ; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1359 ; AVX-NEXT: retq
1401 ; AVX1-LABEL: min_le_v2i64:
1402 ; AVX1: # BB#0:
1403 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
1404 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm3
1405 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm2
1406 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2
1407 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
1408 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2
1409 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1410 ; AVX1-NEXT: retq
1411 ;
1412 ; AVX2-LABEL: min_le_v2i64:
1413 ; AVX2: # BB#0:
1414 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
1415 ; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm3
1416 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm2
1417 ; AVX2-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2
1418 ; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
1419 ; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2
1420 ; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1421 ; AVX2-NEXT: retq
1422 ;
1423 ; AVX512-LABEL: min_le_v2i64:
1424 ; AVX512: # BB#0:
1425 ; AVX512-NEXT: # kill: %xmm1 %xmm1 %zmm1
1426 ; AVX512-NEXT: # kill: %xmm0 %xmm0 %zmm0
1427 ; AVX512-NEXT: vpminuq %zmm1, %zmm0, %zmm0
1428 ; AVX512-NEXT: # kill: %xmm0 %xmm0 %zmm0
1429 ; AVX512-NEXT: vzeroupper
1430 ; AVX512-NEXT: retq
13601431 %1 = icmp ule <2 x i64> %a, %b
13611432 %2 = select <2 x i1> %1, <2 x i64> %a, <2 x i64> %b
13621433 ret <2 x i64> %2
14941565 ;
14951566 ; AVX512-LABEL: min_le_v4i64:
14961567 ; AVX512: # BB#0:
1497 ; AVX512-NEXT: vpbroadcastq {{.*}}(%rip), %ymm2
1498 ; AVX512-NEXT: vpxor %ymm2, %ymm1, %ymm3
1499 ; AVX512-NEXT: vpxor %ymm2, %ymm0, %ymm2
1500 ; AVX512-NEXT: vpcmpgtq %ymm3, %ymm2, %ymm2
1501 ; AVX512-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
1502 ; AVX512-NEXT: vpxor %ymm3, %ymm2, %ymm2
1503 ; AVX512-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1568 ; AVX512-NEXT: # kill: %ymm1 %ymm1 %zmm1
1569 ; AVX512-NEXT: # kill: %ymm0 %ymm0 %zmm0
1570 ; AVX512-NEXT: vpminuq %zmm1, %zmm0, %zmm0
1571 ; AVX512-NEXT: # kill: %ymm0 %ymm0 %zmm0
15041572 ; AVX512-NEXT: retq
15051573 %1 = icmp ule <4 x i64> %a, %b
15061574 %2 = select <4 x i1> %1, <4 x i64> %a, <4 x i64> %b