From 3bce6b369a2ce19195aa6e46443d10b5372f973e Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 9 Sep 2001 23:01:32 +0000 Subject: [PATCH] Implement the subset of the GetConstantValueAsSignedInt function that is needed, locally. llvm-svn: 524 --- lib/CodeGen/MachineInstr.cpp | 51 ++++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/lib/CodeGen/MachineInstr.cpp b/lib/CodeGen/MachineInstr.cpp index aa9765d21d2..7a5214d260d 100644 --- a/lib/CodeGen/MachineInstr.cpp +++ b/lib/CodeGen/MachineInstr.cpp @@ -305,31 +305,44 @@ ChooseRegOrImmed(Value* val, // 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; }