DSPCore: Make g_cycles_left a regular member variable of DSPEmitter

Gets rid of a global within the DSP core.
This commit is contained in:
Lioncash 2017-02-07 21:54:53 -05:00
parent 22fbcc67fc
commit 4260afc848
7 changed files with 21 additions and 10 deletions

View File

@ -29,7 +29,6 @@ namespace DSP
SDSP g_dsp; SDSP g_dsp;
DSPBreakpoints g_dsp_breakpoints; DSPBreakpoints g_dsp_breakpoints;
static State core_state = State::Stopped; static State core_state = State::Stopped;
u16 g_cycles_left = 0;
bool g_init_hax = false; bool g_init_hax = false;
std::unique_ptr<JIT::x86::DSPEmitter> g_dsp_jit; std::unique_ptr<JIT::x86::DSPEmitter> g_dsp_jit;
std::unique_ptr<DSPCaptureLogger> g_dsp_cap; std::unique_ptr<DSPCaptureLogger> g_dsp_cap;
@ -104,7 +103,6 @@ static void DSPCore_FreeMemoryPages()
bool DSPCore_Init(const DSPInitOptions& opts) bool DSPCore_Init(const DSPInitOptions& opts)
{ {
g_dsp.step_counter = 0; g_dsp.step_counter = 0;
g_cycles_left = 0;
g_init_hax = false; g_init_hax = false;
g_dsp.irom = static_cast<u16*>(Common::AllocateMemoryPages(DSP_IROM_BYTE_SIZE)); g_dsp.irom = static_cast<u16*>(Common::AllocateMemoryPages(DSP_IROM_BYTE_SIZE));

View File

@ -312,7 +312,6 @@ struct SDSP
extern SDSP g_dsp; extern SDSP g_dsp;
extern DSPBreakpoints g_dsp_breakpoints; extern DSPBreakpoints g_dsp_breakpoints;
extern u16 g_cycles_left;
extern bool g_init_hax; extern bool g_init_hax;
extern std::unique_ptr<JIT::x86::DSPEmitter> g_dsp_jit; extern std::unique_ptr<JIT::x86::DSPEmitter> g_dsp_jit;
extern std::unique_ptr<DSPCaptureLogger> g_dsp_cap; extern std::unique_ptr<DSPCaptureLogger> g_dsp_cap;

View File

@ -9,6 +9,7 @@
#include "Common/Assert.h" #include "Common/Assert.h"
#include "Common/BitSet.h" #include "Common/BitSet.h"
#include "Common/ChunkFile.h"
#include "Common/CommonTypes.h" #include "Common/CommonTypes.h"
#include "Common/Logging/Log.h" #include "Common/Logging/Log.h"
@ -57,14 +58,19 @@ u16 DSPEmitter::RunCycles(u16 cycles)
DSPCore_SetExternalInterrupt(false); DSPCore_SetExternalInterrupt(false);
} }
g_cycles_left = cycles; m_cycles_left = cycles;
auto exec_addr = (DSPCompiledCode)m_enter_dispatcher; auto exec_addr = (DSPCompiledCode)m_enter_dispatcher;
exec_addr(); exec_addr();
if (g_dsp.reset_dspjit_codespace) if (g_dsp.reset_dspjit_codespace)
ClearIRAMandDSPJITCodespaceReset(); ClearIRAMandDSPJITCodespaceReset();
return g_cycles_left; return m_cycles_left;
}
void DSPEmitter::DoState(PointerWrap& p)
{
p.Do(m_cycles_left);
} }
void DSPEmitter::ClearIRAM() void DSPEmitter::ClearIRAM()
@ -430,7 +436,7 @@ void DSPEmitter::CompileDispatcher()
m_return_dispatcher = GetCodePtr(); m_return_dispatcher = GetCodePtr();
// Decrement cyclesLeft // Decrement cyclesLeft
SUB(16, M(&g_cycles_left), R(EAX)); SUB(16, M(&m_cycles_left), R(EAX));
J_CC(CC_A, dispatcherLoop); J_CC(CC_A, dispatcherLoop);

