LLE JIT: Speed up the dispatcher by removing the compiled block check. Initialised the blocks with a stub which calls the compiler.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@6490 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
93a901dd1d
commit
c79f41d114
|
@ -30,6 +30,8 @@
|
||||||
|
|
||||||
using namespace Gen;
|
using namespace Gen;
|
||||||
|
|
||||||
|
const u8 *stubEntryPoint;
|
||||||
|
|
||||||
DSPEmitter::DSPEmitter() : storeIndex(-1), storeIndex2(-1)
|
DSPEmitter::DSPEmitter() : storeIndex(-1), storeIndex2(-1)
|
||||||
{
|
{
|
||||||
m_compiledCode = NULL;
|
m_compiledCode = NULL;
|
||||||
|
@ -39,18 +41,19 @@ DSPEmitter::DSPEmitter() : storeIndex(-1), storeIndex2(-1)
|
||||||
blocks = new CompiledCode[MAX_BLOCKS];
|
blocks = new CompiledCode[MAX_BLOCKS];
|
||||||
blockSize = new u16[0x10000];
|
blockSize = new u16[0x10000];
|
||||||
|
|
||||||
//clear all of the block references
|
|
||||||
for(int i = 0x0000; i < MAX_BLOCKS; i++)
|
|
||||||
{
|
|
||||||
blocks[i] = NULL;
|
|
||||||
blockSize[i] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
compileSR = 0;
|
compileSR = 0;
|
||||||
compileSR |= SR_INT_ENABLE;
|
compileSR |= SR_INT_ENABLE;
|
||||||
compileSR |= SR_EXT_INT_ENABLE;
|
compileSR |= SR_EXT_INT_ENABLE;
|
||||||
|
|
||||||
CompileDispatcher();
|
CompileDispatcher();
|
||||||
|
stubEntryPoint = CompileStub();
|
||||||
|
|
||||||
|
//clear all of the block references
|
||||||
|
for(int i = 0x0000; i < MAX_BLOCKS; i++)
|
||||||
|
{
|
||||||
|
blocks[i] = (CompiledCode)stubEntryPoint;
|
||||||
|
blockSize[i] = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DSPEmitter::~DSPEmitter()
|
DSPEmitter::~DSPEmitter()
|
||||||
|
@ -64,12 +67,11 @@ void DSPEmitter::ClearIRAM() {
|
||||||
// ClearCodeSpace();
|
// ClearCodeSpace();
|
||||||
for(int i = 0x0000; i < 0x1000; i++)
|
for(int i = 0x0000; i < 0x1000; i++)
|
||||||
{
|
{
|
||||||
blocks[i] = NULL;
|
blocks[i] = (CompiledCode)stubEntryPoint;
|
||||||
blockSize[i] = 0;
|
blockSize[i] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Must go out of block if exception is detected
|
// Must go out of block if exception is detected
|
||||||
void DSPEmitter::checkExceptions(u32 retval) {
|
void DSPEmitter::checkExceptions(u32 retval) {
|
||||||
// Check for interrupts and exceptions
|
// Check for interrupts and exceptions
|
||||||
|
@ -296,6 +298,20 @@ void DSPEmitter::Compile(int start_addr)
|
||||||
RET();
|
RET();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const u8 *DSPEmitter::CompileStub()
|
||||||
|
{
|
||||||
|
const u8 *entryPoint = AlignCode16();
|
||||||
|
ABI_PushAllCalleeSavedRegsAndAdjustStack();
|
||||||
|
// ABI_AlignStack(0);
|
||||||
|
CALL((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
|
||||||
|
RET();
|
||||||
|
return entryPoint;
|
||||||
|
}
|
||||||
|
|
||||||
void DSPEmitter::CompileDispatcher()
|
void DSPEmitter::CompileDispatcher()
|
||||||
{
|
{
|
||||||
enterDispatcher = AlignCode16();
|
enterDispatcher = AlignCode16();
|
||||||
|
@ -305,11 +321,9 @@ void DSPEmitter::CompileDispatcher()
|
||||||
#ifdef _M_IX86
|
#ifdef _M_IX86
|
||||||
MOV(32, R(ESI), M(&cyclesLeft));
|
MOV(32, R(ESI), M(&cyclesLeft));
|
||||||
MOV(32, R(EBX), Imm32((u32)blocks));
|
MOV(32, R(EBX), Imm32((u32)blocks));
|
||||||
MOV(32, R(EDI), Imm32((u32)blockSize));
|
|
||||||
#else
|
#else
|
||||||
MOV(32, R(ESI), M(&cyclesLeft));
|
MOV(32, R(ESI), M(&cyclesLeft));
|
||||||
MOV(64, R(RBX), Imm64((u64)blocks));
|
MOV(64, R(RBX), Imm64((u64)blocks));
|
||||||
MOV(64, R(RDI), Imm64((u64)blockSize));
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const u8 *dispatcherLoop = GetCodePtr();
|
const u8 *dispatcherLoop = GetCodePtr();
|
||||||
|
@ -318,16 +332,7 @@ void DSPEmitter::CompileDispatcher()
|
||||||
TEST(8, M(&g_dsp.cr), Imm8(CR_HALT));
|
TEST(8, M(&g_dsp.cr), Imm8(CR_HALT));
|
||||||
FixupBranch halt = J_CC(CC_NE);
|
FixupBranch halt = J_CC(CC_NE);
|
||||||
|
|
||||||
// Check if block has been compiled (blockSize > 0)
|
|
||||||
MOVZX(32, 16, ECX, M(&g_dsp.pc));
|
MOVZX(32, 16, ECX, M(&g_dsp.pc));
|
||||||
MOVZX(32, 16, EAX, MComplex(RDI, ECX, SCALE_2, 0));
|
|
||||||
TEST(16, R(AX), R(AX));
|
|
||||||
|
|
||||||
// Compile block if needed
|
|
||||||
FixupBranch found = J_CC(CC_NE);
|
|
||||||
CALL((void *)CompileCurrent);
|
|
||||||
MOVZX(32, 16, ECX, M(&g_dsp.pc));
|
|
||||||
SetJumpTarget(found);
|
|
||||||
|
|
||||||
// Execute block. Cycles executed returned in EAX.
|
// Execute block. Cycles executed returned in EAX.
|
||||||
#ifdef _M_IX86
|
#ifdef _M_IX86
|
||||||
|
@ -338,7 +343,7 @@ void DSPEmitter::CompileDispatcher()
|
||||||
|
|
||||||
// Decrement cyclesLeft
|
// Decrement cyclesLeft
|
||||||
SUB(32, R(ESI), R(EAX));
|
SUB(32, R(ESI), R(EAX));
|
||||||
|
|
||||||
J_CC(CC_A, dispatcherLoop);
|
J_CC(CC_A, dispatcherLoop);
|
||||||
|
|
||||||
// DSP gave up the remaining cycles.
|
// DSP gave up the remaining cycles.
|
||||||
|
|
|
@ -41,7 +41,7 @@ public:
|
||||||
void ClearIRAM();
|
void ClearIRAM();
|
||||||
|
|
||||||
void CompileDispatcher();
|
void CompileDispatcher();
|
||||||
|
const u8 *CompileStub();
|
||||||
void Compile(int start_addr);
|
void Compile(int start_addr);
|
||||||
|
|
||||||
int STACKALIGN RunForCycles(int cycles);
|
int STACKALIGN RunForCycles(int cycles);
|
||||||
|
|
Loading…
Reference in New Issue