From 7378e198a59805a4edf671498e01b800b3de5a6d Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Mon, 27 May 2002 13:30:36 +0000 Subject: [PATCH] Thumb BL instruction: Do not set LR to pc + 2, it has already been advanced. --- sim/arm/ChangeLog | 5 +++++ sim/arm/thumbemu.c | 10 ++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/sim/arm/ChangeLog b/sim/arm/ChangeLog index 9739fe10ea6..f20ed35f18f 100644 --- a/sim/arm/ChangeLog +++ b/sim/arm/ChangeLog @@ -1,3 +1,8 @@ +2002-05-27 Nick Clifton + + * thumbemu.c (ARMul_ThumbDecode, Case 31): Do not set LR to pc + + 2, it has already been advanced. + 2002-05-23 Nick Clifton * thumbemu.c (ARMul_ThumbDecode): When decoding a BLX(1) diff --git a/sim/arm/thumbemu.c b/sim/arm/thumbemu.c index 283e7d5cf5a..1b28edf80f0 100644 --- a/sim/arm/thumbemu.c +++ b/sim/arm/thumbemu.c @@ -489,7 +489,7 @@ tdstate ARMul_ThumbDecode (state, pc, tinstr, ainstr) if r14 is not suitably initialised. */ { ARMword tmp = (pc + 2); - + state->Reg[15] = ((state->Reg[14] + ((tinstr & 0x07FF) << 1)) & 0xFFFFFFFC); CLEART; @@ -509,8 +509,9 @@ tdstate ARMul_ThumbDecode (state, pc, tinstr, ainstr) second half of this BL, and if it is we simulate it immediately. */ state->Reg[14] = state->Reg[15] \ - +(((tinstr & 0x07FF) << 12) \ - |((tinstr & (1 << 10)) ? 0xFF800000 : 0)); + + (((tinstr & 0x07FF) << 12) \ + | ((tinstr & (1 << 10)) ? 0xFF800000 : 0)); + valid = t_branch; /* in-case we don't have the 2nd half */ tinstr = next_instr; /* move the instruction down */ pc += 2; /* point the pc at the 2nd half */ @@ -543,7 +544,8 @@ tdstate ARMul_ThumbDecode (state, pc, tinstr, ainstr) the simulation of it on its own, with undefined results if r14 is not suitably initialised. */ { - ARMword tmp = (pc + 2); + ARMword tmp = pc; + state->Reg[15] = (state->Reg[14] + ((tinstr & 0x07FF) << 1)); state->Reg[14] = (tmp | 1); valid = t_branch; -- 2.30.2