diff options
author | Vikram S. Adve <vadve@cs.uiuc.edu> | 2003-07-29 19:50:12 +0000 |
---|---|---|
committer | Vikram S. Adve <vadve@cs.uiuc.edu> | 2003-07-29 19:50:12 +0000 |
commit | 9143f1962e1263ee514c315c87a64f4c35061c07 (patch) | |
tree | 2a3c7b808b0ac777149ed5be74ecbb9aea9f8afa /llvm/lib/CodeGen/InstrSelection | |
parent | c9cb319bcbcf81efdc88b5c66b4aabffd7ac54f9 (diff) | |
download | bcm5719-llvm-9143f1962e1263ee514c315c87a64f4c35061c07.tar.gz bcm5719-llvm-9143f1962e1263ee514c315c87a64f4c35061c07.zip |
All constant-evaluation code now unified into
TargetInstrInfo::ConvertConstantToIntType().
llvm-svn: 7390
Diffstat (limited to 'llvm/lib/CodeGen/InstrSelection')
-rw-r--r-- | llvm/lib/CodeGen/InstrSelection/InstrSelectionSupport.cpp | 39 |
1 files changed, 8 insertions, 31 deletions
diff --git a/llvm/lib/CodeGen/InstrSelection/InstrSelectionSupport.cpp b/llvm/lib/CodeGen/InstrSelection/InstrSelectionSupport.cpp index 22320130f4b..c88fa23a90c 100644 --- a/llvm/lib/CodeGen/InstrSelection/InstrSelectionSupport.cpp +++ b/llvm/lib/CodeGen/InstrSelection/InstrSelectionSupport.cpp @@ -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 // |