Implement BX
Jeffrey Pfau jeffrey@endrift.com
Sun, 14 Apr 2013 02:55:12 -0700
1 files changed,
14 insertions(+),
1 deletions(-)
jump to
M
src/isa-thumb.c
→
src/isa-thumb.c
@@ -390,7 +390,20 @@ cpu->gprs[ARM_PC] = cpu->gprs[ARM_LR] + immediate; \
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) \