Index: llvm/include/llvm/CodeGen/TargetLowering.h =================================================================== --- llvm/include/llvm/CodeGen/TargetLowering.h +++ llvm/include/llvm/CodeGen/TargetLowering.h @@ -3921,6 +3921,16 @@ /// 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, Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp =================================================================== --- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -3317,76 +3317,18 @@ } 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: Index: llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp =================================================================== --- llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp +++ llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp @@ -140,6 +140,8 @@ 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); @@ -420,6 +422,10 @@ 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: @@ -794,6 +800,12 @@ 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); @@ -1248,6 +1260,32 @@ 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)) Index: llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp =================================================================== --- llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp +++ llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp @@ -5694,6 +5694,80 @@ 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); Index: llvm/test/CodeGen/AArch64/addsubo-legalization.ll =================================================================== --- /dev/null +++ llvm/test/CodeGen/AArch64/addsubo-legalization.ll @@ -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 +} Index: llvm/test/CodeGen/X86/sadd_sat_vec.ll =================================================================== --- llvm/test/CodeGen/X86/sadd_sat_vec.ll +++ llvm/test/CodeGen/X86/sadd_sat_vec.ll @@ -663,7 +663,7 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; ; 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 @@ ; 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 @@ ; 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 @@ ; ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 ; Index: llvm/test/CodeGen/X86/ssub_sat_vec.ll =================================================================== --- llvm/test/CodeGen/X86/ssub_sat_vec.ll +++ llvm/test/CodeGen/X86/ssub_sat_vec.ll @@ -663,7 +663,7 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; ; 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 @@ ; 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 @@ ; 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 @@ ; ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 ; Index: llvm/test/CodeGen/X86/vec_saddo.ll =================================================================== --- llvm/test/CodeGen/X86/vec_saddo.ll +++ llvm/test/CodeGen/X86/vec_saddo.ll @@ -807,62 +807,57 @@ ; 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, %ymm8 +; 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, %xmm7 -; AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm10 -; AVX1-NEXT: vpcmpgtd %xmm10, %xmm5, %xmm3 -; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3 -; AVX1-NEXT: vpcmpeqd %xmm3, %xmm6, %xmm3 -; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3 -; AVX1-NEXT: vinsertf128 $1, %xmm7, %ymm3, %ymm3 -; AVX1-NEXT: vandps %ymm3, %ymm8, %ymm3 -; AVX1-NEXT: vextractf128 $1, %ymm3, %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, %xmm11 -; AVX1-NEXT: vpcmpgtd %xmm2, %xmm5, %xmm7 -; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm12 +; 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 %xmm12, %xmm7, %xmm12 -; AVX1-NEXT: vinsertf128 $1, %xmm11, %ymm12, %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, %xmm1 +; 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, %xmm1, %ymm2, %ymm1 -; AVX1-NEXT: vandps %ymm1, %ymm11, %ymm1 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 -; AVX1-NEXT: vpackssdw %xmm2, %xmm1, %xmm1 -; AVX1-NEXT: vpacksswb %xmm8, %xmm1, %xmm1 +; AVX1-NEXT: vpandn %xmm4, %xmm2, %xmm2 +; AVX1-NEXT: vpackssdw %xmm1, %xmm2, %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, %ymm10, %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 @@ ; 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 Index: llvm/test/CodeGen/X86/vec_ssubo.ll =================================================================== --- llvm/test/CodeGen/X86/vec_ssubo.ll +++ llvm/test/CodeGen/X86/vec_ssubo.ll @@ -830,80 +830,75 @@ ; ; 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, %xmm12 -; AVX1-NEXT: vpcmpgtd %xmm12, %xmm5, %xmm7 -; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm10 -; AVX1-NEXT: vpcmpeqd %xmm9, %xmm10, %xmm7 -; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm9 -; AVX1-NEXT: vpcmpgtd %xmm3, %xmm5, %xmm7 -; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm11 -; AVX1-NEXT: vpcmpgtd %xmm1, %xmm5, %xmm7 -; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm7 -; AVX1-NEXT: vpcmpeqd %xmm11, %xmm7, %xmm6 -; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm6 -; AVX1-NEXT: vinsertf128 $1, %xmm9, %ymm6, %ymm9 -; AVX1-NEXT: vpsubd %xmm8, %xmm12, %xmm8 -; AVX1-NEXT: vpcmpgtd %xmm8, %xmm5, %xmm6 -; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm6 -; AVX1-NEXT: vpcmpeqd %xmm6, %xmm10, %xmm6 -; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm6 -; AVX1-NEXT: vpsubd %xmm3, %xmm1, %xmm10 -; AVX1-NEXT: vpcmpgtd %xmm10, %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, %ymm9, %ymm3 -; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm6 -; AVX1-NEXT: vpackssdw %xmm6, %xmm3, %xmm9 -; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm13 -; AVX1-NEXT: vpcmpgtd %xmm13, %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, %xmm7 -; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm11 -; AVX1-NEXT: vpcmpgtd %xmm2, %xmm5, %xmm7 -; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm12 -; AVX1-NEXT: vpcmpgtd %xmm0, %xmm5, %xmm7 -; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm7 -; AVX1-NEXT: vpcmpeqd %xmm12, %xmm7, %xmm6 -; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm6 -; AVX1-NEXT: vinsertf128 $1, %xmm11, %ymm6, %ymm11 -; AVX1-NEXT: vpsubd %xmm13, %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, %ymm1 -; AVX1-NEXT: vandps %ymm1, %ymm11, %ymm1 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 -; AVX1-NEXT: vpackssdw %xmm2, %xmm1, %xmm1 -; AVX1-NEXT: vpacksswb %xmm9, %xmm1, %xmm1 -; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm2 -; AVX1-NEXT: vinsertf128 $1, %xmm8, %ymm10, %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 @@ ; 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