From 810fa04ac7e367ed1aa736f2c54d980bc6fc09f1 Mon Sep 17 00:00:00 2001 From: Simon Pilgrim Date: Tue, 26 Feb 2019 11:27:53 +0000 Subject: [PATCH] [LegalizeDAG] Expand SADDO/SSUBO using SADDSAT/SSUBSAT (PR37763) If SADDSAT/SSUBSAT are legal, then we can expand SADDO/SSUBO by performing a ADD/SUB and a SADDO/SSUBO and then compare the results. I looked at doing this for UADDO/USUBO as well but as we don't have to do as many range comparisons I didn't see any/much benefit. Differential Revision: https://reviews.llvm.org/D58637 llvm-svn: 354866 --- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 22 ++- llvm/test/CodeGen/X86/vec_saddo.ll | 216 +++++++----------------- llvm/test/CodeGen/X86/vec_ssubo.ll | 227 +++++++------------------- 3 files changed, 143 insertions(+), 322 deletions(-) diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index 4ee0b93..0e5ba34 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -3261,13 +3261,25 @@ bool SelectionDAGLegalize::ExpandNode(SDNode *Node) { case ISD::SSUBO: { SDValue LHS = Node->getOperand(0); SDValue RHS = Node->getOperand(1); - SDValue Sum = DAG.getNode(Node->getOpcode() == ISD::SADDO ? - ISD::ADD : ISD::SUB, dl, LHS.getValueType(), - LHS, RHS); + bool IsAdd = Node->getOpcode() == ISD::SADDO; + + SDValue Sum = DAG.getNode(IsAdd ? ISD::ADD : ISD::SUB, dl, + LHS.getValueType(), LHS, RHS); Results.push_back(Sum); + EVT ResultType = Node->getValueType(1); EVT OType = getSetCCResultType(Node->getValueType(0)); + // If SADDSAT/SSUBSAT is legal, compare results to detect overflow. + unsigned OpcSat = IsAdd ? ISD::SADDSAT : ISD::SSUBSAT; + if (TLI.isOperationLegalOrCustom(OpcSat, LHS.getValueType())) { + SDValue Sat = DAG.getNode(OpcSat, dl, LHS.getValueType(), LHS, RHS); + SDValue SetCC = DAG.getSetCC(dl, OType, Sum, Sat, ISD::SETNE); + Results.push_back( + DAG.getBoolExtOrTrunc(SetCC, dl, ResultType, ResultType)); + break; + } + SDValue Zero = DAG.getConstant(0, dl, LHS.getValueType()); // LHSSign -> LHS >= 0 @@ -3281,8 +3293,7 @@ bool SelectionDAGLegalize::ExpandNode(SDNode *Node) { SDValue LHSSign = DAG.getSetCC(dl, OType, LHS, Zero, ISD::SETGE); SDValue RHSSign = DAG.getSetCC(dl, OType, RHS, Zero, ISD::SETGE); SDValue SignsMatch = DAG.getSetCC(dl, OType, LHSSign, RHSSign, - Node->getOpcode() == ISD::SADDO ? - ISD::SETEQ : ISD::SETNE); + IsAdd ? ISD::SETEQ : ISD::SETNE); SDValue SumSign = DAG.getSetCC(dl, OType, Sum, Zero, ISD::SETGE); SDValue SumSignNE = DAG.getSetCC(dl, OType, LHSSign, SumSign, ISD::SETNE); @@ -3296,6 +3307,7 @@ bool SelectionDAGLegalize::ExpandNode(SDNode *Node) { SDValue LHS = Node->getOperand(0); SDValue RHS = Node->getOperand(1); bool IsAdd = Node->getOpcode() == ISD::UADDO; + // If ADD/SUBCARRY is legal, use that instead. unsigned OpcCarry = IsAdd ? ISD::ADDCARRY : ISD::SUBCARRY; if (TLI.isOperationLegalOrCustom(OpcCarry, Node->getValueType(0))) { diff --git a/llvm/test/CodeGen/X86/vec_saddo.ll b/llvm/test/CodeGen/X86/vec_saddo.ll index 2235ec2..dafd9e2 100644 --- a/llvm/test/CodeGen/X86/vec_saddo.ll +++ b/llvm/test/CodeGen/X86/vec_saddo.ll @@ -936,20 +936,12 @@ define <16 x i32> @saddo_v16i32(<16 x i32> %a0, <16 x i32> %a1, <16 x i32>* %p2) define <16 x i32> @saddo_v16i8(<16 x i8> %a0, <16 x i8> %a1, <16 x i8>* %p2) nounwind { ; SSE2-LABEL: saddo_v16i8: ; SSE2: # %bb.0: -; SSE2-NEXT: pxor %xmm3, %xmm3 -; SSE2-NEXT: pxor %xmm2, %xmm2 -; SSE2-NEXT: pcmpgtb %xmm1, %xmm2 -; SSE2-NEXT: pcmpeqd %xmm4, %xmm4 -; SSE2-NEXT: pxor %xmm4, %xmm2 -; SSE2-NEXT: pxor %xmm5, %xmm5 -; SSE2-NEXT: pcmpgtb %xmm0, %xmm5 -; SSE2-NEXT: pxor %xmm4, %xmm5 -; SSE2-NEXT: pcmpeqb %xmm5, %xmm2 +; SSE2-NEXT: movdqa %xmm0, %xmm2 +; SSE2-NEXT: paddsb %xmm1, %xmm2 ; SSE2-NEXT: paddb %xmm1, %xmm0 -; SSE2-NEXT: pcmpgtb %xmm0, %xmm3 -; SSE2-NEXT: pxor %xmm4, %xmm3 -; SSE2-NEXT: pcmpeqb %xmm5, %xmm3 -; SSE2-NEXT: pandn %xmm2, %xmm3 +; SSE2-NEXT: pcmpeqb %xmm0, %xmm2 +; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE2-NEXT: pxor %xmm2, %xmm3 ; SSE2-NEXT: movdqa %xmm3, %xmm1 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] ; SSE2-NEXT: movdqa %xmm1, %xmm4 @@ -973,20 +965,12 @@ define <16 x i32> @saddo_v16i8(<16 x i8> %a0, <16 x i8> %a1, <16 x i8>* %p2) nou ; ; SSSE3-LABEL: saddo_v16i8: ; SSSE3: # %bb.0: -; SSSE3-NEXT: pxor %xmm3, %xmm3 -; SSSE3-NEXT: pxor %xmm2, %xmm2 -; SSSE3-NEXT: pcmpgtb %xmm1, %xmm2 -; SSSE3-NEXT: pcmpeqd %xmm4, %xmm4 -; SSSE3-NEXT: pxor %xmm4, %xmm2 -; SSSE3-NEXT: pxor %xmm5, %xmm5 -; SSSE3-NEXT: pcmpgtb %xmm0, %xmm5 -; SSSE3-NEXT: pxor %xmm4, %xmm5 -; SSSE3-NEXT: pcmpeqb %xmm5, %xmm2 +; SSSE3-NEXT: movdqa %xmm0, %xmm2 +; SSSE3-NEXT: paddsb %xmm1, %xmm2 ; SSSE3-NEXT: paddb %xmm1, %xmm0 -; SSSE3-NEXT: pcmpgtb %xmm0, %xmm3 -; SSSE3-NEXT: pxor %xmm4, %xmm3 -; SSSE3-NEXT: pcmpeqb %xmm5, %xmm3 -; SSSE3-NEXT: pandn %xmm2, %xmm3 +; SSSE3-NEXT: pcmpeqb %xmm0, %xmm2 +; SSSE3-NEXT: pcmpeqd %xmm3, %xmm3 +; SSSE3-NEXT: pxor %xmm2, %xmm3 ; SSSE3-NEXT: movdqa %xmm3, %xmm1 ; SSSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] ; SSSE3-NEXT: movdqa %xmm1, %xmm4 @@ -1010,20 +994,12 @@ define <16 x i32> @saddo_v16i8(<16 x i8> %a0, <16 x i8> %a1, <16 x i8>* %p2) nou ; ; SSE41-LABEL: saddo_v16i8: ; SSE41: # %bb.0: -; SSE41-NEXT: pxor %xmm3, %xmm3 -; SSE41-NEXT: pxor %xmm2, %xmm2 -; SSE41-NEXT: pcmpgtb %xmm1, %xmm2 -; SSE41-NEXT: pcmpeqd %xmm4, %xmm4 -; SSE41-NEXT: pxor %xmm4, %xmm2 -; SSE41-NEXT: pxor %xmm5, %xmm5 -; SSE41-NEXT: pcmpgtb %xmm0, %xmm5 -; SSE41-NEXT: pxor %xmm4, %xmm5 -; SSE41-NEXT: pcmpeqb %xmm5, %xmm2 +; SSE41-NEXT: movdqa %xmm0, %xmm2 +; SSE41-NEXT: paddsb %xmm1, %xmm2 ; SSE41-NEXT: paddb %xmm1, %xmm0 -; SSE41-NEXT: pcmpgtb %xmm0, %xmm3 -; SSE41-NEXT: pxor %xmm4, %xmm3 -; SSE41-NEXT: pcmpeqb %xmm5, %xmm3 -; SSE41-NEXT: pandn %xmm2, %xmm3 +; SSE41-NEXT: pcmpeqb %xmm0, %xmm2 +; SSE41-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE41-NEXT: pxor %xmm2, %xmm3 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm4 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero ; SSE41-NEXT: pslld $31, %xmm4 ; SSE41-NEXT: psrad $31, %xmm4 @@ -1045,18 +1021,11 @@ define <16 x i32> @saddo_v16i8(<16 x i8> %a0, <16 x i8> %a1, <16 x i8>* %p2) nou ; ; AVX1-LABEL: saddo_v16i8: ; AVX1: # %bb.0: -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1-NEXT: vpcmpgtb %xmm1, %xmm2, %xmm3 -; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4 -; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3 -; AVX1-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm5 -; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5 -; AVX1-NEXT: vpcmpeqb %xmm3, %xmm5, %xmm3 -; AVX1-NEXT: vpaddb %xmm1, %xmm0, %xmm6 -; AVX1-NEXT: vpcmpgtb %xmm6, %xmm2, %xmm0 -; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm0 -; AVX1-NEXT: vpcmpeqb %xmm0, %xmm5, %xmm0 -; AVX1-NEXT: vpandn %xmm3, %xmm0, %xmm1 +; AVX1-NEXT: vpaddsb %xmm1, %xmm0, %xmm2 +; AVX1-NEXT: vpaddb %xmm1, %xmm0, %xmm3 +; AVX1-NEXT: vpcmpeqb %xmm2, %xmm3, %xmm0 +; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 +; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm1 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm0 ; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[1,1,2,3] ; AVX1-NEXT: vpmovsxbd %xmm2, %xmm2 @@ -1066,39 +1035,27 @@ define <16 x i32> @saddo_v16i8(<16 x i8> %a0, <16 x i8> %a1, <16 x i8>* %p2) nou ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[3,3,0,1] ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1 -; AVX1-NEXT: vmovdqa %xmm6, (%rdi) +; AVX1-NEXT: vmovdqa %xmm3, (%rdi) ; AVX1-NEXT: retq ; ; AVX2-LABEL: saddo_v16i8: ; AVX2: # %bb.0: -; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpcmpgtb %xmm1, %xmm2, %xmm3 -; AVX2-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4 -; AVX2-NEXT: vpxor %xmm4, %xmm3, %xmm3 -; AVX2-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm5 -; AVX2-NEXT: vpxor %xmm4, %xmm5, %xmm5 -; AVX2-NEXT: vpcmpeqb %xmm3, %xmm5, %xmm3 -; AVX2-NEXT: vpaddb %xmm1, %xmm0, %xmm6 -; AVX2-NEXT: vpcmpgtb %xmm6, %xmm2, %xmm0 -; AVX2-NEXT: vpxor %xmm4, %xmm0, %xmm0 -; AVX2-NEXT: vpcmpeqb %xmm0, %xmm5, %xmm0 -; AVX2-NEXT: vpandn %xmm3, %xmm0, %xmm1 +; AVX2-NEXT: vpaddsb %xmm1, %xmm0, %xmm2 +; AVX2-NEXT: vpaddb %xmm1, %xmm0, %xmm3 +; AVX2-NEXT: vpcmpeqb %xmm2, %xmm3, %xmm0 +; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 +; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm1 ; AVX2-NEXT: vpmovsxbd %xmm1, %ymm0 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1] ; AVX2-NEXT: vpmovsxbd %xmm1, %ymm1 -; AVX2-NEXT: vmovdqa %xmm6, (%rdi) +; AVX2-NEXT: vmovdqa %xmm3, (%rdi) ; AVX2-NEXT: retq ; ; AVX512-LABEL: saddo_v16i8: ; AVX512: # %bb.0: -; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX512-NEXT: vpcmpnltb %xmm2, %xmm1, %k0 -; AVX512-NEXT: vpcmpnltb %xmm2, %xmm0, %k1 -; AVX512-NEXT: kxorw %k0, %k1, %k0 +; AVX512-NEXT: vpaddsb %xmm1, %xmm0, %xmm2 ; AVX512-NEXT: vpaddb %xmm1, %xmm0, %xmm1 -; AVX512-NEXT: vpcmpnltb %xmm2, %xmm1, %k2 -; AVX512-NEXT: kxorw %k2, %k1, %k1 -; AVX512-NEXT: kandnw %k1, %k0, %k1 +; AVX512-NEXT: vpcmpneqb %xmm2, %xmm1, %k1 ; AVX512-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z} ; AVX512-NEXT: vmovdqa %xmm1, (%rdi) ; AVX512-NEXT: retq @@ -1113,21 +1070,12 @@ define <16 x i32> @saddo_v16i8(<16 x i8> %a0, <16 x i8> %a1, <16 x i8>* %p2) nou define <8 x i32> @saddo_v8i16(<8 x i16> %a0, <8 x i16> %a1, <8 x i16>* %p2) nounwind { ; SSE2-LABEL: saddo_v8i16: ; SSE2: # %bb.0: -; SSE2-NEXT: movdqa %xmm1, %xmm2 -; SSE2-NEXT: pxor %xmm1, %xmm1 -; SSE2-NEXT: pxor %xmm3, %xmm3 -; SSE2-NEXT: pcmpgtw %xmm2, %xmm3 -; SSE2-NEXT: pcmpeqd %xmm4, %xmm4 -; SSE2-NEXT: pxor %xmm4, %xmm3 -; SSE2-NEXT: pxor %xmm5, %xmm5 -; SSE2-NEXT: pcmpgtw %xmm0, %xmm5 -; SSE2-NEXT: pxor %xmm4, %xmm5 -; SSE2-NEXT: pcmpeqw %xmm5, %xmm3 -; SSE2-NEXT: paddw %xmm2, %xmm0 -; SSE2-NEXT: pcmpgtw %xmm0, %xmm1 -; SSE2-NEXT: pxor %xmm4, %xmm1 -; SSE2-NEXT: pcmpeqw %xmm5, %xmm1 -; SSE2-NEXT: pandn %xmm3, %xmm1 +; SSE2-NEXT: movdqa %xmm0, %xmm2 +; SSE2-NEXT: paddsw %xmm1, %xmm2 +; SSE2-NEXT: paddw %xmm1, %xmm0 +; SSE2-NEXT: pcmpeqw %xmm0, %xmm2 +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm2, %xmm1 ; SSE2-NEXT: movdqa %xmm1, %xmm2 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3] ; SSE2-NEXT: pslld $31, %xmm2 @@ -1141,21 +1089,12 @@ define <8 x i32> @saddo_v8i16(<8 x i16> %a0, <8 x i16> %a1, <8 x i16>* %p2) noun ; ; SSSE3-LABEL: saddo_v8i16: ; SSSE3: # %bb.0: -; SSSE3-NEXT: movdqa %xmm1, %xmm2 -; SSSE3-NEXT: pxor %xmm1, %xmm1 -; SSSE3-NEXT: pxor %xmm3, %xmm3 -; SSSE3-NEXT: pcmpgtw %xmm2, %xmm3 -; SSSE3-NEXT: pcmpeqd %xmm4, %xmm4 -; SSSE3-NEXT: pxor %xmm4, %xmm3 -; SSSE3-NEXT: pxor %xmm5, %xmm5 -; SSSE3-NEXT: pcmpgtw %xmm0, %xmm5 -; SSSE3-NEXT: pxor %xmm4, %xmm5 -; SSSE3-NEXT: pcmpeqw %xmm5, %xmm3 -; SSSE3-NEXT: paddw %xmm2, %xmm0 -; SSSE3-NEXT: pcmpgtw %xmm0, %xmm1 -; SSSE3-NEXT: pxor %xmm4, %xmm1 -; SSSE3-NEXT: pcmpeqw %xmm5, %xmm1 -; SSSE3-NEXT: pandn %xmm3, %xmm1 +; SSSE3-NEXT: movdqa %xmm0, %xmm2 +; SSSE3-NEXT: paddsw %xmm1, %xmm2 +; SSSE3-NEXT: paddw %xmm1, %xmm0 +; SSSE3-NEXT: pcmpeqw %xmm0, %xmm2 +; SSSE3-NEXT: pcmpeqd %xmm1, %xmm1 +; SSSE3-NEXT: pxor %xmm2, %xmm1 ; SSSE3-NEXT: movdqa %xmm1, %xmm2 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3] ; SSSE3-NEXT: pslld $31, %xmm2 @@ -1169,21 +1108,12 @@ define <8 x i32> @saddo_v8i16(<8 x i16> %a0, <8 x i16> %a1, <8 x i16>* %p2) noun ; ; SSE41-LABEL: saddo_v8i16: ; SSE41: # %bb.0: -; SSE41-NEXT: movdqa %xmm1, %xmm2 -; SSE41-NEXT: pxor %xmm1, %xmm1 -; SSE41-NEXT: pxor %xmm3, %xmm3 -; SSE41-NEXT: pcmpgtw %xmm2, %xmm3 -; SSE41-NEXT: pcmpeqd %xmm4, %xmm4 -; SSE41-NEXT: pxor %xmm4, %xmm3 -; SSE41-NEXT: pxor %xmm5, %xmm5 -; SSE41-NEXT: pcmpgtw %xmm0, %xmm5 -; SSE41-NEXT: pxor %xmm4, %xmm5 -; SSE41-NEXT: pcmpeqw %xmm5, %xmm3 -; SSE41-NEXT: paddw %xmm2, %xmm0 -; SSE41-NEXT: pcmpgtw %xmm0, %xmm1 -; SSE41-NEXT: pxor %xmm4, %xmm1 -; SSE41-NEXT: pcmpeqw %xmm5, %xmm1 -; SSE41-NEXT: pandn %xmm3, %xmm1 +; SSE41-NEXT: movdqa %xmm0, %xmm2 +; SSE41-NEXT: paddsw %xmm1, %xmm2 +; SSE41-NEXT: paddw %xmm1, %xmm0 +; SSE41-NEXT: pcmpeqw %xmm0, %xmm2 +; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE41-NEXT: pxor %xmm2, %xmm1 ; SSE41-NEXT: pmovzxwd {{.*#+}} xmm2 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero ; SSE41-NEXT: pslld $31, %xmm2 ; SSE41-NEXT: psrad $31, %xmm2 @@ -1196,18 +1126,11 @@ define <8 x i32> @saddo_v8i16(<8 x i16> %a0, <8 x i16> %a1, <8 x i16>* %p2) noun ; ; AVX1-LABEL: saddo_v8i16: ; AVX1: # %bb.0: -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1-NEXT: vpcmpgtw %xmm1, %xmm2, %xmm3 -; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4 -; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3 -; AVX1-NEXT: vpcmpgtw %xmm0, %xmm2, %xmm5 -; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5 -; AVX1-NEXT: vpcmpeqw %xmm3, %xmm5, %xmm3 +; AVX1-NEXT: vpaddsw %xmm1, %xmm0, %xmm2 ; AVX1-NEXT: vpaddw %xmm1, %xmm0, %xmm1 -; AVX1-NEXT: vpcmpgtw %xmm1, %xmm2, %xmm0 -; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm0 -; AVX1-NEXT: vpcmpeqw %xmm0, %xmm5, %xmm0 -; AVX1-NEXT: vpandn %xmm3, %xmm0, %xmm0 +; AVX1-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm0 +; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 +; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0 ; AVX1-NEXT: vpmovsxwd %xmm0, %xmm2 ; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] ; AVX1-NEXT: vpmovsxwd %xmm0, %xmm0 @@ -1217,32 +1140,20 @@ define <8 x i32> @saddo_v8i16(<8 x i16> %a0, <8 x i16> %a1, <8 x i16>* %p2) noun ; ; AVX2-LABEL: saddo_v8i16: ; AVX2: # %bb.0: -; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpcmpgtw %xmm1, %xmm2, %xmm3 -; AVX2-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4 -; AVX2-NEXT: vpxor %xmm4, %xmm3, %xmm3 -; AVX2-NEXT: vpcmpgtw %xmm0, %xmm2, %xmm5 -; AVX2-NEXT: vpxor %xmm4, %xmm5, %xmm5 -; AVX2-NEXT: vpcmpeqw %xmm3, %xmm5, %xmm3 +; AVX2-NEXT: vpaddsw %xmm1, %xmm0, %xmm2 ; AVX2-NEXT: vpaddw %xmm1, %xmm0, %xmm1 -; AVX2-NEXT: vpcmpgtw %xmm1, %xmm2, %xmm0 -; AVX2-NEXT: vpxor %xmm4, %xmm0, %xmm0 -; AVX2-NEXT: vpcmpeqw %xmm0, %xmm5, %xmm0 -; AVX2-NEXT: vpandn %xmm3, %xmm0, %xmm0 +; AVX2-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm0 +; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 +; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0 ; AVX2-NEXT: vpmovsxwd %xmm0, %ymm0 ; AVX2-NEXT: vmovdqa %xmm1, (%rdi) ; AVX2-NEXT: retq ; ; AVX512-LABEL: saddo_v8i16: ; AVX512: # %bb.0: -; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX512-NEXT: vpcmpnltw %xmm2, %xmm1, %k0 -; AVX512-NEXT: vpcmpnltw %xmm2, %xmm0, %k1 -; AVX512-NEXT: kxorw %k0, %k1, %k0 +; AVX512-NEXT: vpaddsw %xmm1, %xmm0, %xmm2 ; AVX512-NEXT: vpaddw %xmm1, %xmm0, %xmm1 -; AVX512-NEXT: vpcmpnltw %xmm2, %xmm1, %k2 -; AVX512-NEXT: kxorw %k2, %k1, %k1 -; AVX512-NEXT: kandnw %k1, %k0, %k1 +; AVX512-NEXT: vpcmpneqw %xmm2, %xmm1, %k1 ; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0 ; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z} ; AVX512-NEXT: vmovdqa %xmm1, (%rdi) @@ -1697,15 +1608,14 @@ define <4 x i32> @saddo_v4i1(<4 x i1> %a0, <4 x i1> %a1, <4 x i1>* %p2) nounwind ; ; AVX512-LABEL: saddo_v4i1: ; AVX512: # %bb.0: +; AVX512-NEXT: vpslld $31, %xmm1, %xmm1 ; AVX512-NEXT: vpslld $31, %xmm0, %xmm0 +; AVX512-NEXT: vpor %xmm1, %xmm0, %xmm2 ; AVX512-NEXT: vptestmd %xmm0, %xmm0, %k0 -; AVX512-NEXT: vptestnmd %xmm0, %xmm0, %k1 -; AVX512-NEXT: vpslld $31, %xmm1, %xmm0 -; AVX512-NEXT: vptestmd %xmm0, %xmm0, %k2 -; AVX512-NEXT: kxorw %k2, %k1, %k3 -; AVX512-NEXT: kxorw %k2, %k0, %k0 -; AVX512-NEXT: kxorw %k0, %k1, %k1 -; AVX512-NEXT: kandnw %k3, %k1, %k1 +; AVX512-NEXT: vptestmd %xmm1, %xmm1, %k1 +; AVX512-NEXT: vptestmd %xmm2, %xmm2, %k2 +; AVX512-NEXT: kxorw %k1, %k0, %k0 +; AVX512-NEXT: kxorw %k2, %k0, %k1 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z} ; AVX512-NEXT: kmovd %k0, %eax diff --git a/llvm/test/CodeGen/X86/vec_ssubo.ll b/llvm/test/CodeGen/X86/vec_ssubo.ll index ac1c89f..8497181 100644 --- a/llvm/test/CodeGen/X86/vec_ssubo.ll +++ b/llvm/test/CodeGen/X86/vec_ssubo.ll @@ -968,21 +968,12 @@ define <16 x i32> @ssubo_v16i32(<16 x i32> %a0, <16 x i32> %a1, <16 x i32>* %p2) define <16 x i32> @ssubo_v16i8(<16 x i8> %a0, <16 x i8> %a1, <16 x i8>* %p2) nounwind { ; SSE2-LABEL: ssubo_v16i8: ; SSE2: # %bb.0: -; SSE2-NEXT: pxor %xmm2, %xmm2 -; SSE2-NEXT: pxor %xmm3, %xmm3 -; SSE2-NEXT: pcmpgtb %xmm1, %xmm3 -; SSE2-NEXT: pcmpeqd %xmm4, %xmm4 -; SSE2-NEXT: pxor %xmm4, %xmm3 -; SSE2-NEXT: pxor %xmm5, %xmm5 -; SSE2-NEXT: pcmpgtb %xmm0, %xmm5 -; SSE2-NEXT: pxor %xmm4, %xmm5 -; SSE2-NEXT: pcmpeqb %xmm5, %xmm3 +; SSE2-NEXT: movdqa %xmm0, %xmm2 +; SSE2-NEXT: psubsb %xmm1, %xmm2 ; SSE2-NEXT: psubb %xmm1, %xmm0 -; SSE2-NEXT: pcmpgtb %xmm0, %xmm2 -; SSE2-NEXT: pxor %xmm4, %xmm2 -; SSE2-NEXT: pcmpeqb %xmm5, %xmm2 -; SSE2-NEXT: pxor %xmm4, %xmm2 -; SSE2-NEXT: pandn %xmm2, %xmm3 +; SSE2-NEXT: pcmpeqb %xmm0, %xmm2 +; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE2-NEXT: pxor %xmm2, %xmm3 ; SSE2-NEXT: movdqa %xmm3, %xmm1 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] ; SSE2-NEXT: movdqa %xmm1, %xmm4 @@ -1006,21 +997,12 @@ define <16 x i32> @ssubo_v16i8(<16 x i8> %a0, <16 x i8> %a1, <16 x i8>* %p2) nou ; ; SSSE3-LABEL: ssubo_v16i8: ; SSSE3: # %bb.0: -; SSSE3-NEXT: pxor %xmm2, %xmm2 -; SSSE3-NEXT: pxor %xmm3, %xmm3 -; SSSE3-NEXT: pcmpgtb %xmm1, %xmm3 -; SSSE3-NEXT: pcmpeqd %xmm4, %xmm4 -; SSSE3-NEXT: pxor %xmm4, %xmm3 -; SSSE3-NEXT: pxor %xmm5, %xmm5 -; SSSE3-NEXT: pcmpgtb %xmm0, %xmm5 -; SSSE3-NEXT: pxor %xmm4, %xmm5 -; SSSE3-NEXT: pcmpeqb %xmm5, %xmm3 +; SSSE3-NEXT: movdqa %xmm0, %xmm2 +; SSSE3-NEXT: psubsb %xmm1, %xmm2 ; SSSE3-NEXT: psubb %xmm1, %xmm0 -; SSSE3-NEXT: pcmpgtb %xmm0, %xmm2 -; SSSE3-NEXT: pxor %xmm4, %xmm2 -; SSSE3-NEXT: pcmpeqb %xmm5, %xmm2 -; SSSE3-NEXT: pxor %xmm4, %xmm2 -; SSSE3-NEXT: pandn %xmm2, %xmm3 +; SSSE3-NEXT: pcmpeqb %xmm0, %xmm2 +; SSSE3-NEXT: pcmpeqd %xmm3, %xmm3 +; SSSE3-NEXT: pxor %xmm2, %xmm3 ; SSSE3-NEXT: movdqa %xmm3, %xmm1 ; SSSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] ; SSSE3-NEXT: movdqa %xmm1, %xmm4 @@ -1044,21 +1026,12 @@ define <16 x i32> @ssubo_v16i8(<16 x i8> %a0, <16 x i8> %a1, <16 x i8>* %p2) nou ; ; SSE41-LABEL: ssubo_v16i8: ; SSE41: # %bb.0: -; SSE41-NEXT: pxor %xmm2, %xmm2 -; SSE41-NEXT: pxor %xmm3, %xmm3 -; SSE41-NEXT: pcmpgtb %xmm1, %xmm3 -; SSE41-NEXT: pcmpeqd %xmm4, %xmm4 -; SSE41-NEXT: pxor %xmm4, %xmm3 -; SSE41-NEXT: pxor %xmm5, %xmm5 -; SSE41-NEXT: pcmpgtb %xmm0, %xmm5 -; SSE41-NEXT: pxor %xmm4, %xmm5 -; SSE41-NEXT: pcmpeqb %xmm5, %xmm3 +; SSE41-NEXT: movdqa %xmm0, %xmm2 +; SSE41-NEXT: psubsb %xmm1, %xmm2 ; SSE41-NEXT: psubb %xmm1, %xmm0 -; SSE41-NEXT: pcmpgtb %xmm0, %xmm2 -; SSE41-NEXT: pxor %xmm4, %xmm2 -; SSE41-NEXT: pcmpeqb %xmm5, %xmm2 -; SSE41-NEXT: pxor %xmm4, %xmm2 -; SSE41-NEXT: pandn %xmm2, %xmm3 +; SSE41-NEXT: pcmpeqb %xmm0, %xmm2 +; SSE41-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE41-NEXT: pxor %xmm2, %xmm3 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm4 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero ; SSE41-NEXT: pslld $31, %xmm4 ; SSE41-NEXT: psrad $31, %xmm4 @@ -1080,19 +1053,11 @@ define <16 x i32> @ssubo_v16i8(<16 x i8> %a0, <16 x i8> %a1, <16 x i8>* %p2) nou ; ; AVX1-LABEL: ssubo_v16i8: ; AVX1: # %bb.0: -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1-NEXT: vpcmpgtb %xmm1, %xmm2, %xmm3 -; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4 -; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3 -; AVX1-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm5 -; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5 -; AVX1-NEXT: vpcmpeqb %xmm3, %xmm5, %xmm3 -; AVX1-NEXT: vpsubb %xmm1, %xmm0, %xmm6 -; AVX1-NEXT: vpcmpgtb %xmm6, %xmm2, %xmm0 -; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm0 -; AVX1-NEXT: vpcmpeqb %xmm0, %xmm5, %xmm0 -; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm0 -; AVX1-NEXT: vpandn %xmm0, %xmm3, %xmm1 +; AVX1-NEXT: vpsubsb %xmm1, %xmm0, %xmm2 +; AVX1-NEXT: vpsubb %xmm1, %xmm0, %xmm3 +; AVX1-NEXT: vpcmpeqb %xmm2, %xmm3, %xmm0 +; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 +; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm1 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm0 ; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[1,1,2,3] ; AVX1-NEXT: vpmovsxbd %xmm2, %xmm2 @@ -1102,40 +1067,27 @@ define <16 x i32> @ssubo_v16i8(<16 x i8> %a0, <16 x i8> %a1, <16 x i8>* %p2) nou ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[3,3,0,1] ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1 -; AVX1-NEXT: vmovdqa %xmm6, (%rdi) +; AVX1-NEXT: vmovdqa %xmm3, (%rdi) ; AVX1-NEXT: retq ; ; AVX2-LABEL: ssubo_v16i8: ; AVX2: # %bb.0: -; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpcmpgtb %xmm1, %xmm2, %xmm3 -; AVX2-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4 -; AVX2-NEXT: vpxor %xmm4, %xmm3, %xmm3 -; AVX2-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm5 -; AVX2-NEXT: vpxor %xmm4, %xmm5, %xmm5 -; AVX2-NEXT: vpcmpeqb %xmm3, %xmm5, %xmm3 -; AVX2-NEXT: vpsubb %xmm1, %xmm0, %xmm6 -; AVX2-NEXT: vpcmpgtb %xmm6, %xmm2, %xmm0 -; AVX2-NEXT: vpxor %xmm4, %xmm0, %xmm0 -; AVX2-NEXT: vpcmpeqb %xmm0, %xmm5, %xmm0 -; AVX2-NEXT: vpxor %xmm4, %xmm0, %xmm0 -; AVX2-NEXT: vpandn %xmm0, %xmm3, %xmm1 +; AVX2-NEXT: vpsubsb %xmm1, %xmm0, %xmm2 +; AVX2-NEXT: vpsubb %xmm1, %xmm0, %xmm3 +; AVX2-NEXT: vpcmpeqb %xmm2, %xmm3, %xmm0 +; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 +; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm1 ; AVX2-NEXT: vpmovsxbd %xmm1, %ymm0 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1] ; AVX2-NEXT: vpmovsxbd %xmm1, %ymm1 -; AVX2-NEXT: vmovdqa %xmm6, (%rdi) +; AVX2-NEXT: vmovdqa %xmm3, (%rdi) ; AVX2-NEXT: retq ; ; AVX512-LABEL: ssubo_v16i8: ; AVX512: # %bb.0: -; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX512-NEXT: vpcmpnltb %xmm2, %xmm1, %k0 -; AVX512-NEXT: vpcmpnltb %xmm2, %xmm0, %k1 -; AVX512-NEXT: kxorw %k0, %k1, %k0 +; AVX512-NEXT: vpsubsb %xmm1, %xmm0, %xmm2 ; AVX512-NEXT: vpsubb %xmm1, %xmm0, %xmm1 -; AVX512-NEXT: vpcmpnltb %xmm2, %xmm1, %k2 -; AVX512-NEXT: kxorw %k2, %k1, %k1 -; AVX512-NEXT: kandw %k1, %k0, %k1 +; AVX512-NEXT: vpcmpneqb %xmm2, %xmm1, %k1 ; AVX512-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z} ; AVX512-NEXT: vmovdqa %xmm1, (%rdi) ; AVX512-NEXT: retq @@ -1150,22 +1102,12 @@ define <16 x i32> @ssubo_v16i8(<16 x i8> %a0, <16 x i8> %a1, <16 x i8>* %p2) nou define <8 x i32> @ssubo_v8i16(<8 x i16> %a0, <8 x i16> %a1, <8 x i16>* %p2) nounwind { ; SSE2-LABEL: ssubo_v8i16: ; SSE2: # %bb.0: -; SSE2-NEXT: movdqa %xmm1, %xmm2 -; SSE2-NEXT: pxor %xmm3, %xmm3 -; SSE2-NEXT: pxor %xmm1, %xmm1 -; SSE2-NEXT: pcmpgtw %xmm2, %xmm1 -; SSE2-NEXT: pcmpeqd %xmm4, %xmm4 -; SSE2-NEXT: pxor %xmm4, %xmm1 -; SSE2-NEXT: pxor %xmm5, %xmm5 -; SSE2-NEXT: pcmpgtw %xmm0, %xmm5 -; SSE2-NEXT: pxor %xmm4, %xmm5 -; SSE2-NEXT: pcmpeqw %xmm5, %xmm1 -; SSE2-NEXT: psubw %xmm2, %xmm0 -; SSE2-NEXT: pcmpgtw %xmm0, %xmm3 -; SSE2-NEXT: pxor %xmm4, %xmm3 -; SSE2-NEXT: pcmpeqw %xmm5, %xmm3 -; SSE2-NEXT: pxor %xmm4, %xmm3 -; SSE2-NEXT: pandn %xmm3, %xmm1 +; SSE2-NEXT: movdqa %xmm0, %xmm2 +; SSE2-NEXT: psubsw %xmm1, %xmm2 +; SSE2-NEXT: psubw %xmm1, %xmm0 +; SSE2-NEXT: pcmpeqw %xmm0, %xmm2 +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm2, %xmm1 ; SSE2-NEXT: movdqa %xmm1, %xmm2 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3] ; SSE2-NEXT: pslld $31, %xmm2 @@ -1179,22 +1121,12 @@ define <8 x i32> @ssubo_v8i16(<8 x i16> %a0, <8 x i16> %a1, <8 x i16>* %p2) noun ; ; SSSE3-LABEL: ssubo_v8i16: ; SSSE3: # %bb.0: -; SSSE3-NEXT: movdqa %xmm1, %xmm2 -; SSSE3-NEXT: pxor %xmm3, %xmm3 -; SSSE3-NEXT: pxor %xmm1, %xmm1 -; SSSE3-NEXT: pcmpgtw %xmm2, %xmm1 -; SSSE3-NEXT: pcmpeqd %xmm4, %xmm4 -; SSSE3-NEXT: pxor %xmm4, %xmm1 -; SSSE3-NEXT: pxor %xmm5, %xmm5 -; SSSE3-NEXT: pcmpgtw %xmm0, %xmm5 -; SSSE3-NEXT: pxor %xmm4, %xmm5 -; SSSE3-NEXT: pcmpeqw %xmm5, %xmm1 -; SSSE3-NEXT: psubw %xmm2, %xmm0 -; SSSE3-NEXT: pcmpgtw %xmm0, %xmm3 -; SSSE3-NEXT: pxor %xmm4, %xmm3 -; SSSE3-NEXT: pcmpeqw %xmm5, %xmm3 -; SSSE3-NEXT: pxor %xmm4, %xmm3 -; SSSE3-NEXT: pandn %xmm3, %xmm1 +; SSSE3-NEXT: movdqa %xmm0, %xmm2 +; SSSE3-NEXT: psubsw %xmm1, %xmm2 +; SSSE3-NEXT: psubw %xmm1, %xmm0 +; SSSE3-NEXT: pcmpeqw %xmm0, %xmm2 +; SSSE3-NEXT: pcmpeqd %xmm1, %xmm1 +; SSSE3-NEXT: pxor %xmm2, %xmm1 ; SSSE3-NEXT: movdqa %xmm1, %xmm2 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3] ; SSSE3-NEXT: pslld $31, %xmm2 @@ -1208,22 +1140,12 @@ define <8 x i32> @ssubo_v8i16(<8 x i16> %a0, <8 x i16> %a1, <8 x i16>* %p2) noun ; ; SSE41-LABEL: ssubo_v8i16: ; SSE41: # %bb.0: -; SSE41-NEXT: movdqa %xmm1, %xmm2 -; SSE41-NEXT: pxor %xmm3, %xmm3 -; SSE41-NEXT: pxor %xmm1, %xmm1 -; SSE41-NEXT: pcmpgtw %xmm2, %xmm1 -; SSE41-NEXT: pcmpeqd %xmm4, %xmm4 -; SSE41-NEXT: pxor %xmm4, %xmm1 -; SSE41-NEXT: pxor %xmm5, %xmm5 -; SSE41-NEXT: pcmpgtw %xmm0, %xmm5 -; SSE41-NEXT: pxor %xmm4, %xmm5 -; SSE41-NEXT: pcmpeqw %xmm5, %xmm1 -; SSE41-NEXT: psubw %xmm2, %xmm0 -; SSE41-NEXT: pcmpgtw %xmm0, %xmm3 -; SSE41-NEXT: pxor %xmm4, %xmm3 -; SSE41-NEXT: pcmpeqw %xmm5, %xmm3 -; SSE41-NEXT: pxor %xmm4, %xmm3 -; SSE41-NEXT: pandn %xmm3, %xmm1 +; SSE41-NEXT: movdqa %xmm0, %xmm2 +; SSE41-NEXT: psubsw %xmm1, %xmm2 +; SSE41-NEXT: psubw %xmm1, %xmm0 +; SSE41-NEXT: pcmpeqw %xmm0, %xmm2 +; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE41-NEXT: pxor %xmm2, %xmm1 ; SSE41-NEXT: pmovzxwd {{.*#+}} xmm2 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero ; SSE41-NEXT: pslld $31, %xmm2 ; SSE41-NEXT: psrad $31, %xmm2 @@ -1236,19 +1158,11 @@ define <8 x i32> @ssubo_v8i16(<8 x i16> %a0, <8 x i16> %a1, <8 x i16>* %p2) noun ; ; AVX1-LABEL: ssubo_v8i16: ; AVX1: # %bb.0: -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1-NEXT: vpcmpgtw %xmm1, %xmm2, %xmm3 -; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4 -; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3 -; AVX1-NEXT: vpcmpgtw %xmm0, %xmm2, %xmm5 -; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5 -; AVX1-NEXT: vpcmpeqw %xmm3, %xmm5, %xmm3 +; AVX1-NEXT: vpsubsw %xmm1, %xmm0, %xmm2 ; AVX1-NEXT: vpsubw %xmm1, %xmm0, %xmm1 -; AVX1-NEXT: vpcmpgtw %xmm1, %xmm2, %xmm0 -; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm0 -; AVX1-NEXT: vpcmpeqw %xmm0, %xmm5, %xmm0 -; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm0 -; AVX1-NEXT: vpandn %xmm0, %xmm3, %xmm0 +; AVX1-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm0 +; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 +; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0 ; AVX1-NEXT: vpmovsxwd %xmm0, %xmm2 ; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] ; AVX1-NEXT: vpmovsxwd %xmm0, %xmm0 @@ -1258,33 +1172,20 @@ define <8 x i32> @ssubo_v8i16(<8 x i16> %a0, <8 x i16> %a1, <8 x i16>* %p2) noun ; ; AVX2-LABEL: ssubo_v8i16: ; AVX2: # %bb.0: -; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpcmpgtw %xmm1, %xmm2, %xmm3 -; AVX2-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4 -; AVX2-NEXT: vpxor %xmm4, %xmm3, %xmm3 -; AVX2-NEXT: vpcmpgtw %xmm0, %xmm2, %xmm5 -; AVX2-NEXT: vpxor %xmm4, %xmm5, %xmm5 -; AVX2-NEXT: vpcmpeqw %xmm3, %xmm5, %xmm3 +; AVX2-NEXT: vpsubsw %xmm1, %xmm0, %xmm2 ; AVX2-NEXT: vpsubw %xmm1, %xmm0, %xmm1 -; AVX2-NEXT: vpcmpgtw %xmm1, %xmm2, %xmm0 -; AVX2-NEXT: vpxor %xmm4, %xmm0, %xmm0 -; AVX2-NEXT: vpcmpeqw %xmm0, %xmm5, %xmm0 -; AVX2-NEXT: vpxor %xmm4, %xmm0, %xmm0 -; AVX2-NEXT: vpandn %xmm0, %xmm3, %xmm0 +; AVX2-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm0 +; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 +; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0 ; AVX2-NEXT: vpmovsxwd %xmm0, %ymm0 ; AVX2-NEXT: vmovdqa %xmm1, (%rdi) ; AVX2-NEXT: retq ; ; AVX512-LABEL: ssubo_v8i16: ; AVX512: # %bb.0: -; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX512-NEXT: vpcmpnltw %xmm2, %xmm1, %k0 -; AVX512-NEXT: vpcmpnltw %xmm2, %xmm0, %k1 -; AVX512-NEXT: kxorw %k0, %k1, %k0 +; AVX512-NEXT: vpsubsw %xmm1, %xmm0, %xmm2 ; AVX512-NEXT: vpsubw %xmm1, %xmm0, %xmm1 -; AVX512-NEXT: vpcmpnltw %xmm2, %xmm1, %k2 -; AVX512-NEXT: kxorw %k2, %k1, %k1 -; AVX512-NEXT: kandw %k1, %k0, %k1 +; AVX512-NEXT: vpcmpneqw %xmm2, %xmm1, %k1 ; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0 ; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z} ; AVX512-NEXT: vmovdqa %xmm1, (%rdi) @@ -1747,15 +1648,13 @@ define <4 x i32> @ssubo_v4i1(<4 x i1> %a0, <4 x i1> %a1, <4 x i1>* %p2) nounwind ; ; AVX512-LABEL: ssubo_v4i1: ; AVX512: # %bb.0: +; AVX512-NEXT: vpslld $31, %xmm1, %xmm1 +; AVX512-NEXT: vptestmd %xmm1, %xmm1, %k0 ; AVX512-NEXT: vpslld $31, %xmm0, %xmm0 -; AVX512-NEXT: vptestmd %xmm0, %xmm0, %k0 -; AVX512-NEXT: vptestnmd %xmm0, %xmm0, %k1 -; AVX512-NEXT: vpslld $31, %xmm1, %xmm0 -; AVX512-NEXT: vptestmd %xmm0, %xmm0, %k2 -; AVX512-NEXT: kxorw %k2, %k1, %k3 -; AVX512-NEXT: kxorw %k2, %k0, %k0 -; AVX512-NEXT: kxnorw %k0, %k1, %k1 -; AVX512-NEXT: kandnw %k1, %k3, %k1 +; AVX512-NEXT: vptestmd %xmm0, %xmm0, %k1 +; AVX512-NEXT: vptestnmd %xmm1, %xmm1, %k2 {%k1} +; AVX512-NEXT: kxorw %k0, %k1, %k0 +; AVX512-NEXT: kxorw %k2, %k0, %k1 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z} ; AVX512-NEXT: kmovd %k0, %eax -- 2.7.4