mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-01 00:33:09 +00:00
Fix a bug in outputting branches to constant PCs. Since the PC is supplied as
a full 64-bit address, it must be adjusted to fit in the branch instruction's immediate field. (This is only used in the reoptimizer, for now.) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@13608 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a900452d37
commit
ceabd97423
@ -597,8 +597,9 @@ int64_t SparcV9CodeEmitter::getMachineOpValue(MachineInstr &MI,
|
||||
unsigned* CurrPC = (unsigned*)(intptr_t)MCE.getCurrentPCValue();
|
||||
BBRefs.push_back(std::make_pair(BB, std::make_pair(CurrPC, &MI)));
|
||||
} else if (const ConstantInt *CI = dyn_cast<ConstantInt>(V)) {
|
||||
// Make constant PC-relative by subtracting the PC from it.
|
||||
rv = CI->getRawValue() - MCE.getCurrentPCValue();
|
||||
// The real target of the branch is CI = PC + (rv * 4)
|
||||
// So undo that: give the instruction (CI - PC) / 4
|
||||
rv = (CI->getRawValue() - MCE.getCurrentPCValue()) / 4;
|
||||
} else if (GlobalValue *GV = dyn_cast<GlobalValue>(V)) {
|
||||
// same as MO.isGlobalAddress()
|
||||
DEBUG(std::cerr << "GlobalValue: ");
|
||||
|
Loading…
Reference in New Issue
Block a user