mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-02-10 22:49:00 +01:00
LLE JIT:
* Added jit versions of 5 DSP LoadStore instructions: srs, lrs, lr, sr, si * Renamed MainOpFallback to Default for consistency in naming with JIT64 * Made ext_dmem_read and ext_dmem_write more generic for wider use * Optimised dmem_read and dmem_write slightly * Added dmem_read_imm and dmem_write_imm optimised versions git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@6596 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
a82a61c53a
commit
93a09ee7b5
@ -22,6 +22,7 @@ set(SRCS Src/assemble.cpp
|
|||||||
Src/Jit/DSPJitBranch.cpp
|
Src/Jit/DSPJitBranch.cpp
|
||||||
Src/Jit/DSPJitCCUtil.cpp
|
Src/Jit/DSPJitCCUtil.cpp
|
||||||
Src/Jit/DSPJitArithmetic.cpp
|
Src/Jit/DSPJitArithmetic.cpp
|
||||||
|
Src/Jit/DSPJitLoadStore.cpp
|
||||||
Src/Jit/DSPJitMultiplier.cpp
|
Src/Jit/DSPJitMultiplier.cpp
|
||||||
Src/Jit/DSPJitUtil.cpp
|
Src/Jit/DSPJitUtil.cpp
|
||||||
Src/Jit/DSPJitMisc.cpp)
|
Src/Jit/DSPJitMisc.cpp)
|
||||||
|
@ -462,6 +462,10 @@
|
|||||||
RelativePath=".\Src\Jit\DSPJitArithmetic.cpp"
|
RelativePath=".\Src\Jit\DSPJitArithmetic.cpp"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Src\Jit\DSPJitLoadStore.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath=".\Src\Jit\DSPJitCCUtil.cpp"
|
RelativePath=".\Src\Jit\DSPJitCCUtil.cpp"
|
||||||
>
|
>
|
||||||
|
@ -112,7 +112,7 @@ void DSPEmitter::checkExceptions(u32 retval)
|
|||||||
SetJumpTarget(skipCheck);
|
SetJumpTarget(skipCheck);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DSPEmitter::MainOpFallback(UDSPInstruction inst)
|
void DSPEmitter::Default(UDSPInstruction inst)
|
||||||
{
|
{
|
||||||
if (opTable[inst]->reads_pc)
|
if (opTable[inst]->reads_pc)
|
||||||
{
|
{
|
||||||
@ -161,7 +161,7 @@ void DSPEmitter::EmitInstruction(UDSPInstruction inst)
|
|||||||
|
|
||||||
// Main instruction
|
// Main instruction
|
||||||
if (!opTable[inst]->jitFunc) {
|
if (!opTable[inst]->jitFunc) {
|
||||||
MainOpFallback(inst);
|
Default(inst);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -185,11 +185,6 @@ void DSPEmitter::unknown_instruction(UDSPInstruction inst)
|
|||||||
PanicAlert("unknown_instruction %04x - Fix me ;)", inst);
|
PanicAlert("unknown_instruction %04x - Fix me ;)", inst);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DSPEmitter::Default(UDSPInstruction _inst)
|
|
||||||
{
|
|
||||||
EmitInstruction(_inst);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DSPEmitter::ClearCallFlag()
|
void DSPEmitter::ClearCallFlag()
|
||||||
{
|
{
|
||||||
DSPAnalyzer::code_flags[startAddr] &= ~DSPAnalyzer::CODE_CALL;
|
DSPAnalyzer::code_flags[startAddr] &= ~DSPAnalyzer::CODE_CALL;
|
||||||
|
@ -37,7 +37,6 @@ public:
|
|||||||
|
|
||||||
void EmitInstruction(UDSPInstruction inst);
|
void EmitInstruction(UDSPInstruction inst);
|
||||||
void unknown_instruction(UDSPInstruction inst);
|
void unknown_instruction(UDSPInstruction inst);
|
||||||
void Default(UDSPInstruction _inst);
|
|
||||||
void ClearIRAM();
|
void ClearIRAM();
|
||||||
|
|
||||||
void CompileDispatcher();
|
void CompileDispatcher();
|
||||||
@ -45,7 +44,7 @@ public:
|
|||||||
void Compile(int start_addr);
|
void Compile(int start_addr);
|
||||||
void ClearCallFlag();
|
void ClearCallFlag();
|
||||||
|
|
||||||
void MainOpFallback(UDSPInstruction inst);
|
void Default(UDSPInstruction inst);
|
||||||
|
|
||||||
int STACKALIGN RunForCycles(int cycles);
|
int STACKALIGN RunForCycles(int cycles);
|
||||||
|
|
||||||
@ -62,8 +61,10 @@ public:
|
|||||||
void decrement_addr_reg(int reg);
|
void decrement_addr_reg(int reg);
|
||||||
void increase_addr_reg(int reg);
|
void increase_addr_reg(int reg);
|
||||||
void decrease_addr_reg(int reg);
|
void decrease_addr_reg(int reg);
|
||||||
void ext_dmem_write(u32 src, u32 dest);
|
void dmem_write();
|
||||||
void ext_dmem_read(u16 addr);
|
void dmem_write_imm(u16 addr);
|
||||||
|
void dmem_read();
|
||||||
|
void dmem_read_imm(u16 addr);
|
||||||
|
|
||||||
// Ext command helpers
|
// Ext command helpers
|
||||||
void pushExtValueFromReg(u16 dreg, u16 sreg);
|
void pushExtValueFromReg(u16 dreg, u16 sreg);
|
||||||
@ -125,6 +126,13 @@ public:
|
|||||||
void call(const UDSPInstruction opc);
|
void call(const UDSPInstruction opc);
|
||||||
void callr(const UDSPInstruction opc);
|
void callr(const UDSPInstruction opc);
|
||||||
|
|
||||||
|
// Load/Store
|
||||||
|
void srs(const UDSPInstruction opc);
|
||||||
|
void lrs(const UDSPInstruction opc);
|
||||||
|
void lr(const UDSPInstruction opc);
|
||||||
|
void sr(const UDSPInstruction opc);
|
||||||
|
void si(const UDSPInstruction opc);
|
||||||
|
|
||||||
// Arithmetic
|
// Arithmetic
|
||||||
void addr(const UDSPInstruction opc);
|
void addr(const UDSPInstruction opc);
|
||||||
void lsl16(const UDSPInstruction opc);
|
void lsl16(const UDSPInstruction opc);
|
||||||
|
@ -95,22 +95,22 @@ const DSPOPCTemplate opcodes[] =
|
|||||||
{"IFO", 0x027e, 0xffff, DSPInterpreter::ifcc, NULL, 1, 0, {}, false, true, false, true},
|
{"IFO", 0x027e, 0xffff, DSPInterpreter::ifcc, NULL, 1, 0, {}, false, true, false, true},
|
||||||
{"IF", 0x027f, 0xffff, DSPInterpreter::ifcc, NULL, 1, 0, {}, false, true, true, true},
|
{"IF", 0x027f, 0xffff, DSPInterpreter::ifcc, NULL, 1, 0, {}, false, true, true, true},
|
||||||
|
|
||||||
{"JGE", 0x0290, 0xffff, DSPInterpreter::jcc, NULL, 2, 1, {{P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, false, true},
|
{"JGE", 0x0290, 0xffff, DSPInterpreter::jcc, &DSPEmitter::jcc, 2, 1, {{P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, false, true},
|
||||||
{"JL", 0x0291, 0xffff, DSPInterpreter::jcc, NULL, 2, 1, {{P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, false, true},
|
{"JL", 0x0291, 0xffff, DSPInterpreter::jcc, &DSPEmitter::jcc, 2, 1, {{P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, false, true},
|
||||||
{"JG", 0x0292, 0xffff, DSPInterpreter::jcc, NULL, 2, 1, {{P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, false, true},
|
{"JG", 0x0292, 0xffff, DSPInterpreter::jcc, &DSPEmitter::jcc, 2, 1, {{P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, false, true},
|
||||||
{"JLE", 0x0293, 0xffff, DSPInterpreter::jcc, NULL, 2, 1, {{P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, false, true},
|
{"JLE", 0x0293, 0xffff, DSPInterpreter::jcc, NULL/*&DSPEmitter::jcc*/, 2, 1, {{P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, false, true},
|
||||||
{"JNZ", 0x0294, 0xffff, DSPInterpreter::jcc, NULL, 2, 1, {{P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, false, true},
|
{"JNZ", 0x0294, 0xffff, DSPInterpreter::jcc, &DSPEmitter::jcc, 2, 1, {{P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, false, true},
|
||||||
{"JZ", 0x0295, 0xffff, DSPInterpreter::jcc, NULL, 2, 1, {{P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, false, true},
|
{"JZ", 0x0295, 0xffff, DSPInterpreter::jcc, &DSPEmitter::jcc, 2, 1, {{P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, false, true},
|
||||||
{"JNC", 0x0296, 0xffff, DSPInterpreter::jcc, NULL, 2, 1, {{P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, false, true},
|
{"JNC", 0x0296, 0xffff, DSPInterpreter::jcc, &DSPEmitter::jcc, 2, 1, {{P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, false, true},
|
||||||
{"JC", 0x0297, 0xffff, DSPInterpreter::jcc, NULL, 2, 1, {{P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, false, true},
|
{"JC", 0x0297, 0xffff, DSPInterpreter::jcc, &DSPEmitter::jcc, 2, 1, {{P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, false, true},
|
||||||
{"JMPx8", 0x0298, 0xffff, DSPInterpreter::jcc, NULL, 2, 1, {{P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, false, true},
|
{"JMPx8", 0x0298, 0xffff, DSPInterpreter::jcc, &DSPEmitter::jcc, 2, 1, {{P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, false, true},
|
||||||
{"JMPx9", 0x0299, 0xffff, DSPInterpreter::jcc, NULL, 2, 1, {{P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, false, true},
|
{"JMPx9", 0x0299, 0xffff, DSPInterpreter::jcc, &DSPEmitter::jcc, 2, 1, {{P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, false, true},
|
||||||
{"JMPxA", 0x029a, 0xffff, DSPInterpreter::jcc, NULL, 2, 1, {{P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, false, true},
|
{"JMPxA", 0x029a, 0xffff, DSPInterpreter::jcc, NULL/*&DSPEmitter::jcc*/, 2, 1, {{P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, false, true},
|
||||||
{"JMPxB", 0x029b, 0xffff, DSPInterpreter::jcc, NULL, 2, 1, {{P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, false, true},
|
{"JMPxB", 0x029b, 0xffff, DSPInterpreter::jcc, NULL/*&DSPEmitter::jcc*/, 2, 1, {{P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, false, true},
|
||||||
{"JLNZ", 0x029c, 0xffff, DSPInterpreter::jcc, NULL, 2, 1, {{P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, false, true},
|
{"JLNZ", 0x029c, 0xffff, DSPInterpreter::jcc, &DSPEmitter::jcc, 2, 1, {{P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, false, true},
|
||||||
{"JLZ", 0x029d, 0xffff, DSPInterpreter::jcc, NULL, 2, 1, {{P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, false, true},
|
{"JLZ", 0x029d, 0xffff, DSPInterpreter::jcc, &DSPEmitter::jcc, 2, 1, {{P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, false, true},
|
||||||
{"JO", 0x029e, 0xffff, DSPInterpreter::jcc, NULL, 2, 1, {{P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, false, true},
|
{"JO", 0x029e, 0xffff, DSPInterpreter::jcc, &DSPEmitter::jcc, 2, 1, {{P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, false, true},
|
||||||
{"JMP", 0x029f, 0xffff, DSPInterpreter::jcc, NULL, 2, 1, {{P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, true, true},
|
{"JMP", 0x029f, 0xffff, DSPInterpreter::jcc, &DSPEmitter::jcc, 2, 1, {{P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, true, true},
|
||||||
|
|
||||||
{"JRGE", 0x1700, 0xff1f, DSPInterpreter::jmprcc, &DSPEmitter::jmprcc, 1, 1, {{P_REG, 1, 0, 5, 0x00e0}}, false, true, false, false},
|
{"JRGE", 0x1700, 0xff1f, DSPInterpreter::jmprcc, &DSPEmitter::jmprcc, 1, 1, {{P_REG, 1, 0, 5, 0x00e0}}, false, true, false, false},
|
||||||
{"JRL", 0x1701, 0xff1f, DSPInterpreter::jmprcc, &DSPEmitter::jmprcc, 1, 1, {{P_REG, 1, 0, 5, 0x00e0}}, false, true, false, false},
|
{"JRL", 0x1701, 0xff1f, DSPInterpreter::jmprcc, &DSPEmitter::jmprcc, 1, 1, {{P_REG, 1, 0, 5, 0x00e0}}, false, true, false, false},
|
||||||
@ -158,12 +158,12 @@ const DSPOPCTemplate opcodes[] =
|
|||||||
{"ASRN", 0x02cb, 0xffff, DSPInterpreter::asrn, NULL, 1, 0, {}, false, false, false, false}, // discovered by ector!
|
{"ASRN", 0x02cb, 0xffff, DSPInterpreter::asrn, NULL, 1, 0, {}, false, false, false, false}, // discovered by ector!
|
||||||
|
|
||||||
{"LRI", 0x0080, 0xffe0, DSPInterpreter::lri, &DSPEmitter::lri, 2, 2, {{P_REG, 1, 0, 0, 0x001f}, {P_IMM, 2, 1, 0, 0xffff}}, false, false, false, true},
|
{"LRI", 0x0080, 0xffe0, DSPInterpreter::lri, &DSPEmitter::lri, 2, 2, {{P_REG, 1, 0, 0, 0x001f}, {P_IMM, 2, 1, 0, 0xffff}}, false, false, false, true},
|
||||||
{"LR", 0x00c0, 0xffe0, DSPInterpreter::lr, NULL, 2, 2, {{P_REG, 1, 0, 0, 0x001f}, {P_MEM, 2, 1, 0, 0xffff}}, false, false, false, true},
|
{"LR", 0x00c0, 0xffe0, DSPInterpreter::lr, &DSPEmitter::lr, 2, 2, {{P_REG, 1, 0, 0, 0x001f}, {P_MEM, 2, 1, 0, 0xffff}}, false, false, false, true},
|
||||||
{"SR", 0x00e0, 0xffe0, DSPInterpreter::sr, NULL, 2, 2, {{P_MEM, 2, 1, 0, 0xffff}, {P_REG, 1, 0, 0, 0x001f}}, false, false, false, true},
|
{"SR", 0x00e0, 0xffe0, DSPInterpreter::sr, &DSPEmitter::sr, 2, 2, {{P_MEM, 2, 1, 0, 0xffff}, {P_REG, 1, 0, 0, 0x001f}}, false, false, false, true},
|
||||||
|
|
||||||
{"MRR", 0x1c00, 0xfc00, DSPInterpreter::mrr, &DSPEmitter::mrr, 1, 2, {{P_REG, 1, 0, 5, 0x03e0}, {P_REG, 1, 0, 0, 0x001f}}, false, false, false, false},
|
{"MRR", 0x1c00, 0xfc00, DSPInterpreter::mrr, &DSPEmitter::mrr, 1, 2, {{P_REG, 1, 0, 5, 0x03e0}, {P_REG, 1, 0, 0, 0x001f}}, false, false, false, false},
|
||||||
|
|
||||||
{"SI", 0x1600, 0xff00, DSPInterpreter::si, NULL, 2, 2, {{P_MEM, 1, 0, 0, 0x00ff}, {P_IMM, 2, 1, 0, 0xffff}}, false, false, false, true},
|
{"SI", 0x1600, 0xff00, DSPInterpreter::si, &DSPEmitter::si, 2, 2, {{P_MEM, 1, 0, 0, 0x00ff}, {P_IMM, 2, 1, 0, 0xffff}}, false, false, false, true},
|
||||||
|
|
||||||
{"ADDIS", 0x0400, 0xfe00, DSPInterpreter::addis, NULL, 1, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_IMM, 1, 0, 0, 0x00ff}}, false, false, false, false},
|
{"ADDIS", 0x0400, 0xfe00, DSPInterpreter::addis, NULL, 1, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_IMM, 1, 0, 0, 0x00ff}}, false, false, false, false},
|
||||||
{"CMPIS", 0x0600, 0xfe00, DSPInterpreter::cmpis, NULL, 1, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_IMM, 1, 0, 0, 0x00ff}}, false, false, false, false},
|
{"CMPIS", 0x0600, 0xfe00, DSPInterpreter::cmpis, NULL, 1, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_IMM, 1, 0, 0, 0x00ff}}, false, false, false, false},
|
||||||
@ -201,8 +201,8 @@ const DSPOPCTemplate opcodes[] =
|
|||||||
{"SRRN", 0x1b80, 0xff80, DSPInterpreter::srrn, NULL, 1, 2, {{P_PRG, 1, 0, 5, 0x0060}, {P_REG, 1, 0, 0, 0x001f}}, false, false, false, false},
|
{"SRRN", 0x1b80, 0xff80, DSPInterpreter::srrn, NULL, 1, 2, {{P_PRG, 1, 0, 5, 0x0060}, {P_REG, 1, 0, 0, 0x001f}}, false, false, false, false},
|
||||||
|
|
||||||
//2
|
//2
|
||||||
{"LRS", 0x2000, 0xf800, DSPInterpreter::lrs, NULL, 1, 2, {{P_REG18, 1, 0, 8, 0x0700}, {P_MEM, 1, 0, 0, 0x00ff}}, false, false, false, false},
|
{"LRS", 0x2000, 0xf800, DSPInterpreter::lrs, &DSPEmitter::lrs, 1, 2, {{P_REG18, 1, 0, 8, 0x0700}, {P_MEM, 1, 0, 0, 0x00ff}}, false, false, false, false},
|
||||||
{"SRS", 0x2800, 0xf800, DSPInterpreter::srs, NULL, 1, 2, {{P_MEM, 1, 0, 0, 0x00ff}, {P_REG18, 1, 0, 8, 0x0700}}, false, false, false, false},
|
{"SRS", 0x2800, 0xf800, DSPInterpreter::srs, &DSPEmitter::srs, 1, 2, {{P_MEM, 1, 0, 0, 0x00ff}, {P_REG18, 1, 0, 8, 0x0700}}, false, false, false, false},
|
||||||
|
|
||||||
// opcodes that can be extended
|
// opcodes that can be extended
|
||||||
|
|
||||||
|
@ -414,7 +414,7 @@ void DSPEmitter::addr(const UDSPInstruction opc)
|
|||||||
|
|
||||||
Update_SR_Register64();
|
Update_SR_Register64();
|
||||||
#else
|
#else
|
||||||
MainOpFallback(opc);
|
Default(opc);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -821,7 +821,7 @@ void DSPEmitter::lsl16(const UDSPInstruction opc)
|
|||||||
// Update_SR_Register64(dsp_get_long_acc(areg));
|
// Update_SR_Register64(dsp_get_long_acc(areg));
|
||||||
Update_SR_Register64();
|
Update_SR_Register64();
|
||||||
#else
|
#else
|
||||||
MainOpFallback(opc);
|
Default(opc);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -883,7 +883,7 @@ void DSPEmitter::lsl(const UDSPInstruction opc)
|
|||||||
// Update_SR_Register64(dsp_get_long_acc(rreg));
|
// Update_SR_Register64(dsp_get_long_acc(rreg));
|
||||||
Update_SR_Register64();
|
Update_SR_Register64();
|
||||||
#else
|
#else
|
||||||
MainOpFallback(opc);
|
Default(opc);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -178,6 +178,9 @@ void r_jcc(const UDSPInstruction opc, DSPEmitter& emitter)
|
|||||||
// address represented by value that follows this "jmp" instruction.
|
// address represented by value that follows this "jmp" instruction.
|
||||||
void DSPEmitter::jcc(const UDSPInstruction opc)
|
void DSPEmitter::jcc(const UDSPInstruction opc)
|
||||||
{
|
{
|
||||||
|
// Disabled as jcc has issues in games
|
||||||
|
Default(opc); return;
|
||||||
|
#if 0
|
||||||
#ifdef _M_IX86 // All32
|
#ifdef _M_IX86 // All32
|
||||||
MOV(16, M(&(g_dsp.pc)), Imm16(compilePC + 1));
|
MOV(16, M(&(g_dsp.pc)), Imm16(compilePC + 1));
|
||||||
#else
|
#else
|
||||||
@ -185,6 +188,7 @@ void DSPEmitter::jcc(const UDSPInstruction opc)
|
|||||||
MOV(16, MDisp(RAX,0), Imm16(compilePC + 1));
|
MOV(16, MDisp(RAX,0), Imm16(compilePC + 1));
|
||||||
#endif
|
#endif
|
||||||
ReJitConditional<r_jcc>(opc, *this);
|
ReJitConditional<r_jcc>(opc, *this);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void r_jmprcc(const UDSPInstruction opc, DSPEmitter& emitter)
|
void r_jmprcc(const UDSPInstruction opc, DSPEmitter& emitter)
|
||||||
|
@ -79,8 +79,17 @@ void DSPEmitter::s(const UDSPInstruction opc)
|
|||||||
{
|
{
|
||||||
u8 dreg = opc & 0x3;
|
u8 dreg = opc & 0x3;
|
||||||
u8 sreg = ((opc >> 3) & 0x3) + DSP_REG_ACL0;
|
u8 sreg = ((opc >> 3) & 0x3) + DSP_REG_ACL0;
|
||||||
|
// u16 addr = g_dsp.r[dest];
|
||||||
ext_dmem_write(dreg, sreg);
|
#ifdef _M_IX86 // All32
|
||||||
|
MOVZX(32, 16, EAX, M(&g_dsp.r[dreg]));
|
||||||
|
MOVZX(32, 16, ECX, M(&g_dsp.r[sreg]));
|
||||||
|
#else
|
||||||
|
MOV(64, R(R11), ImmPtr(&g_dsp.r));
|
||||||
|
MOVZX(64, 16, EAX, MDisp(R11,dreg*2));
|
||||||
|
MOVZX(64, 16, ECX, MDisp(R11,sreg*2));
|
||||||
|
#endif
|
||||||
|
// u16 val = g_dsp.r[src];
|
||||||
|
dmem_write();
|
||||||
increment_addr_reg(dreg);
|
increment_addr_reg(dreg);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -92,8 +101,15 @@ void DSPEmitter::sn(const UDSPInstruction opc)
|
|||||||
{
|
{
|
||||||
u8 dreg = opc & 0x3;
|
u8 dreg = opc & 0x3;
|
||||||
u8 sreg = ((opc >> 3) & 0x3) + DSP_REG_ACL0;
|
u8 sreg = ((opc >> 3) & 0x3) + DSP_REG_ACL0;
|
||||||
|
#ifdef _M_IX86 // All32
|
||||||
ext_dmem_write(dreg, sreg);
|
MOVZX(32, 16, EAX, M(&g_dsp.r[dreg]));
|
||||||
|
MOVZX(32, 16, ECX, M(&g_dsp.r[sreg]));
|
||||||
|
#else
|
||||||
|
MOV(64, R(R11), ImmPtr(&g_dsp.r));
|
||||||
|
MOVZX(64, 16, EAX, MDisp(R11,dreg*2));
|
||||||
|
MOVZX(64, 16, ECX, MDisp(R11,sreg*2));
|
||||||
|
#endif
|
||||||
|
dmem_write();
|
||||||
increase_addr_reg(dreg);
|
increase_addr_reg(dreg);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -164,8 +180,15 @@ void DSPEmitter::ls(const UDSPInstruction opc)
|
|||||||
{
|
{
|
||||||
u8 sreg = (opc & 0x1) + DSP_REG_ACM0;
|
u8 sreg = (opc & 0x1) + DSP_REG_ACM0;
|
||||||
u8 dreg = ((opc >> 4) & 0x3) + DSP_REG_AXL0;
|
u8 dreg = ((opc >> 4) & 0x3) + DSP_REG_AXL0;
|
||||||
|
#ifdef _M_IX86 // All32
|
||||||
ext_dmem_write(DSP_REG_AR3, sreg);
|
MOVZX(32, 16, EAX, M(&g_dsp.r[DSP_REG_AR3]));
|
||||||
|
MOVZX(32, 16, ECX, M(&g_dsp.r[sreg]));
|
||||||
|
#else
|
||||||
|
MOV(64, R(R11), ImmPtr(&g_dsp.r));
|
||||||
|
MOVZX(64, 16, EAX, MDisp(R11,DSP_REG_AR3*2));
|
||||||
|
MOVZX(64, 16, ECX, MDisp(R11,sreg*2));
|
||||||
|
#endif
|
||||||
|
dmem_write();
|
||||||
|
|
||||||
pushExtValueFromMem(dreg, DSP_REG_AR0);
|
pushExtValueFromMem(dreg, DSP_REG_AR0);
|
||||||
|
|
||||||
@ -184,8 +207,15 @@ void DSPEmitter::lsn(const UDSPInstruction opc)
|
|||||||
{
|
{
|
||||||
u8 sreg = (opc & 0x1) + DSP_REG_ACM0;
|
u8 sreg = (opc & 0x1) + DSP_REG_ACM0;
|
||||||
u8 dreg = ((opc >> 4) & 0x3) + DSP_REG_AXL0;
|
u8 dreg = ((opc >> 4) & 0x3) + DSP_REG_AXL0;
|
||||||
|
#ifdef _M_IX86 // All32
|
||||||
ext_dmem_write(DSP_REG_AR3, sreg);
|
MOVZX(32, 16, EAX, M(&g_dsp.r[DSP_REG_AR3]));
|
||||||
|
MOVZX(32, 16, ECX, M(&g_dsp.r[sreg]));
|
||||||
|
#else
|
||||||
|
MOV(64, R(R11), ImmPtr(&g_dsp.r));
|
||||||
|
MOVZX(64, 16, EAX, MDisp(R11,DSP_REG_AR3*2));
|
||||||
|
MOVZX(64, 16, ECX, MDisp(R11,sreg*2));
|
||||||
|
#endif
|
||||||
|
dmem_write();
|
||||||
|
|
||||||
pushExtValueFromMem(dreg, DSP_REG_AR0);
|
pushExtValueFromMem(dreg, DSP_REG_AR0);
|
||||||
|
|
||||||
@ -203,8 +233,15 @@ void DSPEmitter::lsm(const UDSPInstruction opc)
|
|||||||
{
|
{
|
||||||
u8 sreg = (opc & 0x1) + DSP_REG_ACM0;
|
u8 sreg = (opc & 0x1) + DSP_REG_ACM0;
|
||||||
u8 dreg = ((opc >> 4) & 0x3) + DSP_REG_AXL0;
|
u8 dreg = ((opc >> 4) & 0x3) + DSP_REG_AXL0;
|
||||||
|
#ifdef _M_IX86 // All32
|
||||||
ext_dmem_write(DSP_REG_AR3, sreg);
|
MOVZX(32, 16, EAX, M(&g_dsp.r[DSP_REG_AR3]));
|
||||||
|
MOVZX(32, 16, ECX, M(&g_dsp.r[sreg]));
|
||||||
|
#else
|
||||||
|
MOV(64, R(R11), ImmPtr(&g_dsp.r));
|
||||||
|
MOVZX(64, 16, EAX, MDisp(R11,DSP_REG_AR3*2));
|
||||||
|
MOVZX(64, 16, ECX, MDisp(R11,sreg*2));
|
||||||
|
#endif
|
||||||
|
dmem_write();
|
||||||
|
|
||||||
pushExtValueFromMem(dreg, DSP_REG_AR0);
|
pushExtValueFromMem(dreg, DSP_REG_AR0);
|
||||||
|
|
||||||
@ -223,8 +260,15 @@ void DSPEmitter::lsnm(const UDSPInstruction opc)
|
|||||||
{
|
{
|
||||||
u8 sreg = (opc & 0x1) + DSP_REG_ACM0;
|
u8 sreg = (opc & 0x1) + DSP_REG_ACM0;
|
||||||
u8 dreg = ((opc >> 4) & 0x3) + DSP_REG_AXL0;
|
u8 dreg = ((opc >> 4) & 0x3) + DSP_REG_AXL0;
|
||||||
|
#ifdef _M_IX86 // All32
|
||||||
ext_dmem_write(DSP_REG_AR3, sreg);
|
MOVZX(32, 16, EAX, M(&g_dsp.r[DSP_REG_AR3]));
|
||||||
|
MOVZX(32, 16, ECX, M(&g_dsp.r[sreg]));
|
||||||
|
#else
|
||||||
|
MOV(64, R(R11), ImmPtr(&g_dsp.r));
|
||||||
|
MOVZX(64, 16, EAX, MDisp(R11,DSP_REG_AR3*2));
|
||||||
|
MOVZX(64, 16, ECX, MDisp(R11,sreg*2));
|
||||||
|
#endif
|
||||||
|
dmem_write();
|
||||||
|
|
||||||
pushExtValueFromMem(dreg, DSP_REG_AR0);
|
pushExtValueFromMem(dreg, DSP_REG_AR0);
|
||||||
|
|
||||||
@ -241,8 +285,15 @@ void DSPEmitter::sl(const UDSPInstruction opc)
|
|||||||
{
|
{
|
||||||
u8 sreg = (opc & 0x1) + DSP_REG_ACM0;
|
u8 sreg = (opc & 0x1) + DSP_REG_ACM0;
|
||||||
u8 dreg = ((opc >> 4) & 0x3) + DSP_REG_AXL0;
|
u8 dreg = ((opc >> 4) & 0x3) + DSP_REG_AXL0;
|
||||||
|
#ifdef _M_IX86 // All32
|
||||||
ext_dmem_write(DSP_REG_AR0, sreg);
|
MOVZX(32, 16, EAX, M(&g_dsp.r[DSP_REG_AR0]));
|
||||||
|
MOVZX(32, 16, ECX, M(&g_dsp.r[sreg]));
|
||||||
|
#else
|
||||||
|
MOV(64, R(R11), ImmPtr(&g_dsp.r));
|
||||||
|
MOVZX(64, 16, EAX, MDisp(R11,DSP_REG_AR0*2));
|
||||||
|
MOVZX(64, 16, ECX, MDisp(R11,sreg*2));
|
||||||
|
#endif
|
||||||
|
dmem_write();
|
||||||
|
|
||||||
pushExtValueFromMem(dreg, DSP_REG_AR3);
|
pushExtValueFromMem(dreg, DSP_REG_AR3);
|
||||||
|
|
||||||
@ -260,8 +311,15 @@ void DSPEmitter::sln(const UDSPInstruction opc)
|
|||||||
{
|
{
|
||||||
u8 sreg = (opc & 0x1) + DSP_REG_ACM0;
|
u8 sreg = (opc & 0x1) + DSP_REG_ACM0;
|
||||||
u8 dreg = ((opc >> 4) & 0x3) + DSP_REG_AXL0;
|
u8 dreg = ((opc >> 4) & 0x3) + DSP_REG_AXL0;
|
||||||
|
#ifdef _M_IX86 // All32
|
||||||
ext_dmem_write(DSP_REG_AR0, sreg);
|
MOVZX(32, 16, EAX, M(&g_dsp.r[DSP_REG_AR0]));
|
||||||
|
MOVZX(32, 16, ECX, M(&g_dsp.r[sreg]));
|
||||||
|
#else
|
||||||
|
MOV(64, R(R11), ImmPtr(&g_dsp.r));
|
||||||
|
MOVZX(64, 16, EAX, MDisp(R11,DSP_REG_AR0*2));
|
||||||
|
MOVZX(64, 16, ECX, MDisp(R11,sreg*2));
|
||||||
|
#endif
|
||||||
|
dmem_write();
|
||||||
|
|
||||||
pushExtValueFromMem(dreg, DSP_REG_AR3);
|
pushExtValueFromMem(dreg, DSP_REG_AR3);
|
||||||
|
|
||||||
@ -279,8 +337,15 @@ void DSPEmitter::slm(const UDSPInstruction opc)
|
|||||||
{
|
{
|
||||||
u8 sreg = (opc & 0x1) + DSP_REG_ACM0;
|
u8 sreg = (opc & 0x1) + DSP_REG_ACM0;
|
||||||
u8 dreg = ((opc >> 4) & 0x3) + DSP_REG_AXL0;
|
u8 dreg = ((opc >> 4) & 0x3) + DSP_REG_AXL0;
|
||||||
|
#ifdef _M_IX86 // All32
|
||||||
ext_dmem_write(DSP_REG_AR0, sreg);
|
MOVZX(32, 16, EAX, M(&g_dsp.r[DSP_REG_AR0]));
|
||||||
|
MOVZX(32, 16, ECX, M(&g_dsp.r[sreg]));
|
||||||
|
#else
|
||||||
|
MOV(64, R(R11), ImmPtr(&g_dsp.r));
|
||||||
|
MOVZX(64, 16, EAX, MDisp(R11,DSP_REG_AR0*2));
|
||||||
|
MOVZX(64, 16, ECX, MDisp(R11,sreg*2));
|
||||||
|
#endif
|
||||||
|
dmem_write();
|
||||||
|
|
||||||
pushExtValueFromMem(dreg, DSP_REG_AR3);
|
pushExtValueFromMem(dreg, DSP_REG_AR3);
|
||||||
|
|
||||||
@ -298,8 +363,15 @@ void DSPEmitter::slnm(const UDSPInstruction opc)
|
|||||||
{
|
{
|
||||||
u8 sreg = (opc & 0x1) + DSP_REG_ACM0;
|
u8 sreg = (opc & 0x1) + DSP_REG_ACM0;
|
||||||
u8 dreg = ((opc >> 4) & 0x3) + DSP_REG_AXL0;
|
u8 dreg = ((opc >> 4) & 0x3) + DSP_REG_AXL0;
|
||||||
|
#ifdef _M_IX86 // All32
|
||||||
ext_dmem_write(DSP_REG_AR0, sreg);
|
MOVZX(32, 16, EAX, M(&g_dsp.r[DSP_REG_AR0]));
|
||||||
|
MOVZX(32, 16, ECX, M(&g_dsp.r[sreg]));
|
||||||
|
#else
|
||||||
|
MOV(64, R(R11), ImmPtr(&g_dsp.r));
|
||||||
|
MOVZX(64, 16, EAX, MDisp(R11,DSP_REG_AR0*2));
|
||||||
|
MOVZX(64, 16, ECX, MDisp(R11,sreg*2));
|
||||||
|
#endif
|
||||||
|
dmem_write();
|
||||||
|
|
||||||
pushExtValueFromMem(dreg, DSP_REG_AR3);
|
pushExtValueFromMem(dreg, DSP_REG_AR3);
|
||||||
|
|
||||||
@ -566,14 +638,28 @@ void DSPEmitter::pushExtValueFromReg(u16 dreg, u16 sreg) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void DSPEmitter::pushExtValueFromMem(u16 dreg, u16 sreg) {
|
void DSPEmitter::pushExtValueFromMem(u16 dreg, u16 sreg) {
|
||||||
ext_dmem_read(sreg);
|
// u16 addr = g_dsp.r[addr];
|
||||||
|
#ifdef _M_IX86 // All32
|
||||||
|
MOVZX(32, 16, ECX, M(&g_dsp.r[sreg]));
|
||||||
|
#else
|
||||||
|
MOV(64, R(R11), ImmPtr(&g_dsp.r));
|
||||||
|
MOVZX(64, 16, ECX, MDisp(R11,sreg*2));
|
||||||
|
#endif
|
||||||
|
dmem_read();
|
||||||
MOVZX(32, 16, EBX, R(EAX));
|
MOVZX(32, 16, EBX, R(EAX));
|
||||||
|
|
||||||
storeIndex = dreg;
|
storeIndex = dreg;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DSPEmitter::pushExtValueFromMem2(u16 dreg, u16 sreg) {
|
void DSPEmitter::pushExtValueFromMem2(u16 dreg, u16 sreg) {
|
||||||
ext_dmem_read(sreg);
|
// u16 addr = g_dsp.r[addr];
|
||||||
|
#ifdef _M_IX86 // All32
|
||||||
|
MOVZX(32, 16, ECX, M(&g_dsp.r[sreg]));
|
||||||
|
#else
|
||||||
|
MOV(64, R(R11), ImmPtr(&g_dsp.r));
|
||||||
|
MOVZX(64, 16, ECX, MDisp(R11,sreg*2));
|
||||||
|
#endif
|
||||||
|
dmem_read();
|
||||||
SHL(32,R(EAX),Imm8(16));
|
SHL(32,R(EAX),Imm8(16));
|
||||||
OR(32, R(EBX), R(EAX));
|
OR(32, R(EBX), R(EAX));
|
||||||
|
|
||||||
|
@ -108,7 +108,7 @@ void DSPEmitter::dsp_reg_store_stack(int stack_reg, Gen::X64Reg host_sreg)
|
|||||||
#ifdef _M_IX86 // All32
|
#ifdef _M_IX86 // All32
|
||||||
MOV(16, M(&g_dsp.r[DSP_REG_ST0+stack_reg]), R(EDX));
|
MOV(16, M(&g_dsp.r[DSP_REG_ST0+stack_reg]), R(EDX));
|
||||||
#else
|
#else
|
||||||
MOV(64, R(R11), Imm64((u64)g_dsp.r));
|
MOV(64, R(R11), ImmPtr(g_dsp.r));
|
||||||
MOV(16, MDisp(R11,(DSP_REG_ST0+stack_reg)*2), R(EDX));
|
MOV(16, MDisp(R11,(DSP_REG_ST0+stack_reg)*2), R(EDX));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -119,7 +119,7 @@ void DSPEmitter::dsp_reg_load_stack(int stack_reg, Gen::X64Reg host_dreg)
|
|||||||
#ifdef _M_IX86 // All32
|
#ifdef _M_IX86 // All32
|
||||||
MOV(16, R(EDX), M(&g_dsp.r[DSP_REG_ST0+stack_reg]));
|
MOV(16, R(EDX), M(&g_dsp.r[DSP_REG_ST0+stack_reg]));
|
||||||
#else
|
#else
|
||||||
MOV(64, R(R11), Imm64((u64)g_dsp.r));
|
MOV(64, R(R11), ImmPtr(g_dsp.r));
|
||||||
MOV(16, R(EDX), MDisp(R11,(DSP_REG_ST0+stack_reg)*2));
|
MOV(16, R(EDX), MDisp(R11,(DSP_REG_ST0+stack_reg)*2));
|
||||||
#endif
|
#endif
|
||||||
dsp_reg_stack_pop(stack_reg);
|
dsp_reg_stack_pop(stack_reg);
|
||||||
@ -135,7 +135,7 @@ void DSPEmitter::dsp_reg_store_stack_imm(int stack_reg, u16 val)
|
|||||||
#ifdef _M_IX86 // All32
|
#ifdef _M_IX86 // All32
|
||||||
MOV(16, M(&g_dsp.r[DSP_REG_ST0+stack_reg]), Imm16(val));
|
MOV(16, M(&g_dsp.r[DSP_REG_ST0+stack_reg]), Imm16(val));
|
||||||
#else
|
#else
|
||||||
MOV(64, R(R11), Imm64((u64)g_dsp.r));
|
MOV(64, R(R11), ImmPtr(g_dsp.r));
|
||||||
MOV(16, MDisp(R11,(DSP_REG_ST0+stack_reg)*2), Imm16(val));
|
MOV(16, MDisp(R11,(DSP_REG_ST0+stack_reg)*2), Imm16(val));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -151,7 +151,7 @@ void DSPEmitter::dsp_op_write_reg(int reg, Gen::X64Reg host_sreg)
|
|||||||
#ifdef _M_IX86 // All32
|
#ifdef _M_IX86 // All32
|
||||||
MOV(16, M(&g_dsp.r[reg]), R(host_sreg));
|
MOV(16, M(&g_dsp.r[reg]), R(host_sreg));
|
||||||
#else
|
#else
|
||||||
MOV(64, R(R11), Imm64((u64)g_dsp.r));
|
MOV(64, R(R11), ImmPtr(g_dsp.r));
|
||||||
MOV(16, MDisp(R11,reg*2), R(host_sreg));
|
MOV(16, MDisp(R11,reg*2), R(host_sreg));
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
@ -168,7 +168,7 @@ void DSPEmitter::dsp_op_write_reg(int reg, Gen::X64Reg host_sreg)
|
|||||||
#ifdef _M_IX86 // All32
|
#ifdef _M_IX86 // All32
|
||||||
MOV(16, M(&g_dsp.r[reg]), R(host_sreg));
|
MOV(16, M(&g_dsp.r[reg]), R(host_sreg));
|
||||||
#else
|
#else
|
||||||
MOV(64, R(R11), Imm64((u64)g_dsp.r));
|
MOV(64, R(R11), ImmPtr(g_dsp.r));
|
||||||
MOV(16, MDisp(R11,reg*2), R(host_sreg));
|
MOV(16, MDisp(R11,reg*2), R(host_sreg));
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
@ -185,7 +185,7 @@ void DSPEmitter::dsp_op_write_reg_imm(int reg, u16 val)
|
|||||||
#ifdef _M_IX86 // All32
|
#ifdef _M_IX86 // All32
|
||||||
MOV(16, M(&g_dsp.r[reg]), Imm16((u16)(s16)(s8)(u8)val));
|
MOV(16, M(&g_dsp.r[reg]), Imm16((u16)(s16)(s8)(u8)val));
|
||||||
#else
|
#else
|
||||||
MOV(64, R(R11), Imm64((u64)g_dsp.r));
|
MOV(64, R(R11), ImmPtr(g_dsp.r));
|
||||||
MOV(16, MDisp(R11,reg*2), Imm16((u16)(s16)(s8)(u8)val));
|
MOV(16, MDisp(R11,reg*2), Imm16((u16)(s16)(s8)(u8)val));
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
@ -202,7 +202,7 @@ void DSPEmitter::dsp_op_write_reg_imm(int reg, u16 val)
|
|||||||
#ifdef _M_IX86 // All32
|
#ifdef _M_IX86 // All32
|
||||||
MOV(16, M(&g_dsp.r[reg]), Imm16(val));
|
MOV(16, M(&g_dsp.r[reg]), Imm16(val));
|
||||||
#else
|
#else
|
||||||
MOV(64, R(R11), Imm64((u64)g_dsp.r));
|
MOV(64, R(R11), ImmPtr(g_dsp.r));
|
||||||
MOV(16, MDisp(R11,reg*2), Imm16(val));
|
MOV(16, MDisp(R11,reg*2), Imm16(val));
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
@ -231,7 +231,7 @@ void DSPEmitter::dsp_conditional_extend_accum(int reg)
|
|||||||
#ifdef _M_IX86 // All32
|
#ifdef _M_IX86 // All32
|
||||||
MOVSX(32, 16, EAX, M(&g_dsp.r[reg]));
|
MOVSX(32, 16, EAX, M(&g_dsp.r[reg]));
|
||||||
#else
|
#else
|
||||||
MOVSX(32, 16, EAX, MDisp(R11,reg*2));
|
MOVSX(64, 16, EAX, MDisp(R11,reg*2));
|
||||||
#endif
|
#endif
|
||||||
SHR(32,R(EAX),Imm8(16));
|
SHR(32,R(EAX),Imm8(16));
|
||||||
//g_dsp.r[reg - DSP_REG_ACM0 + DSP_REG_ACH0] = (val & 0x8000) ? 0xFFFF : 0x0000;
|
//g_dsp.r[reg - DSP_REG_ACM0 + DSP_REG_ACH0] = (val & 0x8000) ? 0xFFFF : 0x0000;
|
||||||
@ -295,7 +295,7 @@ void DSPEmitter::dsp_op_read_reg(int reg, Gen::X64Reg host_dreg)
|
|||||||
case DSP_REG_ST1:
|
case DSP_REG_ST1:
|
||||||
case DSP_REG_ST2:
|
case DSP_REG_ST2:
|
||||||
case DSP_REG_ST3:
|
case DSP_REG_ST3:
|
||||||
return dsp_reg_load_stack(reg - 0x0c, host_dreg);
|
return dsp_reg_load_stack(reg - DSP_REG_ST0, host_dreg);
|
||||||
default:
|
default:
|
||||||
//return g_dsp.r[reg];
|
//return g_dsp.r[reg];
|
||||||
#ifdef _M_IX86 // All32
|
#ifdef _M_IX86 // All32
|
||||||
|
@ -154,7 +154,7 @@ void DSPEmitter::clrp(const UDSPInstruction opc)
|
|||||||
// g_dsp.r[DSP_REG_PRODM2] = 0x0010;
|
// g_dsp.r[DSP_REG_PRODM2] = 0x0010;
|
||||||
MOV(16, MDisp(R11, DSP_REG_PRODM2 * 2), Imm16(0x0010));
|
MOV(16, MDisp(R11, DSP_REG_PRODM2 * 2), Imm16(0x0010));
|
||||||
#else
|
#else
|
||||||
MainOpFallback(opc);
|
Default(opc);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -171,7 +171,7 @@ void DSPEmitter::tstprod(const UDSPInstruction opc)
|
|||||||
// Update_SR_Register64(prod);
|
// Update_SR_Register64(prod);
|
||||||
Update_SR_Register64();
|
Update_SR_Register64();
|
||||||
#else
|
#else
|
||||||
MainOpFallback(opc);
|
Default(opc);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -194,7 +194,7 @@ void DSPEmitter::movp(const UDSPInstruction opc)
|
|||||||
// Update_SR_Register64(acc);
|
// Update_SR_Register64(acc);
|
||||||
Update_SR_Register64();
|
Update_SR_Register64();
|
||||||
#else
|
#else
|
||||||
MainOpFallback(opc);
|
Default(opc);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -217,7 +217,7 @@ void DSPEmitter::movnp(const UDSPInstruction opc)
|
|||||||
// Update_SR_Register64(acc);
|
// Update_SR_Register64(acc);
|
||||||
Update_SR_Register64();
|
Update_SR_Register64();
|
||||||
#else
|
#else
|
||||||
MainOpFallback(opc);
|
Default(opc);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -239,7 +239,7 @@ void DSPEmitter::movpz(const UDSPInstruction opc)
|
|||||||
// Update_SR_Register64(acc);
|
// Update_SR_Register64(acc);
|
||||||
Update_SR_Register64();
|
Update_SR_Register64();
|
||||||
#else
|
#else
|
||||||
MainOpFallback(opc);
|
Default(opc);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -282,7 +282,7 @@ void DSPEmitter::mulaxh(const UDSPInstruction opc)
|
|||||||
// dsp_set_long_prod(prod);
|
// dsp_set_long_prod(prod);
|
||||||
set_long_prod();
|
set_long_prod();
|
||||||
#else
|
#else
|
||||||
MainOpFallback(opc);
|
Default(opc);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -307,7 +307,7 @@ void DSPEmitter::mul(const UDSPInstruction opc)
|
|||||||
// dsp_set_long_prod(prod);
|
// dsp_set_long_prod(prod);
|
||||||
set_long_prod();
|
set_long_prod();
|
||||||
#else
|
#else
|
||||||
MainOpFallback(opc);
|
Default(opc);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -344,7 +344,7 @@ void DSPEmitter::mulac(const UDSPInstruction opc)
|
|||||||
// Update_SR_Register64(dsp_get_long_acc(rreg));
|
// Update_SR_Register64(dsp_get_long_acc(rreg));
|
||||||
Update_SR_Register64();
|
Update_SR_Register64();
|
||||||
#else
|
#else
|
||||||
MainOpFallback(opc);
|
Default(opc);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -370,7 +370,7 @@ void DSPEmitter::mulmv(const UDSPInstruction opc)
|
|||||||
// Update_SR_Register64(dsp_get_long_acc(rreg));
|
// Update_SR_Register64(dsp_get_long_acc(rreg));
|
||||||
Update_SR_Register64();
|
Update_SR_Register64();
|
||||||
#else
|
#else
|
||||||
MainOpFallback(opc);
|
Default(opc);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -397,7 +397,7 @@ void DSPEmitter::mulmvz(const UDSPInstruction opc)
|
|||||||
// Update_SR_Register64(dsp_get_long_acc(rreg));
|
// Update_SR_Register64(dsp_get_long_acc(rreg));
|
||||||
Update_SR_Register64();
|
Update_SR_Register64();
|
||||||
#else
|
#else
|
||||||
MainOpFallback(opc);
|
Default(opc);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -519,7 +519,7 @@ void DSPEmitter::mulc(const UDSPInstruction opc)
|
|||||||
// dsp_set_long_prod(prod);
|
// dsp_set_long_prod(prod);
|
||||||
set_long_prod();
|
set_long_prod();
|
||||||
#else
|
#else
|
||||||
MainOpFallback(opc);
|
Default(opc);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -557,7 +557,7 @@ void DSPEmitter::mulcac(const UDSPInstruction opc)
|
|||||||
// Update_SR_Register64(dsp_get_long_acc(rreg));
|
// Update_SR_Register64(dsp_get_long_acc(rreg));
|
||||||
Update_SR_Register64();
|
Update_SR_Register64();
|
||||||
#else
|
#else
|
||||||
MainOpFallback(opc);
|
Default(opc);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -593,7 +593,7 @@ void DSPEmitter::mulcmv(const UDSPInstruction opc)
|
|||||||
// Update_SR_Register64(dsp_get_long_acc(rreg));
|
// Update_SR_Register64(dsp_get_long_acc(rreg));
|
||||||
Update_SR_Register64();
|
Update_SR_Register64();
|
||||||
#else
|
#else
|
||||||
MainOpFallback(opc);
|
Default(opc);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -631,7 +631,7 @@ void DSPEmitter::mulcmvz(const UDSPInstruction opc)
|
|||||||
// Update_SR_Register64(dsp_get_long_acc(rreg));
|
// Update_SR_Register64(dsp_get_long_acc(rreg));
|
||||||
Update_SR_Register64();
|
Update_SR_Register64();
|
||||||
#else
|
#else
|
||||||
MainOpFallback(opc);
|
Default(opc);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -696,7 +696,7 @@ void DSPEmitter::maddc(const UDSPInstruction opc)
|
|||||||
// dsp_set_long_prod(prod);
|
// dsp_set_long_prod(prod);
|
||||||
set_long_prod();
|
set_long_prod();
|
||||||
#else
|
#else
|
||||||
MainOpFallback(opc);
|
Default(opc);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -721,7 +721,7 @@ void DSPEmitter::msubc(const UDSPInstruction opc)
|
|||||||
// dsp_set_long_prod(prod);
|
// dsp_set_long_prod(prod);
|
||||||
set_long_prod();
|
set_long_prod();
|
||||||
#else
|
#else
|
||||||
MainOpFallback(opc);
|
Default(opc);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -745,7 +745,7 @@ void DSPEmitter::madd(const UDSPInstruction opc)
|
|||||||
// dsp_set_long_prod(prod);
|
// dsp_set_long_prod(prod);
|
||||||
set_long_prod();
|
set_long_prod();
|
||||||
#else
|
#else
|
||||||
MainOpFallback(opc);
|
Default(opc);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -769,6 +769,6 @@ void DSPEmitter::msub(const UDSPInstruction opc)
|
|||||||
// dsp_set_long_prod(prod);
|
// dsp_set_long_prod(prod);
|
||||||
set_long_prod();
|
set_long_prod();
|
||||||
#else
|
#else
|
||||||
MainOpFallback(opc);
|
Default(opc);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -304,33 +304,16 @@ void DSPEmitter::decrease_addr_reg(int reg)
|
|||||||
|
|
||||||
SetJumpTarget(end);
|
SetJumpTarget(end);
|
||||||
}
|
}
|
||||||
// EAX - destination address (g_dsp.r[dest])
|
|
||||||
// ECX - value (g_dsp.r[src])
|
|
||||||
// ESI - the upper bits of the address (>> 12)
|
// EAX - destination address
|
||||||
void DSPEmitter::ext_dmem_write(u32 dest, u32 src)
|
// ECX - value
|
||||||
|
// ESI - Base of dram
|
||||||
|
void DSPEmitter::dmem_write()
|
||||||
{
|
{
|
||||||
// u16 addr = g_dsp.r[dest];
|
|
||||||
#ifdef _M_IX86 // All32
|
|
||||||
MOVZX(32, 16, EAX, M(&g_dsp.r[dest]));
|
|
||||||
#else
|
|
||||||
MOV(64, R(R11), ImmPtr(&g_dsp.r));
|
|
||||||
MOVZX(32, 16, EAX, MDisp(R11,dest*2));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// u16 val = g_dsp.r[src];
|
|
||||||
#ifdef _M_IX86 // All32
|
|
||||||
MOVZX(32, 16, ECX, M(&g_dsp.r[src]));
|
|
||||||
#else
|
|
||||||
MOVZX(32, 16, ECX, MDisp(R11,src*2));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// u16 saddr = addr >> 12;
|
|
||||||
MOV(32, R(ESI), R(EAX));
|
|
||||||
SHR(16, R(ESI), Imm8(12));
|
|
||||||
|
|
||||||
// if (saddr == 0)
|
// if (saddr == 0)
|
||||||
TEST(16, R(ESI), R(ESI));
|
CMP(16, R(EAX), Imm16(0x0fff));
|
||||||
FixupBranch ifx = J_CC(CC_NZ);
|
FixupBranch ifx = J_CC(CC_A);
|
||||||
|
|
||||||
// g_dsp.dram[addr & DSP_DRAM_MASK] = val;
|
// g_dsp.dram[addr & DSP_DRAM_MASK] = val;
|
||||||
AND(16, R(EAX), Imm16(DSP_DRAM_MASK));
|
AND(16, R(EAX), Imm16(DSP_DRAM_MASK));
|
||||||
@ -349,26 +332,35 @@ void DSPEmitter::ext_dmem_write(u32 dest, u32 src)
|
|||||||
SetJumpTarget(end);
|
SetJumpTarget(end);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ECX - value
|
||||||
|
void DSPEmitter::dmem_write_imm(u16 addr)
|
||||||
|
{
|
||||||
|
switch (addr >> 12)
|
||||||
|
{
|
||||||
|
case 0x0: // 0xxx DRAM
|
||||||
|
MOV(16, M(&g_dsp.dram[addr & DSP_DRAM_MASK]), R(ECX));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0xf: // Fxxx HW regs
|
||||||
|
MOV(16, R(EAX), Imm16(addr));
|
||||||
|
ABI_CallFunctionRR((void *)gdsp_ifx_write, EAX, ECX);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default: // Unmapped/non-existing memory
|
||||||
|
ERROR_LOG(DSPLLE, "%04x DSP ERROR: Write to UNKNOWN (%04x) memory", g_dsp.pc, addr);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// EAX - the result of the read (used by caller)
|
// EAX - the result of the read (used by caller)
|
||||||
// ECX - the address to read
|
// ECX - the address to read
|
||||||
// ESI - the upper bits of the address (>> 12)
|
// ESI - Base
|
||||||
void DSPEmitter::ext_dmem_read(u16 addr)
|
// Trashes R11 on gdsp_ifx_read
|
||||||
|
void DSPEmitter::dmem_read()
|
||||||
{
|
{
|
||||||
// u16 addr = g_dsp.r[addr];
|
|
||||||
#ifdef _M_IX86 // All32
|
|
||||||
MOVZX(32, 16, ECX, M(&g_dsp.r[addr]));
|
|
||||||
#else
|
|
||||||
MOV(64, R(R11), ImmPtr(&g_dsp.r));
|
|
||||||
MOVZX(32, 16, ECX, MDisp(R11,addr*2));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// u16 saddr = addr >> 12;
|
|
||||||
MOV(32, R(ESI), R(ECX));
|
|
||||||
SHR(16, R(ESI), Imm8(12));
|
|
||||||
|
|
||||||
// if (saddr == 0)
|
// if (saddr == 0)
|
||||||
TEST(16, R(ESI), R(ESI));
|
CMP(16, R(ECX), Imm16(0x0fff));
|
||||||
FixupBranch dram = J_CC(CC_NZ);
|
FixupBranch dram = J_CC(CC_A);
|
||||||
// return g_dsp.dram[addr & DSP_DRAM_MASK];
|
// return g_dsp.dram[addr & DSP_DRAM_MASK];
|
||||||
AND(16, R(ECX), Imm16(DSP_DRAM_MASK));
|
AND(16, R(ECX), Imm16(DSP_DRAM_MASK));
|
||||||
#ifdef _M_X64
|
#ifdef _M_X64
|
||||||
@ -381,8 +373,8 @@ void DSPEmitter::ext_dmem_read(u16 addr)
|
|||||||
FixupBranch end = J();
|
FixupBranch end = J();
|
||||||
SetJumpTarget(dram);
|
SetJumpTarget(dram);
|
||||||
// else if (saddr == 0x1)
|
// else if (saddr == 0x1)
|
||||||
CMP(16, R(ESI), Imm16(0x1));
|
CMP(16, R(ECX), Imm16(0x1fff));
|
||||||
FixupBranch ifx = J_CC(CC_NZ);
|
FixupBranch ifx = J_CC(CC_A);
|
||||||
// return g_dsp.coef[addr & DSP_COEF_MASK];
|
// return g_dsp.coef[addr & DSP_COEF_MASK];
|
||||||
AND(16, R(ECX), Imm16(DSP_COEF_MASK));
|
AND(16, R(ECX), Imm16(DSP_COEF_MASK));
|
||||||
#ifdef _M_X64
|
#ifdef _M_X64
|
||||||
@ -402,6 +394,27 @@ void DSPEmitter::ext_dmem_read(u16 addr)
|
|||||||
SetJumpTarget(end2);
|
SetJumpTarget(end2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DSPEmitter::dmem_read_imm(u16 addr)
|
||||||
|
{
|
||||||
|
switch (addr >> 12)
|
||||||
|
{
|
||||||
|
case 0x0: // 0xxx DRAM
|
||||||
|
MOV(16, R(EAX), M(&g_dsp.dram[addr & DSP_DRAM_MASK]));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x1: // 1xxx COEF
|
||||||
|
MOV(16, R(EAX), Imm16(g_dsp.coef[addr & DSP_COEF_MASK]));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0xf: // Fxxx HW regs
|
||||||
|
ABI_CallFunctionC16((void *)gdsp_ifx_read, addr);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default: // Unmapped/non-existing memory
|
||||||
|
ERROR_LOG(DSPLLE, "%04x DSP ERROR: Read from UNKNOWN (%04x) memory", g_dsp.pc, addr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Returns s64 in RAX
|
// Returns s64 in RAX
|
||||||
// Clobbers RSI, RDI
|
// Clobbers RSI, RDI
|
||||||
void DSPEmitter::get_long_prod()
|
void DSPEmitter::get_long_prod()
|
||||||
|
@ -28,6 +28,7 @@ files = [
|
|||||||
"Jit/DSPJitUtil.cpp",
|
"Jit/DSPJitUtil.cpp",
|
||||||
"Jit/DSPJitCCUtil.cpp",
|
"Jit/DSPJitCCUtil.cpp",
|
||||||
"Jit/DSPJitArithmetic.cpp",
|
"Jit/DSPJitArithmetic.cpp",
|
||||||
|
"Jit/DSPJitLoadStore.cpp",
|
||||||
"Jit/DSPJitMultiplier.cpp",
|
"Jit/DSPJitMultiplier.cpp",
|
||||||
"Jit/DSPJitMisc.cpp",
|
"Jit/DSPJitMisc.cpp",
|
||||||
]
|
]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user