aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/arm/dyncom
diff options
context:
space:
mode:
authorGravatar bunnei <bunneidev@gmail.com>2015-07-30 10:44:50 -0400
committerGravatar bunnei <bunneidev@gmail.com>2015-07-30 10:44:50 -0400
commitce65925bc384632a39bb066e5ff581100d1beb69 (patch)
tree63c5ea1e9d315ee21ca5731dd4404d0a8e9b6b11 /src/core/arm/dyncom
parentbb7eb5c574c2141e34c499ff921e0dd9d28819f9 (diff)
parent2e420aba3c007bff84988cf1c281db73c12c7f9a (diff)
Merge pull request #1008 from lioncash/pc
dyncom: Handle the case where PC is the source register for STR/VSTM/VLDM
Diffstat (limited to 'src/core/arm/dyncom')
-rw-r--r--src/core/arm/dyncom/arm_dyncom_interpreter.cpp7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/core/arm/dyncom/arm_dyncom_interpreter.cpp b/src/core/arm/dyncom/arm_dyncom_interpreter.cpp
index bb0cbb4d..b88b7475 100644
--- a/src/core/arm/dyncom/arm_dyncom_interpreter.cpp
+++ b/src/core/arm/dyncom/arm_dyncom_interpreter.cpp
@@ -5994,7 +5994,12 @@ unsigned InterpreterMainLoop(ARMul_State* cpu) {
ldst_inst* inst_cream = (ldst_inst*)inst_base->component;
inst_cream->get_addr(cpu, inst_cream->inst, addr);
- unsigned int value = cpu->Reg[BITS(inst_cream->inst, 12, 15)];
+ unsigned int reg = BITS(inst_cream->inst, 12, 15);
+ unsigned int value = cpu->Reg[reg];
+
+ if (reg == 15)
+ value += 2 * cpu->GetInstructionSize();
+
cpu->WriteMemory32(addr, value);
}
cpu->Reg[15] += cpu->GetInstructionSize();