diff --git a/Source/Core/DSPCore/Src/DSPTables.cpp b/Source/Core/DSPCore/Src/DSPTables.cpp index a684302992..681ebf640d 100644 --- a/Source/Core/DSPCore/Src/DSPTables.cpp +++ b/Source/Core/DSPCore/Src/DSPTables.cpp @@ -310,7 +310,7 @@ const DSPOPCTemplate opcodes_ext[] = {"DR", 0x0004, 0x00fc, DSPInterpreter::Ext::dr, &DSPEmitter::dr, 1, 1, {{P_REG, 1, 0, 0, 0x0003}}, false, false}, {"IR", 0x0008, 0x00fc, DSPInterpreter::Ext::ir, &DSPEmitter::ir, 1, 1, {{P_REG, 1, 0, 0, 0x0003}}, false, false}, - {"NR", 0x000c, 0x00fc, DSPInterpreter::Ext::nr, NULL /*&DSPEmitter::nr*/, 1, 1, {{P_REG, 1, 0, 0, 0x0003}}, false, false}, + {"NR", 0x000c, 0x00fc, DSPInterpreter::Ext::nr, &DSPEmitter::nr, 1, 1, {{P_REG, 1, 0, 0, 0x0003}}, false, false}, {"MV", 0x0010, 0x00f0, DSPInterpreter::Ext::mv, NULL /*&DSPEmitter::mv*/, 1, +2, {{P_REG18, 1, 0, 2, 0x000c}, {P_REG1C, 1, 0, 0, 0x0003}}, false, false}, {"S", 0x0020, 0x00e4, DSPInterpreter::Ext::s, NULL /*&DSPEmitter::s*/, 1, 2, {{P_PRG, 1, 0, 0, 0x0003}, {P_REG1C, 1, 0, 3, 0x0018}}, false, false}, diff --git a/Source/Core/DSPCore/Src/Jit/DSPJitUtil.cpp b/Source/Core/DSPCore/Src/Jit/DSPJitUtil.cpp index 69904d5e7a..af3bf6e5ed 100644 --- a/Source/Core/DSPCore/Src/Jit/DSPJitUtil.cpp +++ b/Source/Core/DSPCore/Src/Jit/DSPJitUtil.cpp @@ -31,8 +31,8 @@ using namespace Gen; // See http://code.google.com/p/dolphin-emu/source/detail?r=3125 void DSPEmitter::increment_addr_reg(int reg) { - PUSH(EAX); - PUSH(ECX); + // PUSH(EAX); + // PUSH(ECX); // u16 tmb = g_dsp.r[DSP_REG_WR0 + reg]; MOVZX(32, 16, EAX, M(&g_dsp.r[DSP_REG_WR0 + reg])); @@ -81,15 +81,15 @@ void DSPEmitter::increment_addr_reg(int reg) // g_dsp.r[reg] = tmp; MOV(16, M(&g_dsp.r[reg]), R(ECX)); - POP(ECX); - POP(EAX); + // POP(ECX); + // POP(EAX); } // See http://code.google.com/p/dolphin-emu/source/detail?r=3125 void DSPEmitter::decrement_addr_reg(int reg) { - PUSH(EAX); - PUSH(ECX); + // PUSH(EAX); + // PUSH(ECX); // s16 tmp = g_dsp.r[reg]; MOVZX(32, 16, EAX, M(&g_dsp.r[reg])); @@ -113,33 +113,27 @@ void DSPEmitter::decrement_addr_reg(int reg) // g_dsp.r[reg] = tmp; MOV(16, M(&g_dsp.r[reg]), R(EAX)); - POP(ECX); - POP(EAX); + // POP(ECX); + // POP(EAX); } // Increase addr register according to the correspond ix register void DSPEmitter::increase_addr_reg(int reg) { // s16 value = (s16)g_dsp.r[DSP_REG_IX0 + reg]; - //FIXME: interpreter uses reg, not IX0+reg? - MOVSX(32, 16, EDX, M(&g_dsp.r[reg])); - XOR(32, R(ECX), R(ECX)); // i = 0 + MOVSX(32, 16, EDX, M(&g_dsp.r[DSP_REG_IX0 + reg])); + XOR(32, R(ESI), R(ESI)); // i = 0 // if (value > 0) - CMP(16, R(EDX), Imm16(0)); - //FIXME: those jumps are too far for one byte, - // and force5bytes = true causes an illegal - // instruction for me. - // calling (de|in)crement_addr_reg causes that. - FixupBranch end = J_CC(CC_Z); + FixupBranch end = J_CC(CC_Z, true); FixupBranch negValue = J_CC(CC_L); // for (int i = 0; i < value; i++) JumpTarget loop_pos = GetCodePtr(); increment_addr_reg(reg); - ADD(32, R(ECX), Imm32(1)); // i++ - CMP(32, R(ECX), R(EDX)); // i < value + ADD(32, R(ESI), Imm32(1)); // i++ + CMP(32, R(ESI), R(EDX)); // i < value J_CC(CC_NE, loop_pos); FixupBranch posValue = J(); @@ -153,8 +147,8 @@ void DSPEmitter::increase_addr_reg(int reg) JumpTarget loop_neg = GetCodePtr(); decrement_addr_reg(reg); - ADD(32, R(ECX), Imm32(1)); // i++ - CMP(32, R(ECX), R(EDX)); // i < -value + ADD(32, R(ESI), Imm32(1)); // i++ + CMP(32, R(ESI), R(EDX)); // i < -value J_CC(CC_NE, loop_neg); SetJumpTarget(posValue); @@ -208,15 +202,29 @@ void DSPEmitter::decrease_addr_reg(int reg) void DSPEmitter::ext_dmem_write(u32 dest, u32 src) { - u16 addr = g_dsp.r[dest]; - u16 val = g_dsp.r[src]; - u16 saddr = addr >> 12; + // u16 addr = g_dsp.r[dest]; + MOVZX(32, 16, EAX, M(&g_dsp.r[dest])); - if (saddr == 0) - g_dsp.dram[addr & DSP_DRAM_MASK] = val; - else if (saddr == 0xf) - gdsp_ifx_write(addr, val); + // u16 val = g_dsp.r[src]; + MOVZX(32, 16, ECX, M(&g_dsp.r[src])); + // u16 saddr = addr >> 12; + MOVZX(32, 16, ESI, R(EAX)); + SHR(16, R(ESI), Imm16(12)); + + // if (saddr == 0) + CMP(16, R(ESI), Imm16(0)); + FixupBranch ifx = J_CC(CC_NZ); + + // g_dsp.dram[addr & DSP_DRAM_MASK] = val; + AND(16, R(EAX), Imm16(DSP_DRAM_MASK)); + // MOVZX(32, 16, M); + + FixupBranch end = J(); + // else if (saddr == 0xf) + SetJumpTarget(ifx); + // gdsp_ifx_write(addr, val); + SetJumpTarget(end); } u16 DSPEmitter::ext_dmem_read(u16 addr)