diff options
author | jam1garner <jam@jam1.re> | 2023-01-31 00:53:05 -0500 |
---|---|---|
committer | jam1garner <jam@jam1.re> | 2023-01-31 00:57:03 -0500 |
commit | af8fcdb3d748b130919e60c1d3a6172d27e487cd (patch) | |
tree | f3a71b187fb1074bbb6dbf82d0d7c8a40e327ed2 /src | |
parent | efbdb28824acc2a94b5910a13da34866da300d20 (diff) |
fix 24-bit branch immediate decoding
Diffstat (limited to 'src')
-rw-r--r-- | src/armv7.rs | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/src/armv7.rs b/src/armv7.rs index c2254a5..276b807 100644 --- a/src/armv7.rs +++ b/src/armv7.rs @@ -3815,20 +3815,26 @@ impl Decoder<ARMv7> for InstDecoder { ]; } else if op < 0b110000 { // 10xxxx - // the + 1 is to compensate for an architecturally-defined initial offset inst.opcode = Opcode::B; + + // the + 2 is to compensate for an architecturally-defined initial offset + let imm24 = ((((word & 0x00ff_ffff) + 2) << 8) as i32) >> 8; + inst.operands = [ - Operand::BranchOffset(((word & 0x00ffff) + 1) as i16 as i32), + Operand::BranchOffset(imm24), Operand::Nothing, Operand::Nothing, Operand::Nothing, ]; } else { // 11xxxx - // the + 1 is to compensate for an architecturally-defined initial offset + + // the + 2 is to compensate for an architecturally-defined initial offset + let imm24 = ((((word & 0x00ff_ffff) + 2) << 8) as i32) >> 8; + inst.opcode = Opcode::BL; inst.operands = [ - Operand::BranchOffset(((word & 0x00ffff) + 1) as i16 as i32), + Operand::BranchOffset(imm24), Operand::Nothing, Operand::Nothing, Operand::Nothing, |