From 5dca78356932bc4e89ff55856eeda25e42e8e8db Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 17 Mar 2017 13:06:11 -0700 Subject: [PATCH] ARM9: Fix blx lr --- src/arm/isa-arm.c | 5 +++-- src/arm/isa-thumb.c | 7 ++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/arm/isa-arm.c b/src/arm/isa-arm.c index 94a8dc2f8..221eabc95 100644 --- a/src/arm/isa-arm.c +++ b/src/arm/isa-arm.c @@ -706,9 +706,10 @@ DEFINE_INSTRUCTION_ARM(BLX, DEFINE_INSTRUCTION_ARM(BLX2, int rm = opcode & 0x0000000F; + int address = cpu->gprs[rm]; cpu->gprs[ARM_LR] = cpu->gprs[ARM_PC] - WORD_SIZE_ARM; - _ARMSetMode(cpu, cpu->gprs[rm] & 0x00000001); - cpu->gprs[ARM_PC] = cpu->gprs[rm] & 0xFFFFFFFE; + _ARMSetMode(cpu, address & 0x00000001); + cpu->gprs[ARM_PC] = address & 0xFFFFFFFE; if (cpu->executionMode == MODE_THUMB) { THUMB_WRITE_PC; } else { diff --git a/src/arm/isa-thumb.c b/src/arm/isa-thumb.c index 465c9c860..e6bcc65c2 100644 --- a/src/arm/isa-thumb.c +++ b/src/arm/isa-thumb.c @@ -422,13 +422,14 @@ DEFINE_INSTRUCTION_THUMB(BX, DEFINE_INSTRUCTION_THUMB(BLX2, int rm = (opcode >> 3) & 0xF; - _ARMSetMode(cpu, cpu->gprs[rm] & 0x00000001); + int address = cpu->gprs[rm]; + _ARMSetMode(cpu, address & 0x00000001); int misalign = 0; if (rm == ARM_PC) { - misalign = cpu->gprs[rm] & 0x00000002; + misalign = address & 0x00000002; } cpu->gprs[ARM_LR] = cpu->gprs[ARM_PC] - 1; - cpu->gprs[ARM_PC] = (cpu->gprs[rm] & 0xFFFFFFFE) - misalign; + cpu->gprs[ARM_PC] = (address & 0xFFFFFFFE) - misalign; if (cpu->executionMode == MODE_THUMB) { THUMB_WRITE_PC; } else {