summaryrefslogtreecommitdiff
path: root/Source/Core/DSPCore/Src/DSPEmitter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/DSPCore/Src/DSPEmitter.cpp')
-rw-r--r--Source/Core/DSPCore/Src/DSPEmitter.cpp34
1 files changed, 21 insertions, 13 deletions
diff --git a/Source/Core/DSPCore/Src/DSPEmitter.cpp b/Source/Core/DSPCore/Src/DSPEmitter.cpp
index f3ee9f16e2..2ec62b1cd4 100644
--- a/Source/Core/DSPCore/Src/DSPEmitter.cpp
+++ b/Source/Core/DSPCore/Src/DSPEmitter.cpp
@@ -22,6 +22,7 @@
#include "DSPCore.h"
#include "DSPInterpreter.h"
#include "DSPAnalyzer.h"
+#include "Jit/DSPJitUtil.h"
#include "x64Emitter.h"
#include "ABI.h"
@@ -30,15 +31,16 @@
using namespace Gen;
-DSPEmitter::DSPEmitter() : storeIndex(-1), storeIndex2(-1)
+DSPEmitter::DSPEmitter() : gpr(*this), storeIndex(-1), storeIndex2(-1)
{
m_compiledCode = NULL;
AllocCodeSpace(COMPILED_CODE_SIZE);
blocks = new CompiledCode[MAX_BLOCKS];
- blockLinks = new CompiledCode[MAX_BLOCKS];
- blockSize = new u16[0x10000];
+ blockLinks = new Block[MAX_BLOCKS];
+ blockSize = new u16[MAX_BLOCKS];
+ unresolvedJumps = new std::list<u16>[MAX_BLOCKS];
compileSR = 0;
compileSR |= SR_INT_ENABLE;
@@ -93,6 +95,9 @@ void DSPEmitter::checkExceptions(u32 retval)
MOV(16, MatR(RAX), Imm16(compilePC));
#endif
+ DSPJitRegCache c(gpr);
+
+ SaveDSPRegs();
ABI_CallFunction((void *)&DSPCore_CheckExceptions);
// ABI_RestoreStack(0);
@@ -100,6 +105,8 @@ void DSPEmitter::checkExceptions(u32 retval)
MOV(32, R(EAX), Imm32(retval));
RET();
+ gpr.flushRegs(c,false);
+
SetJumpTarget(skipCheck);
}
@@ -206,14 +213,14 @@ void DSPEmitter::Compile(u16 start_addr)
return;
*/
+ LoadDSPRegs();
+
blockLinkEntry = GetCodePtr();
compilePC = start_addr;
bool fixup_pc = false;
blockSize[start_addr] = 0;
- LoadDSPRegs();
-
while (compilePC < start_addr + MAX_BLOCK_SIZE)
{
if (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_CHECK_INT)
@@ -266,8 +273,9 @@ void DSPEmitter::Compile(u16 start_addr)
// These functions branch and therefore only need to be called in the
// end of each block and in this order
+ DSPJitRegCache c(gpr);
HandleLoop();
- // ABI_RestoreStack(0);
+ SaveDSPRegs();
ABI_PopAllCalleeSavedRegsAndAdjustStack();
if (DSPAnalyzer::code_flags[start_addr] & DSPAnalyzer::CODE_IDLE_SKIP)
{
@@ -276,8 +284,9 @@ void DSPEmitter::Compile(u16 start_addr)
else
{
MOV(16, R(EAX), Imm16(blockSize[start_addr]));
- }
+ }
RET();
+ gpr.flushRegs(c,false);
SetJumpTarget(rLoopAddressExit);
SetJumpTarget(rLoopCounterExit);
@@ -303,8 +312,9 @@ void DSPEmitter::Compile(u16 start_addr)
CMP(16, R(AX), Imm16(compilePC));
FixupBranch rNoBranch = J_CC(CC_Z);
+ DSPJitRegCache c(gpr);
//don't update g_dsp.pc -- the branch insn already did
- // ABI_RestoreStack(0);
+ SaveDSPRegs();
ABI_PopAllCalleeSavedRegsAndAdjustStack();
if (DSPAnalyzer::code_flags[start_addr] & DSPAnalyzer::CODE_IDLE_SKIP)
{
@@ -313,8 +323,9 @@ void DSPEmitter::Compile(u16 start_addr)
else
{
MOV(16, R(EAX), Imm16(blockSize[start_addr]));
- }
+ }
RET();
+ gpr.flushRegs(c,false);
SetJumpTarget(rNoBranch);
}
@@ -342,7 +353,7 @@ void DSPEmitter::Compile(u16 start_addr)
// any unresolved CALL's
if (unresolvedJumps[start_addr].empty())
{
- blockLinks[start_addr] = (CompiledCode)blockLinkEntry;
+ blockLinks[start_addr] = blockLinkEntry;
for(u16 i = 0x0000; i < 0xffff; ++i)
{
@@ -372,7 +383,6 @@ void DSPEmitter::Compile(u16 start_addr)
SaveDSPRegs();
- // ABI_RestoreStack(0);
ABI_PopAllCalleeSavedRegsAndAdjustStack();
if (DSPAnalyzer::code_flags[start_addr] & DSPAnalyzer::CODE_IDLE_SKIP)
{
@@ -389,9 +399,7 @@ const u8 *DSPEmitter::CompileStub()
{
const u8 *entryPoint = AlignCode16();
ABI_PushAllCalleeSavedRegsAndAdjustStack();
- // ABI_AlignStack(0);
ABI_CallFunction((void *)&CompileCurrent);
- // ABI_RestoreStack(0);
ABI_PopAllCalleeSavedRegsAndAdjustStack();
//MOVZX(32, 16, ECX, M(&g_dsp.pc));
XOR(32, R(EAX), R(EAX)); // Return 0 cycles executed