summaryrefslogtreecommitdiff
path: root/Source/Core/DSPCore/Src/Jit/DSPJitExtOps.cpp
diff options
context:
space:
mode:
authornakeee <nakeee@gmail.com>2010-04-18 18:39:54 +0000
committernakeee <nakeee@gmail.com>2010-04-18 18:39:54 +0000
commit26a8556c822148a2e34cb8291daeaee00cd91455 (patch)
treec7f45ce022c8b0eef8ab0cad581a635ca314e0ab /Source/Core/DSPCore/Src/Jit/DSPJitExtOps.cpp
parent9095b4d67f6fec10870ada9a29dfe029bae72333 (diff)
DSP jit: a bit more work
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@5385 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core/DSPCore/Src/Jit/DSPJitExtOps.cpp')
-rw-r--r--Source/Core/DSPCore/Src/Jit/DSPJitExtOps.cpp237
1 files changed, 158 insertions, 79 deletions
diff --git a/Source/Core/DSPCore/Src/Jit/DSPJitExtOps.cpp b/Source/Core/DSPCore/Src/Jit/DSPJitExtOps.cpp
index 702682d8ab..992686f841 100644
--- a/Source/Core/DSPCore/Src/Jit/DSPJitExtOps.cpp
+++ b/Source/Core/DSPCore/Src/Jit/DSPJitExtOps.cpp
@@ -1,4 +1,4 @@
-// Copyright (C) 2003 Dolphin Project.
+// Copyright (C) 2010 Dolphin Project.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -23,15 +23,6 @@
// See docs in the interpeter
using namespace Gen;
-inline bool IsSameMemArea(u16 a, u16 b)
-{
-//LM: tested on WII
- if ((a>>10)==(b>>10))
- return true;
- else
- return false;
-}
-
// DR $arR
// xxxx xxxx 0000 01rr
// Decrement addressing register $arR.
@@ -63,12 +54,7 @@ void DSPEmitter::mv(const UDSPInstruction opc)
u8 sreg = (opc & 0x3) + DSP_REG_ACL0;
u8 dreg = ((opc >> 2) & 0x3);
-#if 0 //more tests
- if ((sreg >= DSP_REG_ACM0) && (g_dsp.r[DSP_REG_SR] & SR_40_MODE_BIT))
- writeToBackLog(0, dreg + DSP_REG_AXL0, ((u16)dsp_get_acc_h(sreg-DSP_REG_ACM0) & 0x0080) ? 0x8000 : 0x7fff);
- else
-#endif
- writeToBackLog(0, dreg + DSP_REG_AXL0, g_dsp.r[sreg]);
+ MOV(16, M(&g_dsp.r[dreg + DSP_REG_AXL0]), M(&g_dsp.r[sreg]));
}
// S @$arD, $acS.S
@@ -327,27 +313,52 @@ void DSPEmitter::ld(const UDSPInstruction opc)
u8 dreg = (opc >> 5) & 0x1;
u8 rreg = (opc >> 4) & 0x1;
u8 sreg = opc & 0x3;
- /*
+
if (sreg != DSP_REG_AR3) {
- writeToBackLog(0, (dreg << 1) + DSP_REG_AXL0, ext_dmem_read(g_dsp.r[sreg]));
-
- if (IsSameMemArea(g_dsp.r[sreg], g_dsp.r[DSP_REG_AR3]))
- writeToBackLog(1, (rreg << 1) + DSP_REG_AXL1, ext_dmem_read(g_dsp.r[sreg]));
- else
- writeToBackLog(1, (rreg << 1) + DSP_REG_AXL1, ext_dmem_read(g_dsp.r[DSP_REG_AR3]));
-
+
+ ext_dmem_read(g_dsp.r[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])) {
+ MOV(16, R(ESI), M(&g_dsp.r[sreg]));
+ MOV(16, R(EDI), M(&g_dsp.r[g_dsp.r[DSP_REG_AR3]]));
+ SHR(16, R(ESI), Imm8(10));
+ 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]);
+ 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]);
+ MOV(16, M(&g_dsp.r[(rreg << 1) + DSP_REG_AXL1]), R(EAX));
+ SetJumpTarget(after);
+
increment_addr_reg(sreg);
+
} else {
- writeToBackLog(0, rreg + DSP_REG_AXH0, ext_dmem_read(g_dsp.r[dreg]));
-
- if (IsSameMemArea(g_dsp.r[dreg], g_dsp.r[DSP_REG_AR3]))
- writeToBackLog(1, rreg + DSP_REG_AXL0, ext_dmem_read(g_dsp.r[dreg]));
- else
- writeToBackLog(1, rreg + DSP_REG_AXL0, ext_dmem_read(g_dsp.r[DSP_REG_AR3]));
-
+
+ ext_dmem_read(g_dsp.r[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])) {
+ MOV(16, R(ESI), M(&g_dsp.r[dreg]));
+ MOV(16, R(EDI), M(&g_dsp.r[g_dsp.r[DSP_REG_AR3]]));
+ SHR(16, R(ESI), Imm8(10));
+ 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]);
+ 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]);
+ MOV(16, M(&g_dsp.r[rreg + DSP_REG_AXL0]), R(EAX));
+ SetJumpTarget(after);
+
increment_addr_reg(dreg);
}
- */
+
increment_addr_reg(DSP_REG_AR3);
}
@@ -358,27 +369,50 @@ void DSPEmitter::ldn(const UDSPInstruction opc)
u8 dreg = (opc >> 5) & 0x1;
u8 rreg = (opc >> 4) & 0x1;
u8 sreg = opc & 0x3;
- /*
- if (sreg != DSP_REG_AR3) {
- writeToBackLog(0, (dreg << 1) + DSP_REG_AXL0, ext_dmem_read(g_dsp.r[sreg]));
-
- if (IsSameMemArea(g_dsp.r[sreg], g_dsp.r[DSP_REG_AR3]))
- writeToBackLog(1, (rreg << 1) + DSP_REG_AXL1, ext_dmem_read(g_dsp.r[sreg]));
- else
- writeToBackLog(1, (rreg << 1) + DSP_REG_AXL1, ext_dmem_read(g_dsp.r[DSP_REG_AR3]));
+
+ if (sreg != DSP_REG_AR3) {
+ ext_dmem_read(g_dsp.r[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])) {
+ MOV(16, R(ESI), M(&g_dsp.r[sreg]));
+ MOV(16, R(EDI), M(&g_dsp.r[g_dsp.r[DSP_REG_AR3]]));
+ SHR(16, R(ESI), Imm8(10));
+ 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]);
+ 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]);
+ MOV(16, M(&g_dsp.r[(rreg << 1) + DSP_REG_AXL1]), R(EAX));
+ SetJumpTarget(after);
+
increase_addr_reg(sreg);
} else {
- writeToBackLog(0, rreg + DSP_REG_AXH0, ext_dmem_read(g_dsp.r[dreg]));
-
- if (IsSameMemArea(g_dsp.r[dreg], g_dsp.r[DSP_REG_AR3]))
- writeToBackLog(1, rreg + DSP_REG_AXL0, ext_dmem_read(g_dsp.r[dreg]));
- else
- writeToBackLog(1, rreg + DSP_REG_AXL0, ext_dmem_read(g_dsp.r[DSP_REG_AR3]));
-
+ ext_dmem_read(g_dsp.r[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])) {
+ MOV(16, R(ESI), M(&g_dsp.r[dreg]));
+ MOV(16, R(EDI), M(&g_dsp.r[g_dsp.r[DSP_REG_AR3]]));
+ SHR(16, R(ESI), Imm8(10));
+ 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]);
+ 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]);
+ MOV(16, M(&g_dsp.r[rreg + DSP_REG_AXL0]), R(EAX));
+ SetJumpTarget(after);
+
increase_addr_reg(dreg);
}
- */
+
increment_addr_reg(DSP_REG_AR3);
}
@@ -389,27 +423,50 @@ void DSPEmitter::ldm(const UDSPInstruction opc)
u8 dreg = (opc >> 5) & 0x1;
u8 rreg = (opc >> 4) & 0x1;
u8 sreg = opc & 0x3;
- /*
+
if (sreg != DSP_REG_AR3) {
- writeToBackLog(0, (dreg << 1) + DSP_REG_AXL0, ext_dmem_read(g_dsp.r[sreg]));
-
- if (IsSameMemArea(g_dsp.r[sreg], g_dsp.r[DSP_REG_AR3]))
- writeToBackLog(1, (rreg << 1) + DSP_REG_AXL1, ext_dmem_read(g_dsp.r[sreg]));
- else
- writeToBackLog(1, (rreg << 1) + DSP_REG_AXL1, ext_dmem_read(g_dsp.r[DSP_REG_AR3]));
+ ext_dmem_read(g_dsp.r[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])) {
+ MOV(16, R(ESI), M(&g_dsp.r[sreg]));
+ MOV(16, R(EDI), M(&g_dsp.r[g_dsp.r[DSP_REG_AR3]]));
+ SHR(16, R(ESI), Imm8(10));
+ 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]);
+ 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]);
+ MOV(16, M(&g_dsp.r[(rreg << 1) + DSP_REG_AXL1]), R(EAX));
+ SetJumpTarget(after);
+
increment_addr_reg(sreg);
} else {
- writeToBackLog(0, rreg + DSP_REG_AXH0, ext_dmem_read(g_dsp.r[dreg]));
-
- if (IsSameMemArea(g_dsp.r[dreg], g_dsp.r[DSP_REG_AR3]))
- writeToBackLog(1, rreg + DSP_REG_AXL0, ext_dmem_read(g_dsp.r[dreg]));
- else
- writeToBackLog(1, rreg + DSP_REG_AXL0, ext_dmem_read(g_dsp.r[DSP_REG_AR3]));
+ ext_dmem_read(g_dsp.r[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])) {
+ MOV(16, R(ESI), M(&g_dsp.r[dreg]));
+ MOV(16, R(EDI), M(&g_dsp.r[g_dsp.r[DSP_REG_AR3]]));
+ SHR(16, R(ESI), Imm8(10));
+ 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]);
+ 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]);
+ MOV(16, M(&g_dsp.r[rreg + DSP_REG_AXL0]), R(EAX));
+ SetJumpTarget(after);
increment_addr_reg(dreg);
}
- */
+
increase_addr_reg(DSP_REG_AR3);
}
@@ -420,32 +477,54 @@ void DSPEmitter::ldnm(const UDSPInstruction opc)
u8 dreg = (opc >> 5) & 0x1;
u8 rreg = (opc >> 4) & 0x1;
u8 sreg = opc & 0x3;
- /*
- if (sreg != DSP_REG_AR3) {
- writeToBackLog(0, (dreg << 1) + DSP_REG_AXL0, ext_dmem_read(g_dsp.r[sreg]));
-
- if (IsSameMemArea(g_dsp.r[sreg], g_dsp.r[DSP_REG_AR3]))
- writeToBackLog(1, (rreg << 1) + DSP_REG_AXL1, ext_dmem_read(g_dsp.r[sreg]));
- else
- writeToBackLog(1, (rreg << 1) + DSP_REG_AXL1, ext_dmem_read(g_dsp.r[DSP_REG_AR3]));
+ if (sreg != DSP_REG_AR3) {
+ ext_dmem_read(g_dsp.r[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])) {
+ MOV(16, R(ESI), M(&g_dsp.r[sreg]));
+ MOV(16, R(EDI), M(&g_dsp.r[g_dsp.r[DSP_REG_AR3]]));
+ SHR(16, R(ESI), Imm8(10));
+ 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]);
+ 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]);
+ MOV(16, M(&g_dsp.r[(rreg << 1) + DSP_REG_AXL1]), R(EAX));
+ SetJumpTarget(after);
+
increase_addr_reg(sreg);
} else {
- writeToBackLog(0, rreg + DSP_REG_AXH0, ext_dmem_read(g_dsp.r[dreg]));
-
- if (IsSameMemArea(g_dsp.r[dreg], g_dsp.r[DSP_REG_AR3]))
- writeToBackLog(1, rreg + DSP_REG_AXL0, ext_dmem_read(g_dsp.r[dreg]));
- else
- writeToBackLog(1, rreg + DSP_REG_AXL0, ext_dmem_read(g_dsp.r[DSP_REG_AR3]));
-
+ ext_dmem_read(g_dsp.r[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])) {
+ MOV(16, R(ESI), M(&g_dsp.r[dreg]));
+ MOV(16, R(EDI), M(&g_dsp.r[g_dsp.r[DSP_REG_AR3]]));
+ SHR(16, R(ESI), Imm8(10));
+ 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]);
+ 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]);
+ MOV(16, M(&g_dsp.r[rreg + DSP_REG_AXL0]), R(EAX));
+ SetJumpTarget(after);
+
increase_addr_reg(dreg);
}
- */
+
increase_addr_reg(DSP_REG_AR3);
}
-void DSPEmitter::writeAxAcc(const UDSPInstruction opc) {
+void DSPEmitter::storeExtValue(u16 value) {
}