From 7c8d76eb065f35f1abbe7e2f3aceae3211081c11 Mon Sep 17 00:00:00 2001 From: Jeffrey Pfau Date: Sun, 14 Apr 2013 02:55:12 -0700 Subject: [PATCH] Implement BX --- src/isa-thumb.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/isa-thumb.c b/src/isa-thumb.c index b326f990d..92d669cc5 100644 --- a/src/isa-thumb.c +++ b/src/isa-thumb.c @@ -390,7 +390,20 @@ DEFINE_INSTRUCTION_THUMB(BL2, \ cpu->gprs[ARM_LR] = pc - 1; \ THUMB_WRITE_PC;) -DEFINE_INSTRUCTION_THUMB(BX, ARM_STUB) +DEFINE_INSTRUCTION_THUMB(BX, \ + int rm = opcode & 0x0000000F; \ + _ARMSetMode(cpu, cpu->gprs[rm] & 0x00000001); + int misalign = 0; + if (rm == ARM_PC) { + misalign = cpu->gprs[rm] & 0x00000002; + } + cpu->gprs[ARM_PC] = cpu->gprs[rm] & 0xFFFFFFFE - misalign; \ + if (cpu->executionMode == MODE_THUMB) { \ + THUMB_WRITE_PC; \ + } else { \ + ARM_WRITE_PC; \ + }) + DEFINE_INSTRUCTION_THUMB(SWI, ARM_STUB) #define DECLARE_INSTRUCTION_THUMB(EMITTER, NAME) \