diff options
| author | Dale Johannesen <dalej@apple.com> | 2007-10-12 01:37:08 +0000 |
|---|---|---|
| committer | Dale Johannesen <dalej@apple.com> | 2007-10-12 01:37:08 +0000 |
| commit | 05ff9e8cda568ea4e0314bee269e26badc80dc8a (patch) | |
| tree | 911221990b149b0ab99cdc018718d775406a7748 /llvm/lib/CodeGen/SelectionDAG | |
| parent | 3ec1bad331bf0648c1c2a04fef0cc4261f2417c6 (diff) | |
| download | bcm5719-llvm-05ff9e8cda568ea4e0314bee269e26badc80dc8a.tar.gz bcm5719-llvm-05ff9e8cda568ea4e0314bee269e26badc80dc8a.zip | |
PPC long double. Implement a couple more conversions.
llvm-svn: 42888
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index 3f3ffd7d562..361c38d18f0 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -5952,6 +5952,17 @@ void SelectionDAGLegalize::ExpandOp(SDOperand Op, SDOperand &Lo, SDOperand &Hi){ Node, false, Hi); break; case ISD::FP_EXTEND: + if (VT == MVT::ppcf128) { + assert(Node->getOperand(0).getValueType()==MVT::f32 || + Node->getOperand(0).getValueType()==MVT::f64); + const uint64_t zero = 0; + if (Node->getOperand(0).getValueType()==MVT::f32) + Hi = DAG.getNode(ISD::FP_EXTEND, MVT::f64, Node->getOperand(0)); + else + Hi = Node->getOperand(0); + Lo = DAG.getConstantFP(APFloat(APInt(64, 1, &zero)), MVT::f64); + break; + } Lo = ExpandLibCall(TLI.getLibcallName(RTLIB::FPEXT_F32_F64), Node, true,Hi); break; case ISD::FP_ROUND: @@ -6021,6 +6032,30 @@ void SelectionDAGLegalize::ExpandOp(SDOperand Op, SDOperand &Lo, SDOperand &Hi){ case ISD::UINT_TO_FP: { bool isSigned = Node->getOpcode() == ISD::SINT_TO_FP; MVT::ValueType SrcVT = Node->getOperand(0).getValueType(); + if (VT == MVT::ppcf128) { + static uint64_t zero = 0; + if (isSigned) { + Hi = LegalizeOp(DAG.getNode(ISD::SINT_TO_FP, MVT::f64, + Node->getOperand(0))); + Lo = DAG.getConstantFP(APFloat(APInt(64, 1, &zero)), MVT::f64); + } else { + static uint64_t TwoE32[] = { 0x41f0000000000000LL, 0 }; + Hi = LegalizeOp(DAG.getNode(ISD::SINT_TO_FP, MVT::f64, + Node->getOperand(0))); + Lo = DAG.getConstantFP(APFloat(APInt(64, 1, &zero)), MVT::f64); + Hi = DAG.getNode(ISD::BUILD_PAIR, VT, Lo, Hi); + ExpandOp(DAG.getNode(ISD::SELECT_CC, MVT::ppcf128, Node->getOperand(0), + DAG.getConstant(0, MVT::i32), + DAG.getNode(ISD::FADD, MVT::ppcf128, Hi, + DAG.getConstantFP( + APFloat(APInt(128, 2, TwoE32)), + MVT::ppcf128)), + Hi, + DAG.getCondCode(ISD::SETLT)), + Lo, Hi); + } + break; + } RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL; if (Node->getOperand(0).getValueType() == MVT::i64) { if (VT == MVT::f32) |

