diff options
| author | Dale Johannesen <dalej@apple.com> | 2007-10-10 01:01:31 +0000 |
|---|---|---|
| committer | Dale Johannesen <dalej@apple.com> | 2007-10-10 01:01:31 +0000 |
| commit | 666323eacdf09fbd7b01719fb3fd7650b6188900 (patch) | |
| tree | 5b24c9e0ec880af28898cd09a291c6d152397e61 /llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | |
| parent | a9830a04eb8a7910604492551cf0e71bb29f4331 (diff) | |
| download | bcm5719-llvm-666323eacdf09fbd7b01719fb3fd7650b6188900.tar.gz bcm5719-llvm-666323eacdf09fbd7b01719fb3fd7650b6188900.zip | |
Next PPC long double bits: ppcf128->i32 conversion.
Surprisingly complicated.
Adds getTargetNode for 2 outputs, no inputs (missing).
llvm-svn: 42822
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index 98a2495d28d..ce28c79dc9c 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -3324,10 +3324,18 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) { case Expand: { // Convert f32 / f64 to i32 / i64. MVT::ValueType VT = Op.getValueType(); + MVT::ValueType OVT = Node->getOperand(0).getValueType(); + if (OVT == MVT::ppcf128 && VT == MVT::i32) { + Result = DAG.getNode(ISD::FP_TO_SINT, VT, + DAG.getNode(ISD::FP_ROUND, MVT::f64, + (DAG.getNode(ISD::FP_ROUND_INREG, + MVT::ppcf128, Node->getOperand(0), + DAG.getValueType(MVT::f64))))); + break; + } RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL; switch (Node->getOpcode()) { case ISD::FP_TO_SINT: { - MVT::ValueType OVT = Node->getOperand(0).getValueType(); if (OVT == MVT::f32) LC = (VT == MVT::i32) ? RTLIB::FPTOSINT_F32_I32 : RTLIB::FPTOSINT_F32_I64; @@ -3345,7 +3353,6 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) { break; } case ISD::FP_TO_UINT: { - MVT::ValueType OVT = Node->getOperand(0).getValueType(); if (OVT == MVT::f32) LC = (VT == MVT::i32) ? RTLIB::FPTOUINT_F32_I32 : RTLIB::FPTOSINT_F32_I64; @@ -5159,6 +5166,17 @@ void SelectionDAGLegalize::ExpandOp(SDOperand Op, SDOperand &Lo, SDOperand &Hi){ switch (Node->getOpcode()) { case ISD::CopyFromReg: assert(0 && "CopyFromReg must be legal!"); + case ISD::FP_ROUND_INREG: + if (VT == MVT::ppcf128 && + TLI.getOperationAction(ISD::FP_ROUND_INREG, VT) == + TargetLowering::Custom) { + SDOperand Result = TLI.LowerOperation(Op, DAG); + assert(Result.Val->getOpcode() == ISD::BUILD_PAIR); + Lo = Result.Val->getOperand(0); + Hi = Result.Val->getOperand(1); + break; + } + // fall through default: #ifndef NDEBUG cerr << "NODE: "; Node->dump(&DAG); cerr << "\n"; |

