[DAGCombiner] Teach DAG combiner to fold (vselect (N0 xor AllOnes), N1, N2) -> (vselect N0, N2, N1). Only do this if the target indicates its vector boolean type is ZeroOrNegativeOneBooleanContent.

llvm-svn: 291645
This commit is contained in:
Craig Topper 2017-01-11 04:02:23 +00:00
parent ba1b5c98ba
commit 577d258569
4 changed files with 348 additions and 560 deletions

View File

@ -5966,6 +5966,15 @@ SDValue DAGCombiner::visitVSELECT(SDNode *N) {
return CV;
}
// Fold (vselect (N0 xor AllOnes), N1, N2) -> (vselect N0, N2, N1)
if (N0.getOpcode() == ISD::XOR &&
ISD::isBuildVectorAllOnes(N0.getOperand(1).getNode()) &&
TLI.getBooleanContents(N0.getValueType()) ==
TargetLowering::ZeroOrNegativeOneBooleanContent) {
EVT VT = N->getValueType(0);
return DAG.getNode(ISD::VSELECT, DL, VT, N0.getOperand(0), N2, N1);
}
return SDValue();
}

View File

@ -423,33 +423,27 @@ define <2 x i64> @max_ge_v2i64(<2 x i64> %a, <2 x i64> %b) {
; SSE41-NEXT: pcmpgtd %xmm3, %xmm4
; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
; SSE41-NEXT: pcmpeqd %xmm3, %xmm0
; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
; SSE41-NEXT: pand %xmm5, %xmm0
; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
; SSE41-NEXT: por %xmm0, %xmm3
; SSE41-NEXT: pcmpeqd %xmm0, %xmm0
; SSE41-NEXT: pxor %xmm3, %xmm0
; SSE41-NEXT: blendvpd %xmm2, %xmm1
; SSE41-NEXT: movapd %xmm1, %xmm0
; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
; SSE41-NEXT: pand %xmm5, %xmm3
; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
; SSE41-NEXT: por %xmm3, %xmm0
; SSE41-NEXT: blendvpd %xmm1, %xmm2
; SSE41-NEXT: movapd %xmm2, %xmm0
; SSE41-NEXT: retq
;
; SSE42-LABEL: max_ge_v2i64:
; SSE42: # BB#0:
; SSE42-NEXT: movdqa %xmm0, %xmm2
; SSE42-NEXT: movdqa %xmm1, %xmm3
; SSE42-NEXT: pcmpgtq %xmm2, %xmm3
; SSE42-NEXT: pcmpeqd %xmm0, %xmm0
; SSE42-NEXT: pxor %xmm3, %xmm0
; SSE42-NEXT: blendvpd %xmm2, %xmm1
; SSE42-NEXT: movapd %xmm1, %xmm0
; SSE42-NEXT: movdqa %xmm1, %xmm0
; SSE42-NEXT: pcmpgtq %xmm2, %xmm0
; SSE42-NEXT: blendvpd %xmm1, %xmm2
; SSE42-NEXT: movapd %xmm2, %xmm0
; SSE42-NEXT: retq
;
; AVX-LABEL: max_ge_v2i64:
; AVX: # BB#0:
; AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
; AVX-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
; AVX-NEXT: vpxor %xmm3, %xmm2, %xmm2
; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
; AVX-NEXT: vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
; AVX-NEXT: retq
%1 = icmp sge <2 x i64> %a, %b
%2 = select <2 x i1> %1, <2 x i64> %a, <2 x i64> %b
@ -499,7 +493,7 @@ define <4 x i64> @max_ge_v4i64(<4 x i64> %a, <4 x i64> %b) {
;
; SSE41-LABEL: max_ge_v4i64:
; SSE41: # BB#0:
; SSE41-NEXT: movdqa %xmm0, %xmm8
; SSE41-NEXT: movdqa %xmm0, %xmm4
; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [2147483648,0,2147483648,0]
; SSE41-NEXT: movdqa %xmm1, %xmm5
; SSE41-NEXT: pxor %xmm0, %xmm5
@ -507,31 +501,27 @@ define <4 x i64> @max_ge_v4i64(<4 x i64> %a, <4 x i64> %b) {
; SSE41-NEXT: pxor %xmm0, %xmm6
; SSE41-NEXT: movdqa %xmm6, %xmm7
; SSE41-NEXT: pcmpgtd %xmm5, %xmm7
; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
; SSE41-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
; SSE41-NEXT: pcmpeqd %xmm5, %xmm6
; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
; SSE41-NEXT: pand %xmm4, %xmm6
; SSE41-NEXT: pand %xmm8, %xmm6
; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
; SSE41-NEXT: por %xmm6, %xmm5
; SSE41-NEXT: pcmpeqd %xmm9, %xmm9
; SSE41-NEXT: pxor %xmm9, %xmm5
; SSE41-NEXT: movdqa %xmm8, %xmm6
; SSE41-NEXT: movdqa %xmm4, %xmm6
; SSE41-NEXT: pxor %xmm0, %xmm6
; SSE41-NEXT: pxor %xmm2, %xmm0
; SSE41-NEXT: movdqa %xmm0, %xmm7
; SSE41-NEXT: pcmpgtd %xmm6, %xmm7
; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
; SSE41-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
; SSE41-NEXT: pcmpeqd %xmm6, %xmm0
; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3]
; SSE41-NEXT: pand %xmm4, %xmm6
; SSE41-NEXT: pand %xmm8, %xmm6
; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
; SSE41-NEXT: por %xmm6, %xmm0
; SSE41-NEXT: pxor %xmm9, %xmm0
; SSE41-NEXT: blendvpd %xmm8, %xmm2
; SSE41-NEXT: blendvpd %xmm2, %xmm4
; SSE41-NEXT: movdqa %xmm5, %xmm0
; SSE41-NEXT: blendvpd %xmm1, %xmm3
; SSE41-NEXT: movapd %xmm2, %xmm0
; SSE41-NEXT: movapd %xmm3, %xmm1
; SSE41-NEXT: blendvpd %xmm3, %xmm1
; SSE41-NEXT: movapd %xmm4, %xmm0
; SSE41-NEXT: retq
;
; SSE42-LABEL: max_ge_v4i64:
@ -539,16 +529,12 @@ define <4 x i64> @max_ge_v4i64(<4 x i64> %a, <4 x i64> %b) {
; SSE42-NEXT: movdqa %xmm0, %xmm4
; SSE42-NEXT: movdqa %xmm3, %xmm5
; SSE42-NEXT: pcmpgtq %xmm1, %xmm5
; SSE42-NEXT: pcmpeqd %xmm0, %xmm0
; SSE42-NEXT: pxor %xmm0, %xmm5
; SSE42-NEXT: movdqa %xmm2, %xmm6
; SSE42-NEXT: pcmpgtq %xmm4, %xmm6
; SSE42-NEXT: pxor %xmm6, %xmm0
; SSE42-NEXT: blendvpd %xmm4, %xmm2
; SSE42-NEXT: movdqa %xmm2, %xmm0
; SSE42-NEXT: pcmpgtq %xmm4, %xmm0
; SSE42-NEXT: blendvpd %xmm2, %xmm4
; SSE42-NEXT: movdqa %xmm5, %xmm0
; SSE42-NEXT: blendvpd %xmm1, %xmm3
; SSE42-NEXT: movapd %xmm2, %xmm0
; SSE42-NEXT: movapd %xmm3, %xmm1
; SSE42-NEXT: blendvpd %xmm3, %xmm1
; SSE42-NEXT: movapd %xmm4, %xmm0
; SSE42-NEXT: retq
;
; AVX1-LABEL: max_ge_v4i64:
@ -567,17 +553,13 @@ define <4 x i64> @max_ge_v4i64(<4 x i64> %a, <4 x i64> %b) {
; AVX2-LABEL: max_ge_v4i64:
; AVX2: # BB#0:
; AVX2-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm2
; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
; AVX2-NEXT: vblendvpd %ymm2, %ymm1, %ymm0, %ymm0
; AVX2-NEXT: retq
;
; AVX512-LABEL: max_ge_v4i64:
; AVX512: # BB#0:
; AVX512-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm2
; AVX512-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
; AVX512-NEXT: vpxor %ymm3, %ymm2, %ymm2
; AVX512-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
; AVX512-NEXT: vblendvpd %ymm2, %ymm1, %ymm0, %ymm0
; AVX512-NEXT: retq
%1 = icmp sge <4 x i64> %a, %b
%2 = select <4 x i1> %1, <4 x i64> %a, <4 x i64> %b
@ -1217,32 +1199,26 @@ define <2 x i64> @min_le_v2i64(<2 x i64> %a, <2 x i64> %b) {
; SSE41-NEXT: pcmpgtd %xmm3, %xmm4
; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
; SSE41-NEXT: pcmpeqd %xmm3, %xmm0
; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
; SSE41-NEXT: pand %xmm5, %xmm0
; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
; SSE41-NEXT: por %xmm0, %xmm3
; SSE41-NEXT: pcmpeqd %xmm0, %xmm0
; SSE41-NEXT: pxor %xmm3, %xmm0
; SSE41-NEXT: blendvpd %xmm2, %xmm1
; SSE41-NEXT: movapd %xmm1, %xmm0
; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
; SSE41-NEXT: pand %xmm5, %xmm3
; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
; SSE41-NEXT: por %xmm3, %xmm0
; SSE41-NEXT: blendvpd %xmm1, %xmm2
; SSE41-NEXT: movapd %xmm2, %xmm0
; SSE41-NEXT: retq
;
; SSE42-LABEL: min_le_v2i64:
; SSE42: # BB#0:
; SSE42-NEXT: movdqa %xmm0, %xmm2
; SSE42-NEXT: pcmpgtq %xmm1, %xmm0
; SSE42-NEXT: pcmpeqd %xmm3, %xmm3
; SSE42-NEXT: pxor %xmm3, %xmm0
; SSE42-NEXT: blendvpd %xmm2, %xmm1
; SSE42-NEXT: movapd %xmm1, %xmm0
; SSE42-NEXT: blendvpd %xmm1, %xmm2
; SSE42-NEXT: movapd %xmm2, %xmm0
; SSE42-NEXT: retq
;
; AVX-LABEL: min_le_v2i64:
; AVX: # BB#0:
; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2
; AVX-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
; AVX-NEXT: vpxor %xmm3, %xmm2, %xmm2
; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
; AVX-NEXT: vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
; AVX-NEXT: retq
%1 = icmp sle <2 x i64> %a, %b
%2 = select <2 x i1> %1, <2 x i64> %a, <2 x i64> %b
@ -1292,7 +1268,7 @@ define <4 x i64> @min_le_v4i64(<4 x i64> %a, <4 x i64> %b) {
;
; SSE41-LABEL: min_le_v4i64:
; SSE41: # BB#0:
; SSE41-NEXT: movdqa %xmm0, %xmm8
; SSE41-NEXT: movdqa %xmm0, %xmm4
; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [2147483648,0,2147483648,0]
; SSE41-NEXT: movdqa %xmm3, %xmm5
; SSE41-NEXT: pxor %xmm0, %xmm5
@ -1300,31 +1276,27 @@ define <4 x i64> @min_le_v4i64(<4 x i64> %a, <4 x i64> %b) {
; SSE41-NEXT: pxor %xmm0, %xmm6
; SSE41-NEXT: movdqa %xmm6, %xmm7
; SSE41-NEXT: pcmpgtd %xmm5, %xmm7
; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
; SSE41-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
; SSE41-NEXT: pcmpeqd %xmm5, %xmm6
; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
; SSE41-NEXT: pand %xmm4, %xmm6
; SSE41-NEXT: pand %xmm8, %xmm6
; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
; SSE41-NEXT: por %xmm6, %xmm5
; SSE41-NEXT: pcmpeqd %xmm9, %xmm9
; SSE41-NEXT: pxor %xmm9, %xmm5
; SSE41-NEXT: movdqa %xmm2, %xmm6
; SSE41-NEXT: pxor %xmm0, %xmm6
; SSE41-NEXT: pxor %xmm8, %xmm0
; SSE41-NEXT: pxor %xmm4, %xmm0
; SSE41-NEXT: movdqa %xmm0, %xmm7
; SSE41-NEXT: pcmpgtd %xmm6, %xmm7
; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
; SSE41-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
; SSE41-NEXT: pcmpeqd %xmm6, %xmm0
; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3]
; SSE41-NEXT: pand %xmm4, %xmm6
; SSE41-NEXT: pand %xmm8, %xmm6
; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
; SSE41-NEXT: por %xmm6, %xmm0
; SSE41-NEXT: pxor %xmm9, %xmm0
; SSE41-NEXT: blendvpd %xmm8, %xmm2
; SSE41-NEXT: blendvpd %xmm2, %xmm4
; SSE41-NEXT: movdqa %xmm5, %xmm0
; SSE41-NEXT: blendvpd %xmm1, %xmm3
; SSE41-NEXT: movapd %xmm2, %xmm0
; SSE41-NEXT: movapd %xmm3, %xmm1
; SSE41-NEXT: blendvpd %xmm3, %xmm1
; SSE41-NEXT: movapd %xmm4, %xmm0
; SSE41-NEXT: retq
;
; SSE42-LABEL: min_le_v4i64:
@ -1332,15 +1304,11 @@ define <4 x i64> @min_le_v4i64(<4 x i64> %a, <4 x i64> %b) {
; SSE42-NEXT: movdqa %xmm0, %xmm4
; SSE42-NEXT: movdqa %xmm1, %xmm5
; SSE42-NEXT: pcmpgtq %xmm3, %xmm5
; SSE42-NEXT: pcmpeqd %xmm6, %xmm6
; SSE42-NEXT: pxor %xmm6, %xmm5
; SSE42-NEXT: pcmpgtq %xmm2, %xmm0
; SSE42-NEXT: pxor %xmm6, %xmm0
; SSE42-NEXT: blendvpd %xmm4, %xmm2
; SSE42-NEXT: blendvpd %xmm2, %xmm4
; SSE42-NEXT: movdqa %xmm5, %xmm0
; SSE42-NEXT: blendvpd %xmm1, %xmm3
; SSE42-NEXT: movapd %xmm2, %xmm0
; SSE42-NEXT: movapd %xmm3, %xmm1
; SSE42-NEXT: blendvpd %xmm3, %xmm1
; SSE42-NEXT: movapd %xmm4, %xmm0
; SSE42-NEXT: retq
;
; AVX1-LABEL: min_le_v4i64:
@ -1359,17 +1327,13 @@ define <4 x i64> @min_le_v4i64(<4 x i64> %a, <4 x i64> %b) {
; AVX2-LABEL: min_le_v4i64:
; AVX2: # BB#0:
; AVX2-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm2
; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
; AVX2-NEXT: vblendvpd %ymm2, %ymm1, %ymm0, %ymm0
; AVX2-NEXT: retq
;
; AVX512-LABEL: min_le_v4i64:
; AVX512: # BB#0:
; AVX512-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm2
; AVX512-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
; AVX512-NEXT: vpxor %ymm3, %ymm2, %ymm2
; AVX512-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
; AVX512-NEXT: vblendvpd %ymm2, %ymm1, %ymm0, %ymm0
; AVX512-NEXT: retq
%1 = icmp sle <4 x i64> %a, %b
%2 = select <4 x i1> %1, <4 x i64> %a, <4 x i64> %b

View File

@ -462,27 +462,24 @@ define <2 x i64> @max_ge_v2i64(<2 x i64> %a, <2 x i64> %b) {
; SSE41-NEXT: pcmpgtd %xmm3, %xmm4
; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
; SSE41-NEXT: pcmpeqd %xmm3, %xmm0
; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
; SSE41-NEXT: pand %xmm5, %xmm0
; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
; SSE41-NEXT: por %xmm0, %xmm3
; SSE41-NEXT: pcmpeqd %xmm0, %xmm0
; SSE41-NEXT: pxor %xmm3, %xmm0
; SSE41-NEXT: blendvpd %xmm2, %xmm1
; SSE41-NEXT: movapd %xmm1, %xmm0
; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
; SSE41-NEXT: pand %xmm5, %xmm3
; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
; SSE41-NEXT: por %xmm3, %xmm0
; SSE41-NEXT: blendvpd %xmm1, %xmm2
; SSE41-NEXT: movapd %xmm2, %xmm0
; SSE41-NEXT: retq
;
; SSE42-LABEL: max_ge_v2i64:
; SSE42: # BB#0:
; SSE42-NEXT: movdqa %xmm0, %xmm2
; SSE42-NEXT: movdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
; SSE42-NEXT: pxor %xmm3, %xmm0
; SSE42-NEXT: pxor %xmm1, %xmm3
; SSE42-NEXT: pcmpgtq %xmm0, %xmm3
; SSE42-NEXT: pcmpeqd %xmm0, %xmm0
; SSE42-NEXT: pxor %xmm3, %xmm0
; SSE42-NEXT: blendvpd %xmm2, %xmm1
; SSE42-NEXT: movapd %xmm1, %xmm0
; SSE42-NEXT: movdqa {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
; SSE42-NEXT: movdqa %xmm2, %xmm3
; SSE42-NEXT: pxor %xmm0, %xmm3
; SSE42-NEXT: pxor %xmm1, %xmm0
; SSE42-NEXT: pcmpgtq %xmm3, %xmm0
; SSE42-NEXT: blendvpd %xmm1, %xmm2
; SSE42-NEXT: movapd %xmm2, %xmm0
; SSE42-NEXT: retq
;
; AVX-LABEL: max_ge_v2i64:
@ -491,9 +488,7 @@ define <2 x i64> @max_ge_v2i64(<2 x i64> %a, <2 x i64> %b) {
; AVX-NEXT: vpxor %xmm2, %xmm0, %xmm3
; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm2
; AVX-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2
; AVX-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
; AVX-NEXT: vpxor %xmm3, %xmm2, %xmm2
; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
; AVX-NEXT: vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
; AVX-NEXT: retq
%1 = icmp uge <2 x i64> %a, %b
%2 = select <2 x i1> %1, <2 x i64> %a, <2 x i64> %b
@ -543,7 +538,7 @@ define <4 x i64> @max_ge_v4i64(<4 x i64> %a, <4 x i64> %b) {
;
; SSE41-LABEL: max_ge_v4i64:
; SSE41: # BB#0:
; SSE41-NEXT: movdqa %xmm0, %xmm8
; SSE41-NEXT: movdqa %xmm0, %xmm4
; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [2147483648,2147483648,2147483648,2147483648]
; SSE41-NEXT: movdqa %xmm1, %xmm5
; SSE41-NEXT: pxor %xmm0, %xmm5
@ -551,31 +546,27 @@ define <4 x i64> @max_ge_v4i64(<4 x i64> %a, <4 x i64> %b) {
; SSE41-NEXT: pxor %xmm0, %xmm6
; SSE41-NEXT: movdqa %xmm6, %xmm7
; SSE41-NEXT: pcmpgtd %xmm5, %xmm7
; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
; SSE41-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
; SSE41-NEXT: pcmpeqd %xmm5, %xmm6
; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
; SSE41-NEXT: pand %xmm4, %xmm6
; SSE41-NEXT: pand %xmm8, %xmm6
; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
; SSE41-NEXT: por %xmm6, %xmm5
; SSE41-NEXT: pcmpeqd %xmm9, %xmm9
; SSE41-NEXT: pxor %xmm9, %xmm5
; SSE41-NEXT: movdqa %xmm8, %xmm6
; SSE41-NEXT: movdqa %xmm4, %xmm6
; SSE41-NEXT: pxor %xmm0, %xmm6
; SSE41-NEXT: pxor %xmm2, %xmm0
; SSE41-NEXT: movdqa %xmm0, %xmm7
; SSE41-NEXT: pcmpgtd %xmm6, %xmm7
; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
; SSE41-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
; SSE41-NEXT: pcmpeqd %xmm6, %xmm0
; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3]
; SSE41-NEXT: pand %xmm4, %xmm6
; SSE41-NEXT: pand %xmm8, %xmm6
; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
; SSE41-NEXT: por %xmm6, %xmm0
; SSE41-NEXT: pxor %xmm9, %xmm0
; SSE41-NEXT: blendvpd %xmm8, %xmm2
; SSE41-NEXT: blendvpd %xmm2, %xmm4
; SSE41-NEXT: movdqa %xmm5, %xmm0
; SSE41-NEXT: blendvpd %xmm1, %xmm3
; SSE41-NEXT: movapd %xmm2, %xmm0
; SSE41-NEXT: movapd %xmm3, %xmm1
; SSE41-NEXT: blendvpd %xmm3, %xmm1
; SSE41-NEXT: movapd %xmm4, %xmm0
; SSE41-NEXT: retq
;
; SSE42-LABEL: max_ge_v4i64:
@ -587,18 +578,14 @@ define <4 x i64> @max_ge_v4i64(<4 x i64> %a, <4 x i64> %b) {
; SSE42-NEXT: movdqa %xmm3, %xmm5
; SSE42-NEXT: pxor %xmm0, %xmm5
; SSE42-NEXT: pcmpgtq %xmm6, %xmm5
; SSE42-NEXT: pcmpeqd %xmm6, %xmm6
; SSE42-NEXT: pxor %xmm6, %xmm5
; SSE42-NEXT: movdqa %xmm4, %xmm7
; SSE42-NEXT: pxor %xmm0, %xmm7
; SSE42-NEXT: movdqa %xmm4, %xmm6
; SSE42-NEXT: pxor %xmm0, %xmm6
; SSE42-NEXT: pxor %xmm2, %xmm0
; SSE42-NEXT: pcmpgtq %xmm7, %xmm0
; SSE42-NEXT: pxor %xmm6, %xmm0
; SSE42-NEXT: blendvpd %xmm4, %xmm2
; SSE42-NEXT: pcmpgtq %xmm6, %xmm0
; SSE42-NEXT: blendvpd %xmm2, %xmm4
; SSE42-NEXT: movdqa %xmm5, %xmm0
; SSE42-NEXT: blendvpd %xmm1, %xmm3
; SSE42-NEXT: movapd %xmm2, %xmm0
; SSE42-NEXT: movapd %xmm3, %xmm1
; SSE42-NEXT: blendvpd %xmm3, %xmm1
; SSE42-NEXT: movapd %xmm4, %xmm0
; SSE42-NEXT: retq
;
; AVX1-LABEL: max_ge_v4i64:
@ -625,9 +612,7 @@ define <4 x i64> @max_ge_v4i64(<4 x i64> %a, <4 x i64> %b) {
; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm3
; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm2
; AVX2-NEXT: vpcmpgtq %ymm3, %ymm2, %ymm2
; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
; AVX2-NEXT: vblendvpd %ymm2, %ymm1, %ymm0, %ymm0
; AVX2-NEXT: retq
;
; AVX512-LABEL: max_ge_v4i64:
@ -636,9 +621,7 @@ define <4 x i64> @max_ge_v4i64(<4 x i64> %a, <4 x i64> %b) {
; AVX512-NEXT: vpxor %ymm2, %ymm0, %ymm3
; AVX512-NEXT: vpxor %ymm2, %ymm1, %ymm2
; AVX512-NEXT: vpcmpgtq %ymm3, %ymm2, %ymm2
; AVX512-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
; AVX512-NEXT: vpxor %ymm3, %ymm2, %ymm2
; AVX512-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
; AVX512-NEXT: vblendvpd %ymm2, %ymm1, %ymm0, %ymm0
; AVX512-NEXT: retq
%1 = icmp uge <4 x i64> %a, %b
%2 = select <4 x i1> %1, <4 x i64> %a, <4 x i64> %b
@ -1324,28 +1307,24 @@ define <2 x i64> @min_le_v2i64(<2 x i64> %a, <2 x i64> %b) {
; SSE41-NEXT: pcmpgtd %xmm3, %xmm4
; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
; SSE41-NEXT: pcmpeqd %xmm3, %xmm0
; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
; SSE41-NEXT: pand %xmm5, %xmm0
; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
; SSE41-NEXT: por %xmm0, %xmm3
; SSE41-NEXT: pcmpeqd %xmm0, %xmm0
; SSE41-NEXT: pxor %xmm3, %xmm0
; SSE41-NEXT: blendvpd %xmm2, %xmm1
; SSE41-NEXT: movapd %xmm1, %xmm0
; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
; SSE41-NEXT: pand %xmm5, %xmm3
; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
; SSE41-NEXT: por %xmm3, %xmm0
; SSE41-NEXT: blendvpd %xmm1, %xmm2
; SSE41-NEXT: movapd %xmm2, %xmm0
; SSE41-NEXT: retq
;
; SSE42-LABEL: min_le_v2i64:
; SSE42: # BB#0:
; SSE42-NEXT: movdqa %xmm0, %xmm2
; SSE42-NEXT: movdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
; SSE42-NEXT: movdqa %xmm1, %xmm0
; SSE42-NEXT: pxor %xmm3, %xmm0
; SSE42-NEXT: pxor %xmm2, %xmm3
; SSE42-NEXT: pcmpgtq %xmm0, %xmm3
; SSE42-NEXT: pcmpeqd %xmm0, %xmm0
; SSE42-NEXT: pxor %xmm3, %xmm0
; SSE42-NEXT: blendvpd %xmm2, %xmm1
; SSE42-NEXT: movapd %xmm1, %xmm0
; SSE42-NEXT: movdqa {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
; SSE42-NEXT: movdqa %xmm1, %xmm3
; SSE42-NEXT: pxor %xmm0, %xmm3
; SSE42-NEXT: pxor %xmm2, %xmm0
; SSE42-NEXT: pcmpgtq %xmm3, %xmm0
; SSE42-NEXT: blendvpd %xmm1, %xmm2
; SSE42-NEXT: movapd %xmm2, %xmm0
; SSE42-NEXT: retq
;
; AVX-LABEL: min_le_v2i64:
@ -1354,9 +1333,7 @@ define <2 x i64> @min_le_v2i64(<2 x i64> %a, <2 x i64> %b) {
; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm3
; AVX-NEXT: vpxor %xmm2, %xmm0, %xmm2
; AVX-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2
; AVX-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
; AVX-NEXT: vpxor %xmm3, %xmm2, %xmm2
; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
; AVX-NEXT: vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
; AVX-NEXT: retq
%1 = icmp ule <2 x i64> %a, %b
%2 = select <2 x i1> %1, <2 x i64> %a, <2 x i64> %b
@ -1406,7 +1383,7 @@ define <4 x i64> @min_le_v4i64(<4 x i64> %a, <4 x i64> %b) {
;
; SSE41-LABEL: min_le_v4i64:
; SSE41: # BB#0:
; SSE41-NEXT: movdqa %xmm0, %xmm8
; SSE41-NEXT: movdqa %xmm0, %xmm4
; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [2147483648,2147483648,2147483648,2147483648]
; SSE41-NEXT: movdqa %xmm3, %xmm5
; SSE41-NEXT: pxor %xmm0, %xmm5
@ -1414,31 +1391,27 @@ define <4 x i64> @min_le_v4i64(<4 x i64> %a, <4 x i64> %b) {
; SSE41-NEXT: pxor %xmm0, %xmm6
; SSE41-NEXT: movdqa %xmm6, %xmm7
; SSE41-NEXT: pcmpgtd %xmm5, %xmm7
; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
; SSE41-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
; SSE41-NEXT: pcmpeqd %xmm5, %xmm6
; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
; SSE41-NEXT: pand %xmm4, %xmm6
; SSE41-NEXT: pand %xmm8, %xmm6
; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
; SSE41-NEXT: por %xmm6, %xmm5
; SSE41-NEXT: pcmpeqd %xmm9, %xmm9
; SSE41-NEXT: pxor %xmm9, %xmm5
; SSE41-NEXT: movdqa %xmm2, %xmm6
; SSE41-NEXT: pxor %xmm0, %xmm6
; SSE41-NEXT: pxor %xmm8, %xmm0
; SSE41-NEXT: pxor %xmm4, %xmm0
; SSE41-NEXT: movdqa %xmm0, %xmm7
; SSE41-NEXT: pcmpgtd %xmm6, %xmm7
; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
; SSE41-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
; SSE41-NEXT: pcmpeqd %xmm6, %xmm0
; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3]
; SSE41-NEXT: pand %xmm4, %xmm6
; SSE41-NEXT: pand %xmm8, %xmm6
; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
; SSE41-NEXT: por %xmm6, %xmm0
; SSE41-NEXT: pxor %xmm9, %xmm0
; SSE41-NEXT: blendvpd %xmm8, %xmm2
; SSE41-NEXT: blendvpd %xmm2, %xmm4
; SSE41-NEXT: movdqa %xmm5, %xmm0
; SSE41-NEXT: blendvpd %xmm1, %xmm3
; SSE41-NEXT: movapd %xmm2, %xmm0
; SSE41-NEXT: movapd %xmm3, %xmm1
; SSE41-NEXT: blendvpd %xmm3, %xmm1
; SSE41-NEXT: movapd %xmm4, %xmm0
; SSE41-NEXT: retq
;
; SSE42-LABEL: min_le_v4i64:
@ -1450,18 +1423,14 @@ define <4 x i64> @min_le_v4i64(<4 x i64> %a, <4 x i64> %b) {
; SSE42-NEXT: movdqa %xmm1, %xmm5
; SSE42-NEXT: pxor %xmm0, %xmm5
; SSE42-NEXT: pcmpgtq %xmm6, %xmm5
; SSE42-NEXT: pcmpeqd %xmm6, %xmm6
; SSE42-NEXT: pxor %xmm6, %xmm5
; SSE42-NEXT: movdqa %xmm2, %xmm7
; SSE42-NEXT: pxor %xmm0, %xmm7
; SSE42-NEXT: movdqa %xmm2, %xmm6
; SSE42-NEXT: pxor %xmm0, %xmm6
; SSE42-NEXT: pxor %xmm4, %xmm0
; SSE42-NEXT: pcmpgtq %xmm7, %xmm0
; SSE42-NEXT: pxor %xmm6, %xmm0
; SSE42-NEXT: blendvpd %xmm4, %xmm2
; SSE42-NEXT: pcmpgtq %xmm6, %xmm0
; SSE42-NEXT: blendvpd %xmm2, %xmm4
; SSE42-NEXT: movdqa %xmm5, %xmm0
; SSE42-NEXT: blendvpd %xmm1, %xmm3
; SSE42-NEXT: movapd %xmm2, %xmm0
; SSE42-NEXT: movapd %xmm3, %xmm1
; SSE42-NEXT: blendvpd %xmm3, %xmm1
; SSE42-NEXT: movapd %xmm4, %xmm0
; SSE42-NEXT: retq
;
; AVX1-LABEL: min_le_v4i64:
@ -1488,9 +1457,7 @@ define <4 x i64> @min_le_v4i64(<4 x i64> %a, <4 x i64> %b) {
; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm3
; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm2
; AVX2-NEXT: vpcmpgtq %ymm3, %ymm2, %ymm2
; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
; AVX2-NEXT: vblendvpd %ymm2, %ymm1, %ymm0, %ymm0
; AVX2-NEXT: retq
;
; AVX512-LABEL: min_le_v4i64:
@ -1499,9 +1466,7 @@ define <4 x i64> @min_le_v4i64(<4 x i64> %a, <4 x i64> %b) {
; AVX512-NEXT: vpxor %ymm2, %ymm1, %ymm3
; AVX512-NEXT: vpxor %ymm2, %ymm0, %ymm2
; AVX512-NEXT: vpcmpgtq %ymm3, %ymm2, %ymm2
; AVX512-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
; AVX512-NEXT: vpxor %ymm3, %ymm2, %ymm2
; AVX512-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
; AVX512-NEXT: vblendvpd %ymm2, %ymm1, %ymm0, %ymm0
; AVX512-NEXT: retq
%1 = icmp ule <4 x i64> %a, %b
%2 = select <4 x i1> %1, <4 x i64> %a, <4 x i64> %b

File diff suppressed because it is too large Load Diff