Implement the subset of the GetConstantValueAsSignedInt function that is needed, locally.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@524 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/MachineInstr.cpp b/lib/CodeGen/MachineInstr.cpp
index aa9765d..7a5214d 100644
--- a/lib/CodeGen/MachineInstr.cpp
+++ b/lib/CodeGen/MachineInstr.cpp
@@ -305,31 +305,44 @@
   
   // Check for the common case first: argument is not constant
   // 
-  if (val->getValueType() != Value::ConstantVal)
-    return opType;
+  ConstPoolVal *CPV = val->castConstant();
+  if (!CPV) return opType;
+
+  if (CPV->getType() == Type::BoolTy) {
+    ConstPoolBool *CPB = (ConstPoolBool*)CPV;
+    if (!CPB->getValue() && target.zeroRegNum >= 0) {
+      getMachineRegNum = target.zeroRegNum;
+      return MachineOperand::MO_MachineRegister;
+    }
+
+    getImmedValue = 1;
+    return MachineOperand::MO_SignExtendedImmed;
+  }
   
+  if (!CPV->getType()->isIntegral()) return opType;
+
   // Now get the constant value and check if it fits in the IMMED field.
   // Take advantage of the fact that the max unsigned value will rarely
   // fit into any IMMED field and ignore that case (i.e., cast smaller
   // unsigned constants to signed).
   // 
-  bool isValidConstant;
-  int64_t intValue = GetConstantValueAsSignedInt(val, isValidConstant);
-  
-  if (isValidConstant)
-    {
-      if (intValue == 0 && target.zeroRegNum >= 0)
-	{
-	  opType = MachineOperand::MO_MachineRegister;
-	  getMachineRegNum = target.zeroRegNum;
-	}
-      else if (canUseImmed &&
-	       target.getInstrInfo().constantFitsInImmedField(opCode,intValue))
-	{
-	  opType = MachineOperand::MO_SignExtendedImmed;
-	  getImmedValue = intValue;
-	}
-    }
+  int64_t intValue;
+  if (CPV->getType()->isSigned()) {
+    intValue = ((ConstPoolSInt*)CPV)->getValue();
+  } else {
+    uint64_t V = ((ConstPoolUInt*)CPV)->getValue();
+    if (V >= INT64_MAX) return opType;
+    intValue = (int64_t)V;
+  }
+
+  if (intValue == 0 && target.zeroRegNum >= 0){
+    opType = MachineOperand::MO_MachineRegister;
+    getMachineRegNum = target.zeroRegNum;
+  } else if (canUseImmed &&
+	     target.getInstrInfo().constantFitsInImmedField(opCode, intValue)) {
+    opType = MachineOperand::MO_SignExtendedImmed;
+    getImmedValue = intValue;
+  }
   
   return opType;
 }