[llvm] r361166 - [SDAG] Vector op legalization for overflow ops
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Mon May 20 09:09:23 PDT 2019
Author: nikic
Date: Mon May 20 09:09:22 2019
New Revision: 361166
URL: http://llvm.org/viewvc/llvm-project?rev=361166&view=rev
Log:
[SDAG] Vector op legalization for overflow ops
Fixes issue reported by aemerson on D57348. Vector op legalization
support is added for uaddo, usubo, saddo and ssubo (umulo and smulo
were already supported). As usual, by extracting TargetLowering methods
and calling them from vector op legalization.
Vector op legalization doesn't really deal with multiple result nodes,
so I'm explicitly performing a recursive legalization call on the
result value that is not being legalized.
There are some existing test changes because expansion happens
earlier, so we don't get a DAG combiner run in between anymore.
Differential Revision: https://reviews.llvm.org/D61692
Added:
llvm/trunk/test/CodeGen/AArch64/addsubo-legalization.ll
Modified:
llvm/trunk/include/llvm/CodeGen/TargetLowering.h
llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp
llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp
llvm/trunk/test/CodeGen/X86/sadd_sat_vec.ll
llvm/trunk/test/CodeGen/X86/ssub_sat_vec.ll
llvm/trunk/test/CodeGen/X86/vec_saddo.ll
llvm/trunk/test/CodeGen/X86/vec_ssubo.ll
Modified: llvm/trunk/include/llvm/CodeGen/TargetLowering.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/TargetLowering.h?rev=361166&r1=361165&r2=361166&view=diff
==============================================================================
--- llvm/trunk/include/llvm/CodeGen/TargetLowering.h (original)
+++ llvm/trunk/include/llvm/CodeGen/TargetLowering.h Mon May 20 09:09:22 2019
@@ -3956,6 +3956,16 @@ public:
/// integers as its arguments.
SDValue expandFixedPointMul(SDNode *Node, SelectionDAG &DAG) const;
+ /// Method for building the DAG expansion of ISD::U(ADD|SUB)O. Expansion
+ /// always suceeds and populates the Result and Overflow arguments.
+ void expandUADDSUBO(SDNode *Node, SDValue &Result, SDValue &Overflow,
+ SelectionDAG &DAG) const;
+
+ /// Method for building the DAG expansion of ISD::S(ADD|SUB)O. Expansion
+ /// always suceeds and populates the Result and Overflow arguments.
+ void expandSADDSUBO(SDNode *Node, SDValue &Result, SDValue &Overflow,
+ SelectionDAG &DAG) const;
+
/// Method for building the DAG expansion of ISD::[US]MULO. Returns whether
/// expansion was successful and populates the Result and Overflow arguments.
bool expandMULO(SDNode *Node, SDValue &Result, SDValue &Overflow,
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp?rev=361166&r1=361165&r2=361166&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Mon May 20 09:09:22 2019
@@ -3381,76 +3381,18 @@ bool SelectionDAGLegalize::ExpandNode(SD
}
case ISD::SADDO:
case ISD::SSUBO: {
- SDValue LHS = Node->getOperand(0);
- SDValue RHS = Node->getOperand(1);
- 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
- // RHSSign -> RHS >= 0
- // SumSign -> Sum >= 0
- //
- // Add:
- // Overflow -> (LHSSign == RHSSign) && (LHSSign != SumSign)
- // Sub:
- // Overflow -> (LHSSign != RHSSign) && (LHSSign != SumSign)
- 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,
- 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);
-
- SDValue Cmp = DAG.getNode(ISD::AND, dl, OType, SignsMatch, SumSignNE);
- Results.push_back(DAG.getBoolExtOrTrunc(Cmp, dl, ResultType, ResultType));
+ SDValue Result, Overflow;
+ TLI.expandSADDSUBO(Node, Result, Overflow, DAG);
+ Results.push_back(Result);
+ Results.push_back(Overflow);
break;
}
case ISD::UADDO:
case ISD::USUBO: {
- 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))) {
- SDValue CarryIn = DAG.getConstant(0, dl, Node->getValueType(1));
- SDValue NodeCarry = DAG.getNode(OpcCarry, dl, Node->getVTList(),
- { LHS, RHS, CarryIn });
- Results.push_back(SDValue(NodeCarry.getNode(), 0));
- Results.push_back(SDValue(NodeCarry.getNode(), 1));
- break;
- }
-
- SDValue Sum = DAG.getNode(IsAdd ? ISD::ADD : ISD::SUB, dl,
- LHS.getValueType(), LHS, RHS);
- Results.push_back(Sum);
-
- EVT ResultType = Node->getValueType(1);
- EVT SetCCType = getSetCCResultType(Node->getValueType(0));
- ISD::CondCode CC = IsAdd ? ISD::SETULT : ISD::SETUGT;
- SDValue SetCC = DAG.getSetCC(dl, SetCCType, Sum, LHS, CC);
-
- Results.push_back(DAG.getBoolExtOrTrunc(SetCC, dl, ResultType, ResultType));
+ SDValue Result, Overflow;
+ TLI.expandUADDSUBO(Node, Result, Overflow, DAG);
+ Results.push_back(Result);
+ Results.push_back(Overflow);
break;
}
case ISD::UMULO:
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp?rev=361166&r1=361165&r2=361166&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp Mon May 20 09:09:22 2019
@@ -140,6 +140,8 @@ class VectorLegalizer {
SDValue ExpandFunnelShift(SDValue Op);
SDValue ExpandROT(SDValue Op);
SDValue ExpandFMINNUM_FMAXNUM(SDValue Op);
+ SDValue ExpandUADDSUBO(SDValue Op);
+ SDValue ExpandSADDSUBO(SDValue Op);
SDValue ExpandMULO(SDValue Op);
SDValue ExpandAddSubSat(SDValue Op);
SDValue ExpandFixedPointMul(SDValue Op);
@@ -422,6 +424,10 @@ SDValue VectorLegalizer::LegalizeOp(SDVa
case ISD::UMAX:
case ISD::SMUL_LOHI:
case ISD::UMUL_LOHI:
+ case ISD::SADDO:
+ case ISD::UADDO:
+ case ISD::SSUBO:
+ case ISD::USUBO:
case ISD::SMULO:
case ISD::UMULO:
case ISD::FCANONICALIZE:
@@ -796,6 +802,12 @@ SDValue VectorLegalizer::Expand(SDValue
case ISD::FMINNUM:
case ISD::FMAXNUM:
return ExpandFMINNUM_FMAXNUM(Op);
+ case ISD::UADDO:
+ case ISD::USUBO:
+ return ExpandUADDSUBO(Op);
+ case ISD::SADDO:
+ case ISD::SSUBO:
+ return ExpandSADDSUBO(Op);
case ISD::UMULO:
case ISD::SMULO:
return ExpandMULO(Op);
@@ -1250,6 +1262,32 @@ SDValue VectorLegalizer::ExpandFMINNUM_F
return DAG.UnrollVectorOp(Op.getNode());
}
+SDValue VectorLegalizer::ExpandUADDSUBO(SDValue Op) {
+ SDValue Result, Overflow;
+ TLI.expandUADDSUBO(Op.getNode(), Result, Overflow, DAG);
+
+ if (Op.getResNo() == 0) {
+ AddLegalizedOperand(Op.getValue(1), LegalizeOp(Overflow));
+ return Result;
+ } else {
+ AddLegalizedOperand(Op.getValue(0), LegalizeOp(Result));
+ return Overflow;
+ }
+}
+
+SDValue VectorLegalizer::ExpandSADDSUBO(SDValue Op) {
+ SDValue Result, Overflow;
+ TLI.expandSADDSUBO(Op.getNode(), Result, Overflow, DAG);
+
+ if (Op.getResNo() == 0) {
+ AddLegalizedOperand(Op.getValue(1), LegalizeOp(Overflow));
+ return Result;
+ } else {
+ AddLegalizedOperand(Op.getValue(0), LegalizeOp(Result));
+ return Overflow;
+ }
+}
+
SDValue VectorLegalizer::ExpandMULO(SDValue Op) {
SDValue Result, Overflow;
if (!TLI.expandMULO(Op.getNode(), Result, Overflow, DAG))
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp?rev=361166&r1=361165&r2=361166&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp Mon May 20 09:09:22 2019
@@ -5750,6 +5750,80 @@ TargetLowering::expandFixedPointMul(SDNo
DAG.getConstant(Scale, dl, ShiftTy));
}
+void TargetLowering::expandUADDSUBO(
+ SDNode *Node, SDValue &Result, SDValue &Overflow, SelectionDAG &DAG) const {
+ SDLoc dl(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 (isOperationLegalOrCustom(OpcCarry, Node->getValueType(0))) {
+ SDValue CarryIn = DAG.getConstant(0, dl, Node->getValueType(1));
+ SDValue NodeCarry = DAG.getNode(OpcCarry, dl, Node->getVTList(),
+ { LHS, RHS, CarryIn });
+ Result = SDValue(NodeCarry.getNode(), 0);
+ Overflow = SDValue(NodeCarry.getNode(), 1);
+ return;
+ }
+
+ Result = DAG.getNode(IsAdd ? ISD::ADD : ISD::SUB, dl,
+ LHS.getValueType(), LHS, RHS);
+
+ EVT ResultType = Node->getValueType(1);
+ EVT SetCCType = getSetCCResultType(
+ DAG.getDataLayout(), *DAG.getContext(), Node->getValueType(0));
+ ISD::CondCode CC = IsAdd ? ISD::SETULT : ISD::SETUGT;
+ SDValue SetCC = DAG.getSetCC(dl, SetCCType, Result, LHS, CC);
+ Overflow = DAG.getBoolExtOrTrunc(SetCC, dl, ResultType, ResultType);
+}
+
+void TargetLowering::expandSADDSUBO(
+ SDNode *Node, SDValue &Result, SDValue &Overflow, SelectionDAG &DAG) const {
+ SDLoc dl(Node);
+ SDValue LHS = Node->getOperand(0);
+ SDValue RHS = Node->getOperand(1);
+ bool IsAdd = Node->getOpcode() == ISD::SADDO;
+
+ Result = DAG.getNode(IsAdd ? ISD::ADD : ISD::SUB, dl,
+ LHS.getValueType(), LHS, RHS);
+
+ EVT ResultType = Node->getValueType(1);
+ EVT OType = getSetCCResultType(
+ DAG.getDataLayout(), *DAG.getContext(), Node->getValueType(0));
+
+ // If SADDSAT/SSUBSAT is legal, compare results to detect overflow.
+ unsigned OpcSat = IsAdd ? ISD::SADDSAT : ISD::SSUBSAT;
+ if (isOperationLegalOrCustom(OpcSat, LHS.getValueType())) {
+ SDValue Sat = DAG.getNode(OpcSat, dl, LHS.getValueType(), LHS, RHS);
+ SDValue SetCC = DAG.getSetCC(dl, OType, Result, Sat, ISD::SETNE);
+ Overflow = DAG.getBoolExtOrTrunc(SetCC, dl, ResultType, ResultType);
+ return;
+ }
+
+ SDValue Zero = DAG.getConstant(0, dl, LHS.getValueType());
+
+ // LHSSign -> LHS >= 0
+ // RHSSign -> RHS >= 0
+ // SumSign -> Result >= 0
+ //
+ // Add:
+ // Overflow -> (LHSSign == RHSSign) && (LHSSign != SumSign)
+ // Sub:
+ // Overflow -> (LHSSign != RHSSign) && (LHSSign != SumSign)
+ 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,
+ IsAdd ? ISD::SETEQ : ISD::SETNE);
+
+ SDValue SumSign = DAG.getSetCC(dl, OType, Result, Zero, ISD::SETGE);
+ SDValue SumSignNE = DAG.getSetCC(dl, OType, LHSSign, SumSign, ISD::SETNE);
+
+ SDValue Cmp = DAG.getNode(ISD::AND, dl, OType, SignsMatch, SumSignNE);
+ Overflow = DAG.getBoolExtOrTrunc(Cmp, dl, ResultType, ResultType);
+}
+
bool TargetLowering::expandMULO(SDNode *Node, SDValue &Result,
SDValue &Overflow, SelectionDAG &DAG) const {
SDLoc dl(Node);
Added: llvm/trunk/test/CodeGen/AArch64/addsubo-legalization.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/addsubo-legalization.ll?rev=361166&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/AArch64/addsubo-legalization.ll (added)
+++ llvm/trunk/test/CodeGen/AArch64/addsubo-legalization.ll Mon May 20 09:09:22 2019
@@ -0,0 +1,258 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc < %s -mtriple=thumbv7k-linux-gnu | FileCheck %s
+
+declare {<2 x i64>, <2 x i1>} @llvm.uadd.with.overflow.v2i64(<2 x i64>, <2 x i64>)
+declare {<2 x i64>, <2 x i1>} @llvm.usub.with.overflow.v2i64(<2 x i64>, <2 x i64>)
+declare {<2 x i64>, <2 x i1>} @llvm.sadd.with.overflow.v2i64(<2 x i64>, <2 x i64>)
+declare {<2 x i64>, <2 x i1>} @llvm.ssub.with.overflow.v2i64(<2 x i64>, <2 x i64>)
+
+define <2 x i1> @uaddo(<2 x i64> *%ptr, <2 x i64> *%ptr2) {
+; CHECK-LABEL: uaddo:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: push {r4, r5, r6, r7, lr}
+; CHECK-NEXT: vld1.64 {d18, d19}, [r0]
+; CHECK-NEXT: vld1.64 {d16, d17}, [r1]
+; CHECK-NEXT: movs r1, #0
+; CHECK-NEXT: vadd.i64 q8, q9, q8
+; CHECK-NEXT: vmov.32 r3, d18[0]
+; CHECK-NEXT: vmov.32 r2, d18[1]
+; CHECK-NEXT: vmov.32 r12, d16[0]
+; CHECK-NEXT: vmov.32 lr, d16[1]
+; CHECK-NEXT: vmov.32 r4, d17[0]
+; CHECK-NEXT: vmov.32 r5, d19[0]
+; CHECK-NEXT: vmov.32 r6, d17[1]
+; CHECK-NEXT: vmov.32 r7, d19[1]
+; CHECK-NEXT: subs.w r3, r12, r3
+; CHECK-NEXT: sbcs.w r2, lr, r2
+; CHECK-NEXT: mov.w r2, #0
+; CHECK-NEXT: it lo
+; CHECK-NEXT: movlo r2, #1
+; CHECK-NEXT: cmp r2, #0
+; CHECK-NEXT: it ne
+; CHECK-NEXT: movne.w r2, #-1
+; CHECK-NEXT: subs r3, r4, r5
+; CHECK-NEXT: sbcs.w r3, r6, r7
+; CHECK-NEXT: it lo
+; CHECK-NEXT: movlo r1, #1
+; CHECK-NEXT: cmp r1, #0
+; CHECK-NEXT: it ne
+; CHECK-NEXT: movne.w r1, #-1
+; CHECK-NEXT: vst1.64 {d16, d17}, [r0]
+; CHECK-NEXT: mov r0, r2
+; CHECK-NEXT: pop {r4, r5, r6, r7, pc}
+ %x = load <2 x i64>, <2 x i64>* %ptr, align 8
+ %y = load <2 x i64>, <2 x i64>* %ptr2, align 8
+ %s = call {<2 x i64>, <2 x i1>} @llvm.uadd.with.overflow.v2i64(<2 x i64> %x, <2 x i64> %y)
+ %m = extractvalue {<2 x i64>, <2 x i1>} %s, 0
+ %o = extractvalue {<2 x i64>, <2 x i1>} %s, 1
+ store <2 x i64> %m, <2 x i64>* %ptr
+ ret <2 x i1> %o
+}
+
+define <2 x i1> @usubo(<2 x i64> *%ptr, <2 x i64> *%ptr2) {
+; CHECK-LABEL: usubo:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: push {r4, r5, r6, r7, lr}
+; CHECK-NEXT: vld1.64 {d16, d17}, [r1]
+; CHECK-NEXT: movs r1, #0
+; CHECK-NEXT: vld1.64 {d18, d19}, [r0]
+; CHECK-NEXT: vsub.i64 q8, q9, q8
+; CHECK-NEXT: vmov.32 r12, d18[0]
+; CHECK-NEXT: vmov.32 lr, d18[1]
+; CHECK-NEXT: vmov.32 r3, d16[0]
+; CHECK-NEXT: vmov.32 r2, d16[1]
+; CHECK-NEXT: vmov.32 r4, d19[0]
+; CHECK-NEXT: vmov.32 r5, d17[0]
+; CHECK-NEXT: vmov.32 r6, d19[1]
+; CHECK-NEXT: vmov.32 r7, d17[1]
+; CHECK-NEXT: subs.w r3, r12, r3
+; CHECK-NEXT: sbcs.w r2, lr, r2
+; CHECK-NEXT: mov.w r2, #0
+; CHECK-NEXT: it lo
+; CHECK-NEXT: movlo r2, #1
+; CHECK-NEXT: cmp r2, #0
+; CHECK-NEXT: it ne
+; CHECK-NEXT: movne.w r2, #-1
+; CHECK-NEXT: subs r3, r4, r5
+; CHECK-NEXT: sbcs.w r3, r6, r7
+; CHECK-NEXT: it lo
+; CHECK-NEXT: movlo r1, #1
+; CHECK-NEXT: cmp r1, #0
+; CHECK-NEXT: it ne
+; CHECK-NEXT: movne.w r1, #-1
+; CHECK-NEXT: vst1.64 {d16, d17}, [r0]
+; CHECK-NEXT: mov r0, r2
+; CHECK-NEXT: pop {r4, r5, r6, r7, pc}
+ %x = load <2 x i64>, <2 x i64>* %ptr, align 8
+ %y = load <2 x i64>, <2 x i64>* %ptr2, align 8
+ %s = call {<2 x i64>, <2 x i1>} @llvm.usub.with.overflow.v2i64(<2 x i64> %x, <2 x i64> %y)
+ %m = extractvalue {<2 x i64>, <2 x i1>} %s, 0
+ %o = extractvalue {<2 x i64>, <2 x i1>} %s, 1
+ store <2 x i64> %m, <2 x i64>* %ptr
+ ret <2 x i1> %o
+}
+
+define <2 x i1> @saddo(<2 x i64> *%ptr, <2 x i64> *%ptr2) {
+; CHECK-LABEL: saddo:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: push {r4, r5, r6, r7, lr}
+; CHECK-NEXT: vld1.64 {d16, d17}, [r1]
+; CHECK-NEXT: movs r5, #0
+; CHECK-NEXT: movs r6, #0
+; CHECK-NEXT: movs r3, #0
+; CHECK-NEXT: vmov.32 r1, d16[1]
+; CHECK-NEXT: vld1.64 {d18, d19}, [r0]
+; CHECK-NEXT: vmov.32 r2, d17[1]
+; CHECK-NEXT: vadd.i64 q8, q9, q8
+; CHECK-NEXT: vmov.32 r12, d18[1]
+; CHECK-NEXT: vmov.32 r4, d19[1]
+; CHECK-NEXT: vmov.32 lr, d16[1]
+; CHECK-NEXT: vmov.32 r7, d17[1]
+; CHECK-NEXT: cmp.w r1, #-1
+; CHECK-NEXT: mov.w r1, #0
+; CHECK-NEXT: it gt
+; CHECK-NEXT: movgt r1, #1
+; CHECK-NEXT: cmp r1, #0
+; CHECK-NEXT: it ne
+; CHECK-NEXT: movne.w r1, #-1
+; CHECK-NEXT: cmp.w r2, #-1
+; CHECK-NEXT: mov.w r2, #0
+; CHECK-NEXT: it gt
+; CHECK-NEXT: movgt r2, #1
+; CHECK-NEXT: cmp.w r12, #-1
+; CHECK-NEXT: it gt
+; CHECK-NEXT: movgt r5, #1
+; CHECK-NEXT: cmp r5, #0
+; CHECK-NEXT: it ne
+; CHECK-NEXT: movne.w r5, #-1
+; CHECK-NEXT: cmp.w r4, #-1
+; CHECK-NEXT: mov.w r4, #0
+; CHECK-NEXT: it gt
+; CHECK-NEXT: movgt r4, #1
+; CHECK-NEXT: cmp.w lr, #-1
+; CHECK-NEXT: it gt
+; CHECK-NEXT: movgt r6, #1
+; CHECK-NEXT: cmp r6, #0
+; CHECK-NEXT: it ne
+; CHECK-NEXT: movne.w r6, #-1
+; CHECK-NEXT: cmp.w r7, #-1
+; CHECK-NEXT: it gt
+; CHECK-NEXT: movgt r3, #1
+; CHECK-NEXT: cmp r3, #0
+; CHECK-NEXT: it ne
+; CHECK-NEXT: movne.w r3, #-1
+; CHECK-NEXT: cmp r4, #0
+; CHECK-NEXT: vdup.32 d19, r3
+; CHECK-NEXT: it ne
+; CHECK-NEXT: movne.w r4, #-1
+; CHECK-NEXT: cmp r2, #0
+; CHECK-NEXT: it ne
+; CHECK-NEXT: movne.w r2, #-1
+; CHECK-NEXT: vdup.32 d23, r2
+; CHECK-NEXT: vdup.32 d21, r4
+; CHECK-NEXT: vdup.32 d18, r6
+; CHECK-NEXT: vdup.32 d22, r1
+; CHECK-NEXT: vdup.32 d20, r5
+; CHECK-NEXT: vceq.i32 q9, q10, q9
+; CHECK-NEXT: vst1.64 {d16, d17}, [r0]
+; CHECK-NEXT: vceq.i32 q10, q10, q11
+; CHECK-NEXT: vrev64.32 q11, q9
+; CHECK-NEXT: vrev64.32 q12, q10
+; CHECK-NEXT: vand q9, q9, q11
+; CHECK-NEXT: vand q10, q10, q12
+; CHECK-NEXT: vbic q9, q10, q9
+; CHECK-NEXT: vmovn.i64 d18, q9
+; CHECK-NEXT: vmov r2, r1, d18
+; CHECK-NEXT: mov r0, r2
+; CHECK-NEXT: pop {r4, r5, r6, r7, pc}
+ %x = load <2 x i64>, <2 x i64>* %ptr, align 8
+ %y = load <2 x i64>, <2 x i64>* %ptr2, align 8
+ %s = call {<2 x i64>, <2 x i1>} @llvm.sadd.with.overflow.v2i64(<2 x i64> %x, <2 x i64> %y)
+ %m = extractvalue {<2 x i64>, <2 x i1>} %s, 0
+ %o = extractvalue {<2 x i64>, <2 x i1>} %s, 1
+ store <2 x i64> %m, <2 x i64>* %ptr
+ ret <2 x i1> %o
+}
+
+define <2 x i1> @ssubo(<2 x i64> *%ptr, <2 x i64> *%ptr2) {
+; CHECK-LABEL: ssubo:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: push {r4, r5, r6, r7, lr}
+; CHECK-NEXT: vld1.64 {d18, d19}, [r1]
+; CHECK-NEXT: movs r5, #0
+; CHECK-NEXT: movs r6, #0
+; CHECK-NEXT: movs r3, #0
+; CHECK-NEXT: vld1.64 {d20, d21}, [r0]
+; CHECK-NEXT: vsub.i64 q8, q10, q9
+; CHECK-NEXT: vmov.32 r12, d20[1]
+; CHECK-NEXT: vmov.32 lr, d21[1]
+; CHECK-NEXT: vmov.32 r1, d16[1]
+; CHECK-NEXT: vmov.32 r2, d17[1]
+; CHECK-NEXT: vmov.32 r4, d18[1]
+; CHECK-NEXT: vmov.32 r7, d19[1]
+; CHECK-NEXT: cmp.w r1, #-1
+; CHECK-NEXT: mov.w r1, #0
+; CHECK-NEXT: it gt
+; CHECK-NEXT: movgt r1, #1
+; CHECK-NEXT: cmp r1, #0
+; CHECK-NEXT: it ne
+; CHECK-NEXT: movne.w r1, #-1
+; CHECK-NEXT: cmp.w r2, #-1
+; CHECK-NEXT: mov.w r2, #0
+; CHECK-NEXT: it gt
+; CHECK-NEXT: movgt r2, #1
+; CHECK-NEXT: cmp.w r12, #-1
+; CHECK-NEXT: it gt
+; CHECK-NEXT: movgt r5, #1
+; CHECK-NEXT: cmp r5, #0
+; CHECK-NEXT: it ne
+; CHECK-NEXT: movne.w r5, #-1
+; CHECK-NEXT: cmp.w lr, #-1
+; CHECK-NEXT: it gt
+; CHECK-NEXT: movgt r6, #1
+; CHECK-NEXT: cmp.w r4, #-1
+; CHECK-NEXT: mov.w r4, #0
+; CHECK-NEXT: it gt
+; CHECK-NEXT: movgt r4, #1
+; CHECK-NEXT: cmp r4, #0
+; CHECK-NEXT: it ne
+; CHECK-NEXT: movne.w r4, #-1
+; CHECK-NEXT: cmp.w r7, #-1
+; CHECK-NEXT: it gt
+; CHECK-NEXT: movgt r3, #1
+; CHECK-NEXT: cmp r3, #0
+; CHECK-NEXT: it ne
+; CHECK-NEXT: movne.w r3, #-1
+; CHECK-NEXT: vdup.32 d19, r3
+; CHECK-NEXT: cmp r6, #0
+; CHECK-NEXT: it ne
+; CHECK-NEXT: movne.w r6, #-1
+; CHECK-NEXT: vdup.32 d21, r6
+; CHECK-NEXT: cmp r2, #0
+; CHECK-NEXT: vdup.32 d18, r4
+; CHECK-NEXT: it ne
+; CHECK-NEXT: movne.w r2, #-1
+; CHECK-NEXT: vdup.32 d23, r2
+; CHECK-NEXT: vdup.32 d20, r5
+; CHECK-NEXT: vdup.32 d22, r1
+; CHECK-NEXT: vceq.i32 q9, q10, q9
+; CHECK-NEXT: vst1.64 {d16, d17}, [r0]
+; CHECK-NEXT: vceq.i32 q10, q10, q11
+; CHECK-NEXT: vrev64.32 q11, q9
+; CHECK-NEXT: vrev64.32 q12, q10
+; CHECK-NEXT: vand q9, q9, q11
+; CHECK-NEXT: vand q10, q10, q12
+; CHECK-NEXT: vmvn q9, q9
+; CHECK-NEXT: vbic q9, q9, q10
+; CHECK-NEXT: vmovn.i64 d18, q9
+; CHECK-NEXT: vmov r2, r1, d18
+; CHECK-NEXT: mov r0, r2
+; CHECK-NEXT: pop {r4, r5, r6, r7, pc}
+ %x = load <2 x i64>, <2 x i64>* %ptr, align 8
+ %y = load <2 x i64>, <2 x i64>* %ptr2, align 8
+ %s = call {<2 x i64>, <2 x i1>} @llvm.ssub.with.overflow.v2i64(<2 x i64> %x, <2 x i64> %y)
+ %m = extractvalue {<2 x i64>, <2 x i1>} %s, 0
+ %o = extractvalue {<2 x i64>, <2 x i1>} %s, 1
+ store <2 x i64> %m, <2 x i64>* %ptr
+ ret <2 x i1> %o
+}
Modified: llvm/trunk/test/CodeGen/X86/sadd_sat_vec.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/sadd_sat_vec.ll?rev=361166&r1=361165&r2=361166&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/sadd_sat_vec.ll (original)
+++ llvm/trunk/test/CodeGen/X86/sadd_sat_vec.ll Mon May 20 09:09:22 2019
@@ -663,7 +663,7 @@ define <2 x i32> @v2i32(<2 x i32> %x, <2
; SSE2-NEXT: psllq $32, %xmm0
; SSE2-NEXT: movdqa %xmm0, %xmm3
; SSE2-NEXT: paddq %xmm1, %xmm0
-; SSE2-NEXT: pxor %xmm2, %xmm1
+; SSE2-NEXT: por %xmm2, %xmm1
; SSE2-NEXT: movdqa %xmm2, %xmm4
; SSE2-NEXT: pcmpgtd %xmm1, %xmm4
; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
@@ -674,7 +674,7 @@ define <2 x i32> @v2i32(<2 x i32> %x, <2
; SSE2-NEXT: por %xmm1, %xmm4
; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
; SSE2-NEXT: pxor %xmm1, %xmm4
-; SSE2-NEXT: pxor %xmm2, %xmm3
+; SSE2-NEXT: por %xmm2, %xmm3
; SSE2-NEXT: movdqa %xmm2, %xmm5
; SSE2-NEXT: pcmpgtd %xmm3, %xmm5
; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
@@ -688,37 +688,27 @@ define <2 x i32> @v2i32(<2 x i32> %x, <2
; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,0,3,2]
; SSE2-NEXT: pand %xmm4, %xmm3
; SSE2-NEXT: movdqa %xmm0, %xmm4
-; SSE2-NEXT: pxor %xmm2, %xmm4
+; SSE2-NEXT: por %xmm2, %xmm4
; SSE2-NEXT: movdqa %xmm2, %xmm6
; SSE2-NEXT: pcmpgtd %xmm4, %xmm6
; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
; SSE2-NEXT: pcmpeqd %xmm2, %xmm4
-; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
-; SSE2-NEXT: pand %xmm7, %xmm4
-; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
-; SSE2-NEXT: por %xmm4, %xmm6
-; SSE2-NEXT: pxor %xmm1, %xmm6
-; SSE2-NEXT: pcmpeqd %xmm5, %xmm6
-; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm6[1,0,3,2]
-; SSE2-NEXT: pand %xmm6, %xmm1
-; SSE2-NEXT: pandn %xmm3, %xmm1
-; SSE2-NEXT: movdqa %xmm1, %xmm3
-; SSE2-NEXT: pandn %xmm0, %xmm3
-; SSE2-NEXT: por %xmm2, %xmm0
-; SSE2-NEXT: movdqa %xmm2, %xmm4
-; SSE2-NEXT: pcmpgtd %xmm0, %xmm4
-; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
-; SSE2-NEXT: pcmpeqd %xmm2, %xmm0
-; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
-; SSE2-NEXT: pand %xmm5, %xmm0
; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
-; SSE2-NEXT: por %xmm0, %xmm2
-; SSE2-NEXT: movdqa %xmm2, %xmm0
-; SSE2-NEXT: pandn {{.*}}(%rip), %xmm0
-; SSE2-NEXT: pand {{.*}}(%rip), %xmm2
-; SSE2-NEXT: por %xmm0, %xmm2
+; SSE2-NEXT: pand %xmm7, %xmm2
+; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3]
+; SSE2-NEXT: por %xmm2, %xmm4
+; SSE2-NEXT: pxor %xmm4, %xmm1
+; SSE2-NEXT: pcmpeqd %xmm5, %xmm1
+; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,0,3,2]
; SSE2-NEXT: pand %xmm1, %xmm2
-; SSE2-NEXT: por %xmm3, %xmm2
+; SSE2-NEXT: pandn %xmm3, %xmm2
+; SSE2-NEXT: movdqa %xmm4, %xmm1
+; SSE2-NEXT: pandn {{.*}}(%rip), %xmm1
+; SSE2-NEXT: pand {{.*}}(%rip), %xmm4
+; SSE2-NEXT: por %xmm1, %xmm4
+; SSE2-NEXT: pand %xmm2, %xmm4
+; SSE2-NEXT: pandn %xmm0, %xmm2
+; SSE2-NEXT: por %xmm4, %xmm2
; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,3,2,3]
; SSE2-NEXT: psrad $31, %xmm2
; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,3,2,3]
@@ -732,7 +722,7 @@ define <2 x i32> @v2i32(<2 x i32> %x, <2
; SSSE3-NEXT: psllq $32, %xmm0
; SSSE3-NEXT: movdqa %xmm0, %xmm3
; SSSE3-NEXT: paddq %xmm1, %xmm0
-; SSSE3-NEXT: pxor %xmm2, %xmm1
+; SSSE3-NEXT: por %xmm2, %xmm1
; SSSE3-NEXT: movdqa %xmm2, %xmm4
; SSSE3-NEXT: pcmpgtd %xmm1, %xmm4
; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
@@ -743,7 +733,7 @@ define <2 x i32> @v2i32(<2 x i32> %x, <2
; SSSE3-NEXT: por %xmm1, %xmm4
; SSSE3-NEXT: pcmpeqd %xmm1, %xmm1
; SSSE3-NEXT: pxor %xmm1, %xmm4
-; SSSE3-NEXT: pxor %xmm2, %xmm3
+; SSSE3-NEXT: por %xmm2, %xmm3
; SSSE3-NEXT: movdqa %xmm2, %xmm5
; SSSE3-NEXT: pcmpgtd %xmm3, %xmm5
; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
@@ -757,37 +747,27 @@ define <2 x i32> @v2i32(<2 x i32> %x, <2
; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,0,3,2]
; SSSE3-NEXT: pand %xmm4, %xmm3
; SSSE3-NEXT: movdqa %xmm0, %xmm4
-; SSSE3-NEXT: pxor %xmm2, %xmm4
+; SSSE3-NEXT: por %xmm2, %xmm4
; SSSE3-NEXT: movdqa %xmm2, %xmm6
; SSSE3-NEXT: pcmpgtd %xmm4, %xmm6
; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
; SSSE3-NEXT: pcmpeqd %xmm2, %xmm4
-; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
-; SSSE3-NEXT: pand %xmm7, %xmm4
-; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
-; SSSE3-NEXT: por %xmm4, %xmm6
-; SSSE3-NEXT: pxor %xmm1, %xmm6
-; SSSE3-NEXT: pcmpeqd %xmm5, %xmm6
-; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm6[1,0,3,2]
-; SSSE3-NEXT: pand %xmm6, %xmm1
-; SSSE3-NEXT: pandn %xmm3, %xmm1
-; SSSE3-NEXT: movdqa %xmm1, %xmm3
-; SSSE3-NEXT: pandn %xmm0, %xmm3
-; SSSE3-NEXT: por %xmm2, %xmm0
-; SSSE3-NEXT: movdqa %xmm2, %xmm4
-; SSSE3-NEXT: pcmpgtd %xmm0, %xmm4
-; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
-; SSSE3-NEXT: pcmpeqd %xmm2, %xmm0
-; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
-; SSSE3-NEXT: pand %xmm5, %xmm0
; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
-; SSSE3-NEXT: por %xmm0, %xmm2
-; SSSE3-NEXT: movdqa %xmm2, %xmm0
-; SSSE3-NEXT: pandn {{.*}}(%rip), %xmm0
-; SSSE3-NEXT: pand {{.*}}(%rip), %xmm2
-; SSSE3-NEXT: por %xmm0, %xmm2
+; SSSE3-NEXT: pand %xmm7, %xmm2
+; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3]
+; SSSE3-NEXT: por %xmm2, %xmm4
+; SSSE3-NEXT: pxor %xmm4, %xmm1
+; SSSE3-NEXT: pcmpeqd %xmm5, %xmm1
+; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,0,3,2]
; SSSE3-NEXT: pand %xmm1, %xmm2
-; SSSE3-NEXT: por %xmm3, %xmm2
+; SSSE3-NEXT: pandn %xmm3, %xmm2
+; SSSE3-NEXT: movdqa %xmm4, %xmm1
+; SSSE3-NEXT: pandn {{.*}}(%rip), %xmm1
+; SSSE3-NEXT: pand {{.*}}(%rip), %xmm4
+; SSSE3-NEXT: por %xmm1, %xmm4
+; SSSE3-NEXT: pand %xmm2, %xmm4
+; SSSE3-NEXT: pandn %xmm0, %xmm2
+; SSSE3-NEXT: por %xmm4, %xmm2
; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,3,2,3]
; SSSE3-NEXT: psrad $31, %xmm2
; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,3,2,3]
@@ -802,7 +782,7 @@ define <2 x i32> @v2i32(<2 x i32> %x, <2
; SSE41-NEXT: psllq $32, %xmm2
; SSE41-NEXT: movdqa %xmm2, %xmm3
; SSE41-NEXT: paddq %xmm1, %xmm2
-; SSE41-NEXT: pxor %xmm0, %xmm1
+; SSE41-NEXT: por %xmm0, %xmm1
; SSE41-NEXT: movdqa %xmm0, %xmm4
; SSE41-NEXT: pcmpgtd %xmm1, %xmm4
; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
@@ -811,41 +791,32 @@ define <2 x i32> @v2i32(<2 x i32> %x, <2
; SSE41-NEXT: pand %xmm5, %xmm1
; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
; SSE41-NEXT: por %xmm1, %xmm4
-; SSE41-NEXT: pcmpeqd %xmm8, %xmm8
-; SSE41-NEXT: pxor %xmm8, %xmm4
-; SSE41-NEXT: pxor %xmm0, %xmm3
-; SSE41-NEXT: movdqa %xmm0, %xmm1
-; SSE41-NEXT: pcmpgtd %xmm3, %xmm1
-; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm1[0,0,2,2]
+; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
+; SSE41-NEXT: pxor %xmm1, %xmm4
+; SSE41-NEXT: por %xmm0, %xmm3
+; SSE41-NEXT: movdqa %xmm0, %xmm5
+; SSE41-NEXT: pcmpgtd %xmm3, %xmm5
+; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
; SSE41-NEXT: pcmpeqd %xmm0, %xmm3
; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
; SSE41-NEXT: pand %xmm6, %xmm3
-; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm1[1,1,3,3]
-; SSE41-NEXT: por %xmm3, %xmm6
-; SSE41-NEXT: pxor %xmm8, %xmm6
-; SSE41-NEXT: pcmpeqq %xmm6, %xmm4
-; SSE41-NEXT: movdqa %xmm2, %xmm1
-; SSE41-NEXT: pxor %xmm0, %xmm1
-; SSE41-NEXT: movdqa %xmm0, %xmm3
-; SSE41-NEXT: pcmpgtd %xmm1, %xmm3
-; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm3[0,0,2,2]
-; SSE41-NEXT: pcmpeqd %xmm0, %xmm1
-; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3]
-; SSE41-NEXT: pand %xmm7, %xmm5
-; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
-; SSE41-NEXT: por %xmm5, %xmm1
-; SSE41-NEXT: pxor %xmm8, %xmm1
-; SSE41-NEXT: pcmpeqq %xmm6, %xmm1
-; SSE41-NEXT: pandn %xmm4, %xmm1
+; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
+; SSE41-NEXT: por %xmm3, %xmm5
+; SSE41-NEXT: pxor %xmm1, %xmm5
+; SSE41-NEXT: pcmpeqq %xmm5, %xmm4
; SSE41-NEXT: movdqa %xmm2, %xmm3
; SSE41-NEXT: por %xmm0, %xmm3
-; SSE41-NEXT: movdqa %xmm0, %xmm4
-; SSE41-NEXT: pcmpgtd %xmm3, %xmm4
-; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
+; SSE41-NEXT: movdqa %xmm0, %xmm6
+; SSE41-NEXT: pcmpgtd %xmm3, %xmm6
+; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
; SSE41-NEXT: pcmpeqd %xmm0, %xmm3
-; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
-; SSE41-NEXT: pand %xmm5, %xmm0
-; SSE41-NEXT: por %xmm4, %xmm0
+; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
+; SSE41-NEXT: pand %xmm7, %xmm3
+; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
+; SSE41-NEXT: por %xmm3, %xmm0
+; SSE41-NEXT: pxor %xmm0, %xmm1
+; SSE41-NEXT: pcmpeqq %xmm5, %xmm1
+; SSE41-NEXT: pandn %xmm4, %xmm1
; SSE41-NEXT: movapd {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
; SSE41-NEXT: blendvpd %xmm0, {{.*}}(%rip), %xmm3
; SSE41-NEXT: movdqa %xmm1, %xmm0
@@ -869,12 +840,12 @@ define <2 x i32> @v2i32(<2 x i32> %x, <2
; AVX1-NEXT: vpcmpeqq %xmm3, %xmm5, %xmm3
; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm0
; AVX1-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm1
-; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm1
-; AVX1-NEXT: vpcmpeqq %xmm1, %xmm5, %xmm1
-; AVX1-NEXT: vpandn %xmm3, %xmm1, %xmm1
-; AVX1-NEXT: vmovapd {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
-; AVX1-NEXT: vblendvpd %xmm0, {{.*}}(%rip), %xmm2, %xmm2
-; AVX1-NEXT: vblendvpd %xmm1, %xmm2, %xmm0, %xmm0
+; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm2
+; AVX1-NEXT: vpcmpeqq %xmm2, %xmm5, %xmm2
+; AVX1-NEXT: vpandn %xmm3, %xmm2, %xmm2
+; AVX1-NEXT: vmovapd {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
+; AVX1-NEXT: vblendvpd %xmm1, {{.*}}(%rip), %xmm3, %xmm1
+; AVX1-NEXT: vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
; AVX1-NEXT: vpsrad $31, %xmm0, %xmm1
; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
@@ -893,12 +864,12 @@ define <2 x i32> @v2i32(<2 x i32> %x, <2
; AVX2-NEXT: vpcmpeqq %xmm3, %xmm5, %xmm3
; AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm0
; AVX2-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm1
-; AVX2-NEXT: vpxor %xmm4, %xmm1, %xmm1
-; AVX2-NEXT: vpcmpeqq %xmm1, %xmm5, %xmm1
-; AVX2-NEXT: vpandn %xmm3, %xmm1, %xmm1
-; AVX2-NEXT: vmovapd {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
-; AVX2-NEXT: vblendvpd %xmm0, {{.*}}(%rip), %xmm2, %xmm2
-; AVX2-NEXT: vblendvpd %xmm1, %xmm2, %xmm0, %xmm0
+; AVX2-NEXT: vpxor %xmm4, %xmm1, %xmm2
+; AVX2-NEXT: vpcmpeqq %xmm2, %xmm5, %xmm2
+; AVX2-NEXT: vpandn %xmm3, %xmm2, %xmm2
+; AVX2-NEXT: vmovapd {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
+; AVX2-NEXT: vblendvpd %xmm1, {{.*}}(%rip), %xmm3, %xmm1
+; AVX2-NEXT: vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
; AVX2-NEXT: vpsrad $31, %xmm0, %xmm1
; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
@@ -982,22 +953,21 @@ define <4 x i32> @v4i32(<4 x i32> %x, <4
; SSE41-LABEL: v4i32:
; SSE41: # %bb.0:
; SSE41-NEXT: movdqa %xmm0, %xmm2
-; SSE41-NEXT: pxor %xmm3, %xmm3
; SSE41-NEXT: pxor %xmm0, %xmm0
-; SSE41-NEXT: pcmpgtd %xmm1, %xmm0
-; SSE41-NEXT: pcmpeqd %xmm4, %xmm4
-; SSE41-NEXT: pxor %xmm4, %xmm0
+; SSE41-NEXT: pxor %xmm4, %xmm4
+; SSE41-NEXT: pcmpgtd %xmm1, %xmm4
+; SSE41-NEXT: pcmpeqd %xmm3, %xmm3
+; SSE41-NEXT: pxor %xmm3, %xmm4
; SSE41-NEXT: pxor %xmm5, %xmm5
; SSE41-NEXT: pcmpgtd %xmm2, %xmm5
-; SSE41-NEXT: pxor %xmm4, %xmm5
-; SSE41-NEXT: pcmpeqd %xmm5, %xmm0
+; SSE41-NEXT: pxor %xmm3, %xmm5
+; SSE41-NEXT: pcmpeqd %xmm5, %xmm4
; SSE41-NEXT: paddd %xmm1, %xmm2
-; SSE41-NEXT: pcmpgtd %xmm2, %xmm3
-; SSE41-NEXT: pxor %xmm4, %xmm3
+; SSE41-NEXT: pcmpgtd %xmm2, %xmm0
+; SSE41-NEXT: pxor %xmm0, %xmm3
; SSE41-NEXT: pcmpeqd %xmm5, %xmm3
-; SSE41-NEXT: pandn %xmm0, %xmm3
+; SSE41-NEXT: pandn %xmm4, %xmm3
; SSE41-NEXT: movaps {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
-; SSE41-NEXT: movdqa %xmm2, %xmm0
; SSE41-NEXT: blendvps %xmm0, {{.*}}(%rip), %xmm1
; SSE41-NEXT: movdqa %xmm3, %xmm0
; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm2
@@ -1015,12 +985,12 @@ define <4 x i32> @v4i32(<4 x i32> %x, <4
; AVX1-NEXT: vpcmpeqd %xmm3, %xmm5, %xmm3
; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm0
; AVX1-NEXT: vpcmpgtd %xmm0, %xmm2, %xmm1
-; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm1
-; AVX1-NEXT: vpcmpeqd %xmm1, %xmm5, %xmm1
-; AVX1-NEXT: vpandn %xmm3, %xmm1, %xmm1
-; AVX1-NEXT: vmovaps {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
-; AVX1-NEXT: vblendvps %xmm0, {{.*}}(%rip), %xmm2, %xmm2
-; AVX1-NEXT: vblendvps %xmm1, %xmm2, %xmm0, %xmm0
+; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm2
+; AVX1-NEXT: vpcmpeqd %xmm2, %xmm5, %xmm2
+; AVX1-NEXT: vpandn %xmm3, %xmm2, %xmm2
+; AVX1-NEXT: vmovaps {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
+; AVX1-NEXT: vblendvps %xmm1, {{.*}}(%rip), %xmm3, %xmm1
+; AVX1-NEXT: vblendvps %xmm2, %xmm1, %xmm0, %xmm0
; AVX1-NEXT: retq
;
; AVX2-LABEL: v4i32:
@@ -1034,13 +1004,13 @@ define <4 x i32> @v4i32(<4 x i32> %x, <4
; AVX2-NEXT: vpcmpeqd %xmm3, %xmm5, %xmm3
; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm0
; AVX2-NEXT: vpcmpgtd %xmm0, %xmm2, %xmm1
-; AVX2-NEXT: vpxor %xmm4, %xmm1, %xmm1
-; AVX2-NEXT: vpcmpeqd %xmm1, %xmm5, %xmm1
-; AVX2-NEXT: vpandn %xmm3, %xmm1, %xmm1
-; AVX2-NEXT: vbroadcastss {{.*#+}} xmm2 = [2147483647,2147483647,2147483647,2147483647]
-; AVX2-NEXT: vbroadcastss {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
-; AVX2-NEXT: vblendvps %xmm0, %xmm2, %xmm3, %xmm2
-; AVX2-NEXT: vblendvps %xmm1, %xmm2, %xmm0, %xmm0
+; AVX2-NEXT: vpxor %xmm4, %xmm1, %xmm2
+; AVX2-NEXT: vpcmpeqd %xmm2, %xmm5, %xmm2
+; AVX2-NEXT: vpandn %xmm3, %xmm2, %xmm2
+; AVX2-NEXT: vbroadcastss {{.*#+}} xmm3 = [2147483647,2147483647,2147483647,2147483647]
+; AVX2-NEXT: vbroadcastss {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
+; AVX2-NEXT: vblendvps %xmm1, %xmm3, %xmm4, %xmm1
+; AVX2-NEXT: vblendvps %xmm2, %xmm1, %xmm0, %xmm0
; AVX2-NEXT: retq
;
; AVX512-LABEL: v4i32:
@@ -1163,46 +1133,46 @@ define <8 x i32> @v8i32(<8 x i32> %x, <8
;
; SSE41-LABEL: v8i32:
; SSE41: # %bb.0:
-; SSE41-NEXT: movdqa %xmm0, %xmm5
-; SSE41-NEXT: pxor %xmm4, %xmm4
-; SSE41-NEXT: pxor %xmm0, %xmm0
-; SSE41-NEXT: pcmpgtd %xmm2, %xmm0
-; SSE41-NEXT: pcmpeqd %xmm9, %xmm9
-; SSE41-NEXT: pxor %xmm9, %xmm0
+; SSE41-NEXT: movdqa %xmm0, %xmm6
+; SSE41-NEXT: pxor %xmm8, %xmm8
; SSE41-NEXT: pxor %xmm7, %xmm7
-; SSE41-NEXT: pcmpgtd %xmm5, %xmm7
-; SSE41-NEXT: pxor %xmm9, %xmm7
-; SSE41-NEXT: pcmpeqd %xmm7, %xmm0
-; SSE41-NEXT: paddd %xmm2, %xmm5
-; SSE41-NEXT: pxor %xmm2, %xmm2
-; SSE41-NEXT: pcmpgtd %xmm5, %xmm2
-; SSE41-NEXT: pxor %xmm9, %xmm2
-; SSE41-NEXT: pcmpeqd %xmm7, %xmm2
-; SSE41-NEXT: pandn %xmm0, %xmm2
-; SSE41-NEXT: movaps {{.*#+}} xmm8 = [2147483647,2147483647,2147483647,2147483647]
-; SSE41-NEXT: movaps {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
-; SSE41-NEXT: movaps %xmm6, %xmm7
-; SSE41-NEXT: movdqa %xmm5, %xmm0
-; SSE41-NEXT: blendvps %xmm0, %xmm8, %xmm7
+; SSE41-NEXT: pcmpgtd %xmm2, %xmm7
+; SSE41-NEXT: pcmpeqd %xmm4, %xmm4
+; SSE41-NEXT: pxor %xmm4, %xmm7
+; SSE41-NEXT: pxor %xmm5, %xmm5
+; SSE41-NEXT: pcmpgtd %xmm0, %xmm5
+; SSE41-NEXT: pxor %xmm4, %xmm5
+; SSE41-NEXT: pcmpeqd %xmm5, %xmm7
+; SSE41-NEXT: paddd %xmm2, %xmm6
+; SSE41-NEXT: pxor %xmm0, %xmm0
+; SSE41-NEXT: pcmpgtd %xmm6, %xmm0
+; SSE41-NEXT: movdqa %xmm0, %xmm2
+; SSE41-NEXT: pxor %xmm4, %xmm2
+; SSE41-NEXT: pcmpeqd %xmm5, %xmm2
+; SSE41-NEXT: pandn %xmm7, %xmm2
+; SSE41-NEXT: movaps {{.*#+}} xmm9 = [2147483647,2147483647,2147483647,2147483647]
+; SSE41-NEXT: movaps {{.*#+}} xmm5 = [2147483648,2147483648,2147483648,2147483648]
+; SSE41-NEXT: movaps %xmm5, %xmm7
+; SSE41-NEXT: blendvps %xmm0, %xmm9, %xmm7
; SSE41-NEXT: movdqa %xmm2, %xmm0
-; SSE41-NEXT: blendvps %xmm0, %xmm7, %xmm5
+; SSE41-NEXT: blendvps %xmm0, %xmm7, %xmm6
; SSE41-NEXT: pxor %xmm0, %xmm0
; SSE41-NEXT: pcmpgtd %xmm3, %xmm0
-; SSE41-NEXT: pxor %xmm9, %xmm0
+; SSE41-NEXT: pxor %xmm4, %xmm0
; SSE41-NEXT: pxor %xmm2, %xmm2
; SSE41-NEXT: pcmpgtd %xmm1, %xmm2
-; SSE41-NEXT: pxor %xmm9, %xmm2
+; SSE41-NEXT: pxor %xmm4, %xmm2
; SSE41-NEXT: pcmpeqd %xmm2, %xmm0
; SSE41-NEXT: paddd %xmm3, %xmm1
-; SSE41-NEXT: pcmpgtd %xmm1, %xmm4
-; SSE41-NEXT: pxor %xmm9, %xmm4
+; SSE41-NEXT: pcmpgtd %xmm1, %xmm8
+; SSE41-NEXT: pxor %xmm8, %xmm4
; SSE41-NEXT: pcmpeqd %xmm2, %xmm4
; SSE41-NEXT: pandn %xmm0, %xmm4
-; SSE41-NEXT: movdqa %xmm1, %xmm0
-; SSE41-NEXT: blendvps %xmm0, %xmm8, %xmm6
+; SSE41-NEXT: movdqa %xmm8, %xmm0
+; SSE41-NEXT: blendvps %xmm0, %xmm9, %xmm5
; SSE41-NEXT: movdqa %xmm4, %xmm0
-; SSE41-NEXT: blendvps %xmm0, %xmm6, %xmm1
-; SSE41-NEXT: movaps %xmm5, %xmm0
+; SSE41-NEXT: blendvps %xmm0, %xmm5, %xmm1
+; SSE41-NEXT: movaps %xmm6, %xmm0
; SSE41-NEXT: retq
;
; AVX1-LABEL: v8i32:
@@ -1229,16 +1199,16 @@ define <8 x i32> @v8i32(<8 x i32> %x, <8
; AVX1-NEXT: vpxor %xmm5, %xmm2, %xmm2
; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm0
; AVX1-NEXT: vpcmpgtd %xmm0, %xmm3, %xmm1
-; AVX1-NEXT: vpxor %xmm5, %xmm1, %xmm1
-; AVX1-NEXT: vpcmpeqd %xmm1, %xmm4, %xmm1
-; AVX1-NEXT: vpxor %xmm5, %xmm1, %xmm1
-; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
-; AVX1-NEXT: vandps %ymm1, %ymm8, %ymm1
-; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm0, %ymm2
+; AVX1-NEXT: vpxor %xmm5, %xmm1, %xmm3
+; AVX1-NEXT: vpcmpeqd %xmm3, %xmm4, %xmm3
+; AVX1-NEXT: vpxor %xmm5, %xmm3, %xmm3
+; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2
+; AVX1-NEXT: vandps %ymm2, %ymm8, %ymm2
+; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm1, %ymm1
; AVX1-NEXT: vmovaps {{.*#+}} ymm3 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
-; AVX1-NEXT: vblendvps %ymm2, {{.*}}(%rip), %ymm3, %ymm2
+; AVX1-NEXT: vblendvps %ymm1, {{.*}}(%rip), %ymm3, %ymm1
; AVX1-NEXT: vinsertf128 $1, %xmm9, %ymm0, %ymm0
-; AVX1-NEXT: vblendvps %ymm1, %ymm2, %ymm0, %ymm0
+; AVX1-NEXT: vblendvps %ymm2, %ymm1, %ymm0, %ymm0
; AVX1-NEXT: retq
;
; AVX2-LABEL: v8i32:
@@ -1252,13 +1222,13 @@ define <8 x i32> @v8i32(<8 x i32> %x, <8
; AVX2-NEXT: vpcmpeqd %ymm3, %ymm5, %ymm3
; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm0
; AVX2-NEXT: vpcmpgtd %ymm0, %ymm2, %ymm1
-; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm1
-; AVX2-NEXT: vpcmpeqd %ymm1, %ymm5, %ymm1
-; AVX2-NEXT: vpandn %ymm3, %ymm1, %ymm1
-; AVX2-NEXT: vbroadcastss {{.*#+}} ymm2 = [2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647]
-; AVX2-NEXT: vbroadcastss {{.*#+}} ymm3 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
-; AVX2-NEXT: vblendvps %ymm0, %ymm2, %ymm3, %ymm2
-; AVX2-NEXT: vblendvps %ymm1, %ymm2, %ymm0, %ymm0
+; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm2
+; AVX2-NEXT: vpcmpeqd %ymm2, %ymm5, %ymm2
+; AVX2-NEXT: vpandn %ymm3, %ymm2, %ymm2
+; AVX2-NEXT: vbroadcastss {{.*#+}} ymm3 = [2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647]
+; AVX2-NEXT: vbroadcastss {{.*#+}} ymm4 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
+; AVX2-NEXT: vblendvps %ymm1, %ymm3, %ymm4, %ymm1
+; AVX2-NEXT: vblendvps %ymm2, %ymm1, %ymm0, %ymm0
; AVX2-NEXT: retq
;
; AVX512-LABEL: v8i32:
@@ -1469,62 +1439,62 @@ define <16 x i32> @v16i32(<16 x i32> %x,
;
; SSE41-LABEL: v16i32:
; SSE41: # %bb.0:
-; SSE41-NEXT: movdqa %xmm0, %xmm8
-; SSE41-NEXT: pxor %xmm9, %xmm9
+; SSE41-NEXT: movdqa %xmm0, %xmm9
+; SSE41-NEXT: pxor %xmm8, %xmm8
; SSE41-NEXT: pxor %xmm11, %xmm11
; SSE41-NEXT: pcmpgtd %xmm4, %xmm11
; SSE41-NEXT: pcmpeqd %xmm10, %xmm10
; SSE41-NEXT: pxor %xmm10, %xmm11
+; SSE41-NEXT: pxor %xmm12, %xmm12
+; SSE41-NEXT: pcmpgtd %xmm0, %xmm12
+; SSE41-NEXT: pxor %xmm10, %xmm12
+; SSE41-NEXT: pcmpeqd %xmm12, %xmm11
+; SSE41-NEXT: paddd %xmm4, %xmm9
; SSE41-NEXT: pxor %xmm0, %xmm0
-; SSE41-NEXT: pcmpgtd %xmm8, %xmm0
-; SSE41-NEXT: pxor %xmm10, %xmm0
-; SSE41-NEXT: pcmpeqd %xmm0, %xmm11
-; SSE41-NEXT: paddd %xmm4, %xmm8
-; SSE41-NEXT: pxor %xmm4, %xmm4
-; SSE41-NEXT: pcmpgtd %xmm8, %xmm4
+; SSE41-NEXT: pcmpgtd %xmm9, %xmm0
+; SSE41-NEXT: movdqa %xmm0, %xmm4
; SSE41-NEXT: pxor %xmm10, %xmm4
-; SSE41-NEXT: pcmpeqd %xmm0, %xmm4
+; SSE41-NEXT: pcmpeqd %xmm12, %xmm4
; SSE41-NEXT: pandn %xmm11, %xmm4
; SSE41-NEXT: movaps {{.*#+}} xmm12 = [2147483647,2147483647,2147483647,2147483647]
; SSE41-NEXT: movaps {{.*#+}} xmm11 = [2147483648,2147483648,2147483648,2147483648]
; SSE41-NEXT: movaps %xmm11, %xmm13
-; SSE41-NEXT: movdqa %xmm8, %xmm0
; SSE41-NEXT: blendvps %xmm0, %xmm12, %xmm13
; SSE41-NEXT: movdqa %xmm4, %xmm0
-; SSE41-NEXT: blendvps %xmm0, %xmm13, %xmm8
+; SSE41-NEXT: blendvps %xmm0, %xmm13, %xmm9
; SSE41-NEXT: xorps %xmm13, %xmm13
; SSE41-NEXT: pcmpgtd %xmm5, %xmm13
; SSE41-NEXT: pxor %xmm10, %xmm13
+; SSE41-NEXT: pxor %xmm14, %xmm14
+; SSE41-NEXT: pcmpgtd %xmm1, %xmm14
+; SSE41-NEXT: pxor %xmm10, %xmm14
+; SSE41-NEXT: pcmpeqd %xmm14, %xmm13
+; SSE41-NEXT: paddd %xmm5, %xmm1
; SSE41-NEXT: pxor %xmm0, %xmm0
; SSE41-NEXT: pcmpgtd %xmm1, %xmm0
-; SSE41-NEXT: pxor %xmm10, %xmm0
-; SSE41-NEXT: pcmpeqd %xmm0, %xmm13
-; SSE41-NEXT: paddd %xmm5, %xmm1
-; SSE41-NEXT: pxor %xmm4, %xmm4
-; SSE41-NEXT: pcmpgtd %xmm1, %xmm4
+; SSE41-NEXT: movdqa %xmm0, %xmm4
; SSE41-NEXT: pxor %xmm10, %xmm4
-; SSE41-NEXT: pcmpeqd %xmm0, %xmm4
+; SSE41-NEXT: pcmpeqd %xmm14, %xmm4
; SSE41-NEXT: pandn %xmm13, %xmm4
; SSE41-NEXT: movaps %xmm11, %xmm5
-; SSE41-NEXT: movdqa %xmm1, %xmm0
; SSE41-NEXT: blendvps %xmm0, %xmm12, %xmm5
; SSE41-NEXT: movdqa %xmm4, %xmm0
; SSE41-NEXT: blendvps %xmm0, %xmm5, %xmm1
-; SSE41-NEXT: pxor %xmm0, %xmm0
-; SSE41-NEXT: pcmpgtd %xmm6, %xmm0
-; SSE41-NEXT: pxor %xmm10, %xmm0
+; SSE41-NEXT: pxor %xmm13, %xmm13
+; SSE41-NEXT: pcmpgtd %xmm6, %xmm13
+; SSE41-NEXT: pxor %xmm10, %xmm13
; SSE41-NEXT: xorps %xmm5, %xmm5
; SSE41-NEXT: pcmpgtd %xmm2, %xmm5
; SSE41-NEXT: pxor %xmm10, %xmm5
-; SSE41-NEXT: pcmpeqd %xmm5, %xmm0
+; SSE41-NEXT: pcmpeqd %xmm5, %xmm13
; SSE41-NEXT: paddd %xmm6, %xmm2
-; SSE41-NEXT: pxor %xmm4, %xmm4
-; SSE41-NEXT: pcmpgtd %xmm2, %xmm4
+; SSE41-NEXT: pxor %xmm0, %xmm0
+; SSE41-NEXT: pcmpgtd %xmm2, %xmm0
+; SSE41-NEXT: movdqa %xmm0, %xmm4
; SSE41-NEXT: pxor %xmm10, %xmm4
; SSE41-NEXT: pcmpeqd %xmm5, %xmm4
-; SSE41-NEXT: pandn %xmm0, %xmm4
+; SSE41-NEXT: pandn %xmm13, %xmm4
; SSE41-NEXT: movaps %xmm11, %xmm5
-; SSE41-NEXT: movdqa %xmm2, %xmm0
; SSE41-NEXT: blendvps %xmm0, %xmm12, %xmm5
; SSE41-NEXT: movdqa %xmm4, %xmm0
; SSE41-NEXT: blendvps %xmm0, %xmm5, %xmm2
@@ -1536,80 +1506,80 @@ define <16 x i32> @v16i32(<16 x i32> %x,
; SSE41-NEXT: pxor %xmm10, %xmm4
; SSE41-NEXT: pcmpeqd %xmm4, %xmm0
; SSE41-NEXT: paddd %xmm7, %xmm3
-; SSE41-NEXT: pcmpgtd %xmm3, %xmm9
-; SSE41-NEXT: pxor %xmm10, %xmm9
-; SSE41-NEXT: pcmpeqd %xmm4, %xmm9
-; SSE41-NEXT: pandn %xmm0, %xmm9
-; SSE41-NEXT: movdqa %xmm3, %xmm0
+; SSE41-NEXT: pcmpgtd %xmm3, %xmm8
+; SSE41-NEXT: pxor %xmm8, %xmm10
+; SSE41-NEXT: pcmpeqd %xmm4, %xmm10
+; SSE41-NEXT: pandn %xmm0, %xmm10
+; SSE41-NEXT: movdqa %xmm8, %xmm0
; SSE41-NEXT: blendvps %xmm0, %xmm12, %xmm11
-; SSE41-NEXT: movdqa %xmm9, %xmm0
+; SSE41-NEXT: movdqa %xmm10, %xmm0
; SSE41-NEXT: blendvps %xmm0, %xmm11, %xmm3
-; SSE41-NEXT: movaps %xmm8, %xmm0
+; SSE41-NEXT: movaps %xmm9, %xmm0
; SSE41-NEXT: retq
;
; AVX1-LABEL: v16i32:
; AVX1: # %bb.0:
; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm9
-; AVX1-NEXT: vpxor %xmm12, %xmm12, %xmm12
-; AVX1-NEXT: vpcmpgtd %xmm9, %xmm12, %xmm7
+; AVX1-NEXT: vpxor %xmm10, %xmm10, %xmm10
+; AVX1-NEXT: vpcmpgtd %xmm9, %xmm10, %xmm7
; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm8
; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm7
-; AVX1-NEXT: vpcmpgtd %xmm7, %xmm12, %xmm6
-; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm10
-; AVX1-NEXT: vpcmpeqd %xmm8, %xmm10, %xmm8
-; AVX1-NEXT: vpcmpgtd %xmm2, %xmm12, %xmm6
-; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm11
-; AVX1-NEXT: vpcmpgtd %xmm0, %xmm12, %xmm6
-; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm6
-; AVX1-NEXT: vpcmpeqd %xmm11, %xmm6, %xmm11
+; AVX1-NEXT: vpcmpgtd %xmm7, %xmm10, %xmm6
+; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm12
+; AVX1-NEXT: vpcmpeqd %xmm8, %xmm12, %xmm8
+; AVX1-NEXT: vpcmpgtd %xmm2, %xmm10, %xmm5
+; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm11
+; AVX1-NEXT: vpcmpgtd %xmm0, %xmm10, %xmm5
+; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5
+; AVX1-NEXT: vpcmpeqd %xmm11, %xmm5, %xmm11
; AVX1-NEXT: vinsertf128 $1, %xmm8, %ymm11, %ymm8
; AVX1-NEXT: vpaddd %xmm9, %xmm7, %xmm9
-; AVX1-NEXT: vpcmpgtd %xmm9, %xmm12, %xmm7
-; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm5
-; AVX1-NEXT: vpcmpeqd %xmm5, %xmm10, %xmm5
-; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5
+; AVX1-NEXT: vpcmpgtd %xmm9, %xmm10, %xmm7
+; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm6
+; AVX1-NEXT: vpcmpeqd %xmm6, %xmm12, %xmm6
+; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm11
; AVX1-NEXT: vpaddd %xmm2, %xmm0, %xmm0
-; AVX1-NEXT: vpcmpgtd %xmm0, %xmm12, %xmm2
-; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm2
-; AVX1-NEXT: vpcmpeqd %xmm2, %xmm6, %xmm2
-; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm2
-; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm2, %ymm2
-; AVX1-NEXT: vandps %ymm2, %ymm8, %ymm5
-; AVX1-NEXT: vinsertf128 $1, %xmm7, %ymm0, %ymm7
+; AVX1-NEXT: vpcmpgtd %xmm0, %xmm10, %xmm2
+; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm6
+; AVX1-NEXT: vpcmpeqd %xmm6, %xmm5, %xmm5
+; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5
+; AVX1-NEXT: vinsertf128 $1, %xmm11, %ymm5, %ymm5
+; AVX1-NEXT: vandps %ymm5, %ymm8, %ymm5
+; AVX1-NEXT: vinsertf128 $1, %xmm7, %ymm2, %ymm7
; AVX1-NEXT: vmovaps {{.*#+}} ymm8 = [2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647]
-; AVX1-NEXT: vmovaps {{.*#+}} ymm10 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
-; AVX1-NEXT: vblendvps %ymm7, %ymm8, %ymm10, %ymm7
+; AVX1-NEXT: vmovaps {{.*#+}} ymm11 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
+; AVX1-NEXT: vblendvps %ymm7, %ymm8, %ymm11, %ymm7
; AVX1-NEXT: vinsertf128 $1, %xmm9, %ymm0, %ymm0
; AVX1-NEXT: vblendvps %ymm5, %ymm7, %ymm0, %ymm0
; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm5
-; AVX1-NEXT: vpcmpgtd %xmm5, %xmm12, %xmm7
+; AVX1-NEXT: vpcmpgtd %xmm5, %xmm10, %xmm7
; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm7
; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
-; AVX1-NEXT: vpcmpgtd %xmm2, %xmm12, %xmm6
+; AVX1-NEXT: vpcmpgtd %xmm2, %xmm10, %xmm6
; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm6
; AVX1-NEXT: vpcmpeqd %xmm7, %xmm6, %xmm9
-; AVX1-NEXT: vpcmpgtd %xmm3, %xmm12, %xmm7
-; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm11
-; AVX1-NEXT: vpcmpgtd %xmm1, %xmm12, %xmm7
+; AVX1-NEXT: vpcmpgtd %xmm3, %xmm10, %xmm7
+; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm12
+; AVX1-NEXT: vpcmpgtd %xmm1, %xmm10, %xmm7
; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm7
-; AVX1-NEXT: vpcmpeqd %xmm11, %xmm7, %xmm11
-; AVX1-NEXT: vinsertf128 $1, %xmm9, %ymm11, %ymm9
-; AVX1-NEXT: vpaddd %xmm5, %xmm2, %xmm11
-; AVX1-NEXT: vpcmpgtd %xmm11, %xmm12, %xmm5
+; AVX1-NEXT: vpcmpeqd %xmm12, %xmm7, %xmm12
+; AVX1-NEXT: vinsertf128 $1, %xmm9, %ymm12, %ymm9
+; AVX1-NEXT: vpaddd %xmm5, %xmm2, %xmm12
+; AVX1-NEXT: vpcmpgtd %xmm12, %xmm10, %xmm5
; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm2
; AVX1-NEXT: vpcmpeqd %xmm2, %xmm6, %xmm2
; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm2
; AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm1
-; AVX1-NEXT: vpcmpgtd %xmm1, %xmm12, %xmm3
-; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
-; AVX1-NEXT: vpcmpeqd %xmm3, %xmm7, %xmm3
-; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
-; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2
+; AVX1-NEXT: vpcmpgtd %xmm1, %xmm10, %xmm3
+; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm6
+; AVX1-NEXT: vpcmpeqd %xmm6, %xmm7, %xmm6
+; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm4
+; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm4, %ymm2
; AVX1-NEXT: vandps %ymm2, %ymm9, %ymm2
-; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm1, %ymm3
-; AVX1-NEXT: vblendvps %ymm3, %ymm8, %ymm10, %ymm3
-; AVX1-NEXT: vinsertf128 $1, %xmm11, %ymm1, %ymm1
+; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm3, %ymm3
+; AVX1-NEXT: vblendvps %ymm3, %ymm8, %ymm11, %ymm3
+; AVX1-NEXT: vinsertf128 $1, %xmm12, %ymm1, %ymm1
; AVX1-NEXT: vblendvps %ymm2, %ymm3, %ymm1, %ymm1
; AVX1-NEXT: retq
;
@@ -1624,24 +1594,24 @@ define <16 x i32> @v16i32(<16 x i32> %x,
; AVX2-NEXT: vpcmpeqd %ymm5, %ymm7, %ymm5
; AVX2-NEXT: vpaddd %ymm2, %ymm0, %ymm0
; AVX2-NEXT: vpcmpgtd %ymm0, %ymm4, %ymm2
-; AVX2-NEXT: vpxor %ymm6, %ymm2, %ymm2
-; AVX2-NEXT: vpcmpeqd %ymm2, %ymm7, %ymm2
-; AVX2-NEXT: vpandn %ymm5, %ymm2, %ymm2
-; AVX2-NEXT: vbroadcastss {{.*#+}} ymm5 = [2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647]
-; AVX2-NEXT: vbroadcastss {{.*#+}} ymm7 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
-; AVX2-NEXT: vblendvps %ymm0, %ymm5, %ymm7, %ymm8
-; AVX2-NEXT: vblendvps %ymm2, %ymm8, %ymm0, %ymm0
+; AVX2-NEXT: vpxor %ymm6, %ymm2, %ymm8
+; AVX2-NEXT: vpcmpeqd %ymm8, %ymm7, %ymm7
+; AVX2-NEXT: vpandn %ymm5, %ymm7, %ymm5
+; AVX2-NEXT: vbroadcastss {{.*#+}} ymm7 = [2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647]
+; AVX2-NEXT: vbroadcastss {{.*#+}} ymm8 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
+; AVX2-NEXT: vblendvps %ymm2, %ymm7, %ymm8, %ymm2
+; AVX2-NEXT: vblendvps %ymm5, %ymm2, %ymm0, %ymm0
; AVX2-NEXT: vpcmpgtd %ymm3, %ymm4, %ymm2
; AVX2-NEXT: vpxor %ymm6, %ymm2, %ymm2
-; AVX2-NEXT: vpcmpgtd %ymm1, %ymm4, %ymm8
-; AVX2-NEXT: vpxor %ymm6, %ymm8, %ymm8
-; AVX2-NEXT: vpcmpeqd %ymm2, %ymm8, %ymm2
+; AVX2-NEXT: vpcmpgtd %ymm1, %ymm4, %ymm5
+; AVX2-NEXT: vpxor %ymm6, %ymm5, %ymm5
+; AVX2-NEXT: vpcmpeqd %ymm2, %ymm5, %ymm2
; AVX2-NEXT: vpaddd %ymm3, %ymm1, %ymm1
; AVX2-NEXT: vpcmpgtd %ymm1, %ymm4, %ymm3
-; AVX2-NEXT: vpxor %ymm6, %ymm3, %ymm3
-; AVX2-NEXT: vpcmpeqd %ymm3, %ymm8, %ymm3
-; AVX2-NEXT: vpandn %ymm2, %ymm3, %ymm2
-; AVX2-NEXT: vblendvps %ymm1, %ymm5, %ymm7, %ymm3
+; AVX2-NEXT: vpxor %ymm6, %ymm3, %ymm4
+; AVX2-NEXT: vpcmpeqd %ymm4, %ymm5, %ymm4
+; AVX2-NEXT: vpandn %ymm2, %ymm4, %ymm2
+; AVX2-NEXT: vblendvps %ymm3, %ymm7, %ymm8, %ymm3
; AVX2-NEXT: vblendvps %ymm2, %ymm3, %ymm1, %ymm1
; AVX2-NEXT: retq
;
@@ -1832,12 +1802,12 @@ define <2 x i64> @v2i64(<2 x i64> %x, <2
; AVX1-NEXT: vpcmpeqq %xmm3, %xmm5, %xmm3
; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm0
; AVX1-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm1
-; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm1
-; AVX1-NEXT: vpcmpeqq %xmm1, %xmm5, %xmm1
-; AVX1-NEXT: vpandn %xmm3, %xmm1, %xmm1
-; AVX1-NEXT: vmovapd {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
-; AVX1-NEXT: vblendvpd %xmm0, {{.*}}(%rip), %xmm2, %xmm2
-; AVX1-NEXT: vblendvpd %xmm1, %xmm2, %xmm0, %xmm0
+; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm2
+; AVX1-NEXT: vpcmpeqq %xmm2, %xmm5, %xmm2
+; AVX1-NEXT: vpandn %xmm3, %xmm2, %xmm2
+; AVX1-NEXT: vmovapd {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
+; AVX1-NEXT: vblendvpd %xmm1, {{.*}}(%rip), %xmm3, %xmm1
+; AVX1-NEXT: vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
; AVX1-NEXT: retq
;
; AVX2-LABEL: v2i64:
@@ -1851,12 +1821,12 @@ define <2 x i64> @v2i64(<2 x i64> %x, <2
; AVX2-NEXT: vpcmpeqq %xmm3, %xmm5, %xmm3
; AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm0
; AVX2-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm1
-; AVX2-NEXT: vpxor %xmm4, %xmm1, %xmm1
-; AVX2-NEXT: vpcmpeqq %xmm1, %xmm5, %xmm1
-; AVX2-NEXT: vpandn %xmm3, %xmm1, %xmm1
-; AVX2-NEXT: vmovapd {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
-; AVX2-NEXT: vblendvpd %xmm0, {{.*}}(%rip), %xmm2, %xmm2
-; AVX2-NEXT: vblendvpd %xmm1, %xmm2, %xmm0, %xmm0
+; AVX2-NEXT: vpxor %xmm4, %xmm1, %xmm2
+; AVX2-NEXT: vpcmpeqq %xmm2, %xmm5, %xmm2
+; AVX2-NEXT: vpandn %xmm3, %xmm2, %xmm2
+; AVX2-NEXT: vmovapd {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
+; AVX2-NEXT: vblendvpd %xmm1, {{.*}}(%rip), %xmm3, %xmm1
+; AVX2-NEXT: vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
; AVX2-NEXT: retq
;
; AVX512-LABEL: v2i64:
@@ -2200,16 +2170,16 @@ define <4 x i64> @v4i64(<4 x i64> %x, <4
; AVX1-NEXT: vpxor %xmm5, %xmm2, %xmm2
; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm0
; AVX1-NEXT: vpcmpgtq %xmm0, %xmm3, %xmm1
-; AVX1-NEXT: vpxor %xmm5, %xmm1, %xmm1
-; AVX1-NEXT: vpcmpeqq %xmm1, %xmm4, %xmm1
-; AVX1-NEXT: vpxor %xmm5, %xmm1, %xmm1
-; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
-; AVX1-NEXT: vandpd %ymm1, %ymm8, %ymm1
-; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm0, %ymm2
+; AVX1-NEXT: vpxor %xmm5, %xmm1, %xmm3
+; AVX1-NEXT: vpcmpeqq %xmm3, %xmm4, %xmm3
+; AVX1-NEXT: vpxor %xmm5, %xmm3, %xmm3
+; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2
+; AVX1-NEXT: vandpd %ymm2, %ymm8, %ymm2
+; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm1, %ymm1
; AVX1-NEXT: vmovapd {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
-; AVX1-NEXT: vblendvpd %ymm2, {{.*}}(%rip), %ymm3, %ymm2
+; AVX1-NEXT: vblendvpd %ymm1, {{.*}}(%rip), %ymm3, %ymm1
; AVX1-NEXT: vinsertf128 $1, %xmm9, %ymm0, %ymm0
-; AVX1-NEXT: vblendvpd %ymm1, %ymm2, %ymm0, %ymm0
+; AVX1-NEXT: vblendvpd %ymm2, %ymm1, %ymm0, %ymm0
; AVX1-NEXT: retq
;
; AVX2-LABEL: v4i64:
@@ -2223,13 +2193,13 @@ define <4 x i64> @v4i64(<4 x i64> %x, <4
; AVX2-NEXT: vpcmpeqq %ymm3, %ymm5, %ymm3
; AVX2-NEXT: vpaddq %ymm1, %ymm0, %ymm0
; AVX2-NEXT: vpcmpgtq %ymm0, %ymm2, %ymm1
-; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm1
-; AVX2-NEXT: vpcmpeqq %ymm1, %ymm5, %ymm1
-; AVX2-NEXT: vpandn %ymm3, %ymm1, %ymm1
-; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm2 = [9223372036854775807,9223372036854775807,9223372036854775807,9223372036854775807]
-; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
-; AVX2-NEXT: vblendvpd %ymm0, %ymm2, %ymm3, %ymm2
-; AVX2-NEXT: vblendvpd %ymm1, %ymm2, %ymm0, %ymm0
+; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm2
+; AVX2-NEXT: vpcmpeqq %ymm2, %ymm5, %ymm2
+; AVX2-NEXT: vpandn %ymm3, %ymm2, %ymm2
+; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm3 = [9223372036854775807,9223372036854775807,9223372036854775807,9223372036854775807]
+; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm4 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
+; AVX2-NEXT: vblendvpd %ymm1, %ymm3, %ymm4, %ymm1
+; AVX2-NEXT: vblendvpd %ymm2, %ymm1, %ymm0, %ymm0
; AVX2-NEXT: retq
;
; AVX512-LABEL: v4i64:
@@ -2831,66 +2801,66 @@ define <8 x i64> @v8i64(<8 x i64> %x, <8
; AVX1-LABEL: v8i64:
; AVX1: # %bb.0:
; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm9
-; AVX1-NEXT: vpxor %xmm12, %xmm12, %xmm12
-; AVX1-NEXT: vpcmpgtq %xmm9, %xmm12, %xmm7
+; AVX1-NEXT: vpxor %xmm10, %xmm10, %xmm10
+; AVX1-NEXT: vpcmpgtq %xmm9, %xmm10, %xmm7
; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm8
; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm7
-; AVX1-NEXT: vpcmpgtq %xmm7, %xmm12, %xmm6
-; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm10
-; AVX1-NEXT: vpcmpeqq %xmm8, %xmm10, %xmm8
-; AVX1-NEXT: vpcmpgtq %xmm2, %xmm12, %xmm6
-; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm11
-; AVX1-NEXT: vpcmpgtq %xmm0, %xmm12, %xmm6
-; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm6
-; AVX1-NEXT: vpcmpeqq %xmm11, %xmm6, %xmm11
+; AVX1-NEXT: vpcmpgtq %xmm7, %xmm10, %xmm6
+; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm12
+; AVX1-NEXT: vpcmpeqq %xmm8, %xmm12, %xmm8
+; AVX1-NEXT: vpcmpgtq %xmm2, %xmm10, %xmm5
+; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm11
+; AVX1-NEXT: vpcmpgtq %xmm0, %xmm10, %xmm5
+; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5
+; AVX1-NEXT: vpcmpeqq %xmm11, %xmm5, %xmm11
; AVX1-NEXT: vinsertf128 $1, %xmm8, %ymm11, %ymm8
; AVX1-NEXT: vpaddq %xmm9, %xmm7, %xmm9
-; AVX1-NEXT: vpcmpgtq %xmm9, %xmm12, %xmm7
-; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm5
-; AVX1-NEXT: vpcmpeqq %xmm5, %xmm10, %xmm5
-; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5
+; AVX1-NEXT: vpcmpgtq %xmm9, %xmm10, %xmm7
+; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm6
+; AVX1-NEXT: vpcmpeqq %xmm6, %xmm12, %xmm6
+; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm11
; AVX1-NEXT: vpaddq %xmm2, %xmm0, %xmm0
-; AVX1-NEXT: vpcmpgtq %xmm0, %xmm12, %xmm2
-; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm2
-; AVX1-NEXT: vpcmpeqq %xmm2, %xmm6, %xmm2
-; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm2
-; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm2, %ymm2
-; AVX1-NEXT: vandpd %ymm2, %ymm8, %ymm5
-; AVX1-NEXT: vinsertf128 $1, %xmm7, %ymm0, %ymm7
+; AVX1-NEXT: vpcmpgtq %xmm0, %xmm10, %xmm2
+; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm6
+; AVX1-NEXT: vpcmpeqq %xmm6, %xmm5, %xmm5
+; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5
+; AVX1-NEXT: vinsertf128 $1, %xmm11, %ymm5, %ymm5
+; AVX1-NEXT: vandpd %ymm5, %ymm8, %ymm5
+; AVX1-NEXT: vinsertf128 $1, %xmm7, %ymm2, %ymm7
; AVX1-NEXT: vmovapd {{.*#+}} ymm8 = [9223372036854775807,9223372036854775807,9223372036854775807,9223372036854775807]
-; AVX1-NEXT: vmovapd {{.*#+}} ymm10 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
-; AVX1-NEXT: vblendvpd %ymm7, %ymm8, %ymm10, %ymm7
+; AVX1-NEXT: vmovapd {{.*#+}} ymm11 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
+; AVX1-NEXT: vblendvpd %ymm7, %ymm8, %ymm11, %ymm7
; AVX1-NEXT: vinsertf128 $1, %xmm9, %ymm0, %ymm0
; AVX1-NEXT: vblendvpd %ymm5, %ymm7, %ymm0, %ymm0
; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm5
-; AVX1-NEXT: vpcmpgtq %xmm5, %xmm12, %xmm7
+; AVX1-NEXT: vpcmpgtq %xmm5, %xmm10, %xmm7
; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm7
; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
-; AVX1-NEXT: vpcmpgtq %xmm2, %xmm12, %xmm6
+; AVX1-NEXT: vpcmpgtq %xmm2, %xmm10, %xmm6
; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm6
; AVX1-NEXT: vpcmpeqq %xmm7, %xmm6, %xmm9
-; AVX1-NEXT: vpcmpgtq %xmm3, %xmm12, %xmm7
-; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm11
-; AVX1-NEXT: vpcmpgtq %xmm1, %xmm12, %xmm7
+; AVX1-NEXT: vpcmpgtq %xmm3, %xmm10, %xmm7
+; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm12
+; AVX1-NEXT: vpcmpgtq %xmm1, %xmm10, %xmm7
; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm7
-; AVX1-NEXT: vpcmpeqq %xmm11, %xmm7, %xmm11
-; AVX1-NEXT: vinsertf128 $1, %xmm9, %ymm11, %ymm9
-; AVX1-NEXT: vpaddq %xmm5, %xmm2, %xmm11
-; AVX1-NEXT: vpcmpgtq %xmm11, %xmm12, %xmm5
+; AVX1-NEXT: vpcmpeqq %xmm12, %xmm7, %xmm12
+; AVX1-NEXT: vinsertf128 $1, %xmm9, %ymm12, %ymm9
+; AVX1-NEXT: vpaddq %xmm5, %xmm2, %xmm12
+; AVX1-NEXT: vpcmpgtq %xmm12, %xmm10, %xmm5
; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm2
; AVX1-NEXT: vpcmpeqq %xmm2, %xmm6, %xmm2
; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm2
; AVX1-NEXT: vpaddq %xmm3, %xmm1, %xmm1
-; AVX1-NEXT: vpcmpgtq %xmm1, %xmm12, %xmm3
-; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
-; AVX1-NEXT: vpcmpeqq %xmm3, %xmm7, %xmm3
-; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
-; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2
+; AVX1-NEXT: vpcmpgtq %xmm1, %xmm10, %xmm3
+; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm6
+; AVX1-NEXT: vpcmpeqq %xmm6, %xmm7, %xmm6
+; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm4
+; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm4, %ymm2
; AVX1-NEXT: vandpd %ymm2, %ymm9, %ymm2
-; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm1, %ymm3
-; AVX1-NEXT: vblendvpd %ymm3, %ymm8, %ymm10, %ymm3
-; AVX1-NEXT: vinsertf128 $1, %xmm11, %ymm1, %ymm1
+; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm3, %ymm3
+; AVX1-NEXT: vblendvpd %ymm3, %ymm8, %ymm11, %ymm3
+; AVX1-NEXT: vinsertf128 $1, %xmm12, %ymm1, %ymm1
; AVX1-NEXT: vblendvpd %ymm2, %ymm3, %ymm1, %ymm1
; AVX1-NEXT: retq
;
@@ -2905,24 +2875,24 @@ define <8 x i64> @v8i64(<8 x i64> %x, <8
; AVX2-NEXT: vpcmpeqq %ymm5, %ymm7, %ymm5
; AVX2-NEXT: vpaddq %ymm2, %ymm0, %ymm0
; AVX2-NEXT: vpcmpgtq %ymm0, %ymm4, %ymm2
-; AVX2-NEXT: vpxor %ymm6, %ymm2, %ymm2
-; AVX2-NEXT: vpcmpeqq %ymm2, %ymm7, %ymm2
-; AVX2-NEXT: vpandn %ymm5, %ymm2, %ymm2
-; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm5 = [9223372036854775807,9223372036854775807,9223372036854775807,9223372036854775807]
-; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm7 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
-; AVX2-NEXT: vblendvpd %ymm0, %ymm5, %ymm7, %ymm8
-; AVX2-NEXT: vblendvpd %ymm2, %ymm8, %ymm0, %ymm0
+; AVX2-NEXT: vpxor %ymm6, %ymm2, %ymm8
+; AVX2-NEXT: vpcmpeqq %ymm8, %ymm7, %ymm7
+; AVX2-NEXT: vpandn %ymm5, %ymm7, %ymm5
+; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm7 = [9223372036854775807,9223372036854775807,9223372036854775807,9223372036854775807]
+; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm8 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
+; AVX2-NEXT: vblendvpd %ymm2, %ymm7, %ymm8, %ymm2
+; AVX2-NEXT: vblendvpd %ymm5, %ymm2, %ymm0, %ymm0
; AVX2-NEXT: vpcmpgtq %ymm3, %ymm4, %ymm2
; AVX2-NEXT: vpxor %ymm6, %ymm2, %ymm2
-; AVX2-NEXT: vpcmpgtq %ymm1, %ymm4, %ymm8
-; AVX2-NEXT: vpxor %ymm6, %ymm8, %ymm8
-; AVX2-NEXT: vpcmpeqq %ymm2, %ymm8, %ymm2
+; AVX2-NEXT: vpcmpgtq %ymm1, %ymm4, %ymm5
+; AVX2-NEXT: vpxor %ymm6, %ymm5, %ymm5
+; AVX2-NEXT: vpcmpeqq %ymm2, %ymm5, %ymm2
; AVX2-NEXT: vpaddq %ymm3, %ymm1, %ymm1
; AVX2-NEXT: vpcmpgtq %ymm1, %ymm4, %ymm3
-; AVX2-NEXT: vpxor %ymm6, %ymm3, %ymm3
-; AVX2-NEXT: vpcmpeqq %ymm3, %ymm8, %ymm3
-; AVX2-NEXT: vpandn %ymm2, %ymm3, %ymm2
-; AVX2-NEXT: vblendvpd %ymm1, %ymm5, %ymm7, %ymm3
+; AVX2-NEXT: vpxor %ymm6, %ymm3, %ymm4
+; AVX2-NEXT: vpcmpeqq %ymm4, %ymm5, %ymm4
+; AVX2-NEXT: vpandn %ymm2, %ymm4, %ymm2
+; AVX2-NEXT: vblendvpd %ymm3, %ymm7, %ymm8, %ymm3
; AVX2-NEXT: vblendvpd %ymm2, %ymm3, %ymm1, %ymm1
; AVX2-NEXT: retq
;
Modified: llvm/trunk/test/CodeGen/X86/ssub_sat_vec.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/ssub_sat_vec.ll?rev=361166&r1=361165&r2=361166&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/ssub_sat_vec.ll (original)
+++ llvm/trunk/test/CodeGen/X86/ssub_sat_vec.ll Mon May 20 09:09:22 2019
@@ -663,7 +663,7 @@ define <2 x i32> @v2i32(<2 x i32> %x, <2
; SSE2-NEXT: psllq $32, %xmm0
; SSE2-NEXT: movdqa %xmm0, %xmm3
; SSE2-NEXT: psubq %xmm1, %xmm0
-; SSE2-NEXT: pxor %xmm2, %xmm1
+; SSE2-NEXT: por %xmm2, %xmm1
; SSE2-NEXT: movdqa %xmm2, %xmm4
; SSE2-NEXT: pcmpgtd %xmm1, %xmm4
; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
@@ -672,57 +672,48 @@ define <2 x i32> @v2i32(<2 x i32> %x, <2
; SSE2-NEXT: pand %xmm5, %xmm1
; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
; SSE2-NEXT: por %xmm1, %xmm4
-; SSE2-NEXT: pcmpeqd %xmm5, %xmm5
-; SSE2-NEXT: pxor %xmm5, %xmm4
-; SSE2-NEXT: pxor %xmm2, %xmm3
-; SSE2-NEXT: movdqa %xmm2, %xmm1
-; SSE2-NEXT: pcmpgtd %xmm3, %xmm1
-; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm1[0,0,2,2]
+; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
+; SSE2-NEXT: pxor %xmm1, %xmm4
+; SSE2-NEXT: por %xmm2, %xmm3
+; SSE2-NEXT: movdqa %xmm2, %xmm5
+; SSE2-NEXT: pcmpgtd %xmm3, %xmm5
+; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
; SSE2-NEXT: pcmpeqd %xmm2, %xmm3
; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
; SSE2-NEXT: pand %xmm6, %xmm3
-; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm1[1,1,3,3]
-; SSE2-NEXT: por %xmm3, %xmm6
-; SSE2-NEXT: pxor %xmm5, %xmm6
-; SSE2-NEXT: pcmpeqd %xmm6, %xmm4
-; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm4[1,0,3,2]
-; SSE2-NEXT: pand %xmm4, %xmm1
-; SSE2-NEXT: movdqa %xmm0, %xmm3
-; SSE2-NEXT: pxor %xmm2, %xmm3
-; SSE2-NEXT: movdqa %xmm2, %xmm4
-; SSE2-NEXT: pcmpgtd %xmm3, %xmm4
-; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
-; SSE2-NEXT: pcmpeqd %xmm2, %xmm3
-; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
-; SSE2-NEXT: pand %xmm7, %xmm3
-; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
-; SSE2-NEXT: por %xmm3, %xmm4
-; SSE2-NEXT: pxor %xmm5, %xmm4
-; SSE2-NEXT: pcmpeqd %xmm6, %xmm4
+; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
+; SSE2-NEXT: por %xmm3, %xmm5
+; SSE2-NEXT: pxor %xmm1, %xmm5
+; SSE2-NEXT: pcmpeqd %xmm5, %xmm4
; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,0,3,2]
; SSE2-NEXT: pand %xmm4, %xmm3
-; SSE2-NEXT: pxor %xmm5, %xmm3
-; SSE2-NEXT: pandn %xmm3, %xmm1
-; SSE2-NEXT: movdqa %xmm1, %xmm3
-; SSE2-NEXT: pandn %xmm0, %xmm3
-; SSE2-NEXT: por %xmm2, %xmm0
-; SSE2-NEXT: movdqa %xmm2, %xmm4
-; SSE2-NEXT: pcmpgtd %xmm0, %xmm4
-; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
-; SSE2-NEXT: pcmpeqd %xmm2, %xmm0
-; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
-; SSE2-NEXT: pand %xmm5, %xmm0
+; SSE2-NEXT: movdqa %xmm0, %xmm4
+; SSE2-NEXT: por %xmm2, %xmm4
+; SSE2-NEXT: movdqa %xmm2, %xmm6
+; SSE2-NEXT: pcmpgtd %xmm4, %xmm6
+; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
+; SSE2-NEXT: pcmpeqd %xmm2, %xmm4
; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
-; SSE2-NEXT: por %xmm0, %xmm2
-; SSE2-NEXT: movdqa %xmm2, %xmm0
-; SSE2-NEXT: pandn {{.*}}(%rip), %xmm0
-; SSE2-NEXT: pand {{.*}}(%rip), %xmm2
-; SSE2-NEXT: por %xmm0, %xmm2
-; SSE2-NEXT: pand %xmm1, %xmm2
-; SSE2-NEXT: por %xmm3, %xmm2
-; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,3,2,3]
-; SSE2-NEXT: psrad $31, %xmm2
-; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,3,2,3]
+; SSE2-NEXT: pand %xmm7, %xmm2
+; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3]
+; SSE2-NEXT: por %xmm2, %xmm4
+; SSE2-NEXT: movdqa %xmm4, %xmm2
+; SSE2-NEXT: pxor %xmm1, %xmm2
+; SSE2-NEXT: pcmpeqd %xmm5, %xmm2
+; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm2[1,0,3,2]
+; SSE2-NEXT: pand %xmm2, %xmm5
+; SSE2-NEXT: pxor %xmm1, %xmm5
+; SSE2-NEXT: pandn %xmm5, %xmm3
+; SSE2-NEXT: movdqa %xmm4, %xmm1
+; SSE2-NEXT: pandn {{.*}}(%rip), %xmm1
+; SSE2-NEXT: pand {{.*}}(%rip), %xmm4
+; SSE2-NEXT: por %xmm1, %xmm4
+; SSE2-NEXT: pand %xmm3, %xmm4
+; SSE2-NEXT: pandn %xmm0, %xmm3
+; SSE2-NEXT: por %xmm4, %xmm3
+; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,3,2,3]
+; SSE2-NEXT: psrad $31, %xmm3
+; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,3,2,3]
; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
; SSE2-NEXT: retq
;
@@ -733,7 +724,7 @@ define <2 x i32> @v2i32(<2 x i32> %x, <2
; SSSE3-NEXT: psllq $32, %xmm0
; SSSE3-NEXT: movdqa %xmm0, %xmm3
; SSSE3-NEXT: psubq %xmm1, %xmm0
-; SSSE3-NEXT: pxor %xmm2, %xmm1
+; SSSE3-NEXT: por %xmm2, %xmm1
; SSSE3-NEXT: movdqa %xmm2, %xmm4
; SSSE3-NEXT: pcmpgtd %xmm1, %xmm4
; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
@@ -742,57 +733,48 @@ define <2 x i32> @v2i32(<2 x i32> %x, <2
; SSSE3-NEXT: pand %xmm5, %xmm1
; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
; SSSE3-NEXT: por %xmm1, %xmm4
-; SSSE3-NEXT: pcmpeqd %xmm5, %xmm5
-; SSSE3-NEXT: pxor %xmm5, %xmm4
-; SSSE3-NEXT: pxor %xmm2, %xmm3
-; SSSE3-NEXT: movdqa %xmm2, %xmm1
-; SSSE3-NEXT: pcmpgtd %xmm3, %xmm1
-; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm1[0,0,2,2]
+; SSSE3-NEXT: pcmpeqd %xmm1, %xmm1
+; SSSE3-NEXT: pxor %xmm1, %xmm4
+; SSSE3-NEXT: por %xmm2, %xmm3
+; SSSE3-NEXT: movdqa %xmm2, %xmm5
+; SSSE3-NEXT: pcmpgtd %xmm3, %xmm5
+; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
; SSSE3-NEXT: pcmpeqd %xmm2, %xmm3
; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
; SSSE3-NEXT: pand %xmm6, %xmm3
-; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm1[1,1,3,3]
-; SSSE3-NEXT: por %xmm3, %xmm6
-; SSSE3-NEXT: pxor %xmm5, %xmm6
-; SSSE3-NEXT: pcmpeqd %xmm6, %xmm4
-; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm4[1,0,3,2]
-; SSSE3-NEXT: pand %xmm4, %xmm1
-; SSSE3-NEXT: movdqa %xmm0, %xmm3
-; SSSE3-NEXT: pxor %xmm2, %xmm3
-; SSSE3-NEXT: movdqa %xmm2, %xmm4
-; SSSE3-NEXT: pcmpgtd %xmm3, %xmm4
-; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
-; SSSE3-NEXT: pcmpeqd %xmm2, %xmm3
-; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
-; SSSE3-NEXT: pand %xmm7, %xmm3
-; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
-; SSSE3-NEXT: por %xmm3, %xmm4
-; SSSE3-NEXT: pxor %xmm5, %xmm4
-; SSSE3-NEXT: pcmpeqd %xmm6, %xmm4
+; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
+; SSSE3-NEXT: por %xmm3, %xmm5
+; SSSE3-NEXT: pxor %xmm1, %xmm5
+; SSSE3-NEXT: pcmpeqd %xmm5, %xmm4
; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,0,3,2]
; SSSE3-NEXT: pand %xmm4, %xmm3
-; SSSE3-NEXT: pxor %xmm5, %xmm3
-; SSSE3-NEXT: pandn %xmm3, %xmm1
-; SSSE3-NEXT: movdqa %xmm1, %xmm3
-; SSSE3-NEXT: pandn %xmm0, %xmm3
-; SSSE3-NEXT: por %xmm2, %xmm0
-; SSSE3-NEXT: movdqa %xmm2, %xmm4
-; SSSE3-NEXT: pcmpgtd %xmm0, %xmm4
-; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
-; SSSE3-NEXT: pcmpeqd %xmm2, %xmm0
-; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
-; SSSE3-NEXT: pand %xmm5, %xmm0
+; SSSE3-NEXT: movdqa %xmm0, %xmm4
+; SSSE3-NEXT: por %xmm2, %xmm4
+; SSSE3-NEXT: movdqa %xmm2, %xmm6
+; SSSE3-NEXT: pcmpgtd %xmm4, %xmm6
+; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
+; SSSE3-NEXT: pcmpeqd %xmm2, %xmm4
; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
-; SSSE3-NEXT: por %xmm0, %xmm2
-; SSSE3-NEXT: movdqa %xmm2, %xmm0
-; SSSE3-NEXT: pandn {{.*}}(%rip), %xmm0
-; SSSE3-NEXT: pand {{.*}}(%rip), %xmm2
-; SSSE3-NEXT: por %xmm0, %xmm2
-; SSSE3-NEXT: pand %xmm1, %xmm2
-; SSSE3-NEXT: por %xmm3, %xmm2
-; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,3,2,3]
-; SSSE3-NEXT: psrad $31, %xmm2
-; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,3,2,3]
+; SSSE3-NEXT: pand %xmm7, %xmm2
+; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3]
+; SSSE3-NEXT: por %xmm2, %xmm4
+; SSSE3-NEXT: movdqa %xmm4, %xmm2
+; SSSE3-NEXT: pxor %xmm1, %xmm2
+; SSSE3-NEXT: pcmpeqd %xmm5, %xmm2
+; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm2[1,0,3,2]
+; SSSE3-NEXT: pand %xmm2, %xmm5
+; SSSE3-NEXT: pxor %xmm1, %xmm5
+; SSSE3-NEXT: pandn %xmm5, %xmm3
+; SSSE3-NEXT: movdqa %xmm4, %xmm1
+; SSSE3-NEXT: pandn {{.*}}(%rip), %xmm1
+; SSSE3-NEXT: pand {{.*}}(%rip), %xmm4
+; SSSE3-NEXT: por %xmm1, %xmm4
+; SSSE3-NEXT: pand %xmm3, %xmm4
+; SSSE3-NEXT: pandn %xmm0, %xmm3
+; SSSE3-NEXT: por %xmm4, %xmm3
+; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,3,2,3]
+; SSSE3-NEXT: psrad $31, %xmm3
+; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,3,2,3]
; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
; SSSE3-NEXT: retq
;
@@ -804,7 +786,7 @@ define <2 x i32> @v2i32(<2 x i32> %x, <2
; SSE41-NEXT: psllq $32, %xmm2
; SSE41-NEXT: movdqa %xmm2, %xmm3
; SSE41-NEXT: psubq %xmm1, %xmm2
-; SSE41-NEXT: pxor %xmm0, %xmm1
+; SSE41-NEXT: por %xmm0, %xmm1
; SSE41-NEXT: movdqa %xmm0, %xmm4
; SSE41-NEXT: pcmpgtd %xmm1, %xmm4
; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
@@ -815,7 +797,7 @@ define <2 x i32> @v2i32(<2 x i32> %x, <2
; SSE41-NEXT: por %xmm6, %xmm1
; SSE41-NEXT: pcmpeqd %xmm4, %xmm4
; SSE41-NEXT: pxor %xmm4, %xmm1
-; SSE41-NEXT: pxor %xmm0, %xmm3
+; SSE41-NEXT: por %xmm0, %xmm3
; SSE41-NEXT: movdqa %xmm0, %xmm5
; SSE41-NEXT: pcmpgtd %xmm3, %xmm5
; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
@@ -827,28 +809,20 @@ define <2 x i32> @v2i32(<2 x i32> %x, <2
; SSE41-NEXT: pxor %xmm4, %xmm5
; SSE41-NEXT: pcmpeqq %xmm5, %xmm1
; SSE41-NEXT: movdqa %xmm2, %xmm3
-; SSE41-NEXT: pxor %xmm0, %xmm3
+; SSE41-NEXT: por %xmm0, %xmm3
; SSE41-NEXT: movdqa %xmm0, %xmm6
; SSE41-NEXT: pcmpgtd %xmm3, %xmm6
; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
; SSE41-NEXT: pcmpeqd %xmm0, %xmm3
; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
; SSE41-NEXT: pand %xmm7, %xmm3
-; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
-; SSE41-NEXT: por %xmm3, %xmm6
-; SSE41-NEXT: pxor %xmm4, %xmm6
-; SSE41-NEXT: pcmpeqq %xmm5, %xmm6
-; SSE41-NEXT: pxor %xmm4, %xmm6
-; SSE41-NEXT: pandn %xmm6, %xmm1
-; SSE41-NEXT: movdqa %xmm2, %xmm3
-; SSE41-NEXT: por %xmm0, %xmm3
-; SSE41-NEXT: movdqa %xmm0, %xmm4
-; SSE41-NEXT: pcmpgtd %xmm3, %xmm4
-; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
-; SSE41-NEXT: pcmpeqd %xmm0, %xmm3
-; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
-; SSE41-NEXT: pand %xmm5, %xmm0
-; SSE41-NEXT: por %xmm4, %xmm0
+; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
+; SSE41-NEXT: por %xmm3, %xmm0
+; SSE41-NEXT: movdqa %xmm0, %xmm3
+; SSE41-NEXT: pxor %xmm4, %xmm3
+; SSE41-NEXT: pcmpeqq %xmm5, %xmm3
+; SSE41-NEXT: pxor %xmm4, %xmm3
+; SSE41-NEXT: pandn %xmm3, %xmm1
; SSE41-NEXT: movapd {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
; SSE41-NEXT: blendvpd %xmm0, {{.*}}(%rip), %xmm3
; SSE41-NEXT: movdqa %xmm1, %xmm0
@@ -872,13 +846,13 @@ define <2 x i32> @v2i32(<2 x i32> %x, <2
; AVX1-NEXT: vpcmpeqq %xmm3, %xmm5, %xmm3
; AVX1-NEXT: vpsubq %xmm1, %xmm0, %xmm0
; AVX1-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm1
-; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm1
-; AVX1-NEXT: vpcmpeqq %xmm1, %xmm5, %xmm1
-; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm1
-; AVX1-NEXT: vpandn %xmm1, %xmm3, %xmm1
-; AVX1-NEXT: vmovapd {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
-; AVX1-NEXT: vblendvpd %xmm0, {{.*}}(%rip), %xmm2, %xmm2
-; AVX1-NEXT: vblendvpd %xmm1, %xmm2, %xmm0, %xmm0
+; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm2
+; AVX1-NEXT: vpcmpeqq %xmm2, %xmm5, %xmm2
+; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm2
+; AVX1-NEXT: vpandn %xmm2, %xmm3, %xmm2
+; AVX1-NEXT: vmovapd {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
+; AVX1-NEXT: vblendvpd %xmm1, {{.*}}(%rip), %xmm3, %xmm1
+; AVX1-NEXT: vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
; AVX1-NEXT: vpsrad $31, %xmm0, %xmm1
; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
@@ -897,13 +871,13 @@ define <2 x i32> @v2i32(<2 x i32> %x, <2
; AVX2-NEXT: vpcmpeqq %xmm3, %xmm5, %xmm3
; AVX2-NEXT: vpsubq %xmm1, %xmm0, %xmm0
; AVX2-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm1
-; AVX2-NEXT: vpxor %xmm4, %xmm1, %xmm1
-; AVX2-NEXT: vpcmpeqq %xmm1, %xmm5, %xmm1
-; AVX2-NEXT: vpxor %xmm4, %xmm1, %xmm1
-; AVX2-NEXT: vpandn %xmm1, %xmm3, %xmm1
-; AVX2-NEXT: vmovapd {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
-; AVX2-NEXT: vblendvpd %xmm0, {{.*}}(%rip), %xmm2, %xmm2
-; AVX2-NEXT: vblendvpd %xmm1, %xmm2, %xmm0, %xmm0
+; AVX2-NEXT: vpxor %xmm4, %xmm1, %xmm2
+; AVX2-NEXT: vpcmpeqq %xmm2, %xmm5, %xmm2
+; AVX2-NEXT: vpxor %xmm4, %xmm2, %xmm2
+; AVX2-NEXT: vpandn %xmm2, %xmm3, %xmm2
+; AVX2-NEXT: vmovapd {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
+; AVX2-NEXT: vblendvpd %xmm1, {{.*}}(%rip), %xmm3, %xmm1
+; AVX2-NEXT: vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
; AVX2-NEXT: vpsrad $31, %xmm0, %xmm1
; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
@@ -1002,12 +976,12 @@ define <4 x i32> @v4i32(<4 x i32> %x, <4
; SSE41-NEXT: pcmpeqd %xmm5, %xmm3
; SSE41-NEXT: psubd %xmm1, %xmm2
; SSE41-NEXT: pcmpgtd %xmm2, %xmm0
-; SSE41-NEXT: pxor %xmm4, %xmm0
-; SSE41-NEXT: pcmpeqd %xmm5, %xmm0
-; SSE41-NEXT: pxor %xmm4, %xmm0
-; SSE41-NEXT: pandn %xmm0, %xmm3
+; SSE41-NEXT: movdqa %xmm0, %xmm1
+; SSE41-NEXT: pxor %xmm4, %xmm1
+; SSE41-NEXT: pcmpeqd %xmm5, %xmm1
+; SSE41-NEXT: pxor %xmm4, %xmm1
+; SSE41-NEXT: pandn %xmm1, %xmm3
; SSE41-NEXT: movaps {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
-; SSE41-NEXT: movdqa %xmm2, %xmm0
; SSE41-NEXT: blendvps %xmm0, {{.*}}(%rip), %xmm1
; SSE41-NEXT: movdqa %xmm3, %xmm0
; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm2
@@ -1025,13 +999,13 @@ define <4 x i32> @v4i32(<4 x i32> %x, <4
; AVX1-NEXT: vpcmpeqd %xmm3, %xmm5, %xmm3
; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm0
; AVX1-NEXT: vpcmpgtd %xmm0, %xmm2, %xmm1
-; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm1
-; AVX1-NEXT: vpcmpeqd %xmm1, %xmm5, %xmm1
-; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm1
-; AVX1-NEXT: vpandn %xmm1, %xmm3, %xmm1
-; AVX1-NEXT: vmovaps {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
-; AVX1-NEXT: vblendvps %xmm0, {{.*}}(%rip), %xmm2, %xmm2
-; AVX1-NEXT: vblendvps %xmm1, %xmm2, %xmm0, %xmm0
+; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm2
+; AVX1-NEXT: vpcmpeqd %xmm2, %xmm5, %xmm2
+; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm2
+; AVX1-NEXT: vpandn %xmm2, %xmm3, %xmm2
+; AVX1-NEXT: vmovaps {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
+; AVX1-NEXT: vblendvps %xmm1, {{.*}}(%rip), %xmm3, %xmm1
+; AVX1-NEXT: vblendvps %xmm2, %xmm1, %xmm0, %xmm0
; AVX1-NEXT: retq
;
; AVX2-LABEL: v4i32:
@@ -1045,14 +1019,14 @@ define <4 x i32> @v4i32(<4 x i32> %x, <4
; AVX2-NEXT: vpcmpeqd %xmm3, %xmm5, %xmm3
; AVX2-NEXT: vpsubd %xmm1, %xmm0, %xmm0
; AVX2-NEXT: vpcmpgtd %xmm0, %xmm2, %xmm1
-; AVX2-NEXT: vpxor %xmm4, %xmm1, %xmm1
-; AVX2-NEXT: vpcmpeqd %xmm1, %xmm5, %xmm1
-; AVX2-NEXT: vpxor %xmm4, %xmm1, %xmm1
-; AVX2-NEXT: vpandn %xmm1, %xmm3, %xmm1
-; AVX2-NEXT: vbroadcastss {{.*#+}} xmm2 = [2147483647,2147483647,2147483647,2147483647]
-; AVX2-NEXT: vbroadcastss {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
-; AVX2-NEXT: vblendvps %xmm0, %xmm2, %xmm3, %xmm2
-; AVX2-NEXT: vblendvps %xmm1, %xmm2, %xmm0, %xmm0
+; AVX2-NEXT: vpxor %xmm4, %xmm1, %xmm2
+; AVX2-NEXT: vpcmpeqd %xmm2, %xmm5, %xmm2
+; AVX2-NEXT: vpxor %xmm4, %xmm2, %xmm2
+; AVX2-NEXT: vpandn %xmm2, %xmm3, %xmm2
+; AVX2-NEXT: vbroadcastss {{.*#+}} xmm3 = [2147483647,2147483647,2147483647,2147483647]
+; AVX2-NEXT: vbroadcastss {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
+; AVX2-NEXT: vblendvps %xmm1, %xmm3, %xmm4, %xmm1
+; AVX2-NEXT: vblendvps %xmm2, %xmm1, %xmm0, %xmm0
; AVX2-NEXT: retq
;
; AVX512-LABEL: v4i32:
@@ -1181,30 +1155,30 @@ define <8 x i32> @v8i32(<8 x i32> %x, <8
;
; SSE41-LABEL: v8i32:
; SSE41: # %bb.0:
-; SSE41-NEXT: movdqa %xmm0, %xmm4
+; SSE41-NEXT: movdqa %xmm0, %xmm5
+; SSE41-NEXT: pxor %xmm4, %xmm4
; SSE41-NEXT: pxor %xmm6, %xmm6
-; SSE41-NEXT: pxor %xmm5, %xmm5
-; SSE41-NEXT: pcmpgtd %xmm2, %xmm5
+; SSE41-NEXT: pcmpgtd %xmm2, %xmm6
; SSE41-NEXT: pcmpeqd %xmm8, %xmm8
-; SSE41-NEXT: pxor %xmm8, %xmm5
+; SSE41-NEXT: pxor %xmm8, %xmm6
+; SSE41-NEXT: pxor %xmm7, %xmm7
+; SSE41-NEXT: pcmpgtd %xmm0, %xmm7
+; SSE41-NEXT: pxor %xmm8, %xmm7
+; SSE41-NEXT: pcmpeqd %xmm7, %xmm6
+; SSE41-NEXT: psubd %xmm2, %xmm5
; SSE41-NEXT: pxor %xmm0, %xmm0
-; SSE41-NEXT: pcmpgtd %xmm4, %xmm0
-; SSE41-NEXT: pxor %xmm8, %xmm0
-; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
-; SSE41-NEXT: psubd %xmm2, %xmm4
-; SSE41-NEXT: pxor %xmm2, %xmm2
-; SSE41-NEXT: pcmpgtd %xmm4, %xmm2
+; SSE41-NEXT: pcmpgtd %xmm5, %xmm0
+; SSE41-NEXT: movdqa %xmm0, %xmm2
; SSE41-NEXT: pxor %xmm8, %xmm2
-; SSE41-NEXT: pcmpeqd %xmm0, %xmm2
+; SSE41-NEXT: pcmpeqd %xmm7, %xmm2
; SSE41-NEXT: pxor %xmm8, %xmm2
-; SSE41-NEXT: pandn %xmm2, %xmm5
+; SSE41-NEXT: pandn %xmm2, %xmm6
; SSE41-NEXT: movaps {{.*#+}} xmm9 = [2147483647,2147483647,2147483647,2147483647]
; SSE41-NEXT: movaps {{.*#+}} xmm7 = [2147483648,2147483648,2147483648,2147483648]
; SSE41-NEXT: movaps %xmm7, %xmm2
-; SSE41-NEXT: movdqa %xmm4, %xmm0
; SSE41-NEXT: blendvps %xmm0, %xmm9, %xmm2
-; SSE41-NEXT: movdqa %xmm5, %xmm0
-; SSE41-NEXT: blendvps %xmm0, %xmm2, %xmm4
+; SSE41-NEXT: movdqa %xmm6, %xmm0
+; SSE41-NEXT: blendvps %xmm0, %xmm2, %xmm5
; SSE41-NEXT: xorps %xmm2, %xmm2
; SSE41-NEXT: pcmpgtd %xmm3, %xmm2
; SSE41-NEXT: pxor %xmm8, %xmm2
@@ -1213,54 +1187,55 @@ define <8 x i32> @v8i32(<8 x i32> %x, <8
; SSE41-NEXT: pxor %xmm8, %xmm0
; SSE41-NEXT: pcmpeqd %xmm0, %xmm2
; SSE41-NEXT: psubd %xmm3, %xmm1
-; SSE41-NEXT: pcmpgtd %xmm1, %xmm6
-; SSE41-NEXT: pxor %xmm8, %xmm6
-; SSE41-NEXT: pcmpeqd %xmm0, %xmm6
-; SSE41-NEXT: pxor %xmm8, %xmm6
-; SSE41-NEXT: pandn %xmm6, %xmm2
-; SSE41-NEXT: movdqa %xmm1, %xmm0
+; SSE41-NEXT: pcmpgtd %xmm1, %xmm4
+; SSE41-NEXT: movdqa %xmm4, %xmm3
+; SSE41-NEXT: pxor %xmm8, %xmm3
+; SSE41-NEXT: pcmpeqd %xmm0, %xmm3
+; SSE41-NEXT: pxor %xmm8, %xmm3
+; SSE41-NEXT: pandn %xmm3, %xmm2
+; SSE41-NEXT: movdqa %xmm4, %xmm0
; SSE41-NEXT: blendvps %xmm0, %xmm9, %xmm7
; SSE41-NEXT: movdqa %xmm2, %xmm0
; SSE41-NEXT: blendvps %xmm0, %xmm7, %xmm1
-; SSE41-NEXT: movaps %xmm4, %xmm0
+; SSE41-NEXT: movaps %xmm5, %xmm0
; SSE41-NEXT: retq
;
; AVX1-LABEL: v8i32:
; AVX1: # %bb.0:
; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm9
-; AVX1-NEXT: vpxor %xmm10, %xmm10, %xmm10
-; AVX1-NEXT: vpcmpgtd %xmm9, %xmm10, %xmm4
+; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
+; AVX1-NEXT: vpcmpgtd %xmm9, %xmm3, %xmm4
; AVX1-NEXT: vpcmpeqd %xmm5, %xmm5, %xmm5
; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm4
; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6
-; AVX1-NEXT: vpcmpgtd %xmm6, %xmm10, %xmm7
+; AVX1-NEXT: vpcmpgtd %xmm6, %xmm3, %xmm7
; AVX1-NEXT: vpxor %xmm5, %xmm7, %xmm7
; AVX1-NEXT: vpcmpeqd %xmm4, %xmm7, %xmm4
; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm8
-; AVX1-NEXT: vpcmpgtd %xmm1, %xmm10, %xmm4
+; AVX1-NEXT: vpcmpgtd %xmm1, %xmm3, %xmm4
; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm4
-; AVX1-NEXT: vpcmpgtd %xmm0, %xmm10, %xmm2
+; AVX1-NEXT: vpcmpgtd %xmm0, %xmm3, %xmm2
; AVX1-NEXT: vpxor %xmm5, %xmm2, %xmm2
; AVX1-NEXT: vpcmpeqd %xmm4, %xmm2, %xmm4
; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm4
; AVX1-NEXT: vinsertf128 $1, %xmm8, %ymm4, %ymm8
-; AVX1-NEXT: vpsubd %xmm9, %xmm6, %xmm6
-; AVX1-NEXT: vpcmpgtd %xmm6, %xmm10, %xmm4
-; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm3
-; AVX1-NEXT: vpcmpeqd %xmm3, %xmm7, %xmm3
-; AVX1-NEXT: vpxor %xmm5, %xmm3, %xmm3
+; AVX1-NEXT: vpsubd %xmm9, %xmm6, %xmm9
+; AVX1-NEXT: vpcmpgtd %xmm9, %xmm3, %xmm4
+; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm6
+; AVX1-NEXT: vpcmpeqd %xmm6, %xmm7, %xmm6
+; AVX1-NEXT: vpxor %xmm5, %xmm6, %xmm6
; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vpcmpgtd %xmm0, %xmm10, %xmm1
-; AVX1-NEXT: vpxor %xmm5, %xmm1, %xmm1
-; AVX1-NEXT: vpcmpeqd %xmm1, %xmm2, %xmm1
-; AVX1-NEXT: vpxor %xmm5, %xmm1, %xmm1
-; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1
-; AVX1-NEXT: vandps %ymm1, %ymm8, %ymm1
-; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm2
+; AVX1-NEXT: vpcmpgtd %xmm0, %xmm3, %xmm1
+; AVX1-NEXT: vpxor %xmm5, %xmm1, %xmm3
+; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm2
+; AVX1-NEXT: vpxor %xmm5, %xmm2, %xmm2
+; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm2, %ymm2
+; AVX1-NEXT: vandps %ymm2, %ymm8, %ymm2
+; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm1, %ymm1
; AVX1-NEXT: vmovaps {{.*#+}} ymm3 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
-; AVX1-NEXT: vblendvps %ymm2, {{.*}}(%rip), %ymm3, %ymm2
-; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm0, %ymm0
-; AVX1-NEXT: vblendvps %ymm1, %ymm2, %ymm0, %ymm0
+; AVX1-NEXT: vblendvps %ymm1, {{.*}}(%rip), %ymm3, %ymm1
+; AVX1-NEXT: vinsertf128 $1, %xmm9, %ymm0, %ymm0
+; AVX1-NEXT: vblendvps %ymm2, %ymm1, %ymm0, %ymm0
; AVX1-NEXT: retq
;
; AVX2-LABEL: v8i32:
@@ -1274,14 +1249,14 @@ define <8 x i32> @v8i32(<8 x i32> %x, <8
; AVX2-NEXT: vpcmpeqd %ymm3, %ymm5, %ymm3
; AVX2-NEXT: vpsubd %ymm1, %ymm0, %ymm0
; AVX2-NEXT: vpcmpgtd %ymm0, %ymm2, %ymm1
-; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm1
-; AVX2-NEXT: vpcmpeqd %ymm1, %ymm5, %ymm1
-; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm1
-; AVX2-NEXT: vpandn %ymm1, %ymm3, %ymm1
-; AVX2-NEXT: vbroadcastss {{.*#+}} ymm2 = [2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647]
-; AVX2-NEXT: vbroadcastss {{.*#+}} ymm3 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
-; AVX2-NEXT: vblendvps %ymm0, %ymm2, %ymm3, %ymm2
-; AVX2-NEXT: vblendvps %ymm1, %ymm2, %ymm0, %ymm0
+; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm2
+; AVX2-NEXT: vpcmpeqd %ymm2, %ymm5, %ymm2
+; AVX2-NEXT: vpxor %ymm4, %ymm2, %ymm2
+; AVX2-NEXT: vpandn %ymm2, %ymm3, %ymm2
+; AVX2-NEXT: vbroadcastss {{.*#+}} ymm3 = [2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647]
+; AVX2-NEXT: vbroadcastss {{.*#+}} ymm4 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
+; AVX2-NEXT: vblendvps %ymm1, %ymm3, %ymm4, %ymm1
+; AVX2-NEXT: vblendvps %ymm2, %ymm1, %ymm0, %ymm0
; AVX2-NEXT: retq
;
; AVX512-LABEL: v8i32:
@@ -1502,65 +1477,65 @@ define <16 x i32> @v16i32(<16 x i32> %x,
;
; SSE41-LABEL: v16i32:
; SSE41: # %bb.0:
-; SSE41-NEXT: movdqa %xmm0, %xmm8
+; SSE41-NEXT: movdqa %xmm0, %xmm9
+; SSE41-NEXT: pxor %xmm8, %xmm8
; SSE41-NEXT: pxor %xmm10, %xmm10
-; SSE41-NEXT: pxor %xmm9, %xmm9
-; SSE41-NEXT: pcmpgtd %xmm4, %xmm9
+; SSE41-NEXT: pcmpgtd %xmm4, %xmm10
; SSE41-NEXT: pcmpeqd %xmm11, %xmm11
-; SSE41-NEXT: pxor %xmm11, %xmm9
+; SSE41-NEXT: pxor %xmm11, %xmm10
+; SSE41-NEXT: pxor %xmm12, %xmm12
+; SSE41-NEXT: pcmpgtd %xmm0, %xmm12
+; SSE41-NEXT: pxor %xmm11, %xmm12
+; SSE41-NEXT: pcmpeqd %xmm12, %xmm10
+; SSE41-NEXT: psubd %xmm4, %xmm9
; SSE41-NEXT: pxor %xmm0, %xmm0
-; SSE41-NEXT: pcmpgtd %xmm8, %xmm0
-; SSE41-NEXT: pxor %xmm11, %xmm0
-; SSE41-NEXT: pcmpeqd %xmm0, %xmm9
-; SSE41-NEXT: psubd %xmm4, %xmm8
-; SSE41-NEXT: pxor %xmm4, %xmm4
-; SSE41-NEXT: pcmpgtd %xmm8, %xmm4
+; SSE41-NEXT: pcmpgtd %xmm9, %xmm0
+; SSE41-NEXT: movdqa %xmm0, %xmm4
; SSE41-NEXT: pxor %xmm11, %xmm4
-; SSE41-NEXT: pcmpeqd %xmm0, %xmm4
+; SSE41-NEXT: pcmpeqd %xmm12, %xmm4
; SSE41-NEXT: pxor %xmm11, %xmm4
-; SSE41-NEXT: pandn %xmm4, %xmm9
+; SSE41-NEXT: pandn %xmm4, %xmm10
; SSE41-NEXT: movaps {{.*#+}} xmm13 = [2147483647,2147483647,2147483647,2147483647]
; SSE41-NEXT: movaps {{.*#+}} xmm12 = [2147483648,2147483648,2147483648,2147483648]
; SSE41-NEXT: movaps %xmm12, %xmm4
-; SSE41-NEXT: movdqa %xmm8, %xmm0
; SSE41-NEXT: blendvps %xmm0, %xmm13, %xmm4
-; SSE41-NEXT: movdqa %xmm9, %xmm0
-; SSE41-NEXT: blendvps %xmm0, %xmm4, %xmm8
+; SSE41-NEXT: movdqa %xmm10, %xmm0
+; SSE41-NEXT: blendvps %xmm0, %xmm4, %xmm9
; SSE41-NEXT: xorps %xmm4, %xmm4
; SSE41-NEXT: pcmpgtd %xmm5, %xmm4
; SSE41-NEXT: pxor %xmm11, %xmm4
+; SSE41-NEXT: pxor %xmm10, %xmm10
+; SSE41-NEXT: pcmpgtd %xmm1, %xmm10
+; SSE41-NEXT: pxor %xmm11, %xmm10
+; SSE41-NEXT: pcmpeqd %xmm10, %xmm4
+; SSE41-NEXT: psubd %xmm5, %xmm1
; SSE41-NEXT: pxor %xmm0, %xmm0
; SSE41-NEXT: pcmpgtd %xmm1, %xmm0
-; SSE41-NEXT: pxor %xmm11, %xmm0
-; SSE41-NEXT: pcmpeqd %xmm0, %xmm4
-; SSE41-NEXT: psubd %xmm5, %xmm1
-; SSE41-NEXT: pxor %xmm5, %xmm5
-; SSE41-NEXT: pcmpgtd %xmm1, %xmm5
+; SSE41-NEXT: movdqa %xmm0, %xmm5
; SSE41-NEXT: pxor %xmm11, %xmm5
-; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
+; SSE41-NEXT: pcmpeqd %xmm10, %xmm5
; SSE41-NEXT: pxor %xmm11, %xmm5
; SSE41-NEXT: pandn %xmm5, %xmm4
; SSE41-NEXT: movaps %xmm12, %xmm5
-; SSE41-NEXT: movdqa %xmm1, %xmm0
; SSE41-NEXT: blendvps %xmm0, %xmm13, %xmm5
; SSE41-NEXT: movdqa %xmm4, %xmm0
; SSE41-NEXT: blendvps %xmm0, %xmm5, %xmm1
; SSE41-NEXT: pxor %xmm4, %xmm4
; SSE41-NEXT: pcmpgtd %xmm6, %xmm4
; SSE41-NEXT: pxor %xmm11, %xmm4
-; SSE41-NEXT: pxor %xmm0, %xmm0
-; SSE41-NEXT: pcmpgtd %xmm2, %xmm0
-; SSE41-NEXT: pxor %xmm11, %xmm0
-; SSE41-NEXT: pcmpeqd %xmm0, %xmm4
-; SSE41-NEXT: psubd %xmm6, %xmm2
; SSE41-NEXT: xorps %xmm5, %xmm5
; SSE41-NEXT: pcmpgtd %xmm2, %xmm5
; SSE41-NEXT: pxor %xmm11, %xmm5
-; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
-; SSE41-NEXT: pxor %xmm11, %xmm5
-; SSE41-NEXT: pandn %xmm5, %xmm4
+; SSE41-NEXT: pcmpeqd %xmm5, %xmm4
+; SSE41-NEXT: psubd %xmm6, %xmm2
+; SSE41-NEXT: pxor %xmm0, %xmm0
+; SSE41-NEXT: pcmpgtd %xmm2, %xmm0
+; SSE41-NEXT: movdqa %xmm0, %xmm6
+; SSE41-NEXT: pxor %xmm11, %xmm6
+; SSE41-NEXT: pcmpeqd %xmm5, %xmm6
+; SSE41-NEXT: pxor %xmm11, %xmm6
+; SSE41-NEXT: pandn %xmm6, %xmm4
; SSE41-NEXT: movaps %xmm12, %xmm5
-; SSE41-NEXT: movdqa %xmm2, %xmm0
; SSE41-NEXT: blendvps %xmm0, %xmm13, %xmm5
; SSE41-NEXT: movdqa %xmm4, %xmm0
; SSE41-NEXT: blendvps %xmm0, %xmm5, %xmm2
@@ -1572,85 +1547,86 @@ define <16 x i32> @v16i32(<16 x i32> %x,
; SSE41-NEXT: pxor %xmm11, %xmm0
; SSE41-NEXT: pcmpeqd %xmm0, %xmm4
; SSE41-NEXT: psubd %xmm7, %xmm3
-; SSE41-NEXT: pcmpgtd %xmm3, %xmm10
-; SSE41-NEXT: pxor %xmm11, %xmm10
-; SSE41-NEXT: pcmpeqd %xmm0, %xmm10
-; SSE41-NEXT: pxor %xmm11, %xmm10
-; SSE41-NEXT: pandn %xmm10, %xmm4
-; SSE41-NEXT: movdqa %xmm3, %xmm0
+; SSE41-NEXT: pcmpgtd %xmm3, %xmm8
+; SSE41-NEXT: movdqa %xmm8, %xmm5
+; SSE41-NEXT: pxor %xmm11, %xmm5
+; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
+; SSE41-NEXT: pxor %xmm11, %xmm5
+; SSE41-NEXT: pandn %xmm5, %xmm4
+; SSE41-NEXT: movdqa %xmm8, %xmm0
; SSE41-NEXT: blendvps %xmm0, %xmm13, %xmm12
; SSE41-NEXT: movdqa %xmm4, %xmm0
; SSE41-NEXT: blendvps %xmm0, %xmm12, %xmm3
-; SSE41-NEXT: movaps %xmm8, %xmm0
+; SSE41-NEXT: movaps %xmm9, %xmm0
; SSE41-NEXT: retq
;
; AVX1-LABEL: v16i32:
; AVX1: # %bb.0:
; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm8
-; AVX1-NEXT: vpxor %xmm12, %xmm12, %xmm12
-; AVX1-NEXT: vpcmpgtd %xmm8, %xmm12, %xmm7
+; AVX1-NEXT: vpxor %xmm10, %xmm10, %xmm10
+; AVX1-NEXT: vpcmpgtd %xmm8, %xmm10, %xmm7
; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm9
; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6
-; AVX1-NEXT: vpcmpgtd %xmm6, %xmm12, %xmm7
-; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm10
-; AVX1-NEXT: vpcmpeqd %xmm9, %xmm10, %xmm7
-; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm9
-; AVX1-NEXT: vpcmpgtd %xmm2, %xmm12, %xmm7
-; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm11
-; AVX1-NEXT: vpcmpgtd %xmm0, %xmm12, %xmm7
-; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm7
-; AVX1-NEXT: vpcmpeqd %xmm11, %xmm7, %xmm5
+; AVX1-NEXT: vpcmpgtd %xmm6, %xmm10, %xmm7
+; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm12
+; AVX1-NEXT: vpcmpeqd %xmm9, %xmm12, %xmm5
+; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm9
+; AVX1-NEXT: vpcmpgtd %xmm2, %xmm10, %xmm5
+; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm11
+; AVX1-NEXT: vpcmpgtd %xmm0, %xmm10, %xmm5
; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5
-; AVX1-NEXT: vinsertf128 $1, %xmm9, %ymm5, %ymm9
+; AVX1-NEXT: vpcmpeqd %xmm11, %xmm5, %xmm7
+; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm7
+; AVX1-NEXT: vinsertf128 $1, %xmm9, %ymm7, %ymm9
; AVX1-NEXT: vpsubd %xmm8, %xmm6, %xmm8
-; AVX1-NEXT: vpcmpgtd %xmm8, %xmm12, %xmm5
-; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm6
-; AVX1-NEXT: vpcmpeqd %xmm6, %xmm10, %xmm6
-; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm6
+; AVX1-NEXT: vpcmpgtd %xmm8, %xmm10, %xmm7
+; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm6
+; AVX1-NEXT: vpcmpeqd %xmm6, %xmm12, %xmm6
+; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm11
; AVX1-NEXT: vpsubd %xmm2, %xmm0, %xmm0
-; AVX1-NEXT: vpcmpgtd %xmm0, %xmm12, %xmm2
-; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm2
-; AVX1-NEXT: vpcmpeqd %xmm2, %xmm7, %xmm2
-; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm2
-; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm2, %ymm2
-; AVX1-NEXT: vandps %ymm2, %ymm9, %ymm6
-; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm0, %ymm7
+; AVX1-NEXT: vpcmpgtd %xmm0, %xmm10, %xmm2
+; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm6
+; AVX1-NEXT: vpcmpeqd %xmm6, %xmm5, %xmm5
+; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5
+; AVX1-NEXT: vinsertf128 $1, %xmm11, %ymm5, %ymm5
+; AVX1-NEXT: vandps %ymm5, %ymm9, %ymm6
+; AVX1-NEXT: vinsertf128 $1, %xmm7, %ymm2, %ymm7
; AVX1-NEXT: vmovaps {{.*#+}} ymm9 = [2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647]
-; AVX1-NEXT: vmovaps {{.*#+}} ymm10 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
-; AVX1-NEXT: vblendvps %ymm7, %ymm9, %ymm10, %ymm7
+; AVX1-NEXT: vmovaps {{.*#+}} ymm11 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
+; AVX1-NEXT: vblendvps %ymm7, %ymm9, %ymm11, %ymm7
; AVX1-NEXT: vinsertf128 $1, %xmm8, %ymm0, %ymm0
; AVX1-NEXT: vblendvps %ymm6, %ymm7, %ymm0, %ymm0
; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm13
-; AVX1-NEXT: vpcmpgtd %xmm13, %xmm12, %xmm7
+; AVX1-NEXT: vpcmpgtd %xmm13, %xmm10, %xmm7
; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm7
; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
-; AVX1-NEXT: vpcmpgtd %xmm2, %xmm12, %xmm5
+; AVX1-NEXT: vpcmpgtd %xmm2, %xmm10, %xmm5
; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5
; AVX1-NEXT: vpcmpeqd %xmm7, %xmm5, %xmm7
; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm8
-; AVX1-NEXT: vpcmpgtd %xmm3, %xmm12, %xmm7
-; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm11
-; AVX1-NEXT: vpcmpgtd %xmm1, %xmm12, %xmm7
+; AVX1-NEXT: vpcmpgtd %xmm3, %xmm10, %xmm7
+; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm12
+; AVX1-NEXT: vpcmpgtd %xmm1, %xmm10, %xmm7
; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm7
-; AVX1-NEXT: vpcmpeqd %xmm11, %xmm7, %xmm6
+; AVX1-NEXT: vpcmpeqd %xmm12, %xmm7, %xmm6
; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm6
; AVX1-NEXT: vinsertf128 $1, %xmm8, %ymm6, %ymm8
-; AVX1-NEXT: vpsubd %xmm13, %xmm2, %xmm11
-; AVX1-NEXT: vpcmpgtd %xmm11, %xmm12, %xmm6
+; AVX1-NEXT: vpsubd %xmm13, %xmm2, %xmm12
+; AVX1-NEXT: vpcmpgtd %xmm12, %xmm10, %xmm6
; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm2
; AVX1-NEXT: vpcmpeqd %xmm2, %xmm5, %xmm2
; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm2
; AVX1-NEXT: vpsubd %xmm3, %xmm1, %xmm1
-; AVX1-NEXT: vpcmpgtd %xmm1, %xmm12, %xmm3
-; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
-; AVX1-NEXT: vpcmpeqd %xmm3, %xmm7, %xmm3
-; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
-; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2
+; AVX1-NEXT: vpcmpgtd %xmm1, %xmm10, %xmm3
+; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm5
+; AVX1-NEXT: vpcmpeqd %xmm5, %xmm7, %xmm5
+; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm4
+; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm4, %ymm2
; AVX1-NEXT: vandps %ymm2, %ymm8, %ymm2
-; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm1, %ymm3
-; AVX1-NEXT: vblendvps %ymm3, %ymm9, %ymm10, %ymm3
-; AVX1-NEXT: vinsertf128 $1, %xmm11, %ymm1, %ymm1
+; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm3, %ymm3
+; AVX1-NEXT: vblendvps %ymm3, %ymm9, %ymm11, %ymm3
+; AVX1-NEXT: vinsertf128 $1, %xmm12, %ymm1, %ymm1
; AVX1-NEXT: vblendvps %ymm2, %ymm3, %ymm1, %ymm1
; AVX1-NEXT: retq
;
@@ -1665,26 +1641,26 @@ define <16 x i32> @v16i32(<16 x i32> %x,
; AVX2-NEXT: vpcmpeqd %ymm5, %ymm7, %ymm5
; AVX2-NEXT: vpsubd %ymm2, %ymm0, %ymm0
; AVX2-NEXT: vpcmpgtd %ymm0, %ymm4, %ymm2
-; AVX2-NEXT: vpxor %ymm6, %ymm2, %ymm2
-; AVX2-NEXT: vpcmpeqd %ymm2, %ymm7, %ymm2
-; AVX2-NEXT: vpxor %ymm6, %ymm2, %ymm2
-; AVX2-NEXT: vpandn %ymm2, %ymm5, %ymm2
-; AVX2-NEXT: vbroadcastss {{.*#+}} ymm5 = [2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647]
-; AVX2-NEXT: vbroadcastss {{.*#+}} ymm7 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
-; AVX2-NEXT: vblendvps %ymm0, %ymm5, %ymm7, %ymm8
-; AVX2-NEXT: vblendvps %ymm2, %ymm8, %ymm0, %ymm0
+; AVX2-NEXT: vpxor %ymm6, %ymm2, %ymm8
+; AVX2-NEXT: vpcmpeqd %ymm8, %ymm7, %ymm7
+; AVX2-NEXT: vpxor %ymm6, %ymm7, %ymm7
+; AVX2-NEXT: vpandn %ymm7, %ymm5, %ymm5
+; AVX2-NEXT: vbroadcastss {{.*#+}} ymm7 = [2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647]
+; AVX2-NEXT: vbroadcastss {{.*#+}} ymm8 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
+; AVX2-NEXT: vblendvps %ymm2, %ymm7, %ymm8, %ymm2
+; AVX2-NEXT: vblendvps %ymm5, %ymm2, %ymm0, %ymm0
; AVX2-NEXT: vpcmpgtd %ymm3, %ymm4, %ymm2
; AVX2-NEXT: vpxor %ymm6, %ymm2, %ymm2
-; AVX2-NEXT: vpcmpgtd %ymm1, %ymm4, %ymm8
-; AVX2-NEXT: vpxor %ymm6, %ymm8, %ymm8
-; AVX2-NEXT: vpcmpeqd %ymm2, %ymm8, %ymm2
+; AVX2-NEXT: vpcmpgtd %ymm1, %ymm4, %ymm5
+; AVX2-NEXT: vpxor %ymm6, %ymm5, %ymm5
+; AVX2-NEXT: vpcmpeqd %ymm2, %ymm5, %ymm2
; AVX2-NEXT: vpsubd %ymm3, %ymm1, %ymm1
; AVX2-NEXT: vpcmpgtd %ymm1, %ymm4, %ymm3
-; AVX2-NEXT: vpxor %ymm6, %ymm3, %ymm3
-; AVX2-NEXT: vpcmpeqd %ymm3, %ymm8, %ymm3
-; AVX2-NEXT: vpxor %ymm6, %ymm3, %ymm3
-; AVX2-NEXT: vpandn %ymm3, %ymm2, %ymm2
-; AVX2-NEXT: vblendvps %ymm1, %ymm5, %ymm7, %ymm3
+; AVX2-NEXT: vpxor %ymm6, %ymm3, %ymm4
+; AVX2-NEXT: vpcmpeqd %ymm4, %ymm5, %ymm4
+; AVX2-NEXT: vpxor %ymm6, %ymm4, %ymm4
+; AVX2-NEXT: vpandn %ymm4, %ymm2, %ymm2
+; AVX2-NEXT: vblendvps %ymm3, %ymm7, %ymm8, %ymm3
; AVX2-NEXT: vblendvps %ymm2, %ymm3, %ymm1, %ymm1
; AVX2-NEXT: retq
;
@@ -1881,13 +1857,13 @@ define <2 x i64> @v2i64(<2 x i64> %x, <2
; AVX1-NEXT: vpcmpeqq %xmm3, %xmm5, %xmm3
; AVX1-NEXT: vpsubq %xmm1, %xmm0, %xmm0
; AVX1-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm1
-; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm1
-; AVX1-NEXT: vpcmpeqq %xmm1, %xmm5, %xmm1
-; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm1
-; AVX1-NEXT: vpandn %xmm1, %xmm3, %xmm1
-; AVX1-NEXT: vmovapd {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
-; AVX1-NEXT: vblendvpd %xmm0, {{.*}}(%rip), %xmm2, %xmm2
-; AVX1-NEXT: vblendvpd %xmm1, %xmm2, %xmm0, %xmm0
+; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm2
+; AVX1-NEXT: vpcmpeqq %xmm2, %xmm5, %xmm2
+; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm2
+; AVX1-NEXT: vpandn %xmm2, %xmm3, %xmm2
+; AVX1-NEXT: vmovapd {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
+; AVX1-NEXT: vblendvpd %xmm1, {{.*}}(%rip), %xmm3, %xmm1
+; AVX1-NEXT: vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
; AVX1-NEXT: retq
;
; AVX2-LABEL: v2i64:
@@ -1901,13 +1877,13 @@ define <2 x i64> @v2i64(<2 x i64> %x, <2
; AVX2-NEXT: vpcmpeqq %xmm3, %xmm5, %xmm3
; AVX2-NEXT: vpsubq %xmm1, %xmm0, %xmm0
; AVX2-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm1
-; AVX2-NEXT: vpxor %xmm4, %xmm1, %xmm1
-; AVX2-NEXT: vpcmpeqq %xmm1, %xmm5, %xmm1
-; AVX2-NEXT: vpxor %xmm4, %xmm1, %xmm1
-; AVX2-NEXT: vpandn %xmm1, %xmm3, %xmm1
-; AVX2-NEXT: vmovapd {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
-; AVX2-NEXT: vblendvpd %xmm0, {{.*}}(%rip), %xmm2, %xmm2
-; AVX2-NEXT: vblendvpd %xmm1, %xmm2, %xmm0, %xmm0
+; AVX2-NEXT: vpxor %xmm4, %xmm1, %xmm2
+; AVX2-NEXT: vpcmpeqq %xmm2, %xmm5, %xmm2
+; AVX2-NEXT: vpxor %xmm4, %xmm2, %xmm2
+; AVX2-NEXT: vpandn %xmm2, %xmm3, %xmm2
+; AVX2-NEXT: vmovapd {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
+; AVX2-NEXT: vblendvpd %xmm1, {{.*}}(%rip), %xmm3, %xmm1
+; AVX2-NEXT: vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
; AVX2-NEXT: retq
;
; AVX512-LABEL: v2i64:
@@ -2239,39 +2215,39 @@ define <4 x i64> @v4i64(<4 x i64> %x, <4
; AVX1-LABEL: v4i64:
; AVX1: # %bb.0:
; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm9
-; AVX1-NEXT: vpxor %xmm10, %xmm10, %xmm10
-; AVX1-NEXT: vpcmpgtq %xmm9, %xmm10, %xmm4
+; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
+; AVX1-NEXT: vpcmpgtq %xmm9, %xmm3, %xmm4
; AVX1-NEXT: vpcmpeqd %xmm5, %xmm5, %xmm5
; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm4
; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6
-; AVX1-NEXT: vpcmpgtq %xmm6, %xmm10, %xmm7
+; AVX1-NEXT: vpcmpgtq %xmm6, %xmm3, %xmm7
; AVX1-NEXT: vpxor %xmm5, %xmm7, %xmm7
; AVX1-NEXT: vpcmpeqq %xmm4, %xmm7, %xmm4
; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm8
-; AVX1-NEXT: vpcmpgtq %xmm1, %xmm10, %xmm4
+; AVX1-NEXT: vpcmpgtq %xmm1, %xmm3, %xmm4
; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm4
-; AVX1-NEXT: vpcmpgtq %xmm0, %xmm10, %xmm2
+; AVX1-NEXT: vpcmpgtq %xmm0, %xmm3, %xmm2
; AVX1-NEXT: vpxor %xmm5, %xmm2, %xmm2
; AVX1-NEXT: vpcmpeqq %xmm4, %xmm2, %xmm4
; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm4
; AVX1-NEXT: vinsertf128 $1, %xmm8, %ymm4, %ymm8
-; AVX1-NEXT: vpsubq %xmm9, %xmm6, %xmm6
-; AVX1-NEXT: vpcmpgtq %xmm6, %xmm10, %xmm4
-; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm3
-; AVX1-NEXT: vpcmpeqq %xmm3, %xmm7, %xmm3
-; AVX1-NEXT: vpxor %xmm5, %xmm3, %xmm3
+; AVX1-NEXT: vpsubq %xmm9, %xmm6, %xmm9
+; AVX1-NEXT: vpcmpgtq %xmm9, %xmm3, %xmm4
+; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm6
+; AVX1-NEXT: vpcmpeqq %xmm6, %xmm7, %xmm6
+; AVX1-NEXT: vpxor %xmm5, %xmm6, %xmm6
; AVX1-NEXT: vpsubq %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vpcmpgtq %xmm0, %xmm10, %xmm1
-; AVX1-NEXT: vpxor %xmm5, %xmm1, %xmm1
-; AVX1-NEXT: vpcmpeqq %xmm1, %xmm2, %xmm1
-; AVX1-NEXT: vpxor %xmm5, %xmm1, %xmm1
-; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1
-; AVX1-NEXT: vandpd %ymm1, %ymm8, %ymm1
-; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm2
+; AVX1-NEXT: vpcmpgtq %xmm0, %xmm3, %xmm1
+; AVX1-NEXT: vpxor %xmm5, %xmm1, %xmm3
+; AVX1-NEXT: vpcmpeqq %xmm3, %xmm2, %xmm2
+; AVX1-NEXT: vpxor %xmm5, %xmm2, %xmm2
+; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm2, %ymm2
+; AVX1-NEXT: vandpd %ymm2, %ymm8, %ymm2
+; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm1, %ymm1
; AVX1-NEXT: vmovapd {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
-; AVX1-NEXT: vblendvpd %ymm2, {{.*}}(%rip), %ymm3, %ymm2
-; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm0, %ymm0
-; AVX1-NEXT: vblendvpd %ymm1, %ymm2, %ymm0, %ymm0
+; AVX1-NEXT: vblendvpd %ymm1, {{.*}}(%rip), %ymm3, %ymm1
+; AVX1-NEXT: vinsertf128 $1, %xmm9, %ymm0, %ymm0
+; AVX1-NEXT: vblendvpd %ymm2, %ymm1, %ymm0, %ymm0
; AVX1-NEXT: retq
;
; AVX2-LABEL: v4i64:
@@ -2285,14 +2261,14 @@ define <4 x i64> @v4i64(<4 x i64> %x, <4
; AVX2-NEXT: vpcmpeqq %ymm3, %ymm5, %ymm3
; AVX2-NEXT: vpsubq %ymm1, %ymm0, %ymm0
; AVX2-NEXT: vpcmpgtq %ymm0, %ymm2, %ymm1
-; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm1
-; AVX2-NEXT: vpcmpeqq %ymm1, %ymm5, %ymm1
-; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm1
-; AVX2-NEXT: vpandn %ymm1, %ymm3, %ymm1
-; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm2 = [9223372036854775807,9223372036854775807,9223372036854775807,9223372036854775807]
-; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
-; AVX2-NEXT: vblendvpd %ymm0, %ymm2, %ymm3, %ymm2
-; AVX2-NEXT: vblendvpd %ymm1, %ymm2, %ymm0, %ymm0
+; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm2
+; AVX2-NEXT: vpcmpeqq %ymm2, %ymm5, %ymm2
+; AVX2-NEXT: vpxor %ymm4, %ymm2, %ymm2
+; AVX2-NEXT: vpandn %ymm2, %ymm3, %ymm2
+; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm3 = [9223372036854775807,9223372036854775807,9223372036854775807,9223372036854775807]
+; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm4 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
+; AVX2-NEXT: vblendvpd %ymm1, %ymm3, %ymm4, %ymm1
+; AVX2-NEXT: vblendvpd %ymm2, %ymm1, %ymm0, %ymm0
; AVX2-NEXT: retq
;
; AVX512-LABEL: v4i64:
@@ -2909,70 +2885,70 @@ define <8 x i64> @v8i64(<8 x i64> %x, <8
; AVX1-LABEL: v8i64:
; AVX1: # %bb.0:
; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm8
-; AVX1-NEXT: vpxor %xmm12, %xmm12, %xmm12
-; AVX1-NEXT: vpcmpgtq %xmm8, %xmm12, %xmm7
+; AVX1-NEXT: vpxor %xmm10, %xmm10, %xmm10
+; AVX1-NEXT: vpcmpgtq %xmm8, %xmm10, %xmm7
; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm9
; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6
-; AVX1-NEXT: vpcmpgtq %xmm6, %xmm12, %xmm7
-; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm10
-; AVX1-NEXT: vpcmpeqq %xmm9, %xmm10, %xmm7
-; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm9
-; AVX1-NEXT: vpcmpgtq %xmm2, %xmm12, %xmm7
-; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm11
-; AVX1-NEXT: vpcmpgtq %xmm0, %xmm12, %xmm7
-; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm7
-; AVX1-NEXT: vpcmpeqq %xmm11, %xmm7, %xmm5
+; AVX1-NEXT: vpcmpgtq %xmm6, %xmm10, %xmm7
+; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm12
+; AVX1-NEXT: vpcmpeqq %xmm9, %xmm12, %xmm5
+; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm9
+; AVX1-NEXT: vpcmpgtq %xmm2, %xmm10, %xmm5
+; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm11
+; AVX1-NEXT: vpcmpgtq %xmm0, %xmm10, %xmm5
; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5
-; AVX1-NEXT: vinsertf128 $1, %xmm9, %ymm5, %ymm9
+; AVX1-NEXT: vpcmpeqq %xmm11, %xmm5, %xmm7
+; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm7
+; AVX1-NEXT: vinsertf128 $1, %xmm9, %ymm7, %ymm9
; AVX1-NEXT: vpsubq %xmm8, %xmm6, %xmm8
-; AVX1-NEXT: vpcmpgtq %xmm8, %xmm12, %xmm5
-; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm6
-; AVX1-NEXT: vpcmpeqq %xmm6, %xmm10, %xmm6
-; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm6
+; AVX1-NEXT: vpcmpgtq %xmm8, %xmm10, %xmm7
+; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm6
+; AVX1-NEXT: vpcmpeqq %xmm6, %xmm12, %xmm6
+; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm11
; AVX1-NEXT: vpsubq %xmm2, %xmm0, %xmm0
-; AVX1-NEXT: vpcmpgtq %xmm0, %xmm12, %xmm2
-; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm2
-; AVX1-NEXT: vpcmpeqq %xmm2, %xmm7, %xmm2
-; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm2
-; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm2, %ymm2
-; AVX1-NEXT: vandpd %ymm2, %ymm9, %ymm6
-; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm0, %ymm7
+; AVX1-NEXT: vpcmpgtq %xmm0, %xmm10, %xmm2
+; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm6
+; AVX1-NEXT: vpcmpeqq %xmm6, %xmm5, %xmm5
+; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5
+; AVX1-NEXT: vinsertf128 $1, %xmm11, %ymm5, %ymm5
+; AVX1-NEXT: vandpd %ymm5, %ymm9, %ymm6
+; AVX1-NEXT: vinsertf128 $1, %xmm7, %ymm2, %ymm7
; AVX1-NEXT: vmovapd {{.*#+}} ymm9 = [9223372036854775807,9223372036854775807,9223372036854775807,9223372036854775807]
-; AVX1-NEXT: vmovapd {{.*#+}} ymm10 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
-; AVX1-NEXT: vblendvpd %ymm7, %ymm9, %ymm10, %ymm7
+; AVX1-NEXT: vmovapd {{.*#+}} ymm11 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
+; AVX1-NEXT: vblendvpd %ymm7, %ymm9, %ymm11, %ymm7
; AVX1-NEXT: vinsertf128 $1, %xmm8, %ymm0, %ymm0
; AVX1-NEXT: vblendvpd %ymm6, %ymm7, %ymm0, %ymm0
; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm13
-; AVX1-NEXT: vpcmpgtq %xmm13, %xmm12, %xmm7
+; AVX1-NEXT: vpcmpgtq %xmm13, %xmm10, %xmm7
; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm7
; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
-; AVX1-NEXT: vpcmpgtq %xmm2, %xmm12, %xmm5
+; AVX1-NEXT: vpcmpgtq %xmm2, %xmm10, %xmm5
; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5
; AVX1-NEXT: vpcmpeqq %xmm7, %xmm5, %xmm7
; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm8
-; AVX1-NEXT: vpcmpgtq %xmm3, %xmm12, %xmm7
-; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm11
-; AVX1-NEXT: vpcmpgtq %xmm1, %xmm12, %xmm7
+; AVX1-NEXT: vpcmpgtq %xmm3, %xmm10, %xmm7
+; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm12
+; AVX1-NEXT: vpcmpgtq %xmm1, %xmm10, %xmm7
; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm7
-; AVX1-NEXT: vpcmpeqq %xmm11, %xmm7, %xmm6
+; AVX1-NEXT: vpcmpeqq %xmm12, %xmm7, %xmm6
; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm6
; AVX1-NEXT: vinsertf128 $1, %xmm8, %ymm6, %ymm8
-; AVX1-NEXT: vpsubq %xmm13, %xmm2, %xmm11
-; AVX1-NEXT: vpcmpgtq %xmm11, %xmm12, %xmm6
+; AVX1-NEXT: vpsubq %xmm13, %xmm2, %xmm12
+; AVX1-NEXT: vpcmpgtq %xmm12, %xmm10, %xmm6
; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm2
; AVX1-NEXT: vpcmpeqq %xmm2, %xmm5, %xmm2
; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm2
; AVX1-NEXT: vpsubq %xmm3, %xmm1, %xmm1
-; AVX1-NEXT: vpcmpgtq %xmm1, %xmm12, %xmm3
-; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
-; AVX1-NEXT: vpcmpeqq %xmm3, %xmm7, %xmm3
-; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
-; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2
+; AVX1-NEXT: vpcmpgtq %xmm1, %xmm10, %xmm3
+; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm5
+; AVX1-NEXT: vpcmpeqq %xmm5, %xmm7, %xmm5
+; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm4
+; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm4, %ymm2
; AVX1-NEXT: vandpd %ymm2, %ymm8, %ymm2
-; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm1, %ymm3
-; AVX1-NEXT: vblendvpd %ymm3, %ymm9, %ymm10, %ymm3
-; AVX1-NEXT: vinsertf128 $1, %xmm11, %ymm1, %ymm1
+; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm3, %ymm3
+; AVX1-NEXT: vblendvpd %ymm3, %ymm9, %ymm11, %ymm3
+; AVX1-NEXT: vinsertf128 $1, %xmm12, %ymm1, %ymm1
; AVX1-NEXT: vblendvpd %ymm2, %ymm3, %ymm1, %ymm1
; AVX1-NEXT: retq
;
@@ -2987,26 +2963,26 @@ define <8 x i64> @v8i64(<8 x i64> %x, <8
; AVX2-NEXT: vpcmpeqq %ymm5, %ymm7, %ymm5
; AVX2-NEXT: vpsubq %ymm2, %ymm0, %ymm0
; AVX2-NEXT: vpcmpgtq %ymm0, %ymm4, %ymm2
-; AVX2-NEXT: vpxor %ymm6, %ymm2, %ymm2
-; AVX2-NEXT: vpcmpeqq %ymm2, %ymm7, %ymm2
-; AVX2-NEXT: vpxor %ymm6, %ymm2, %ymm2
-; AVX2-NEXT: vpandn %ymm2, %ymm5, %ymm2
-; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm5 = [9223372036854775807,9223372036854775807,9223372036854775807,9223372036854775807]
-; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm7 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
-; AVX2-NEXT: vblendvpd %ymm0, %ymm5, %ymm7, %ymm8
-; AVX2-NEXT: vblendvpd %ymm2, %ymm8, %ymm0, %ymm0
+; AVX2-NEXT: vpxor %ymm6, %ymm2, %ymm8
+; AVX2-NEXT: vpcmpeqq %ymm8, %ymm7, %ymm7
+; AVX2-NEXT: vpxor %ymm6, %ymm7, %ymm7
+; AVX2-NEXT: vpandn %ymm7, %ymm5, %ymm5
+; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm7 = [9223372036854775807,9223372036854775807,9223372036854775807,9223372036854775807]
+; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm8 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
+; AVX2-NEXT: vblendvpd %ymm2, %ymm7, %ymm8, %ymm2
+; AVX2-NEXT: vblendvpd %ymm5, %ymm2, %ymm0, %ymm0
; AVX2-NEXT: vpcmpgtq %ymm3, %ymm4, %ymm2
; AVX2-NEXT: vpxor %ymm6, %ymm2, %ymm2
-; AVX2-NEXT: vpcmpgtq %ymm1, %ymm4, %ymm8
-; AVX2-NEXT: vpxor %ymm6, %ymm8, %ymm8
-; AVX2-NEXT: vpcmpeqq %ymm2, %ymm8, %ymm2
+; AVX2-NEXT: vpcmpgtq %ymm1, %ymm4, %ymm5
+; AVX2-NEXT: vpxor %ymm6, %ymm5, %ymm5
+; AVX2-NEXT: vpcmpeqq %ymm2, %ymm5, %ymm2
; AVX2-NEXT: vpsubq %ymm3, %ymm1, %ymm1
; AVX2-NEXT: vpcmpgtq %ymm1, %ymm4, %ymm3
-; AVX2-NEXT: vpxor %ymm6, %ymm3, %ymm3
-; AVX2-NEXT: vpcmpeqq %ymm3, %ymm8, %ymm3
-; AVX2-NEXT: vpxor %ymm6, %ymm3, %ymm3
-; AVX2-NEXT: vpandn %ymm3, %ymm2, %ymm2
-; AVX2-NEXT: vblendvpd %ymm1, %ymm5, %ymm7, %ymm3
+; AVX2-NEXT: vpxor %ymm6, %ymm3, %ymm4
+; AVX2-NEXT: vpcmpeqq %ymm4, %ymm5, %ymm4
+; AVX2-NEXT: vpxor %ymm6, %ymm4, %ymm4
+; AVX2-NEXT: vpandn %ymm4, %ymm2, %ymm2
+; AVX2-NEXT: vblendvpd %ymm3, %ymm7, %ymm8, %ymm3
; AVX2-NEXT: vblendvpd %ymm2, %ymm3, %ymm1, %ymm1
; AVX2-NEXT: retq
;
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=361166&r1=361165&r2=361166&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/vec_saddo.ll (original)
+++ llvm/trunk/test/CodeGen/X86/vec_saddo.ll Mon May 20 09:09:22 2019
@@ -807,62 +807,57 @@ define <16 x i32> @saddo_v16i32(<16 x i3
; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm9
; AVX1-NEXT: vpxor %xmm5, %xmm5, %xmm5
; AVX1-NEXT: vpcmpgtd %xmm9, %xmm5, %xmm7
-; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
-; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm8
+; AVX1-NEXT: vpcmpeqd %xmm6, %xmm6, %xmm6
+; AVX1-NEXT: vpxor %xmm6, %xmm7, %xmm8
; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm7
-; AVX1-NEXT: vpcmpgtd %xmm7, %xmm5, %xmm6
-; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm10
-; AVX1-NEXT: vpcmpeqd %xmm8, %xmm10, %xmm8
-; AVX1-NEXT: vpcmpgtd %xmm3, %xmm5, %xmm6
-; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm11
-; AVX1-NEXT: vpcmpgtd %xmm1, %xmm5, %xmm6
-; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm6
-; AVX1-NEXT: vpcmpeqd %xmm11, %xmm6, %xmm11
-; AVX1-NEXT: vinsertf128 $1, %xmm8, %ymm11, %ymm11
+; AVX1-NEXT: vpcmpgtd %xmm7, %xmm5, %xmm4
+; AVX1-NEXT: vpxor %xmm6, %xmm4, %xmm4
+; AVX1-NEXT: vpcmpeqd %xmm8, %xmm4, %xmm8
; AVX1-NEXT: vpaddd %xmm9, %xmm7, %xmm9
; AVX1-NEXT: vpcmpgtd %xmm9, %xmm5, %xmm7
-; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm7
-; AVX1-NEXT: vpcmpeqd %xmm7, %xmm10, %xmm7
-; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm10
-; AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm12
-; AVX1-NEXT: vpcmpgtd %xmm12, %xmm5, %xmm3
-; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
-; AVX1-NEXT: vpcmpeqd %xmm3, %xmm6, %xmm3
-; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
-; AVX1-NEXT: vinsertf128 $1, %xmm10, %ymm3, %ymm3
-; AVX1-NEXT: vandps %ymm3, %ymm11, %ymm3
-; AVX1-NEXT: vpandn %xmm8, %xmm7, %xmm6
-; AVX1-NEXT: vpackssdw %xmm6, %xmm3, %xmm8
-; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm6
-; AVX1-NEXT: vpcmpgtd %xmm6, %xmm5, %xmm7
-; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm7
+; AVX1-NEXT: vpxor %xmm6, %xmm7, %xmm7
+; AVX1-NEXT: vpcmpeqd %xmm7, %xmm4, %xmm4
+; AVX1-NEXT: vpandn %xmm8, %xmm4, %xmm8
+; AVX1-NEXT: vpcmpgtd %xmm3, %xmm5, %xmm7
+; AVX1-NEXT: vpxor %xmm6, %xmm7, %xmm7
+; AVX1-NEXT: vpcmpgtd %xmm1, %xmm5, %xmm4
+; AVX1-NEXT: vpxor %xmm6, %xmm4, %xmm4
+; AVX1-NEXT: vpcmpeqd %xmm7, %xmm4, %xmm7
+; AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm11
+; AVX1-NEXT: vpcmpgtd %xmm11, %xmm5, %xmm3
+; AVX1-NEXT: vpxor %xmm6, %xmm3, %xmm3
+; AVX1-NEXT: vpcmpeqd %xmm3, %xmm4, %xmm3
+; AVX1-NEXT: vpandn %xmm7, %xmm3, %xmm3
+; AVX1-NEXT: vpackssdw %xmm8, %xmm3, %xmm3
+; AVX1-NEXT: vmovdqa {{.*#+}} xmm8 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u>
+; AVX1-NEXT: vpshufb %xmm8, %xmm3, %xmm10
+; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm7
+; AVX1-NEXT: vpcmpgtd %xmm7, %xmm5, %xmm4
+; AVX1-NEXT: vpxor %xmm6, %xmm4, %xmm4
; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
; AVX1-NEXT: vpcmpgtd %xmm3, %xmm5, %xmm1
-; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm1
-; AVX1-NEXT: vpcmpeqd %xmm7, %xmm1, %xmm10
-; AVX1-NEXT: vpcmpgtd %xmm2, %xmm5, %xmm7
-; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm11
+; AVX1-NEXT: vpxor %xmm6, %xmm1, %xmm1
+; AVX1-NEXT: vpcmpeqd %xmm4, %xmm1, %xmm4
+; AVX1-NEXT: vpaddd %xmm7, %xmm3, %xmm3
+; AVX1-NEXT: vpcmpgtd %xmm3, %xmm5, %xmm7
+; AVX1-NEXT: vpxor %xmm6, %xmm7, %xmm7
+; AVX1-NEXT: vpcmpeqd %xmm7, %xmm1, %xmm1
+; AVX1-NEXT: vpandn %xmm4, %xmm1, %xmm1
+; AVX1-NEXT: vpcmpgtd %xmm2, %xmm5, %xmm4
+; AVX1-NEXT: vpxor %xmm6, %xmm4, %xmm4
; AVX1-NEXT: vpcmpgtd %xmm0, %xmm5, %xmm7
-; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm7
-; AVX1-NEXT: vpcmpeqd %xmm11, %xmm7, %xmm11
-; AVX1-NEXT: vinsertf128 $1, %xmm10, %ymm11, %ymm11
-; AVX1-NEXT: vpaddd %xmm6, %xmm3, %xmm3
-; AVX1-NEXT: vpcmpgtd %xmm3, %xmm5, %xmm6
-; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm6
-; AVX1-NEXT: vpcmpeqd %xmm6, %xmm1, %xmm1
-; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm6
+; AVX1-NEXT: vpxor %xmm6, %xmm7, %xmm7
+; AVX1-NEXT: vpcmpeqd %xmm4, %xmm7, %xmm4
; AVX1-NEXT: vpaddd %xmm2, %xmm0, %xmm0
; AVX1-NEXT: vpcmpgtd %xmm0, %xmm5, %xmm2
-; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm2
+; AVX1-NEXT: vpxor %xmm6, %xmm2, %xmm2
; AVX1-NEXT: vpcmpeqd %xmm2, %xmm7, %xmm2
-; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm2
-; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm2, %ymm2
-; AVX1-NEXT: vandps %ymm2, %ymm11, %ymm2
-; AVX1-NEXT: vpandn %xmm10, %xmm1, %xmm1
+; AVX1-NEXT: vpandn %xmm4, %xmm2, %xmm2
; AVX1-NEXT: vpackssdw %xmm1, %xmm2, %xmm1
-; AVX1-NEXT: vpacksswb %xmm8, %xmm1, %xmm1
+; AVX1-NEXT: vpshufb %xmm8, %xmm1, %xmm1
+; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm10[0]
; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm2
-; AVX1-NEXT: vinsertf128 $1, %xmm9, %ymm12, %ymm3
+; AVX1-NEXT: vinsertf128 $1, %xmm9, %ymm11, %ymm3
; AVX1-NEXT: vpmovsxbd %xmm1, %xmm0
; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm1[1,1,2,3]
; AVX1-NEXT: vpmovsxbd %xmm4, %xmm4
@@ -892,19 +887,22 @@ define <16 x i32> @saddo_v16i32(<16 x i3
; AVX2-NEXT: vpandn %ymm5, %ymm1, %ymm1
; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm5
; AVX2-NEXT: vpackssdw %xmm5, %xmm1, %xmm1
-; AVX2-NEXT: vpcmpgtd %ymm2, %ymm4, %ymm5
-; AVX2-NEXT: vpxor %ymm6, %ymm5, %ymm5
-; AVX2-NEXT: vpcmpgtd %ymm0, %ymm4, %ymm7
+; AVX2-NEXT: vmovdqa {{.*#+}} xmm5 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u>
+; AVX2-NEXT: vpshufb %xmm5, %xmm1, %xmm1
+; AVX2-NEXT: vpcmpgtd %ymm2, %ymm4, %ymm7
; AVX2-NEXT: vpxor %ymm6, %ymm7, %ymm7
-; AVX2-NEXT: vpcmpeqd %ymm5, %ymm7, %ymm5
+; AVX2-NEXT: vpcmpgtd %ymm0, %ymm4, %ymm8
+; AVX2-NEXT: vpxor %ymm6, %ymm8, %ymm8
+; AVX2-NEXT: vpcmpeqd %ymm7, %ymm8, %ymm7
; AVX2-NEXT: vpaddd %ymm2, %ymm0, %ymm2
; AVX2-NEXT: vpcmpgtd %ymm2, %ymm4, %ymm0
; AVX2-NEXT: vpxor %ymm6, %ymm0, %ymm0
-; AVX2-NEXT: vpcmpeqd %ymm0, %ymm7, %ymm0
-; AVX2-NEXT: vpandn %ymm5, %ymm0, %ymm0
+; AVX2-NEXT: vpcmpeqd %ymm0, %ymm8, %ymm0
+; AVX2-NEXT: vpandn %ymm7, %ymm0, %ymm0
; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm4
; AVX2-NEXT: vpackssdw %xmm4, %xmm0, %xmm0
-; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm1
+; AVX2-NEXT: vpshufb %xmm5, %xmm0, %xmm0
+; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm0[0],xmm1[0]
; AVX2-NEXT: vpmovsxbd %xmm1, %ymm0
; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
; AVX2-NEXT: vpmovsxbd %xmm1, %ymm1
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=361166&r1=361165&r2=361166&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/vec_ssubo.ll (original)
+++ llvm/trunk/test/CodeGen/X86/vec_ssubo.ll Mon May 20 09:09:22 2019
@@ -830,80 +830,75 @@ define <16 x i32> @ssubo_v16i32(<16 x i3
;
; AVX1-LABEL: ssubo_v16i32:
; AVX1: # %bb.0:
-; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm8
-; AVX1-NEXT: vpxor %xmm5, %xmm5, %xmm5
-; AVX1-NEXT: vpcmpgtd %xmm8, %xmm5, %xmm7
-; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
-; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm9
-; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm13
-; AVX1-NEXT: vpcmpgtd %xmm13, %xmm5, %xmm7
-; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm11
-; AVX1-NEXT: vpcmpeqd %xmm9, %xmm11, %xmm9
-; AVX1-NEXT: vpxor %xmm4, %xmm9, %xmm10
-; AVX1-NEXT: vpcmpgtd %xmm3, %xmm5, %xmm7
-; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm12
-; AVX1-NEXT: vpcmpgtd %xmm1, %xmm5, %xmm7
-; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm7
-; AVX1-NEXT: vpcmpeqd %xmm12, %xmm7, %xmm6
-; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm6
-; AVX1-NEXT: vinsertf128 $1, %xmm10, %ymm6, %ymm10
-; AVX1-NEXT: vpsubd %xmm8, %xmm13, %xmm8
-; AVX1-NEXT: vpcmpgtd %xmm8, %xmm5, %xmm6
-; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm6
-; AVX1-NEXT: vpcmpeqd %xmm6, %xmm11, %xmm6
-; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm6
-; AVX1-NEXT: vpsubd %xmm3, %xmm1, %xmm11
-; AVX1-NEXT: vpcmpgtd %xmm11, %xmm5, %xmm3
-; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
-; AVX1-NEXT: vpcmpeqd %xmm3, %xmm7, %xmm3
-; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
-; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm3, %ymm3
-; AVX1-NEXT: vandps %ymm3, %ymm10, %ymm3
-; AVX1-NEXT: vpandn %xmm6, %xmm9, %xmm6
-; AVX1-NEXT: vpackssdw %xmm6, %xmm3, %xmm9
-; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm14
-; AVX1-NEXT: vpcmpgtd %xmm14, %xmm5, %xmm7
-; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm7
-; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
-; AVX1-NEXT: vpcmpgtd %xmm3, %xmm5, %xmm1
-; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm1
-; AVX1-NEXT: vpcmpeqd %xmm7, %xmm1, %xmm12
-; AVX1-NEXT: vpxor %xmm4, %xmm12, %xmm10
-; AVX1-NEXT: vpcmpgtd %xmm2, %xmm5, %xmm7
-; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm13
-; AVX1-NEXT: vpcmpgtd %xmm0, %xmm5, %xmm7
-; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm7
-; AVX1-NEXT: vpcmpeqd %xmm13, %xmm7, %xmm6
-; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm6
-; AVX1-NEXT: vinsertf128 $1, %xmm10, %ymm6, %ymm10
-; AVX1-NEXT: vpsubd %xmm14, %xmm3, %xmm3
-; AVX1-NEXT: vpcmpgtd %xmm3, %xmm5, %xmm6
-; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm6
-; AVX1-NEXT: vpcmpeqd %xmm6, %xmm1, %xmm1
-; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm1
+; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4
+; AVX1-NEXT: vpxor %xmm9, %xmm9, %xmm9
+; AVX1-NEXT: vpcmpgtd %xmm4, %xmm9, %xmm7
+; AVX1-NEXT: vpcmpeqd %xmm5, %xmm5, %xmm5
+; AVX1-NEXT: vpxor %xmm5, %xmm7, %xmm8
+; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm7
+; AVX1-NEXT: vpcmpgtd %xmm7, %xmm9, %xmm6
+; AVX1-NEXT: vpxor %xmm5, %xmm6, %xmm6
+; AVX1-NEXT: vpcmpeqd %xmm8, %xmm6, %xmm8
+; AVX1-NEXT: vpsubd %xmm4, %xmm7, %xmm10
+; AVX1-NEXT: vpcmpgtd %xmm10, %xmm9, %xmm7
+; AVX1-NEXT: vpxor %xmm5, %xmm7, %xmm7
+; AVX1-NEXT: vpcmpeqd %xmm7, %xmm6, %xmm6
+; AVX1-NEXT: vpxor %xmm5, %xmm6, %xmm6
+; AVX1-NEXT: vpandn %xmm6, %xmm8, %xmm6
+; AVX1-NEXT: vpcmpgtd %xmm3, %xmm9, %xmm7
+; AVX1-NEXT: vpxor %xmm5, %xmm7, %xmm7
+; AVX1-NEXT: vpcmpgtd %xmm1, %xmm9, %xmm4
+; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm4
+; AVX1-NEXT: vpcmpeqd %xmm7, %xmm4, %xmm7
+; AVX1-NEXT: vpsubd %xmm3, %xmm1, %xmm1
+; AVX1-NEXT: vpcmpgtd %xmm1, %xmm9, %xmm3
+; AVX1-NEXT: vpxor %xmm5, %xmm3, %xmm3
+; AVX1-NEXT: vpcmpeqd %xmm3, %xmm4, %xmm3
+; AVX1-NEXT: vpxor %xmm5, %xmm3, %xmm3
+; AVX1-NEXT: vpandn %xmm3, %xmm7, %xmm3
+; AVX1-NEXT: vpackssdw %xmm6, %xmm3, %xmm3
+; AVX1-NEXT: vmovdqa {{.*#+}} xmm8 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u>
+; AVX1-NEXT: vpshufb %xmm8, %xmm3, %xmm11
+; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm6
+; AVX1-NEXT: vpcmpgtd %xmm6, %xmm9, %xmm7
+; AVX1-NEXT: vpxor %xmm5, %xmm7, %xmm7
+; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
+; AVX1-NEXT: vpcmpgtd %xmm4, %xmm9, %xmm3
+; AVX1-NEXT: vpxor %xmm5, %xmm3, %xmm3
+; AVX1-NEXT: vpcmpeqd %xmm7, %xmm3, %xmm7
+; AVX1-NEXT: vpsubd %xmm6, %xmm4, %xmm4
+; AVX1-NEXT: vpcmpgtd %xmm4, %xmm9, %xmm6
+; AVX1-NEXT: vpxor %xmm5, %xmm6, %xmm6
+; AVX1-NEXT: vpcmpeqd %xmm6, %xmm3, %xmm3
+; AVX1-NEXT: vpxor %xmm5, %xmm3, %xmm3
+; AVX1-NEXT: vpandn %xmm3, %xmm7, %xmm3
+; AVX1-NEXT: vpcmpgtd %xmm2, %xmm9, %xmm6
+; AVX1-NEXT: vpxor %xmm5, %xmm6, %xmm6
+; AVX1-NEXT: vpcmpgtd %xmm0, %xmm9, %xmm7
+; AVX1-NEXT: vpxor %xmm5, %xmm7, %xmm7
+; AVX1-NEXT: vpcmpeqd %xmm6, %xmm7, %xmm6
; AVX1-NEXT: vpsubd %xmm2, %xmm0, %xmm0
-; AVX1-NEXT: vpcmpgtd %xmm0, %xmm5, %xmm2
-; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm2
+; AVX1-NEXT: vpcmpgtd %xmm0, %xmm9, %xmm2
+; AVX1-NEXT: vpxor %xmm5, %xmm2, %xmm2
; AVX1-NEXT: vpcmpeqd %xmm2, %xmm7, %xmm2
-; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm2
-; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm2
-; AVX1-NEXT: vandps %ymm2, %ymm10, %ymm2
-; AVX1-NEXT: vpandn %xmm1, %xmm12, %xmm1
-; AVX1-NEXT: vpackssdw %xmm1, %xmm2, %xmm1
-; AVX1-NEXT: vpacksswb %xmm9, %xmm1, %xmm1
-; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm2
-; AVX1-NEXT: vinsertf128 $1, %xmm8, %ymm11, %ymm3
-; AVX1-NEXT: vpmovsxbd %xmm1, %xmm0
-; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm1[1,1,2,3]
-; AVX1-NEXT: vpmovsxbd %xmm4, %xmm4
-; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0
-; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm1[2,3,0,1]
-; AVX1-NEXT: vpmovsxbd %xmm4, %xmm4
-; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[3,3,0,1]
+; AVX1-NEXT: vpxor %xmm5, %xmm2, %xmm2
+; AVX1-NEXT: vpandn %xmm2, %xmm6, %xmm2
+; AVX1-NEXT: vpackssdw %xmm3, %xmm2, %xmm2
+; AVX1-NEXT: vpshufb %xmm8, %xmm2, %xmm2
+; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm11[0]
+; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm3
+; AVX1-NEXT: vinsertf128 $1, %xmm10, %ymm1, %ymm4
+; AVX1-NEXT: vpmovsxbd %xmm2, %xmm0
+; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm2[1,1,2,3]
; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1
-; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm4, %ymm1
-; AVX1-NEXT: vmovaps %ymm3, 32(%rdi)
-; AVX1-NEXT: vmovaps %ymm2, (%rdi)
+; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
+; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm2[2,3,0,1]
+; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1
+; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[3,3,0,1]
+; AVX1-NEXT: vpmovsxbd %xmm2, %xmm2
+; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
+; AVX1-NEXT: vmovaps %ymm4, 32(%rdi)
+; AVX1-NEXT: vmovaps %ymm3, (%rdi)
; AVX1-NEXT: retq
;
; AVX2-LABEL: ssubo_v16i32:
@@ -923,20 +918,23 @@ define <16 x i32> @ssubo_v16i32(<16 x i3
; AVX2-NEXT: vpandn %ymm1, %ymm5, %ymm1
; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm5
; AVX2-NEXT: vpackssdw %xmm5, %xmm1, %xmm1
-; AVX2-NEXT: vpcmpgtd %ymm2, %ymm4, %ymm5
-; AVX2-NEXT: vpxor %ymm6, %ymm5, %ymm5
-; AVX2-NEXT: vpcmpgtd %ymm0, %ymm4, %ymm7
+; AVX2-NEXT: vmovdqa {{.*#+}} xmm5 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u>
+; AVX2-NEXT: vpshufb %xmm5, %xmm1, %xmm1
+; AVX2-NEXT: vpcmpgtd %ymm2, %ymm4, %ymm7
; AVX2-NEXT: vpxor %ymm6, %ymm7, %ymm7
-; AVX2-NEXT: vpcmpeqd %ymm5, %ymm7, %ymm5
+; AVX2-NEXT: vpcmpgtd %ymm0, %ymm4, %ymm8
+; AVX2-NEXT: vpxor %ymm6, %ymm8, %ymm8
+; AVX2-NEXT: vpcmpeqd %ymm7, %ymm8, %ymm7
; AVX2-NEXT: vpsubd %ymm2, %ymm0, %ymm2
; AVX2-NEXT: vpcmpgtd %ymm2, %ymm4, %ymm0
; AVX2-NEXT: vpxor %ymm6, %ymm0, %ymm0
-; AVX2-NEXT: vpcmpeqd %ymm0, %ymm7, %ymm0
+; AVX2-NEXT: vpcmpeqd %ymm0, %ymm8, %ymm0
; AVX2-NEXT: vpxor %ymm6, %ymm0, %ymm0
-; AVX2-NEXT: vpandn %ymm0, %ymm5, %ymm0
+; AVX2-NEXT: vpandn %ymm0, %ymm7, %ymm0
; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm4
; AVX2-NEXT: vpackssdw %xmm4, %xmm0, %xmm0
-; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm1
+; AVX2-NEXT: vpshufb %xmm5, %xmm0, %xmm0
+; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm0[0],xmm1[0]
; AVX2-NEXT: vpmovsxbd %xmm1, %ymm0
; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
; AVX2-NEXT: vpmovsxbd %xmm1, %ymm1
More information about the llvm-commits
mailing list