mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-25 13:24:46 +00:00
Support an extension of ARM asm syntax to allow immediate operands to ADR instructions. This is helpful for disassembler testing, and indeed exposed a disassembler bug that is also fixed here.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@138635 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -570,9 +570,18 @@ getUnconditionalBranchTargetOpValue(const MCInst &MI, unsigned OpIdx,
|
||||
uint32_t ARMMCCodeEmitter::
|
||||
getAdrLabelOpValue(const MCInst &MI, unsigned OpIdx,
|
||||
SmallVectorImpl<MCFixup> &Fixups) const {
|
||||
assert(MI.getOperand(OpIdx).isExpr() && "Unexpected adr target type!");
|
||||
return ::getBranchTargetOpValue(MI, OpIdx, ARM::fixup_arm_adr_pcrel_12,
|
||||
Fixups);
|
||||
const MCOperand MO = MI.getOperand(OpIdx);
|
||||
if (MO.isExpr())
|
||||
return ::getBranchTargetOpValue(MI, OpIdx, ARM::fixup_arm_adr_pcrel_12,
|
||||
Fixups);
|
||||
int32_t offset = MO.getImm();
|
||||
uint32_t Val = 0x2000;
|
||||
if (offset < 0) {
|
||||
Val = 0x1000;
|
||||
offset *= -1;
|
||||
}
|
||||
Val |= offset;
|
||||
return Val;
|
||||
}
|
||||
|
||||
/// getAdrLabelOpValue - Return encoding info for 12-bit immediate ADR label
|
||||
@@ -580,9 +589,11 @@ getAdrLabelOpValue(const MCInst &MI, unsigned OpIdx,
|
||||
uint32_t ARMMCCodeEmitter::
|
||||
getT2AdrLabelOpValue(const MCInst &MI, unsigned OpIdx,
|
||||
SmallVectorImpl<MCFixup> &Fixups) const {
|
||||
assert(MI.getOperand(OpIdx).isExpr() && "Unexpected adr target type!");
|
||||
return ::getBranchTargetOpValue(MI, OpIdx, ARM::fixup_t2_adr_pcrel_12,
|
||||
Fixups);
|
||||
const MCOperand MO = MI.getOperand(OpIdx);
|
||||
if (MO.isExpr())
|
||||
return ::getBranchTargetOpValue(MI, OpIdx, ARM::fixup_t2_adr_pcrel_12,
|
||||
Fixups);
|
||||
return MO.getImm();
|
||||
}
|
||||
|
||||
/// getAdrLabelOpValue - Return encoding info for 8-bit immediate ADR label
|
||||
@@ -590,9 +601,11 @@ getT2AdrLabelOpValue(const MCInst &MI, unsigned OpIdx,
|
||||
uint32_t ARMMCCodeEmitter::
|
||||
getThumbAdrLabelOpValue(const MCInst &MI, unsigned OpIdx,
|
||||
SmallVectorImpl<MCFixup> &Fixups) const {
|
||||
assert(MI.getOperand(OpIdx).isExpr() && "Unexpected adr target type!");
|
||||
return ::getBranchTargetOpValue(MI, OpIdx, ARM::fixup_thumb_adr_pcrel_10,
|
||||
Fixups);
|
||||
const MCOperand MO = MI.getOperand(OpIdx);
|
||||
if (MO.isExpr())
|
||||
return ::getBranchTargetOpValue(MI, OpIdx, ARM::fixup_thumb_adr_pcrel_10,
|
||||
Fixups);
|
||||
return MO.getImm();
|
||||
}
|
||||
|
||||
/// getThumbAddrModeRegRegOpValue - Return encoding info for 'reg + reg'
|
||||
|
Reference in New Issue
Block a user