View File

@ -15,6 +15,8 @@
#include "Core/DSP/DSPCommon.h" #include "Core/DSP/DSPCommon.h"
#include "Core/DSP/Jit/DSPJitRegCache.h" #include "Core/DSP/Jit/DSPJitRegCache.h"
class PointerWrap;
namespace DSP namespace DSP
{ {
enum class StackRegister; enum class StackRegister;
@ -36,6 +38,8 @@ public:
u16 RunCycles(u16 cycles); u16 RunCycles(u16 cycles);
void DoState(PointerWrap& p);
void EmitInstruction(UDSPInstruction inst); void EmitInstruction(UDSPInstruction inst);
void ClearIRAM(); void ClearIRAM();
void ClearIRAMandDSPJITCodespaceReset(); void ClearIRAMandDSPJITCodespaceReset();
@ -292,6 +296,8 @@ private:
std::vector<Block> m_block_links; std::vector<Block> m_block_links;
Block m_block_link_entry; Block m_block_link_entry;
u16 m_cycles_left = 0;
// The index of the last stored ext value (compile time). // The index of the last stored ext value (compile time).
int m_store_index = -1; int m_store_index = -1;
int m_store_index2 = -1; int m_store_index2 = -1;

View File

@ -109,12 +109,12 @@ void DSPEmitter::WriteBlockLink(u16 dest)
{ {
m_gpr.FlushRegs(); m_gpr.FlushRegs();
// Check if we have enough cycles to execute the next block // Check if we have enough cycles to execute the next block
MOV(16, R(ECX), M(&g_cycles_left)); MOV(16, R(ECX), M(&m_cycles_left));
CMP(16, R(ECX), Imm16(m_block_size[m_start_address] + m_block_size[dest])); CMP(16, R(ECX), Imm16(m_block_size[m_start_address] + m_block_size[dest]));
FixupBranch notEnoughCycles = J_CC(CC_BE); FixupBranch notEnoughCycles = J_CC(CC_BE);
SUB(16, R(ECX), Imm16(m_block_size[m_start_address])); SUB(16, R(ECX), Imm16(m_block_size[m_start_address]));
MOV(16, M(&g_cycles_left), R(ECX)); MOV(16, M(&m_cycles_left), R(ECX));
JMP(m_block_links[dest], true); JMP(m_block_links[dest], true);
SetJumpTarget(notEnoughCycles); SetJumpTarget(notEnoughCycles);
} }

View File

@ -73,9 +73,11 @@ void DSPLLE::DoState(PointerWrap& p)
if (p.GetMode() == PointerWrap::MODE_READ) if (p.GetMode() == PointerWrap::MODE_READ)
Host::CodeLoaded((const u8*)g_dsp.iram, DSP_IRAM_BYTE_SIZE); Host::CodeLoaded((const u8*)g_dsp.iram, DSP_IRAM_BYTE_SIZE);
p.DoArray(g_dsp.dram, DSP_DRAM_SIZE); p.DoArray(g_dsp.dram, DSP_DRAM_SIZE);
p.Do(g_cycles_left);
p.Do(g_init_hax); p.Do(g_init_hax);
p.Do(m_cycle_count); p.Do(m_cycle_count);
if (g_dsp_jit)
g_dsp_jit->DoState(p);
} }
// Regular thread // Regular thread

View File

@ -71,7 +71,7 @@ static Common::Event g_compressAndDumpStateSyncEvent;
static std::thread g_save_thread; static std::thread g_save_thread;
// Don't forget to increase this after doing changes on the savestate system // Don't forget to increase this after doing changes on the savestate system
static const u32 STATE_VERSION = 74; // Last changed in PR 4408 static const u32 STATE_VERSION = 75; // Last changed in PR 4857
// Maps savestate versions to Dolphin versions. // Maps savestate versions to Dolphin versions.
// Versions after 42 don't need to be added to this list, // Versions after 42 don't need to be added to this list,