summaryrefslogtreecommitdiff
path: root/Source/Core/DSPCore
diff options
context:
space:
mode:
authornakeee <nakeee@gmail.com>2010-04-27 18:15:08 +0000
committernakeee <nakeee@gmail.com>2010-04-27 18:15:08 +0000
commit757285f7d01506502901e9ac5f2b002bd2bc36f4 (patch)
treed003613e8e7880880943934e197b1f2a3e561452 /Source/Core/DSPCore
parentc7634aa8dc620222560ae7d916d2c047fe592241 (diff)
DSP jit more work
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@5419 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core/DSPCore')
-rw-r--r--Source/Core/DSPCore/Src/Jit/DSPJitExtOps.cpp58
-rw-r--r--Source/Core/DSPCore/Src/Jit/DSPJitUtil.cpp12
2 files changed, 38 insertions, 32 deletions
diff --git a/Source/Core/DSPCore/Src/Jit/DSPJitExtOps.cpp b/Source/Core/DSPCore/Src/Jit/DSPJitExtOps.cpp
index edb4f33e8a..77db35b253 100644
--- a/Source/Core/DSPCore/Src/Jit/DSPJitExtOps.cpp
+++ b/Source/Core/DSPCore/Src/Jit/DSPJitExtOps.cpp
@@ -95,7 +95,7 @@ void DSPEmitter::l(const UDSPInstruction opc)
if ((dreg >= DSP_REG_ACM0) && (g_dsp.r[DSP_REG_SR] & SR_40_MODE_BIT))
{
u16 val;
- ext_dmem_read(g_dsp.r[sreg]);
+ ext_dmem_read(sreg);
MOV(16, M(&val), R(EAX));
writeToBackLog(0, dreg - DSP_REG_ACM0 + DSP_REG_ACH0, (val & 0x8000) ? 0xFFFF : 0x0000);
@@ -105,7 +105,7 @@ void DSPEmitter::l(const UDSPInstruction opc)
}
else
{
- ext_dmem_read(g_dsp.r[sreg]);
+ ext_dmem_read(sreg);
MOV(16, M(&g_dsp.r[dreg]), R(EAX));
increment_addr_reg(sreg);
}
@@ -123,7 +123,7 @@ void DSPEmitter::ln(const UDSPInstruction opc)
if ((dreg >= DSP_REG_ACM0) && (g_dsp.r[DSP_REG_SR] & SR_40_MODE_BIT))
{
u16 val;
- ext_dmem_read(g_dsp.r[sreg]);
+ ext_dmem_read(sreg);
MOV(16, M(&val), R(EAX));
writeToBackLog(0, dreg - DSP_REG_ACM0 + DSP_REG_ACH0, (val & 0x8000) ? 0xFFFF : 0x0000);
writeToBackLog(1, dreg, val);
@@ -132,7 +132,7 @@ void DSPEmitter::ln(const UDSPInstruction opc)
}
else
{
- ext_dmem_read(g_dsp.r[sreg]);
+ ext_dmem_read(sreg);
MOV(16, M(&g_dsp.r[dreg]), R(EAX));
increase_addr_reg(sreg);
}
@@ -308,7 +308,7 @@ void DSPEmitter::ld(const UDSPInstruction opc)
if (sreg != DSP_REG_AR3) {
- ext_dmem_read(g_dsp.r[sreg]);
+ ext_dmem_read(sreg);
MOV(16, M(&g_dsp.r[(dreg << 1) + DSP_REG_AXL0]), R(EAX));
// if (IsSameMemArea(g_dsp.r[sreg], g_dsp.r[DSP_REG_AR3])) {
@@ -318,11 +318,11 @@ void DSPEmitter::ld(const UDSPInstruction opc)
SHR(16, R(EDI), Imm8(10));
CMP(16, R(ESI), R(EDI));
FixupBranch not_equal = J_CC(CC_NE);
- ext_dmem_read(g_dsp.r[sreg]);
+ ext_dmem_read(sreg);
MOV(16, M(&g_dsp.r[(rreg << 1) + DSP_REG_AXL1]), R(EAX));
FixupBranch after = J();
SetJumpTarget(not_equal); // else
- ext_dmem_read(g_dsp.r[DSP_REG_AR3]);
+ ext_dmem_read(DSP_REG_AR3);
MOV(16, M(&g_dsp.r[(rreg << 1) + DSP_REG_AXL1]), R(EAX));
SetJumpTarget(after);
@@ -330,7 +330,7 @@ void DSPEmitter::ld(const UDSPInstruction opc)
} else {
- ext_dmem_read(g_dsp.r[dreg]);
+ ext_dmem_read(dreg);
MOV(16, M(&g_dsp.r[rreg + DSP_REG_AXH0]), R(EAX));
//if (IsSameMemArea(g_dsp.r[dreg], g_dsp.r[DSP_REG_AR3])) {
@@ -340,11 +340,11 @@ void DSPEmitter::ld(const UDSPInstruction opc)
SHR(16, R(EDI), Imm8(10));
CMP(16, R(ESI), R(EDI));
FixupBranch not_equal = J_CC(CC_NE);
- ext_dmem_read(g_dsp.r[dreg]);
+ ext_dmem_read(dreg);
MOV(16, M(&g_dsp.r[rreg + DSP_REG_AXL0]), R(EAX));
FixupBranch after = J(); // else
SetJumpTarget(not_equal);
- ext_dmem_read(g_dsp.r[DSP_REG_AR3]);
+ ext_dmem_read(DSP_REG_AR3);
MOV(16, M(&g_dsp.r[rreg + DSP_REG_AXL0]), R(EAX));
SetJumpTarget(after);
@@ -364,7 +364,7 @@ void DSPEmitter::ldn(const UDSPInstruction opc)
if (sreg != DSP_REG_AR3) {
- ext_dmem_read(g_dsp.r[sreg]);
+ ext_dmem_read(sreg);
MOV(16, M(&g_dsp.r[(dreg << 1) + DSP_REG_AXL0]), R(EAX));
// if (IsSameMemArea(g_dsp.r[sreg], g_dsp.r[DSP_REG_AR3])) {
@@ -374,17 +374,17 @@ void DSPEmitter::ldn(const UDSPInstruction opc)
SHR(16, R(EDI), Imm8(10));
CMP(16, R(ESI), R(EDI));
FixupBranch not_equal = J_CC(CC_NE);
- ext_dmem_read(g_dsp.r[sreg]);
+ ext_dmem_read(sreg);
MOV(16, M(&g_dsp.r[(rreg << 1) + DSP_REG_AXL1]), R(EAX));
FixupBranch after = J();
SetJumpTarget(not_equal); // else
- ext_dmem_read(g_dsp.r[DSP_REG_AR3]);
+ ext_dmem_read(DSP_REG_AR3);
MOV(16, M(&g_dsp.r[(rreg << 1) + DSP_REG_AXL1]), R(EAX));
SetJumpTarget(after);
increase_addr_reg(sreg);
} else {
- ext_dmem_read(g_dsp.r[dreg]);
+ ext_dmem_read(dreg);
MOV(16, M(&g_dsp.r[rreg + DSP_REG_AXH0]), R(EAX));
//if (IsSameMemArea(g_dsp.r[dreg], g_dsp.r[DSP_REG_AR3])) {
@@ -394,11 +394,11 @@ void DSPEmitter::ldn(const UDSPInstruction opc)
SHR(16, R(EDI), Imm8(10));
CMP(16, R(ESI), R(EDI));
FixupBranch not_equal = J_CC(CC_NE);
- ext_dmem_read(g_dsp.r[dreg]);
+ ext_dmem_read(dreg);
MOV(16, M(&g_dsp.r[rreg + DSP_REG_AXL0]), R(EAX));
FixupBranch after = J(); // else
SetJumpTarget(not_equal);
- ext_dmem_read(g_dsp.r[DSP_REG_AR3]);
+ ext_dmem_read(DSP_REG_AR3);
MOV(16, M(&g_dsp.r[rreg + DSP_REG_AXL0]), R(EAX));
SetJumpTarget(after);
@@ -417,7 +417,7 @@ void DSPEmitter::ldm(const UDSPInstruction opc)
u8 sreg = opc & 0x3;
if (sreg != DSP_REG_AR3) {
- ext_dmem_read(g_dsp.r[sreg]);
+ ext_dmem_read(sreg);
MOV(16, M(&g_dsp.r[(dreg << 1) + DSP_REG_AXL0]), R(EAX));
// if (IsSameMemArea(g_dsp.r[sreg], g_dsp.r[DSP_REG_AR3])) {
@@ -427,18 +427,18 @@ void DSPEmitter::ldm(const UDSPInstruction opc)
SHR(16, R(EDI), Imm8(10));
CMP(16, R(ESI), R(EDI));
FixupBranch not_equal = J_CC(CC_NE);
- ext_dmem_read(g_dsp.r[sreg]);
+ ext_dmem_read(sreg);
MOV(16, M(&g_dsp.r[(rreg << 1) + DSP_REG_AXL1]), R(EAX));
FixupBranch after = J();
SetJumpTarget(not_equal); // else
- ext_dmem_read(g_dsp.r[DSP_REG_AR3]);
+ ext_dmem_read(DSP_REG_AR3);
MOV(16, M(&g_dsp.r[(rreg << 1) + DSP_REG_AXL1]), R(EAX));
SetJumpTarget(after);
increment_addr_reg(sreg);
} else {
- ext_dmem_read(g_dsp.r[dreg]);
+ ext_dmem_read(dreg);
MOV(16, M(&g_dsp.r[rreg + DSP_REG_AXH0]), R(EAX));
//if (IsSameMemArea(g_dsp.r[dreg], g_dsp.r[DSP_REG_AR3])) {
@@ -448,11 +448,11 @@ void DSPEmitter::ldm(const UDSPInstruction opc)
SHR(16, R(EDI), Imm8(10));
CMP(16, R(ESI), R(EDI));
FixupBranch not_equal = J_CC(CC_NE);
- ext_dmem_read(g_dsp.r[dreg]);
+ ext_dmem_read(dreg);
MOV(16, M(&g_dsp.r[rreg + DSP_REG_AXL0]), R(EAX));
FixupBranch after = J(); // else
SetJumpTarget(not_equal);
- ext_dmem_read(g_dsp.r[DSP_REG_AR3]);
+ ext_dmem_read(DSP_REG_AR3);
MOV(16, M(&g_dsp.r[rreg + DSP_REG_AXL0]), R(EAX));
SetJumpTarget(after);
@@ -471,7 +471,7 @@ void DSPEmitter::ldnm(const UDSPInstruction opc)
u8 sreg = opc & 0x3;
if (sreg != DSP_REG_AR3) {
- ext_dmem_read(g_dsp.r[sreg]);
+ ext_dmem_read(sreg);
MOV(16, M(&g_dsp.r[(dreg << 1) + DSP_REG_AXL0]), R(EAX));
// if (IsSameMemArea(g_dsp.r[sreg], g_dsp.r[DSP_REG_AR3])) {
@@ -481,17 +481,17 @@ void DSPEmitter::ldnm(const UDSPInstruction opc)
SHR(16, R(EDI), Imm8(10));
CMP(16, R(ESI), R(EDI));
FixupBranch not_equal = J_CC(CC_NE);
- ext_dmem_read(g_dsp.r[sreg]);
+ ext_dmem_read(sreg);
MOV(16, M(&g_dsp.r[(rreg << 1) + DSP_REG_AXL1]), R(EAX));
FixupBranch after = J();
SetJumpTarget(not_equal); // else
- ext_dmem_read(g_dsp.r[DSP_REG_AR3]);
+ ext_dmem_read(DSP_REG_AR3);
MOV(16, M(&g_dsp.r[(rreg << 1) + DSP_REG_AXL1]), R(EAX));
SetJumpTarget(after);
increase_addr_reg(sreg);
} else {
- ext_dmem_read(g_dsp.r[dreg]);
+ ext_dmem_read(dreg);
MOV(16, M(&g_dsp.r[rreg + DSP_REG_AXH0]), R(EAX));
//if (IsSameMemArea(g_dsp.r[dreg], g_dsp.r[DSP_REG_AR3])) {
@@ -501,11 +501,11 @@ void DSPEmitter::ldnm(const UDSPInstruction opc)
SHR(16, R(EDI), Imm8(10));
CMP(16, R(ESI), R(EDI));
FixupBranch not_equal = J_CC(CC_NE);
- ext_dmem_read(g_dsp.r[dreg]);
+ ext_dmem_read(dreg);
MOV(16, M(&g_dsp.r[rreg + DSP_REG_AXL0]), R(EAX));
FixupBranch after = J(); // else
SetJumpTarget(not_equal);
- ext_dmem_read(g_dsp.r[DSP_REG_AR3]);
+ ext_dmem_read(DSP_REG_AR3);
MOV(16, M(&g_dsp.r[rreg + DSP_REG_AXL0]), R(EAX));
SetJumpTarget(after);
@@ -524,7 +524,7 @@ void DSPEmitter::pushExtValueFromReg(u16 dreg, u16 sreg) {
}
void DSPEmitter::pushExtValueFromMem(u16 dreg, u16 sreg) {
- ext_dmem_read(g_dsp.r[sreg]);
+ ext_dmem_read(sreg);
MOV(16, R(EBX), R(EAX));
storeIndex = dreg;
diff --git a/Source/Core/DSPCore/Src/Jit/DSPJitUtil.cpp b/Source/Core/DSPCore/Src/Jit/DSPJitUtil.cpp
index 1dd9186dff..6a5dc5d031 100644
--- a/Source/Core/DSPCore/Src/Jit/DSPJitUtil.cpp
+++ b/Source/Core/DSPCore/Src/Jit/DSPJitUtil.cpp
@@ -246,7 +246,9 @@ void DSPEmitter::decrease_addr_reg(int reg)
SetJumpTarget(end);
}
-
+// EAX - destination address (g_dsp.r[dest])
+// ECX - value (g_dsp.r[src])
+// ESI - the upper bits of the address (>> 12)
void DSPEmitter::ext_dmem_write(u32 dest, u32 src)
{
// u16 addr = g_dsp.r[dest];
@@ -282,10 +284,13 @@ void DSPEmitter::ext_dmem_write(u32 dest, u32 src)
SetJumpTarget(end);
}
-// EAX should have the return value
+// EAX - the result of the read (used by caller)
+// ECX - the address to read
+// ESI - the upper bits of the address (>> 12)
void DSPEmitter::ext_dmem_read(u16 addr)
{
- MOVZX(32, 16, ECX, M(&addr));
+ // u16 addr = g_dsp.r[addr];
+ MOVZX(32, 16, ECX, M(&g_dsp.r[addr]));
// u16 saddr = addr >> 12;
MOV(32, R(ESI), R(ECX));
@@ -312,6 +317,7 @@ void DSPEmitter::ext_dmem_read(u16 addr)
FixupBranch ifx = J_CC(CC_NZ);
// return g_dsp.coef[addr & DSP_COEF_MASK];
AND(16, R(ECX), Imm16(DSP_COEF_MASK));
+ SHL(16, R(ECX), Imm8(1)); // * sizeof(u16)
#ifdef _M_X64
MOV(64, R(R11), Imm64((u64)g_dsp.dram));
ADD(64, R(ECX), R(R11));