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 | |
| parent | b3144e7b36c460588154b9dda2f9e2de83b70e3a (diff) | |
Test Target, fix bogus MRS destinations
Diffstat (limited to 'src/armv7')
| -rw-r--r-- | src/armv7/display.rs | 6 | ||||
| -rw-r--r-- | src/armv7/thumb.rs | 27 |
2 files changed, 33 insertions, 0 deletions
diff --git a/src/armv7/display.rs b/src/armv7/display.rs index 6673fcd..91affeb 100644 --- a/src/armv7/display.rs +++ b/src/armv7/display.rs @@ -964,6 +964,7 @@ impl <T: fmt::Write, Y: YaxColors> Colorize<T, Y> for ConditionedOpcode { Opcode::DSB | Opcode::CSDB | Opcode::SRS(_, _) | + Opcode::TT { .. } | Opcode::BKPT => { write!(out, "{}", colors.misc_op(self)) }, Opcode::DBG | @@ -1262,6 +1263,11 @@ impl Opcode { Opcode::USUB8 => { "usub8" }, Opcode::UQSUB8 => { "uqsub8" }, Opcode::UHSUB8 => { "uhsub8" }, + + Opcode::TT { alternate: false, unprivileged: false } => "tt", + Opcode::TT { alternate: true, unprivileged: false } => "tta", + Opcode::TT { alternate: false, unprivileged: true } => "ttt", + Opcode::TT { alternate: true, unprivileged: true } => "ttat", } } } 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()?; |
