diff --git a/desmume/src/arm_jit.cpp b/desmume/src/arm_jit.cpp index a9418e690..7dc5c616a 100644 --- a/desmume/src/arm_jit.cpp +++ b/desmume/src/arm_jit.cpp @@ -1911,15 +1911,29 @@ template static u32 FASTCALL OP_LDRD_REG(u32 adr) { cpu->R[Rnum] = READ32(cpu->mem_if->data, adr); - cpu->R[Rnum+1] = READ32(cpu->mem_if->data, adr+4); - return (MMU_memAccessCycles(adr) + MMU_memAccessCycles(adr+4)); + + // For even-numbered registers, we'll do a double-word load. Otherwise, we'll just do a single-word load. + if ((Rnum & 0x01) == 0) + { + cpu->R[Rnum+1] = READ32(cpu->mem_if->data, adr+4); + return (MMU_memAccessCycles(adr) + MMU_memAccessCycles(adr+4)); + } + + return MMU_memAccessCycles(adr); } template static u32 FASTCALL OP_STRD_REG(u32 adr) { WRITE32(cpu->mem_if->data, adr, cpu->R[Rnum]); - WRITE32(cpu->mem_if->data, adr + 4, cpu->R[Rnum + 1]); - return (MMU_memAccessCycles(adr) + MMU_memAccessCycles(adr+4)); + + // For even-numbered registers, we'll do a double-word store. Otherwise, we'll just do a single-word store. + if ((Rnum & 0x01) == 0) + { + WRITE32(cpu->mem_if->data, adr+4, cpu->R[Rnum + 1]); + return (MMU_memAccessCycles(adr) + MMU_memAccessCycles(adr+4)); + } + + return MMU_memAccessCycles(adr); } #define T(op, proc) op, op, op, op, op, op, op, op, op, op, op, op, op, op, op, op static const LDRD_STRD_REG op_ldrd_tab[2][16] = { {T(OP_LDRD_REG, 0)}, {T(OP_LDRD_REG, 1)} };