diff options
author | Duncan Sands <baldrick@free.fr> | 2008-07-08 10:50:55 +0000 |
---|---|---|
committer | Duncan Sands <baldrick@free.fr> | 2008-07-08 10:50:55 +0000 |
commit | 12525efdfce50db50e27c3bb95f5c3ea7baf7ec1 (patch) | |
tree | 83042ed8db0233d18b8980d1dfb8cac08a4ad9db | |
parent | acf0189b4baaabe641e52e34c0504eea4fd7cc66 (diff) | |
download | bcm5719-llvm-12525efdfce50db50e27c3bb95f5c3ea7baf7ec1.tar.gz bcm5719-llvm-12525efdfce50db50e27c3bb95f5c3ea7baf7ec1.zip |
LegalizeTypes support for FP_ROUND and FP_EXTEND
soft float.
llvm-svn: 53231
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp | 46 | ||||
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h | 2 |
2 files changed, 46 insertions, 2 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp index 4b0d572cd0f..f8340ccc1f6 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp @@ -66,7 +66,7 @@ void DAGTypeLegalizer::SoftenFloatResult(SDNode *N, unsigned ResNo) { cerr << "SoftenFloatResult #" << ResNo << ": "; N->dump(&DAG); cerr << "\n"; #endif - assert(0 && "Do not know how to convert the result of this operator!"); + assert(0 && "Do not know how to soften the result of this operator!"); abort(); case ISD::BIT_CONVERT: R = SoftenFloatRes_BIT_CONVERT(N); break; @@ -75,6 +75,8 @@ void DAGTypeLegalizer::SoftenFloatResult(SDNode *N, unsigned ResNo) { R = SoftenFloatRes_ConstantFP(cast<ConstantFPSDNode>(N)); break; case ISD::FCOPYSIGN: R = SoftenFloatRes_FCOPYSIGN(N); break; + case ISD::FP_EXTEND: R = SoftenFloatRes_FP_EXTEND(N); break; + case ISD::FP_ROUND: R = SoftenFloatRes_FP_ROUND(N); break; case ISD::LOAD: R = SoftenFloatRes_LOAD(N); break; case ISD::SINT_TO_FP: case ISD::UINT_TO_FP: R = SoftenFloatRes_XINT_TO_FP(N); break; @@ -169,6 +171,46 @@ SDOperand DAGTypeLegalizer::SoftenFloatRes_FMUL(SDNode *N) { NVT, Ops, 2, false); } +SDOperand DAGTypeLegalizer::SoftenFloatRes_FP_EXTEND(SDNode *N) { + MVT NVT = TLI.getTypeToTransformTo(N->getValueType(0)); + SDOperand Op = N->getOperand(0); + + RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL; + switch (Op.getValueType().getSimpleVT()) { + default: + assert(false && "Unsupported FP_EXTEND!"); + case MVT::f32: + switch (N->getValueType(0).getSimpleVT()) { + default: + assert(false && "Unsupported FP_EXTEND!"); + case MVT::f64: + LC = RTLIB::FPEXT_F32_F64; + } + } + + return MakeLibCall(LC, NVT, &Op, 1, false); +} + +SDOperand DAGTypeLegalizer::SoftenFloatRes_FP_ROUND(SDNode *N) { + MVT NVT = TLI.getTypeToTransformTo(N->getValueType(0)); + SDOperand Op = N->getOperand(0); + + RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL; + switch (Op.getValueType().getSimpleVT()) { + default: + assert(false && "Unsupported FP_ROUND!"); + case MVT::f64: + switch (N->getValueType(0).getSimpleVT()) { + default: + assert(false && "Unsupported FP_ROUND!"); + case MVT::f32: + LC = RTLIB::FPROUND_F64_F32; + } + } + + return MakeLibCall(LC, NVT, &Op, 1, false); +} + SDOperand DAGTypeLegalizer::SoftenFloatRes_FSUB(SDNode *N) { MVT NVT = TLI.getTypeToTransformTo(N->getValueType(0)); SDOperand Ops[2] = { GetSoftenedFloat(N->getOperand(0)), @@ -323,7 +365,7 @@ bool DAGTypeLegalizer::SoftenFloatOperand(SDNode *N, unsigned OpNo) { cerr << "SoftenFloatOperand Op #" << OpNo << ": "; N->dump(&DAG); cerr << "\n"; #endif - assert(0 && "Do not know how to convert this operator's operand!"); + assert(0 && "Do not know how to soften this operator's operand!"); abort(); case ISD::BIT_CONVERT: Res = SoftenFloatOp_BIT_CONVERT(N); break; diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h index 3eba15beb3d..22c4f63e3a8 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h @@ -334,6 +334,8 @@ private: SDOperand SoftenFloatRes_FADD(SDNode *N); SDOperand SoftenFloatRes_FCOPYSIGN(SDNode *N); SDOperand SoftenFloatRes_FMUL(SDNode *N); + SDOperand SoftenFloatRes_FP_EXTEND(SDNode *N); + SDOperand SoftenFloatRes_FP_ROUND(SDNode *N); SDOperand SoftenFloatRes_FSUB(SDNode *N); SDOperand SoftenFloatRes_LOAD(SDNode *N); SDOperand SoftenFloatRes_XINT_TO_FP(SDNode *N); |