aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoriximeow <me@iximeow.net>2026-08-02 20:28:30 +0000
committeriximeow <me@iximeow.net>2026-08-02 20:28:30 +0000
commitb89b56f1e92b9559ccd11929e575db3ea2b71ced (patch)
tree5f39d5b218a06c53d8e112ba4f045dcbd7c90d5b
parent8d4d7a3876cbca23e21c4b5c7c30abae934b6b30 (diff)
fix missing decode of `s` bit for wide shift/rotate ops
-rw-r--r--CHANGELOG1
-rw-r--r--src/armv7/thumb.rs1
-rw-r--r--tests/armv7/thumb.rs17
3 files changed, 19 insertions, 0 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 835d41b..30b3866 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -15,6 +15,7 @@
* thumb2: `mrs` destinations, which should have been a mask of the current (or
saved) program status register, was reported as a banked GPR.
* thumb2: some coprocessor instructions were incorrectly decoded as `ldc*/stc*`
+* thumb2: fix missing decode of `s` bit for wide lsl/lsr/asr/ror (register)
* ARMv8: support thumb2 encoding of `Test Target` instruction, `Opcode::TT`
(formatted as any of `tt`, `ttt`, `tta`, `ttat`)
* ARMv8: formerly-coprocessor instructions have been defined into SIMD extensions,
diff --git a/src/armv7/thumb.rs b/src/armv7/thumb.rs
index 45c8917..18b4526 100644
--- a/src/armv7/thumb.rs
+++ b/src/armv7/thumb.rs
@@ -2762,6 +2762,7 @@ pub fn decode_into<T: Reader<<ARMv7 as Arch>::Address, <ARMv7 as Arch>::Word>>(d
if !op2[3] {
// `LSL`, `LSR`, `ASR`, `ROR`
// v6T2
+ inst.set_s(instr2[4]);
let op = [
Opcode::LSL,
Opcode::LSR,
diff --git a/tests/armv7/thumb.rs b/tests/armv7/thumb.rs
index 43d7638..defdacb 100644
--- a/tests/armv7/thumb.rs
+++ b/tests/armv7/thumb.rs
@@ -3194,6 +3194,23 @@ fn test_decode_op_s_cases() {
&[0xff, 0x37],
"adds r7, 0xff"
);
+
+ test_display(
+ &[0x7c, 0xfa, 0xe, 0xfe],
+ "rors.w lr, ip, lr"
+ );
+ test_display(
+ &[0x5b, 0xfa, 0xe, 0xfe],
+ "asrs.w lr, fp, lr"
+ );
+ test_display(
+ &[0x32, 0xfa, 0xe, 0xfe],
+ "lsrs.w lr, r2, lr"
+ );
+ test_display(
+ &[0x16, 0xfa, 0xe, 0xfe],
+ "lsls.w lr, r6, lr"
+ );
}
#[test]
fn test_decode_pop_cases() {