From 3d676ac57e59d80b47294272996c4981f0cac8d4 Mon Sep 17 00:00:00 2001 From: Marko Pusljar Date: Mon, 30 May 2011 13:02:05 +0000 Subject: [PATCH] dspjit - iram/codespace reset fixed, decreased dspjit codespace to 2MB git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@7572 8ced0084-cf51-0410-be5f-012b33b47a6e --- Source/Core/Core/Src/DSP/DSPCore.cpp | 3 +++ Source/Core/Core/Src/DSP/DSPCore.h | 1 + Source/Core/Core/Src/DSP/DSPEmitter.cpp | 23 +++++++++++++++++++++-- Source/Core/Core/Src/DSP/DSPEmitter.h | 3 ++- 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/Source/Core/Core/Src/DSP/DSPCore.cpp b/Source/Core/Core/Src/DSP/DSPCore.cpp index 81632e9126..6eb2800ff8 100644 --- a/Source/Core/Core/Src/DSP/DSPCore.cpp +++ b/Source/Core/Core/Src/DSP/DSPCore.cpp @@ -274,6 +274,9 @@ int DSPCore_RunCycles(int cycles) DSPCompiledCode pExecAddr = (DSPCompiledCode)dspjit->enterDispatcher; pExecAddr(); + if (g_dsp.reset_dspjit_codespace) + dspjit->ClearIRAMandDSPJITCodespaceReset(); + return cyclesLeft; } diff --git a/Source/Core/Core/Src/DSP/DSPCore.h b/Source/Core/Core/Src/DSP/DSPCore.h index 36991027b3..f6a3b4e51f 100644 --- a/Source/Core/Core/Src/DSP/DSPCore.h +++ b/Source/Core/Core/Src/DSP/DSPCore.h @@ -232,6 +232,7 @@ struct SDSP u8 reg_stack_ptr[4]; u8 exceptions; // pending exceptions volatile bool external_interrupt_waiting; + bool reset_dspjit_codespace; // DSP hardware stacks. They're mapped to a bunch of registers, such that writes // to them push and reads pop. diff --git a/Source/Core/Core/Src/DSP/DSPEmitter.cpp b/Source/Core/Core/Src/DSP/DSPEmitter.cpp index 43d905a29a..c8d8695d9d 100644 --- a/Source/Core/Core/Src/DSP/DSPEmitter.cpp +++ b/Source/Core/Core/Src/DSP/DSPEmitter.cpp @@ -66,16 +66,35 @@ DSPEmitter::~DSPEmitter() FreeCodeSpace(); } -void DSPEmitter::ClearIRAM() { - // ClearCodeSpace(); +void DSPEmitter::ClearIRAM() +{ for(int i = 0x0000; i < 0x1000; i++) { blocks[i] = (DSPCompiledCode)stubEntryPoint; blockLinks[i] = 0; blockSize[i] = 0; + unresolvedJumps[i].clear(); } + g_dsp.reset_dspjit_codespace = true; } +void DSPEmitter::ClearIRAMandDSPJITCodespaceReset() +{ + ResetCodePtr(); + CompileDispatcher(); + stubEntryPoint = CompileStub(); + + for(int i = 0x0000; i < 0x10000; i++) + { + blocks[i] = (DSPCompiledCode)stubEntryPoint; + blockLinks[i] = 0; + blockSize[i] = 0; + unresolvedJumps[i].clear(); + } + g_dsp.reset_dspjit_codespace = false; +} + + // Must go out of block if exception is detected void DSPEmitter::checkExceptions(u32 retval) { diff --git a/Source/Core/Core/Src/DSP/DSPEmitter.h b/Source/Core/Core/Src/DSP/DSPEmitter.h index 5a1ebd4b72..963bd0393d 100644 --- a/Source/Core/Core/Src/DSP/DSPEmitter.h +++ b/Source/Core/Core/Src/DSP/DSPEmitter.h @@ -24,7 +24,7 @@ #include "x64Emitter.h" #include "Jit/DSPJitRegCache.h" -#define COMPILED_CODE_SIZE sizeof(void *) * 0x200000 +#define COMPILED_CODE_SIZE 2097152 #define MAX_BLOCKS 0x10000 @@ -41,6 +41,7 @@ public: void EmitInstruction(UDSPInstruction inst); void ClearIRAM(); + void ClearIRAMandDSPJITCodespaceReset(); void CompileDispatcher(); Block CompileStub();