diff options
author | Nate Begeman <natebegeman@mac.com> | 2005-12-20 00:26:01 +0000 |
---|---|---|
committer | Nate Begeman <natebegeman@mac.com> | 2005-12-20 00:26:01 +0000 |
commit | b11b8e44fa59da86031d71ba2e3b3aa91966d244 (patch) | |
tree | 4978675dbd52dc45c056451ec669de6ebc46896e /llvm/lib/Target/PowerPC/PPCISelLowering.cpp | |
parent | fe90b604a49ba50300d867b1c847cf02e44efe9f (diff) | |
download | bcm5719-llvm-b11b8e44fa59da86031d71ba2e3b3aa91966d244.tar.gz bcm5719-llvm-b11b8e44fa59da86031d71ba2e3b3aa91966d244.zip |
Pattern-match return. Includes gross hack!
llvm-svn: 24874
Diffstat (limited to 'llvm/lib/Target/PowerPC/PPCISelLowering.cpp')
-rw-r--r-- | llvm/lib/Target/PowerPC/PPCISelLowering.cpp | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp index ba3fa0ed2c9..0e5000e37fb 100644 --- a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp +++ b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp @@ -793,15 +793,26 @@ PPCTargetLowering::LowerCallTo(SDOperand Chain, SDOperand PPCTargetLowering::LowerReturnTo(SDOperand Chain, SDOperand Op, SelectionDAG &DAG) { - if (Op.getValueType() == MVT::i64) { - SDOperand Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, MVT::i32, Op, - DAG.getConstant(1, MVT::i32)); - SDOperand Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, MVT::i32, Op, - DAG.getConstant(0, MVT::i32)); - return DAG.getNode(ISD::RET, MVT::Other, Chain, Lo, Hi); - } else { - return DAG.getNode(ISD::RET, MVT::Other, Chain, Op); + SDOperand Copy; + switch (Op.getValueType()) { + default: assert(0 && "Unknown type to return!"); + case MVT::i32: + Copy = DAG.getCopyToReg(Chain, PPC::R3, Op, SDOperand()); + break; + case MVT::f32: + case MVT::f64: + Copy = DAG.getCopyToReg(Chain, PPC::F1, Op, SDOperand()); + break; + case MVT::i64: + SDOperand Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, MVT::i32, Op, + DAG.getConstant(1, MVT::i32)); + SDOperand Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, MVT::i32, Op, + DAG.getConstant(0, MVT::i32)); + Copy = DAG.getCopyToReg(Chain, PPC::R3, Hi, SDOperand()); + Copy = DAG.getCopyToReg(Copy, PPC::R4, Lo, Copy.getValue(1)); + break; } + return DAG.getNode(PPCISD::RET_FLAG, MVT::Other, Copy, Copy.getValue(1)); } SDOperand PPCTargetLowering::LowerVAStart(SDOperand Chain, SDOperand VAListP, |