diff options
Diffstat (limited to 'lib/CodeGen/SelectionDAG/LegalizeDAG.cpp')
| -rw-r--r-- | lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 194 |
1 files changed, 27 insertions, 167 deletions
diff --git a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index 4b9236db46..4b02c54a4e 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -3764,86 +3764,9 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) { break; } // Convert f32 / f64 to i32 / i64 / i128. - RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL; - switch (Node->getOpcode()) { - case ISD::FP_TO_SINT: { - if (VT == MVT::i32) { - if (OVT == MVT::f32) - LC = RTLIB::FPTOSINT_F32_I32; - else if (OVT == MVT::f64) - LC = RTLIB::FPTOSINT_F64_I32; - else if (OVT == MVT::f80) - LC = RTLIB::FPTOSINT_F80_I32; - else if (OVT == MVT::ppcf128) - LC = RTLIB::FPTOSINT_PPCF128_I32; - else - assert(0 && "Unexpected i32-to-fp conversion!"); - } else if (VT == MVT::i64) { - if (OVT == MVT::f32) - LC = RTLIB::FPTOSINT_F32_I64; - else if (OVT == MVT::f64) - LC = RTLIB::FPTOSINT_F64_I64; - else if (OVT == MVT::f80) - LC = RTLIB::FPTOSINT_F80_I64; - else if (OVT == MVT::ppcf128) - LC = RTLIB::FPTOSINT_PPCF128_I64; - else - assert(0 && "Unexpected i64-to-fp conversion!"); - } else if (VT == MVT::i128) { - if (OVT == MVT::f32) - LC = RTLIB::FPTOSINT_F32_I128; - else if (OVT == MVT::f64) - LC = RTLIB::FPTOSINT_F64_I128; - else if (OVT == MVT::f80) - LC = RTLIB::FPTOSINT_F80_I128; - else if (OVT == MVT::ppcf128) - LC = RTLIB::FPTOSINT_PPCF128_I128; - else - assert(0 && "Unexpected i128-to-fp conversion!"); - } else { - assert(0 && "Unexpectd int-to-fp conversion!"); - } - break; - } - case ISD::FP_TO_UINT: { - if (VT == MVT::i32) { - if (OVT == MVT::f32) - LC = RTLIB::FPTOUINT_F32_I32; - else if (OVT == MVT::f64) - LC = RTLIB::FPTOUINT_F64_I32; - else if (OVT == MVT::f80) - LC = RTLIB::FPTOUINT_F80_I32; - else - assert(0 && "Unexpected i32-to-fp conversion!"); - } else if (VT == MVT::i64) { - if (OVT == MVT::f32) - LC = RTLIB::FPTOUINT_F32_I64; - else if (OVT == MVT::f64) - LC = RTLIB::FPTOUINT_F64_I64; - else if (OVT == MVT::f80) - LC = RTLIB::FPTOUINT_F80_I64; - else if (OVT == MVT::ppcf128) - LC = RTLIB::FPTOUINT_PPCF128_I64; - else - assert(0 && "Unexpected i64-to-fp conversion!"); - } else if (VT == MVT::i128) { - if (OVT == MVT::f32) - LC = RTLIB::FPTOUINT_F32_I128; - else if (OVT == MVT::f64) - LC = RTLIB::FPTOUINT_F64_I128; - else if (OVT == MVT::f80) - LC = RTLIB::FPTOUINT_F80_I128; - else if (OVT == MVT::ppcf128) - LC = RTLIB::FPTOUINT_PPCF128_I128; - else - assert(0 && "Unexpected i128-to-fp conversion!"); - } else { - assert(0 && "Unexpectd int-to-fp conversion!"); - } - break; - } - default: assert(0 && "Unreachable!"); - } + RTLIB::Libcall LC = (Node->getOpcode() == ISD::FP_TO_SINT) ? + RTLIB::getFPTOSINT(OVT, VT) : RTLIB::getFPTOUINT(OVT, VT); + assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unexpectd fp-to-int conversion!"); SDOperand Dummy; Result = ExpandLibCall(LC, Node, false/*sign irrelevant*/, Dummy); break; @@ -5412,41 +5335,11 @@ ExpandIntToFP(bool isSigned, MVT DestTy, SDOperand Source) { Source = DAG.getNode(ISD::BUILD_PAIR, SourceVT, SrcLo, SrcHi); } - RTLIB::Libcall LC; - if (SourceVT == MVT::i32) { - if (DestTy == MVT::f32) - LC = isSigned ? RTLIB::SINTTOFP_I32_F32 : RTLIB::UINTTOFP_I32_F32; - else { - assert(DestTy == MVT::f64 && "Unknown fp value type!"); - LC = isSigned ? RTLIB::SINTTOFP_I32_F64 : RTLIB::UINTTOFP_I32_F64; - } - } else if (SourceVT == MVT::i64) { - if (DestTy == MVT::f32) - LC = RTLIB::SINTTOFP_I64_F32; - else if (DestTy == MVT::f64) - LC = RTLIB::SINTTOFP_I64_F64; - else if (DestTy == MVT::f80) - LC = RTLIB::SINTTOFP_I64_F80; - else { - assert(DestTy == MVT::ppcf128 && "Unknown fp value type!"); - LC = RTLIB::SINTTOFP_I64_PPCF128; - } - } else if (SourceVT == MVT::i128) { - if (DestTy == MVT::f32) - LC = RTLIB::SINTTOFP_I128_F32; - else if (DestTy == MVT::f64) - LC = RTLIB::SINTTOFP_I128_F64; - else if (DestTy == MVT::f80) - LC = RTLIB::SINTTOFP_I128_F80; - else { - assert(DestTy == MVT::ppcf128 && "Unknown fp value type!"); - LC = RTLIB::SINTTOFP_I128_PPCF128; - } - } else { - assert(0 && "Unknown int value type"); - } - - assert(TLI.getLibcallName(LC) && "Don't know how to expand this SINT_TO_FP!"); + RTLIB::Libcall LC = isSigned ? + RTLIB::getSINTTOFP(SourceVT, DestTy) : + RTLIB::getUINTTOFP(SourceVT, DestTy); + assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unknown int value type"); + Source = DAG.getNode(ISD::SINT_TO_FP, DestTy, Source); SDOperand HiPart; SDOperand Result = ExpandLibCall(LC, Source.Val, isSigned, HiPart); @@ -6196,30 +6089,10 @@ void SelectionDAGLegalize::ExpandOp(SDOperand Op, SDOperand &Lo, SDOperand &Hi){ } } - RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL; - if (VT == MVT::i64) { - if (Node->getOperand(0).getValueType() == MVT::f32) - LC = RTLIB::FPTOSINT_F32_I64; - else if (Node->getOperand(0).getValueType() == MVT::f64) - LC = RTLIB::FPTOSINT_F64_I64; - else if (Node->getOperand(0).getValueType() == MVT::f80) - LC = RTLIB::FPTOSINT_F80_I64; - else if (Node->getOperand(0).getValueType() == MVT::ppcf128) - LC = RTLIB::FPTOSINT_PPCF128_I64; - Lo = ExpandLibCall(LC, Node, false/*sign irrelevant*/, Hi); - } else if (VT == MVT::i128) { - if (Node->getOperand(0).getValueType() == MVT::f32) - LC = RTLIB::FPTOSINT_F32_I128; - else if (Node->getOperand(0).getValueType() == MVT::f64) - LC = RTLIB::FPTOSINT_F64_I128; - else if (Node->getOperand(0).getValueType() == MVT::f80) - LC = RTLIB::FPTOSINT_F80_I128; - else if (Node->getOperand(0).getValueType() == MVT::ppcf128) - LC = RTLIB::FPTOSINT_PPCF128_I128; - Lo = ExpandLibCall(LC, Node, false/*sign irrelevant*/, Hi); - } else { - assert(0 && "Unexpected uint-to-fp conversion!"); - } + RTLIB::Libcall LC = RTLIB::getFPTOSINT(Node->getOperand(0).getValueType(), + VT); + assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unexpected uint-to-fp conversion!"); + Lo = ExpandLibCall(LC, Node, false/*sign irrelevant*/, Hi); break; } @@ -6241,30 +6114,10 @@ void SelectionDAGLegalize::ExpandOp(SDOperand Op, SDOperand &Lo, SDOperand &Hi){ } } - RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL; - if (VT == MVT::i64) { - if (Node->getOperand(0).getValueType() == MVT::f32) - LC = RTLIB::FPTOUINT_F32_I64; - else if (Node->getOperand(0).getValueType() == MVT::f64) - LC = RTLIB::FPTOUINT_F64_I64; - else if (Node->getOperand(0).getValueType() == MVT::f80) - LC = RTLIB::FPTOUINT_F80_I64; - else if (Node->getOperand(0).getValueType() == MVT::ppcf128) - LC = RTLIB::FPTOUINT_PPCF128_I64; - Lo = ExpandLibCall(LC, Node, false/*sign irrelevant*/, Hi); - } else if (VT == MVT::i128) { - if (Node->getOperand(0).getValueType() == MVT::f32) - LC = RTLIB::FPTOUINT_F32_I128; - else if (Node->getOperand(0).getValueType() == MVT::f64) - LC = RTLIB::FPTOUINT_F64_I128; - else if (Node->getOperand(0).getValueType() == MVT::f80) - LC = RTLIB::FPTOUINT_F80_I128; - else if (Node->getOperand(0).getValueType() == MVT::ppcf128) - LC = RTLIB::FPTOUINT_PPCF128_I128; - Lo = ExpandLibCall(LC, Node, false/*sign irrelevant*/, Hi); - } else { - assert(0 && "Unexpected uint-to-fp conversion!"); - } + RTLIB::Libcall LC = RTLIB::getFPTOUINT(Node->getOperand(0).getValueType(), + VT); + assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unexpected fp-to-uint conversion!"); + Lo = ExpandLibCall(LC, Node, false/*sign irrelevant*/, Hi); break; } @@ -6579,7 +6432,7 @@ void SelectionDAGLegalize::ExpandOp(SDOperand Op, SDOperand &Lo, SDOperand &Hi){ RTLIB::DIV_PPCF128), Node, false, Hi); break; - case ISD::FP_EXTEND: + case ISD::FP_EXTEND: { if (VT == MVT::ppcf128) { assert(Node->getOperand(0).getValueType()==MVT::f32 || Node->getOperand(0).getValueType()==MVT::f64); @@ -6591,11 +6444,18 @@ void SelectionDAGLegalize::ExpandOp(SDOperand Op, SDOperand &Lo, SDOperand &Hi){ Lo = DAG.getConstantFP(APFloat(APInt(64, 1, &zero)), MVT::f64); break; } - Lo = ExpandLibCall(RTLIB::FPEXT_F32_F64, Node, true, Hi); + RTLIB::Libcall LC = RTLIB::getFPEXT(Node->getOperand(0).getValueType(), VT); + assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported FP_EXTEND!"); + Lo = ExpandLibCall(LC, Node, true, Hi); break; - case ISD::FP_ROUND: - Lo = ExpandLibCall(RTLIB::FPROUND_F64_F32, Node, true, Hi); + } + case ISD::FP_ROUND: { + RTLIB::Libcall LC = RTLIB::getFPROUND(Node->getOperand(0).getValueType(), + VT); + assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported FP_ROUND!"); + Lo = ExpandLibCall(LC, Node, true, Hi); break; + } case ISD::FPOWI: Lo = ExpandLibCall(GetFPLibCall(VT, RTLIB::POWI_F32, RTLIB::POWI_F64, |
