Factorize some code for determining which libcall to use.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53713 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
index 4b9236d..4b02c54 100644
--- a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
+++ b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
@@ -3764,86 +3764,9 @@
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 @@
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 @@
}
}
- 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 @@
}
}
- 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 @@
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 @@
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,