aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2009-01-17 07:40:19 +0000
committerBill Wendling <isanbard@gmail.com>2009-01-17 07:40:19 +0000
commit030939c87b68292e474dbf518eebf83c9d78d01c (patch)
treec076ff6475e00ffaac80e95172495abcc22c9d6b
parent8e278266494c71471bfd7c29cccfcdcef433a4ba (diff)
Extend thi
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@62415 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Target/X86/X86ISelLowering.cpp23
1 files changed, 12 insertions, 11 deletions
diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp
index 6dae08d9f9..544b71cf8f 100644
--- a/lib/Target/X86/X86ISelLowering.cpp
+++ b/lib/Target/X86/X86ISelLowering.cpp
@@ -121,11 +121,7 @@ X86TargetLowering::X86TargetLowering(X86TargetMachine &TM)
setOperationAction(ISD::UINT_TO_FP , MVT::i64 , Custom);
// We have faster algorithm for ui32->single only.
-#if 0
setOperationAction(ISD::UINT_TO_FP , MVT::i32 , Custom);
-#else
- setOperationAction(ISD::UINT_TO_FP , MVT::i32 , Expand);
-#endif
} else
setOperationAction(ISD::UINT_TO_FP , MVT::i32 , Promote);
}
@@ -4874,8 +4870,17 @@ SDValue X86TargetLowering::LowerUINT_TO_FP_i32(SDValue Op, SelectionDAG &DAG) {
SDValue Sub = DAG.getNode(ISD::FSUB, MVT::f64, Or, Bias);
// Handle final rounding.
- return DAG.getNode(ISD::FP_ROUND, MVT::f32, Sub,
- DAG.getIntPtrConstant(0));
+ MVT DestVT = Op.getValueType();
+
+ if (DestVT.bitsLT(MVT::f64)) {
+ return DAG.getNode(ISD::FP_ROUND, DestVT, Sub,
+ DAG.getIntPtrConstant(0));
+ } else if (DestVT.bitsGT(MVT::f64)) {
+ return DAG.getNode(ISD::FP_EXTEND, DestVT, Sub);
+ }
+
+ // Handle final rounding.
+ return Sub;
}
SDValue X86TargetLowering::LowerUINT_TO_FP(SDValue Op, SelectionDAG &DAG) {
@@ -4885,13 +4890,9 @@ SDValue X86TargetLowering::LowerUINT_TO_FP(SDValue Op, SelectionDAG &DAG) {
// We only handle SSE2 f64 target here; caller can handle the rest.
if (Op.getValueType() != MVT::f64 || !X86ScalarSSEf64)
return SDValue();
-
+
return LowerUINT_TO_FP_i64(Op, DAG);
} else if (SrcVT == MVT::i32) {
- // We only handle SSE2 f32 target here; caller can handle the rest.
- if (Op.getValueType() != MVT::f32 || !X86ScalarSSEf32)
- return SDValue();
-
return LowerUINT_TO_FP_i32(Op, DAG);
}