aboutsummaryrefslogtreecommitdiff
path: root/tests/armv7/thumb.rs
diff options
context:
space:
mode:
authorBrandon Ros <brandonros1@gmail.com>2026-07-03 20:48:35 -0400
committeriximeow <me@iximeow.net>2026-07-28 02:53:24 +0000
commitbbbb546ee0b73d295be891b1b2e0e5a18cbfd3d1 (patch)
tree7f20df891883d5d60a7a366d16e76b286ac91b64 /tests/armv7/thumb.rs
parent9e9c7b2663fa52881bf6883e74f4cd8610c38570 (diff)
fix thumb2 TBH decode: wrong opcode and register-shift operand
the T1 TBH arm set Opcode::TBB instead of Opcode::TBH, and built the index operand with bit 4 set in the RegShift raw value. bit 4 is the RegReg selector in RegShift::into_shift, so the mandatory 'lsl #1' index scaling decoded as a register shift 'lsl r0' instead. clear bit 4 so it reads back as the RegImm 'lsl #1' the encoding specifies. verified against binutils objdump: df e8 13 f0 is tbh [pc, r3, lsl #1].
Diffstat (limited to 'tests/armv7/thumb.rs')
-rw-r--r--tests/armv7/thumb.rs37
1 files changed, 37 insertions, 0 deletions
diff --git a/tests/armv7/thumb.rs b/tests/armv7/thumb.rs
index 8c1885d..6384af7 100644
--- a/tests/armv7/thumb.rs
+++ b/tests/armv7/thumb.rs
@@ -4325,3 +4325,40 @@ fn test_decode_shift_reg_32b_cases() {
"ror.w r1, r2, r3"
);
}
+
+#[test]
+fn test_decode_tbb_tbh_cases() {
+ test_display(
+ &[0xdf, 0xe8, 0x13, 0xf0],
+ "tbh [pc, r3, lsl 1]"
+ );
+ test_display(
+ &[0xdf, 0xe8, 0x0b, 0xf0],
+ "tbb [pc, fp]"
+ );
+}
+
+#[test]
+fn test_decode_tbh_operand_shape() {
+ use yaxpeax_arm::armv7::{Opcode, Operand, RegShiftStyle, ShiftStyle};
+
+ let mut reader = yaxpeax_arch::U8Reader::new(&[0xdf, 0xe8, 0x13, 0xf0][..]);
+ let inst = InstDecoder::default_thumb().decode(&mut reader).unwrap();
+ assert_eq!(inst.opcode, Opcode::TBH);
+ match inst.operands[0] {
+ Operand::RegDerefPreindexRegShift(base, shift, add, wback) => {
+ assert_eq!(base.number(), 15);
+ assert!(add);
+ assert!(!wback);
+ match shift.into_shift() {
+ RegShiftStyle::RegImm(s) => {
+ assert_eq!(s.shiftee().number(), 3);
+ assert_eq!(s.stype(), ShiftStyle::LSL);
+ assert_eq!(s.imm(), 1);
+ }
+ RegShiftStyle::RegReg(_) => panic!("TBH index must be a register+immediate shift"),
+ }
+ }
+ other => panic!("unexpected TBH operand: {:?}", other),
+ }
+}