[llvm-commits] [llvm] r53286 - in /llvm/trunk/lib/CodeGen/SelectionDAG: LegalizeFloatTypes.cpp LegalizeTypes.h
Duncan Sands
baldrick at free.fr
Wed Jul 9 04:13:46 PDT 2008
Author: baldrick
Date: Wed Jul 9 06:13:46 2008
New Revision: 53286
URL: http://llvm.org/viewvc/llvm-project?rev=53286&view=rev
Log:
LegalizeTypes soft float support for FP_TO_SINT and
FP_TO_UINT.
Modified:
llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp
llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeTypes.h
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp?rev=53286&r1=53285&r2=53286&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp Wed Jul 9 06:13:46 2008
@@ -380,10 +380,12 @@
case ISD::BIT_CONVERT: Res = SoftenFloatOp_BIT_CONVERT(N); break;
- case ISD::BR_CC: Res = SoftenFloatOp_BR_CC(N); break;
- case ISD::SELECT_CC: Res = SoftenFloatOp_SELECT_CC(N); break;
- case ISD::SETCC: Res = SoftenFloatOp_SETCC(N); break;
- case ISD::STORE: Res = SoftenFloatOp_STORE(N, OpNo); break;
+ case ISD::BR_CC: Res = SoftenFloatOp_BR_CC(N); break;
+ case ISD::FP_TO_SINT: Res = SoftenFloatOp_FP_TO_SINT(N); break;
+ case ISD::FP_TO_UINT: Res = SoftenFloatOp_FP_TO_UINT(N); break;
+ case ISD::SELECT_CC: Res = SoftenFloatOp_SELECT_CC(N); break;
+ case ISD::SETCC: Res = SoftenFloatOp_SETCC(N); break;
+ case ISD::STORE: Res = SoftenFloatOp_STORE(N, OpNo); break;
}
// If the result is null, the sub-method took care of registering results etc.
@@ -514,6 +516,132 @@
N->getOperand(4));
}
+SDOperand DAGTypeLegalizer::SoftenFloatOp_FP_TO_SINT(SDNode *N) {
+ MVT SVT = N->getOperand(0).getValueType();
+ MVT RVT = N->getValueType(0);
+
+ RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
+ switch (RVT.getSimpleVT()) {
+ case MVT::i32:
+ switch (SVT.getSimpleVT()) {
+ case MVT::f32:
+ LC = RTLIB::FPTOSINT_F32_I32;
+ break;
+ case MVT::f64:
+ LC = RTLIB::FPTOSINT_F64_I32;
+ break;
+ default:
+ break;
+ }
+ break;
+ case MVT::i64:
+ switch (SVT.getSimpleVT()) {
+ case MVT::f32:
+ LC = RTLIB::FPTOSINT_F32_I64;
+ break;
+ case MVT::f64:
+ LC = RTLIB::FPTOSINT_F64_I64;
+ break;
+ case MVT::f80:
+ LC = RTLIB::FPTOSINT_F80_I64;
+ break;
+ case MVT::ppcf128:
+ LC = RTLIB::FPTOSINT_PPCF128_I64;
+ break;
+ default:
+ break;
+ }
+ break;
+ case MVT::i128:
+ switch (SVT.getSimpleVT()) {
+ case MVT::f32:
+ LC = RTLIB::FPTOSINT_F32_I128;
+ break;
+ case MVT::f64:
+ LC = RTLIB::FPTOSINT_F64_I128;
+ break;
+ case MVT::f80:
+ LC = RTLIB::FPTOSINT_F80_I128;
+ break;
+ case MVT::ppcf128:
+ LC = RTLIB::FPTOSINT_PPCF128_I128;
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported FP_TO_SINT!");
+
+ SDOperand Op = GetSoftenedFloat(N->getOperand(0));
+ return MakeLibCall(LC, RVT, &Op, 1, false);
+}
+
+SDOperand DAGTypeLegalizer::SoftenFloatOp_FP_TO_UINT(SDNode *N) {
+ MVT SVT = N->getOperand(0).getValueType();
+ MVT RVT = N->getValueType(0);
+
+ RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
+ switch (RVT.getSimpleVT()) {
+ case MVT::i32:
+ switch (SVT.getSimpleVT()) {
+ case MVT::f32:
+ LC = RTLIB::FPTOUINT_F32_I32;
+ break;
+ case MVT::f64:
+ LC = RTLIB::FPTOUINT_F64_I32;
+ break;
+ default:
+ break;
+ }
+ break;
+ case MVT::i64:
+ switch (SVT.getSimpleVT()) {
+ case MVT::f32:
+ LC = RTLIB::FPTOUINT_F32_I64;
+ break;
+ case MVT::f64:
+ LC = RTLIB::FPTOUINT_F64_I64;
+ break;
+ case MVT::f80:
+ LC = RTLIB::FPTOUINT_F80_I64;
+ break;
+ case MVT::ppcf128:
+ LC = RTLIB::FPTOUINT_PPCF128_I64;
+ break;
+ default:
+ break;
+ }
+ break;
+ case MVT::i128:
+ switch (SVT.getSimpleVT()) {
+ case MVT::f32:
+ LC = RTLIB::FPTOUINT_F32_I128;
+ break;
+ case MVT::f64:
+ LC = RTLIB::FPTOUINT_F64_I128;
+ break;
+ case MVT::f80:
+ LC = RTLIB::FPTOUINT_F80_I128;
+ break;
+ case MVT::ppcf128:
+ LC = RTLIB::FPTOUINT_PPCF128_I128;
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported FP_TO_UINT!");
+
+ SDOperand Op = GetSoftenedFloat(N->getOperand(0));
+ return MakeLibCall(LC, RVT, &Op, 1, false);
+}
+
SDOperand DAGTypeLegalizer::SoftenFloatOp_SELECT_CC(SDNode *N) {
SDOperand NewLHS = N->getOperand(0), NewRHS = N->getOperand(1);
ISD::CondCode CCCode = cast<CondCodeSDNode>(N->getOperand(4))->get();
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeTypes.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeTypes.h?rev=53286&r1=53285&r2=53286&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeTypes.h (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeTypes.h Wed Jul 9 06:13:46 2008
@@ -347,6 +347,8 @@
bool SoftenFloatOperand(SDNode *N, unsigned OpNo);
SDOperand SoftenFloatOp_BIT_CONVERT(SDNode *N);
SDOperand SoftenFloatOp_BR_CC(SDNode *N);
+ SDOperand SoftenFloatOp_FP_TO_SINT(SDNode *N);
+ SDOperand SoftenFloatOp_FP_TO_UINT(SDNode *N);
SDOperand SoftenFloatOp_SELECT_CC(SDNode *N);
SDOperand SoftenFloatOp_SETCC(SDNode *N);
SDOperand SoftenFloatOp_STORE(SDNode *N, unsigned OpNo);
More information about the llvm-commits
mailing list