aboutsummaryrefslogtreecommitdiff
path: root/src/armv7/thumb.rs
diff options
context:
space:
mode:
authoriximeow <me@iximeow.net>2026-08-02 19:55:16 +0000
committeriximeow <me@iximeow.net>2026-08-02 19:55:16 +0000
commit2037c3a87532f39963fb0e39ac06f0fffbb6ae2e (patch)
treef64d4e15ac500b08a6e34697836482482cdf26b6 /src/armv7/thumb.rs
parentb9deebeead9c29c3a14b7293015913734aa66702 (diff)
thumb2 preload improvements
Diffstat (limited to 'src/armv7/thumb.rs')
-rw-r--r--src/armv7/thumb.rs37
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`)