aboutsummaryrefslogtreecommitdiff
path: root/src/armv7/thumb.rs
diff options
context:
space:
mode:
authoriximeow <me@iximeow.net>2026-09-11 16:08:55 +0000
committeriximeow <me@iximeow.net>2026-09-11 16:18:53 +0000
commitecec44cbee7be32e632b24ae0e4fe3f84e6e8ef8 (patch)
tree30fd0b61c3463a9a8591b4f0f18f931f2ed7ae54 /src/armv7/thumb.rs
parenta00a54539d9124d8b376ee9cbeab355d99c9d163 (diff)
fix issues around unpredictable ldrd and offset printing
Diffstat (limited to 'src/armv7/thumb.rs')
-rw-r--r--src/armv7/thumb.rs16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/armv7/thumb.rs b/src/armv7/thumb.rs
index 1d9d96a..077834a 100644
--- a/src/armv7/thumb.rs
+++ b/src/armv7/thumb.rs
@@ -286,7 +286,13 @@ pub fn decode_into<T: Reader<<ARMv7 as Arch>::Address, <ARMv7 as Arch>::Word>>(d
inst.operands = [
Operand::Reg(Reg::from_u8(rt)),
Operand::Reg(Reg::from_u8(rd)),
- Operand::RegDerefPreindexOffset(Reg::from_u8(rn), imm8 << 2, u, false),
+ if p {
+ Operand::RegDerefPreindexOffset(Reg::from_u8(rn), imm8 << 2, u, w)
+ } else {
+ decoder.unpredictable()?;
+ // p == 0 and w == 0 is impossible, would be tbb/tbh
+ Operand::RegDerefPostindexOffset(Reg::from_u8(rn), imm8 << 2, u, false)
+ },
Operand::Nothing,
];
}
@@ -595,7 +601,13 @@ pub fn decode_into<T: Reader<<ARMv7 as Arch>::Address, <ARMv7 as Arch>::Word>>(d
inst.operands = [
Operand::Reg(Reg::from_u8(rt)),
Operand::Reg(Reg::from_u8(rd)),
- Operand::RegDerefPreindexOffset(Reg::from_u8(rn), imm8 << 2, u, false),
+ if p {
+ Operand::RegDerefPreindexOffset(Reg::from_u8(rn), imm8 << 2, u, w)
+ } else {
+ decoder.unpredictable()?;
+ // p == 0 and w == 0 is impossible, would be tbb/tbh
+ Operand::RegDerefPostindexOffset(Reg::from_u8(rn), imm8 << 2, u, false)
+ },
Operand::Nothing,
];
}