summaryrefslogtreecommitdiff
path: root/Source/Core/DSPCore/Src/Jit/DSPJitExtOps.cpp
diff options
context:
space:
mode:
authorskidau <skidau@gmail.com>2010-12-16 23:27:38 +0000
committerskidau <skidau@gmail.com>2010-12-16 23:27:38 +0000
commit93a09ee7b569d0edfa6967b947095e7c464160dc (patch)
tree1d3ad505164232e65c50dacbe78c200ff9ab8502 /Source/Core/DSPCore/Src/Jit/DSPJitExtOps.cpp
parenta82a61c53a3f6b15980fcad31c1a0fe69be51f6f (diff)
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
Diffstat (limited to 'Source/Core/DSPCore/Src/Jit/DSPJitExtOps.cpp')
-rw-r--r--Source/Core/DSPCore/Src/Jit/DSPJitExtOps.cpp130
1 files changed, 108 insertions, 22 deletions
diff --git a/Source/Core/DSPCore/Src/Jit/DSPJitExtOps.cpp b/Source/Core/DSPCore/Src/Jit/DSPJitExtOps.cpp
index a4229a7557..3bf0b87d46 100644
--- a/Source/Core/DSPCore/Src/Jit/DSPJitExtOps.cpp
+++ b/Source/Core/DSPCore/Src/Jit/DSPJitExtOps.cpp
@@ -79,8 +79,17 @@ void DSPEmitter::s(const UDSPInstruction opc)
{
u8 dreg = opc & 0x3;
u8 sreg = ((opc >> 3) & 0x3) + DSP_REG_ACL0;
-
- ext_dmem_write(dreg, sreg);
+ // u16 addr = g_dsp.r[dest];
+#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);
}
@@ -92,8 +101,15 @@ void DSPEmitter::sn(const UDSPInstruction opc)
{
u8 dreg = opc & 0x3;
u8 sreg = ((opc >> 3) & 0x3) + DSP_REG_ACL0;
-
- 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
+ dmem_write();
increase_addr_reg(dreg);
}
@@ -164,8 +180,15 @@ void DSPEmitter::ls(const UDSPInstruction opc)
{
u8 sreg = (opc & 0x1) + DSP_REG_ACM0;
u8 dreg = ((opc >> 4) & 0x3) + DSP_REG_AXL0;
-
- ext_dmem_write(DSP_REG_AR3, sreg);
+#ifdef _M_IX86 // All32
+ 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);
@@ -184,8 +207,15 @@ void DSPEmitter::lsn(const UDSPInstruction opc)
{
u8 sreg = (opc & 0x1) + DSP_REG_ACM0;
u8 dreg = ((opc >> 4) & 0x3) + DSP_REG_AXL0;
-
- ext_dmem_write(DSP_REG_AR3, sreg);
+#ifdef _M_IX86 // All32
+ 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);
@@ -203,8 +233,15 @@ void DSPEmitter::lsm(const UDSPInstruction opc)
{
u8 sreg = (opc & 0x1) + DSP_REG_ACM0;
u8 dreg = ((opc >> 4) & 0x3) + DSP_REG_AXL0;
-
- ext_dmem_write(DSP_REG_AR3, sreg);
+#ifdef _M_IX86 // All32
+ 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);
@@ -223,8 +260,15 @@ void DSPEmitter::lsnm(const UDSPInstruction opc)
{
u8 sreg = (opc & 0x1) + DSP_REG_ACM0;
u8 dreg = ((opc >> 4) & 0x3) + DSP_REG_AXL0;
-
- ext_dmem_write(DSP_REG_AR3, sreg);
+#ifdef _M_IX86 // All32
+ 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);
@@ -241,8 +285,15 @@ void DSPEmitter::sl(const UDSPInstruction opc)
{
u8 sreg = (opc & 0x1) + DSP_REG_ACM0;
u8 dreg = ((opc >> 4) & 0x3) + DSP_REG_AXL0;
-
- ext_dmem_write(DSP_REG_AR0, sreg);
+#ifdef _M_IX86 // All32
+ 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);
@@ -260,8 +311,15 @@ void DSPEmitter::sln(const UDSPInstruction opc)
{
u8 sreg = (opc & 0x1) + DSP_REG_ACM0;
u8 dreg = ((opc >> 4) & 0x3) + DSP_REG_AXL0;
-
- ext_dmem_write(DSP_REG_AR0, sreg);
+#ifdef _M_IX86 // All32
+ 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);
@@ -279,8 +337,15 @@ void DSPEmitter::slm(const UDSPInstruction opc)
{
u8 sreg = (opc & 0x1) + DSP_REG_ACM0;
u8 dreg = ((opc >> 4) & 0x3) + DSP_REG_AXL0;
-
- ext_dmem_write(DSP_REG_AR0, sreg);
+#ifdef _M_IX86 // All32
+ 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);
@@ -298,8 +363,15 @@ void DSPEmitter::slnm(const UDSPInstruction opc)
{
u8 sreg = (opc & 0x1) + DSP_REG_ACM0;
u8 dreg = ((opc >> 4) & 0x3) + DSP_REG_AXL0;
-
- ext_dmem_write(DSP_REG_AR0, sreg);
+#ifdef _M_IX86 // All32
+ 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);
@@ -566,14 +638,28 @@ void DSPEmitter::pushExtValueFromReg(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));
storeIndex = dreg;
}
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));
OR(32, R(EBX), R(EAX));