diff options
| author | iximeow <me@iximeow.net> | 2026-08-02 19:55:16 +0000 |
|---|---|---|
| committer | iximeow <me@iximeow.net> | 2026-08-02 19:55:16 +0000 |
| commit | 2037c3a87532f39963fb0e39ac06f0fffbb6ae2e (patch) | |
| tree | f64d4e15ac500b08a6e34697836482482cdf26b6 /src/armv7/thumb.rs | |
| parent | b9deebeead9c29c3a14b7293015913734aa66702 (diff) | |
thumb2 preload improvements
Diffstat (limited to 'src/armv7/thumb.rs')
| -rw-r--r-- | src/armv7/thumb.rs | 37 |
1 files changed, 14 insertions, 23 deletions
diff --git a/src/armv7/thumb.rs b/src/armv7/thumb.rs index b8d1192..1f0cdf5 100644 --- a/src/armv7/thumb.rs +++ b/src/armv7/thumb.rs @@ -2419,19 +2419,11 @@ pub fn decode_into<T: Reader<<ARMv7 as Arch>::Address, <ARMv7 as Arch>::Word>>(d } else if op2 & 0b111100 == 0b111000 { // `(immediate, Thumb)` - let opcode = if rt == 0b1111 { - [ - Opcode::PLD, - Opcode::PLD, - Opcode::LDRT, - ][size] - } else { - [ - Opcode::LDRBT, - Opcode::LDRHT, - Opcode::LDRT, - ][size] - }; + let opcode = [ + Opcode::LDRBT, + Opcode::LDRHT, + Opcode::LDRT, + ][size]; let w = lower2[8]; let u = lower2[9]; let p = lower2[10]; @@ -2449,19 +2441,11 @@ pub fn decode_into<T: Reader<<ARMv7 as Arch>::Address, <ARMv7 as Arch>::Word>>(d ]; } else if op2 & 0b100100 == 0b100100 { // `(immediate, Thumb)` - let opcode = if rt == 0b1111 { - [ - Opcode::PLD, - Opcode::PLD, - Opcode::LDR, - ][size] - } else { - [ + let opcode = [ Opcode::LDRB, Opcode::LDRH, Opcode::LDR, - ][size] - }; + ][size]; let w = lower2[8]; let u = lower2[9]; let p = lower2[10]; @@ -2760,6 +2744,13 @@ pub fn decode_into<T: Reader<<ARMv7 as Arch>::Address, <ARMv7 as Arch>::Word>>(d } } } + + // TODO: so, this is gross! the PLD/PLI/PLT handling needs improvement across + // the board. + if inst.opcode == Opcode::PLD { + inst.operands[0] = inst.operands[1]; + inst.operands[1] = Operand::Nothing; + } } else { if !op2[4] { // `Data-processing (register)` (`A6-243`) |
