[llvm] r354866 - [LegalizeDAG] Expand SADDO/SSUBO using SADDSAT/SSUBSAT (PR37763)
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Tue Feb 26 03:27:53 PST 2019
Author: rksimon
Date: Tue Feb 26 03:27:53 2019
New Revision: 354866
URL: http://llvm.org/viewvc/llvm-project?rev=354866&view=rev
Log:
[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
Modified:
llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
llvm/trunk/test/CodeGen/X86/vec_saddo.ll
llvm/trunk/test/CodeGen/X86/vec_ssubo.ll
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp?rev=354866&r1=354865&r2=354866&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Tue Feb 26 03:27:53 2019
@@ -3261,13 +3261,25 @@ bool SelectionDAGLegalize::ExpandNode(SD
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(SD
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(SD
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))) {
Modified: llvm/trunk/test/CodeGen/X86/vec_saddo.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/vec_saddo.ll?rev=354866&r1=354865&r2=354866&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/vec_saddo.ll (original)
+++ llvm/trunk/test/CodeGen/X86/vec_saddo.ll Tue Feb 26 03:27:53 2019
@@ -936,20 +936,12 @@ define <16 x i32> @saddo_v16i32(<16 x i3
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>
;
; 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>
;
; 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>
;
; 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>
; 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>
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>
;
; 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>
;
; 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>
;
; 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>
;
; 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> %a
;
; 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
Modified: llvm/trunk/test/CodeGen/X86/vec_ssubo.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/vec_ssubo.ll?rev=354866&r1=354865&r2=354866&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/vec_ssubo.ll (original)
+++ llvm/trunk/test/CodeGen/X86/vec_ssubo.ll Tue Feb 26 03:27:53 2019
@@ -968,21 +968,12 @@ define <16 x i32> @ssubo_v16i32(<16 x i3
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>
;
; 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>
;
; 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>
;
; 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>
; 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>
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>
;
; 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>
;
; 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>
;
; 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>
;
; 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> %a
;
; 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
More information about the llvm-commits
mailing list