diff options
author | Chris Lattner <sabre@nondot.org> | 2005-01-20 20:29:23 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2005-01-20 20:29:23 +0000 |
commit | e5544f851a2a3f7b06339b132e60ad2f2d53e7b8 (patch) | |
tree | 0511e515b7a49465c65461e6f29dd189c63c4789 /lib/CodeGen | |
parent | 19ad0620bc725dde201b0c5bdd69cf8065701b7b (diff) |
Simplify the shift-expansion code.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@19721 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
-rw-r--r-- | lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index 8bb88a7c3f..6992b403a6 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -1237,13 +1237,16 @@ bool SelectionDAGLegalize::ExpandShift(unsigned Opc, SDOperand Op,SDOperand Amt, SDOperand InL, InH; ExpandOp(Op, InL, InH); SDOperand ShAmt = LegalizeOp(Amt); - SDOperand OShAmt = ShAmt; // Unmasked shift amount. MVT::ValueType ShTy = ShAmt.getValueType(); unsigned NVTBits = MVT::getSizeInBits(NVT); SDOperand NAmt = DAG.getNode(ISD::SUB, ShTy, // NAmt = 32-ShAmt DAG.getConstant(NVTBits, ShTy), ShAmt); + // Compare the unmasked shift amount against 32. + SDOperand Cond = DAG.getSetCC(ISD::SETGE, TLI.getSetCCResultTy(), ShAmt, + DAG.getConstant(NVTBits, ShTy)); + if (TLI.getShiftAmountFlavor() != TargetLowering::Mask) { ShAmt = DAG.getNode(ISD::AND, ShTy, ShAmt, // ShAmt &= 31 DAG.getConstant(NVTBits-1, ShTy)); @@ -1255,10 +1258,8 @@ bool SelectionDAGLegalize::ExpandShift(unsigned Opc, SDOperand Op,SDOperand Amt, SDOperand T1 = DAG.getNode(ISD::OR, NVT,// T1 = (Hi << Amt) | (Lo >> NAmt) DAG.getNode(ISD::SHL, NVT, InH, ShAmt), DAG.getNode(ISD::SRL, NVT, InL, NAmt)); - SDOperand T2 = DAG.getNode(ISD::SHL, NVT, InL, ShAmt); // T2 = Lo << Amt + SDOperand T2 = DAG.getNode(ISD::SHL, NVT, InL, ShAmt); // T2 = Lo << Amt&31 - SDOperand Cond = DAG.getSetCC(ISD::SETGE, TLI.getSetCCResultTy(), OShAmt, - DAG.getConstant(NVTBits, ShTy)); Hi = DAG.getNode(ISD::SELECT, NVT, Cond, T2, T1); Lo = DAG.getNode(ISD::SELECT, NVT, Cond, DAG.getConstant(0, NVT), T2); } else { @@ -1266,17 +1267,15 @@ bool SelectionDAGLegalize::ExpandShift(unsigned Opc, SDOperand Op,SDOperand Amt, DAG.getNode(ISD::SHL, NVT, InH, NAmt), DAG.getNode(ISD::SRL, NVT, InL, ShAmt)); bool isSign = Opc == ISD::SRA; - SDOperand T2 = DAG.getNode(Opc, NVT, InH, ShAmt); + SDOperand T2 = DAG.getNode(Opc, NVT, InH, ShAmt); // T2 = InH >> ShAmt&31 SDOperand HiPart; if (isSign) HiPart = DAG.getNode(Opc, NVT, InH, DAG.getConstant(NVTBits-1, ShTy)); else HiPart = DAG.getConstant(0, NVT); - SDOperand Cond = DAG.getSetCC(ISD::SETGE, TLI.getSetCCResultTy(), OShAmt, - DAG.getConstant(NVTBits, ShTy)); Lo = DAG.getNode(ISD::SELECT, NVT, Cond, T2, T1); - Hi = DAG.getNode(ISD::SELECT, NVT, Cond, HiPart,T2); + Hi = DAG.getNode(ISD::SELECT, NVT, Cond, HiPart, T2); } return true; } |