diff options
author | Mitchell Johnson <ehntoo@ehntoo.org> | 2022-09-04 19:16:21 -0400 |
---|---|---|
committer | iximeow <git@iximeow.net> | 2022-09-29 15:50:31 -0700 |
commit | 4470c5b393817a93854472354d76911cfc9abe6f (patch) | |
tree | f45100c3cf1ccaf0baa450ab3a2dc154a6e8cc3a /src | |
parent | 189cbcfdad097363e66f41daf4d6a76acbf3661c (diff) |
Fix negative unconditional 16-bit thumb branches
Sign extension shift had an off-by-one error so the sign bit was not being
properly extended.
Diffstat (limited to 'src')
-rw-r--r-- | src/armv7/thumb.rs | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/src/armv7/thumb.rs b/src/armv7/thumb.rs index baa2352..2e960b1 100644 --- a/src/armv7/thumb.rs +++ b/src/armv7/thumb.rs @@ -4174,7 +4174,7 @@ pub fn decode_into<T: Reader<<ARMv7 as Arch>::Address, <ARMv7 as Arch>::Word>>(d // v4T inst.opcode = Opcode::B; let imm = instr2[0..11].load::<u32>(); - let imm = ((imm as i32) << 20) >> 20; + let imm = ((imm as i32) << 21) >> 21; inst.operands = [ Operand::BranchThumbOffset(imm), Operand::Nothing, |