[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
Chris Lattner
lattner at cs.uiuc.edu
Sun Jul 17 21:31:25 PDT 2005
Changes in directory llvm/lib/CodeGen/SelectionDAG:
LegalizeDAG.cpp updated: 1.142 -> 1.143
---
Log message:
The assertion was wrong: the code only worked for i64. While we're at it,
expand the code to work for all integer datatypes. This should unbreak
alpha.
---
Diffs of the changes: (+11 -3)
LegalizeDAG.cpp | 14 +++++++++++---
1 files changed, 11 insertions(+), 3 deletions(-)
Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.142 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.143
--- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.142 Fri Jul 15 21:02:34 2005
+++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Sun Jul 17 23:31:14 2005
@@ -158,8 +158,6 @@
/// legal for the target.
SDOperand SelectionDAGLegalize::ExpandLegalUINT_TO_FP(SDOperand Op0,
MVT::ValueType DestVT) {
- assert(Op0.getValueType() == MVT::i32 &&
- "This code only works for i32 input: extend in the future");
SDOperand Tmp1 = DAG.getNode(ISD::SINT_TO_FP, DestVT, Op0);
SDOperand SignSet = DAG.getSetCC(ISD::SETLT, TLI.getSetCCResultTy(),
@@ -170,7 +168,17 @@
SDOperand CstOffset = DAG.getNode(ISD::SELECT, Zero.getValueType(),
SignSet, Four, Zero);
- uint64_t FF = 0x5f800000ULL;
+ // If the sign bit of the integer is set, the large number will be treated as
+ // a negative number. To counteract this, the dynamic code adds an offset
+ // depending on the data type.
+ uint64_t FF;
+ switch (Op0.getValueType()) {
+ default: assert(0 && "Unsupported integer type!");
+ case MVT::i8 : FF = 0x43800000ULL; break; // 2^8 (as a float)
+ case MVT::i16: FF = 0x47800000ULL; break; // 2^16 (as a float)
+ case MVT::i32: FF = 0x4F800000ULL; break; // 2^32 (as a float)
+ case MVT::i64: FF = 0x5F800000ULL; break; // 2^64 (as a float)
+ }
if (TLI.isLittleEndian()) FF <<= 32;
static Constant *FudgeFactor = ConstantUInt::get(Type::ULongTy, FF);
More information about the llvm-commits
mailing list