diff options
| author | Dale Johannesen <dalej@apple.com> | 2008-11-12 18:38:44 +0000 |
|---|---|---|
| committer | Dale Johannesen <dalej@apple.com> | 2008-11-12 18:38:44 +0000 |
| commit | 6467858be13ff7c2d0fbe7f7dda2963668bad900 (patch) | |
| tree | 035fb05d89a19bf621f074a95ba39253cb454565 /llvm/lib/CodeGen/SelectionDAG | |
| parent | a11693bc37b1b03da8cbfa088e79250fefc2f898 (diff) | |
| download | bcm5719-llvm-6467858be13ff7c2d0fbe7f7dda2963668bad900.tar.gz bcm5719-llvm-6467858be13ff7c2d0fbe7f7dda2963668bad900.zip | |
Fix unsigned char->ppcf128 conversion.
llvm-svn: 59150
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp index 0e90ed29b6b..9084e582da0 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp @@ -919,17 +919,22 @@ void DAGTypeLegalizer::ExpandFloatRes_XINT_TO_FP(SDNode *N, SDValue &Lo, MVT NVT = TLI.getTypeToTransformTo(VT); SDValue Src = N->getOperand(0); MVT SrcVT = Src.getValueType(); + bool isSigned = N->getOpcode() == ISD::SINT_TO_FP; // First do an SINT_TO_FP, whether the original was signed or unsigned. + // When promoting partial word types to i32 we must honor the signedness, + // though. if (SrcVT.bitsLE(MVT::i32)) { // The integer can be represented exactly in an f64. - Src = DAG.getNode(ISD::SIGN_EXTEND, MVT::i32, Src); + Src = DAG.getNode(isSigned ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND, + MVT::i32, Src); Lo = DAG.getConstantFP(APFloat(APInt(NVT.getSizeInBits(), 0)), NVT); Hi = DAG.getNode(ISD::SINT_TO_FP, NVT, Src); } else { RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL; if (SrcVT.bitsLE(MVT::i64)) { - Src = DAG.getNode(ISD::SIGN_EXTEND, MVT::i64, Src); + Src = DAG.getNode(isSigned ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND, + MVT::i64, Src); LC = RTLIB::SINTTOFP_I64_PPCF128; } else if (SrcVT.bitsLE(MVT::i128)) { Src = DAG.getNode(ISD::SIGN_EXTEND, MVT::i128, Src); @@ -943,7 +948,7 @@ void DAGTypeLegalizer::ExpandFloatRes_XINT_TO_FP(SDNode *N, SDValue &Lo, Lo = Hi.getOperand(0); Hi = Hi.getOperand(1); } - if (N->getOpcode() == ISD::SINT_TO_FP) + if (isSigned) return; // Unsigned - fix up the SINT_TO_FP value just calculated. |

