diff options
author | Chris Lattner <sabre@nondot.org> | 2005-08-31 19:01:53 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2005-08-31 19:01:53 +0000 |
commit | 50ec8979047065bd0ff41fac4ffd44f744b77723 (patch) | |
tree | cfe4f491851d459cfad35aa844df13f168b9e6de /lib/CodeGen | |
parent | c730706a89a3983a3d2eb95fd61e6ae738ff7fb1 (diff) |
Allow targets to custom expand shifts that are too large for their registers
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23173 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
-rw-r--r-- | lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index 758fd2de8d..d1417de951 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -3101,6 +3101,19 @@ void SelectionDAGLegalize::ExpandOp(SDOperand Op, SDOperand &Lo, SDOperand &Hi){ break; case ISD::SHL: + // If the target wants custom lowering, do so. + if (TLI.getOperationAction(ISD::SHL, VT) == TargetLowering::Custom) { + SDOperand Op = DAG.getNode(ISD::SHL, VT, Node->getOperand(0), + LegalizeOp(Node->getOperand(1))); + Op = TLI.LowerOperation(Op, DAG); + if (Op.Val) { + // Now that the custom expander is done, expand the result, which is + // still VT. + ExpandOp(Op, Lo, Hi); + break; + } + } + // If we can emit an efficient shift operation, do so now. if (ExpandShift(ISD::SHL, Node->getOperand(0), Node->getOperand(1), Lo, Hi)) break; @@ -3117,6 +3130,19 @@ void SelectionDAGLegalize::ExpandOp(SDOperand Op, SDOperand &Lo, SDOperand &Hi){ break; case ISD::SRA: + // If the target wants custom lowering, do so. + if (TLI.getOperationAction(ISD::SRA, VT) == TargetLowering::Custom) { + SDOperand Op = DAG.getNode(ISD::SRA, VT, Node->getOperand(0), + LegalizeOp(Node->getOperand(1))); + Op = TLI.LowerOperation(Op, DAG); + if (Op.Val) { + // Now that the custom expander is done, expand the result, which is + // still VT. + ExpandOp(Op, Lo, Hi); + break; + } + } + // If we can emit an efficient shift operation, do so now. if (ExpandShift(ISD::SRA, Node->getOperand(0), Node->getOperand(1), Lo, Hi)) break; @@ -3132,6 +3158,19 @@ void SelectionDAGLegalize::ExpandOp(SDOperand Op, SDOperand &Lo, SDOperand &Hi){ Lo = ExpandLibCall("__ashrdi3", Node, Hi); break; case ISD::SRL: + // If the target wants custom lowering, do so. + if (TLI.getOperationAction(ISD::SRL, VT) == TargetLowering::Custom) { + SDOperand Op = DAG.getNode(ISD::SRL, VT, Node->getOperand(0), + LegalizeOp(Node->getOperand(1))); + Op = TLI.LowerOperation(Op, DAG); + if (Op.Val) { + // Now that the custom expander is done, expand the result, which is + // still VT. + ExpandOp(Op, Lo, Hi); + break; + } + } + // If we can emit an efficient shift operation, do so now. if (ExpandShift(ISD::SRL, Node->getOperand(0), Node->getOperand(1), Lo, Hi)) break; |