mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-15 04:30:12 +00:00
Make sure to handle small negative values hiding as large unsigned longs --
this is a common case created by the front-end. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4127 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
d0451a9233
commit
893cace8e2
@ -266,7 +266,7 @@ CreateIntSetInstruction(const TargetMachine& target,
|
||||
// Entry == 0 ==> no immediate constant field exists at all.
|
||||
// Entry > 0 ==> abs(immediate constant) <= Entry
|
||||
//
|
||||
vector<unsigned int> MaxConstantsTable(Instruction::NumOtherOps);
|
||||
vector<int> MaxConstantsTable(Instruction::NumOtherOps);
|
||||
|
||||
static int
|
||||
MaxConstantForInstr(unsigned llvmOpCode)
|
||||
@ -343,13 +343,14 @@ UltraSparcInstrInfo::ConstantMayNotFitInImmedField(const Constant* CV,
|
||||
return false;
|
||||
|
||||
if (const ConstantUInt* U = dyn_cast<ConstantUInt>(CV))
|
||||
return (U->getValue() > MaxConstantsTable[I->getOpcode()]);
|
||||
/* Large unsigned longs may really just be small negative signed longs */
|
||||
return (labs((int64_t) U->getValue()) > MaxConstantsTable[I->getOpcode()]);
|
||||
|
||||
if (const ConstantSInt* S = dyn_cast<ConstantSInt>(CV))
|
||||
return (labs(S->getValue()) > (int) MaxConstantsTable[I->getOpcode()]);
|
||||
return (labs(S->getValue()) > MaxConstantsTable[I->getOpcode()]);
|
||||
|
||||
if (isa<ConstantBool>(CV))
|
||||
return (1U > MaxConstantsTable[I->getOpcode()]);
|
||||
return (1 > MaxConstantsTable[I->getOpcode()]);
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -380,6 +381,11 @@ UltraSparcInstrInfo::CreateCodeToLoadConst(const TargetMachine& target,
|
||||
//
|
||||
const Type* valType = val->getType();
|
||||
|
||||
// Unfortunate special case: a ConstantPointerRef is just a
|
||||
// reference to GlobalValue.
|
||||
if (isa<ConstantPointerRef>(val))
|
||||
val = cast<ConstantPointerRef>(val)->getValue();
|
||||
|
||||
if (isa<GlobalValue>(val))
|
||||
{
|
||||
TmpInstruction* tmpReg =
|
||||
|
Loading…
Reference in New Issue
Block a user