mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-02 07:32:52 +00:00
Thumb2 ldr pc-relative encoding fixes.
We were parsing label references to the i12 encoding, which isn't right. They need to go to the pci variant instead. More of rdar://10348687 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@143068 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
2a1286ed58
commit
a581328ceb
@ -1460,7 +1460,7 @@ def t2STRD_POST : T2Ii8s4post<0, 1, 0, (outs GPR:$wb),
|
|||||||
"$addr.base = $wb", []>;
|
"$addr.base = $wb", []>;
|
||||||
|
|
||||||
// T2Ipl (Preload Data/Instruction) signals the memory system of possible future
|
// T2Ipl (Preload Data/Instruction) signals the memory system of possible future
|
||||||
// data/instruction access. These are for disassembly only.
|
// data/instruction access.
|
||||||
// instr_write is inverted for Thumb mode: (prefetch 3) -> (preload 0),
|
// instr_write is inverted for Thumb mode: (prefetch 3) -> (preload 0),
|
||||||
// (prefetch 1) -> (preload 2), (prefetch 2) -> (preload 1).
|
// (prefetch 1) -> (preload 2), (prefetch 2) -> (preload 1).
|
||||||
multiclass T2Ipl<bits<1> write, bits<1> instr, string opc> {
|
multiclass T2Ipl<bits<1> write, bits<1> instr, string opc> {
|
||||||
@ -1518,6 +1518,10 @@ multiclass T2Ipl<bits<1> write, bits<1> instr, string opc> {
|
|||||||
|
|
||||||
let DecoderMethod = "DecodeT2LoadShift";
|
let DecoderMethod = "DecodeT2LoadShift";
|
||||||
}
|
}
|
||||||
|
// FIXME: We should have a separate 'pci' variant here. As-is we represent
|
||||||
|
// it via the i12 variant, which it's related to, but that means we can
|
||||||
|
// represent negative immediates, which aren't legal for anything except
|
||||||
|
// the 'pci' case (Rn == 15).
|
||||||
}
|
}
|
||||||
|
|
||||||
defm t2PLD : T2Ipl<0, 0, "pld">, Requires<[IsThumb2]>;
|
defm t2PLD : T2Ipl<0, 0, "pld">, Requires<[IsThumb2]>;
|
||||||
@ -3906,6 +3910,17 @@ def : t2InstAlias<"ldrsb${p} $Rt, $addr",
|
|||||||
def : t2InstAlias<"ldrsh${p} $Rt, $addr",
|
def : t2InstAlias<"ldrsh${p} $Rt, $addr",
|
||||||
(t2LDRSHs rGPR:$Rt, t2addrmode_so_reg:$addr, pred:$p)>;
|
(t2LDRSHs rGPR:$Rt, t2addrmode_so_reg:$addr, pred:$p)>;
|
||||||
|
|
||||||
|
def : t2InstAlias<"ldr${p} $Rt, $addr",
|
||||||
|
(t2LDRpci GPR:$Rt, t2ldrlabel:$addr, pred:$p)>;
|
||||||
|
def : t2InstAlias<"ldrb${p} $Rt, $addr",
|
||||||
|
(t2LDRBpci rGPR:$Rt, t2ldrlabel:$addr, pred:$p)>;
|
||||||
|
def : t2InstAlias<"ldrh${p} $Rt, $addr",
|
||||||
|
(t2LDRHpci rGPR:$Rt, t2ldrlabel:$addr, pred:$p)>;
|
||||||
|
def : t2InstAlias<"ldrsb${p} $Rt, $addr",
|
||||||
|
(t2LDRSBpci rGPR:$Rt, t2ldrlabel:$addr, pred:$p)>;
|
||||||
|
def : t2InstAlias<"ldrsh${p} $Rt, $addr",
|
||||||
|
(t2LDRSHpci rGPR:$Rt, t2ldrlabel:$addr, pred:$p)>;
|
||||||
|
|
||||||
// Alias for MVN without the ".w" optional width specifier.
|
// Alias for MVN without the ".w" optional width specifier.
|
||||||
def : t2InstAlias<"mvn${s}${p} $Rd, $Rm",
|
def : t2InstAlias<"mvn${s}${p} $Rd, $Rm",
|
||||||
(t2MVNr rGPR:$Rd, rGPR:$Rm, pred:$p, cc_out:$s)>;
|
(t2MVNr rGPR:$Rd, rGPR:$Rm, pred:$p, cc_out:$s)>;
|
||||||
|
@ -865,12 +865,6 @@ public:
|
|||||||
return Val > -256 && Val < 0;
|
return Val > -256 && Val < 0;
|
||||||
}
|
}
|
||||||
bool isMemUImm12Offset() const {
|
bool isMemUImm12Offset() const {
|
||||||
// If we have an immediate that's not a constant, treat it as a label
|
|
||||||
// reference needing a fixup. If it is a constant, it's something else
|
|
||||||
// and we reject it.
|
|
||||||
if (Kind == k_Immediate && !isa<MCConstantExpr>(getImm()))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
if (!isMemory() || Memory.OffsetRegNum != 0 || Memory.Alignment != 0)
|
if (!isMemory() || Memory.OffsetRegNum != 0 || Memory.Alignment != 0)
|
||||||
return false;
|
return false;
|
||||||
// Immediate offset in range [0, 4095].
|
// Immediate offset in range [0, 4095].
|
||||||
|
@ -638,9 +638,12 @@ _func:
|
|||||||
@ LDR(literal)
|
@ LDR(literal)
|
||||||
@------------------------------------------------------------------------------
|
@------------------------------------------------------------------------------
|
||||||
ldr.w r5, _foo
|
ldr.w r5, _foo
|
||||||
|
ldr lr, (_strcmp-4)
|
||||||
|
|
||||||
@ CHECK: ldr.w r5, _foo @ encoding: [0x5f'A',0xf8'A',A,0x50'A']
|
@ CHECK: ldr.w r5, _foo @ encoding: [0x5f'A',0xf8'A',A,0x50'A']
|
||||||
@ fixup A - offset: 0, value: _foo, kind: fixup_t2_ldst_pcrel_12
|
@ CHECK: @ fixup A - offset: 0, value: _foo, kind: fixup_t2_ldst_pcrel_12
|
||||||
|
@ CHECK: ldr.w lr, _strcmp-4 @ encoding: [0x5f'A',0xf8'A',A,0xe0'A']
|
||||||
|
@ CHECK: @ fixup A - offset: 0, value: _strcmp-4, kind: fixup_t2_ldst_pcrel_12
|
||||||
|
|
||||||
|
|
||||||
@------------------------------------------------------------------------------
|
@------------------------------------------------------------------------------
|
||||||
@ -813,7 +816,7 @@ _func:
|
|||||||
@------------------------------------------------------------------------------
|
@------------------------------------------------------------------------------
|
||||||
ldrh r5, _bar
|
ldrh r5, _bar
|
||||||
|
|
||||||
@ CHECK: ldrh.w r5, _bar @ encoding: [0xbf'A',0xf8'A',A,0x50'A']
|
@ CHECK: ldrh.w r5, _bar @ encoding: [0x3f'A',0xf8'A',A,0x50'A']
|
||||||
@ CHECK: @ fixup A - offset: 0, value: _bar, kind: fixup_t2_ldst_pcrel_12
|
@ CHECK: @ fixup A - offset: 0, value: _bar, kind: fixup_t2_ldst_pcrel_12
|
||||||
|
|
||||||
|
|
||||||
@ -882,7 +885,7 @@ _func:
|
|||||||
@------------------------------------------------------------------------------
|
@------------------------------------------------------------------------------
|
||||||
ldrsb r5, _bar
|
ldrsb r5, _bar
|
||||||
|
|
||||||
@ CHECK: ldrsb.w r5, _bar @ encoding: [0x9f'A',0xf9'A',A,0x50'A']
|
@ CHECK: ldrsb.w r5, _bar @ encoding: [0x1f'A',0xf9'A',A,0x50'A']
|
||||||
@ CHECK: @ fixup A - offset: 0, value: _bar, kind: fixup_t2_ldst_pcrel_12
|
@ CHECK: @ fixup A - offset: 0, value: _bar, kind: fixup_t2_ldst_pcrel_12
|
||||||
|
|
||||||
|
|
||||||
@ -951,7 +954,7 @@ _func:
|
|||||||
@------------------------------------------------------------------------------
|
@------------------------------------------------------------------------------
|
||||||
ldrsh r5, _bar
|
ldrsh r5, _bar
|
||||||
|
|
||||||
@ CHECK: ldrsh.w r5, _bar @ encoding: [0xbf'A',0xf9'A',A,0x50'A']
|
@ CHECK: ldrsh.w r5, _bar @ encoding: [0x3f'A',0xf9'A',A,0x50'A']
|
||||||
@ CHECK: @ fixup A - offset: 0, value: _bar, kind: fixup_t2_ldst_pcrel_12
|
@ CHECK: @ fixup A - offset: 0, value: _bar, kind: fixup_t2_ldst_pcrel_12
|
||||||
|
|
||||||
@ TEMPORARILY DISABLED:
|
@ TEMPORARILY DISABLED:
|
||||||
@ -1354,9 +1357,9 @@ _func:
|
|||||||
@------------------------------------------------------------------------------
|
@------------------------------------------------------------------------------
|
||||||
@ PLD(literal)
|
@ PLD(literal)
|
||||||
@------------------------------------------------------------------------------
|
@------------------------------------------------------------------------------
|
||||||
pld _foo
|
@ pld _foo
|
||||||
|
|
||||||
@ CHECK: pld _foo @ encoding: [0x9f'A',0xf8'A',A,0xf0'A']
|
@ FIXME: pld _foo @ encoding: [0x9f'A',0xf8'A',A,0xf0'A']
|
||||||
@ fixup A - offset: 0, value: _foo, kind: fixup_t2_ldst_pcrel_12
|
@ fixup A - offset: 0, value: _foo, kind: fixup_t2_ldst_pcrel_12
|
||||||
|
|
||||||
|
|
||||||
@ -1396,10 +1399,10 @@ _func:
|
|||||||
@------------------------------------------------------------------------------
|
@------------------------------------------------------------------------------
|
||||||
@ PLI(literal)
|
@ PLI(literal)
|
||||||
@------------------------------------------------------------------------------
|
@------------------------------------------------------------------------------
|
||||||
pli _foo
|
@ pli _foo
|
||||||
|
|
||||||
|
|
||||||
@ CHECK: pli _foo @ encoding: [0x9f'A',0xf9'A',A,0xf0'A']
|
@ FIXME: pli _foo @ encoding: [0x9f'A',0xf9'A',A,0xf0'A']
|
||||||
@ fixup A - offset: 0, value: _foo, kind: fixup_t2_ldst_pcrel_12
|
@ fixup A - offset: 0, value: _foo, kind: fixup_t2_ldst_pcrel_12
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user