diff options
| author | iximeow <me@iximeow.net> | 2026-08-02 19:23:45 +0000 |
|---|---|---|
| committer | iximeow <me@iximeow.net> | 2026-08-02 19:23:45 +0000 |
| commit | bc4ffbe7a8ffe1bfbf2e0785c561a339bfa25321 (patch) | |
| tree | 4cf676b73152eb91d063860db0238b27c58ef5ec /src/armv7/thumb.rs | |
| parent | b3144e7b36c460588154b9dda2f9e2de83b70e3a (diff) | |
Test Target, fix bogus MRS destinations
Diffstat (limited to 'src/armv7/thumb.rs')
| -rw-r--r-- | src/armv7/thumb.rs | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/src/armv7/thumb.rs b/src/armv7/thumb.rs index 16d671a..72a2ea6 100644 --- a/src/armv7/thumb.rs +++ b/src/armv7/thumb.rs @@ -147,6 +147,33 @@ pub fn decode_into<T: Reader<<ARMv7 as Arch>::Address, <ARMv7 as Arch>::Word>>(d match op1op2 { 0b0000 => { // `STREX` (`A8-691`) + // v8.something + + // TODO: isa version flags + if rt == 15 /* && decoder.armv8 */ { + if imm8 & 0b0011_1111 != 0 { + if decoder.should_is_must { + return Err(DecodeError::Nonconforming); + } + } + let at = imm8 >> 6; + inst.opcode = Opcode::TT { + alternate: (at >> 1) != 0, + unprivileged: (at & 1) != 0, + }; + if rd == 13 || rd == 15 || rn == 15 { + decoder.unpredictable()?; + } + inst.operands = [ + Operand::Reg(Reg::from_u8(rd)), + Operand::Reg(Reg::from_u8(rn)), + Operand::Nothing, + Operand::Nothing, + ]; + + return Ok(()); + } + // v6T2 if rd == 13 || rd == 15 || rt == 13 || rt == 15 || rn == 15 { decoder.unpredictable()?; |
