diff options
| author | skidau <skidau@gmail.com> | 2010-12-16 23:27:38 +0000 |
|---|---|---|
| committer | skidau <skidau@gmail.com> | 2010-12-16 23:27:38 +0000 |
| commit | 93a09ee7b569d0edfa6967b947095e7c464160dc (patch) | |
| tree | 1d3ad505164232e65c50dacbe78c200ff9ab8502 /Source/Core/DSPCore/Src/Jit/DSPJitExtOps.cpp | |
| parent | a82a61c53a3f6b15980fcad31c1a0fe69be51f6f (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.cpp | 130 |
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)); |
