[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