aboutsummaryrefslogtreecommitdiff
path: root/src/armv7
diff options
context:
space:
mode:
Diffstat (limited to 'src/armv7')
-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,
];
}