All constant-evaluation code now unified into
authorVikram S. Adve <vadve@cs.uiuc.edu>
Tue, 29 Jul 2003 19:50:12 +0000 (19:50 +0000)
committerVikram S. Adve <vadve@cs.uiuc.edu>
Tue, 29 Jul 2003 19:50:12 +0000 (19:50 +0000)
TargetInstrInfo::ConvertConstantToIntType().

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7390 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/InstrSelection/InstrSelectionSupport.cpp
lib/Target/SparcV9/InstrSelection/InstrSelectionSupport.cpp

index 22320130f4bb3bace92fcd4b6f265fa681d4681b..c88fa23a90c639b5197ea6500f345f23435dd332 100644 (file)
@@ -87,44 +87,21 @@ ChooseRegOrImmed(Value* val,
   getImmedValue = 0;
 
   // To use reg or immed, constant needs to be integer, bool, or a NULL pointer
-  Constant *CPV = dyn_cast<Constant>(val);
-  if (CPV == NULL
-      || CPV->isConstantExpr()
-      || (! CPV->getType()->isIntegral() &&
-          ! (isa<PointerType>(CPV->getType()) && CPV->isNullValue())))
+  // TargetInstrInfo::ConvertConstantToIntType() does the right conversions:
+  bool isValidConstant;
+  uint64_t valueToUse =
+    target.getInstrInfo().ConvertConstantToIntType(target, val, val->getType(),
+                                                   isValidConstant);
+  if (! isValidConstant)
     return MachineOperand::MO_VirtualRegister;
 
-  // 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).
+  // Now check if the constant value fits in the IMMED field.
   // 
-  int64_t intValue;
-  if (isa<PointerType>(CPV->getType()))
-    intValue = 0;                       // We checked above that it is NULL 
-  else if (ConstantBool* CB = dyn_cast<ConstantBool>(CPV))
-    intValue = CB->getValue();
-  else if (CPV->getType()->isSigned())
-    intValue = cast<ConstantSInt>(CPV)->getValue();
-  else
-    { // get the int value and sign-extend if original was less than 64 bits
-      intValue = cast<ConstantUInt>(CPV)->getValue();
-      switch(CPV->getType()->getPrimitiveID())
-        {
-        case Type::UByteTyID:  intValue = (int64_t) (int8_t) intValue; break;
-        case Type::UShortTyID: intValue = (int64_t) (short)  intValue; break;
-        case Type::UIntTyID:   intValue = (int64_t) (int)    intValue; break;
-        default: break;
-        }
-    }
-
-  return ChooseRegOrImmed(intValue, CPV->getType()->isSigned(),
+  return ChooseRegOrImmed((int64_t) valueToUse, val->getType()->isSigned(),
                           opCode, target, canUseImmed,
                           getMachineRegNum, getImmedValue);
 }
 
-
-
 //---------------------------------------------------------------------------
 // Function: FixConstantOperandsForInstr
 // 
index 22320130f4bb3bace92fcd4b6f265fa681d4681b..c88fa23a90c639b5197ea6500f345f23435dd332 100644 (file)
@@ -87,44 +87,21 @@ ChooseRegOrImmed(Value* val,
   getImmedValue = 0;
 
   // To use reg or immed, constant needs to be integer, bool, or a NULL pointer
-  Constant *CPV = dyn_cast<Constant>(val);
-  if (CPV == NULL
-      || CPV->isConstantExpr()
-      || (! CPV->getType()->isIntegral() &&
-          ! (isa<PointerType>(CPV->getType()) && CPV->isNullValue())))
+  // TargetInstrInfo::ConvertConstantToIntType() does the right conversions:
+  bool isValidConstant;
+  uint64_t valueToUse =
+    target.getInstrInfo().ConvertConstantToIntType(target, val, val->getType(),
+                                                   isValidConstant);
+  if (! isValidConstant)
     return MachineOperand::MO_VirtualRegister;
 
-  // 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).
+  // Now check if the constant value fits in the IMMED field.
   // 
-  int64_t intValue;
-  if (isa<PointerType>(CPV->getType()))
-    intValue = 0;                       // We checked above that it is NULL 
-  else if (ConstantBool* CB = dyn_cast<ConstantBool>(CPV))
-    intValue = CB->getValue();
-  else if (CPV->getType()->isSigned())
-    intValue = cast<ConstantSInt>(CPV)->getValue();
-  else
-    { // get the int value and sign-extend if original was less than 64 bits
-      intValue = cast<ConstantUInt>(CPV)->getValue();
-      switch(CPV->getType()->getPrimitiveID())
-        {
-        case Type::UByteTyID:  intValue = (int64_t) (int8_t) intValue; break;
-        case Type::UShortTyID: intValue = (int64_t) (short)  intValue; break;
-        case Type::UIntTyID:   intValue = (int64_t) (int)    intValue; break;
-        default: break;
-        }
-    }
-
-  return ChooseRegOrImmed(intValue, CPV->getType()->isSigned(),
+  return ChooseRegOrImmed((int64_t) valueToUse, val->getType()->isSigned(),
                           opCode, target, canUseImmed,
                           getMachineRegNum, getImmedValue);
 }
 
-
-
 //---------------------------------------------------------------------------
 // Function: FixConstantOperandsForInstr
 //