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.cpp8
1 files changed, 8 insertions, 0 deletions
diff --git a/Source/Core/DSPCore/Src/DSPEmitter.cpp b/Source/Core/DSPCore/Src/DSPEmitter.cpp
index a9da27e405..27c636d6dc 100644
--- a/Source/Core/DSPCore/Src/DSPEmitter.cpp
+++ b/Source/Core/DSPCore/Src/DSPEmitter.cpp
@@ -39,6 +39,7 @@ DSPEmitter::DSPEmitter() : storeIndex(-1), storeIndex2(-1)
AllocCodeSpace(COMPILED_CODE_SIZE);
blocks = new CompiledCode[MAX_BLOCKS];
+ blockLinks = new CompiledCode[MAX_BLOCKS];
blockSize = new u16[0x10000];
compileSR = 0;
@@ -52,6 +53,7 @@ DSPEmitter::DSPEmitter() : storeIndex(-1), storeIndex2(-1)
for(int i = 0x0000; i < MAX_BLOCKS; i++)
{
blocks[i] = (CompiledCode)stubEntryPoint;
+ blockLinks[i] = 0;
blockSize[i] = 0;
}
}
@@ -59,6 +61,7 @@ DSPEmitter::DSPEmitter() : storeIndex(-1), storeIndex2(-1)
DSPEmitter::~DSPEmitter()
{
delete[] blocks;
+ delete[] blockLinks;
delete[] blockSize;
FreeCodeSpace();
}
@@ -68,6 +71,7 @@ void DSPEmitter::ClearIRAM() {
for(int i = 0x0000; i < 0x1000; i++)
{
blocks[i] = (CompiledCode)stubEntryPoint;
+ blockLinks[i] = 0;
blockSize[i] = 0;
}
}
@@ -202,6 +206,9 @@ void DSPEmitter::Compile(int start_addr)
if (g_dsp.exceptions == 0)
return;
*/
+
+ blockLinkEntry = GetCodePtr();
+
ABI_CallFunction((void *)&DSPCore_CheckExternalInterrupt);
compilePC = start_addr;
@@ -327,6 +334,7 @@ void DSPEmitter::Compile(int start_addr)
}
blocks[start_addr] = (CompiledCode)entryPoint;
+ blockLinks[start_addr] = (CompiledCode)blockLinkEntry;
if (blockSize[start_addr] == 0)
{
// just a safeguard, should never happen anymore.