aboutsummaryrefslogtreecommitdiff
path: root/src
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
parenta00a54539d9124d8b376ee9cbeab355d99c9d163 (diff)
fix issues around unpredictable ldrd and offset printing
Diffstat (limited to 'src')
-rw-r--r--src/armv7/display.rs10
-rw-r--r--src/armv7/thumb.rs16
2 files changed, 18 insertions, 8 deletions
diff --git a/src/armv7/display.rs b/src/armv7/display.rs
index 2d2a77c..3f7162b 100644
--- a/src/armv7/display.rs
+++ b/src/armv7/display.rs
@@ -245,13 +245,11 @@ impl<T: DisplaySink> crate::armv7::OperandVisitor for DisplayingOperandVisitor<'
self.f.write_reg(base.number())?;
self.f.write_char(']')?;
- if offset != 0 {
- self.f.write_fixed_size(", ")?;
- if !add {
- self.f.write_char('-')?;
- }
- self.f.write_prefixed_u16(offset)?;
+ self.f.write_fixed_size(", ")?;
+ if !add {
+ self.f.write_char('-')?;
}
+ self.f.write_prefixed_u16(offset)?;
Ok(())
}
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,
];
}