diff options
author | Chris Lattner <sabre@nondot.org> | 2007-12-09 00:06:19 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2007-12-09 00:06:19 +0000 |
commit | 0097555e01683a0c9a25adef75efa1ed611e1705 (patch) | |
tree | 631ff1889229dd6b1d19b6f115ce558c1347a702 /lib/CodeGen/SelectionDAG/LegalizeTypesSplit.cpp | |
parent | 041b3f835682588cb63df7e609d726369dd6b7d3 (diff) |
Add support for splitting the operand of a return instruction.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@44728 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/SelectionDAG/LegalizeTypesSplit.cpp')
-rw-r--r-- | lib/CodeGen/SelectionDAG/LegalizeTypesSplit.cpp | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/lib/CodeGen/SelectionDAG/LegalizeTypesSplit.cpp b/lib/CodeGen/SelectionDAG/LegalizeTypesSplit.cpp index c16b05110d..c77bf12d9a 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeTypesSplit.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeTypesSplit.cpp @@ -337,9 +337,8 @@ bool DAGTypeLegalizer::SplitOperand(SDNode *N, unsigned OpNo) { #endif assert(0 && "Do not know how to split this operator's operand!"); abort(); - case ISD::STORE: - Res = SplitOperand_STORE(cast<StoreSDNode>(N), OpNo); - break; + case ISD::STORE: Res = SplitOp_STORE(cast<StoreSDNode>(N), OpNo); break; + case ISD::RET: Res = SplitOp_RET(N, OpNo); break; } } @@ -364,7 +363,7 @@ bool DAGTypeLegalizer::SplitOperand(SDNode *N, unsigned OpNo) { return false; } -SDOperand DAGTypeLegalizer::SplitOperand_STORE(StoreSDNode *N, unsigned OpNo) { +SDOperand DAGTypeLegalizer::SplitOp_STORE(StoreSDNode *N, unsigned OpNo) { assert(OpNo == 1 && "Can only split the stored value"); SDOperand Ch = N->getChain(); @@ -388,3 +387,15 @@ SDOperand DAGTypeLegalizer::SplitOperand_STORE(StoreSDNode *N, unsigned OpNo) { return DAG.getNode(ISD::TokenFactor, MVT::Other, Lo, Hi); } +SDOperand DAGTypeLegalizer::SplitOp_RET(SDNode *N, unsigned OpNo) { + assert(N->getNumOperands() == 3 &&"Can only handle ret of one vector so far"); + // FIXME: Returns of gcc generic vectors larger than a legal vector + // type should be returned by reference! + SDOperand Lo, Hi; + GetSplitOp(N->getOperand(1), Lo, Hi); + + SDOperand Chain = N->getOperand(0); // The chain. + SDOperand Sign = N->getOperand(2); // Signness + + return DAG.getNode(ISD::RET, MVT::Other, Chain, Lo, Sign, Hi, Sign); +} |