Merge pull request #12210 from JosJuice/fastmem-init-order

Jit: Fix fastmem initialization order
This commit is contained in:
Admiral H. Curtiss 2023-10-01 15:26:52 +02:00 committed by GitHub
commit 9d41024d1b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 20 additions and 14 deletions

View File

@ -82,7 +82,7 @@ CachedInterpreter::~CachedInterpreter() = default;
void CachedInterpreter::Init() void CachedInterpreter::Init()
{ {
RefreshConfig(); RefreshConfig(InitFastmemArena::No);
m_code.reserve(CODE_SIZE / sizeof(Instruction)); m_code.reserve(CODE_SIZE / sizeof(Instruction));
@ -384,5 +384,5 @@ void CachedInterpreter::ClearCache()
{ {
m_code.clear(); m_code.clear();
m_block_cache.Clear(); m_block_cache.Clear();
RefreshConfig(); RefreshConfig(InitFastmemArena::No);
} }

View File

@ -251,13 +251,10 @@ bool Jit64::BackPatch(SContext* ctx)
void Jit64::Init() void Jit64::Init()
{ {
RefreshConfig(); RefreshConfig(InitFastmemArena::Yes);
EnableBlockLink(); EnableBlockLink();
auto& memory = m_system.GetMemory();
jo.fastmem_arena = m_fastmem_enabled && memory.InitFastmemArena();
jo.optimizeGatherPipe = true; jo.optimizeGatherPipe = true;
jo.accurateSinglePrecision = true; jo.accurateSinglePrecision = true;
js.fastmemLoadStore = nullptr; js.fastmemLoadStore = nullptr;
@ -307,7 +304,7 @@ void Jit64::ClearCache()
m_const_pool.Clear(); m_const_pool.Clear();
ClearCodeSpace(); ClearCodeSpace();
Clear(); Clear();
RefreshConfig(); RefreshConfig(InitFastmemArena::No);
ResetFreeMemoryRanges(); ResetFreeMemoryRanges();
} }

View File

@ -47,15 +47,12 @@ JitArm64::~JitArm64() = default;
void JitArm64::Init() void JitArm64::Init()
{ {
RefreshConfig(); RefreshConfig(InitFastmemArena::Yes);
const size_t child_code_size = jo.memcheck ? FARCODE_SIZE_MMU : FARCODE_SIZE; const size_t child_code_size = jo.memcheck ? FARCODE_SIZE_MMU : FARCODE_SIZE;
AllocCodeSpace(CODE_SIZE + child_code_size); AllocCodeSpace(CODE_SIZE + child_code_size);
AddChildCodeSpace(&m_far_code, child_code_size); AddChildCodeSpace(&m_far_code, child_code_size);
auto& memory = m_system.GetMemory();
jo.fastmem_arena = m_fastmem_enabled && memory.InitFastmemArena();
jo.optimizeGatherPipe = true; jo.optimizeGatherPipe = true;
SetBlockLinkingEnabled(true); SetBlockLinkingEnabled(true);
SetOptimizationEnabled(true); SetOptimizationEnabled(true);
@ -158,7 +155,7 @@ void JitArm64::ClearCache()
const Common::ScopedJITPageWriteAndNoExecute enable_jit_page_writes; const Common::ScopedJITPageWriteAndNoExecute enable_jit_page_writes;
ClearCodeSpace(); ClearCodeSpace();
m_far_code.ClearCodeSpace(); m_far_code.ClearCodeSpace();
RefreshConfig(); RefreshConfig(InitFastmemArena::No);
GenerateAsm(); GenerateAsm();

View File

@ -115,7 +115,7 @@ bool JitBase::DoesConfigNeedRefresh()
}); });
} }
void JitBase::RefreshConfig() void JitBase::RefreshConfig(InitFastmemArena init_fastmem_arena)
{ {
for (const auto& [member, config_info] : JIT_SETTINGS) for (const auto& [member, config_info] : JIT_SETTINGS)
this->*member = Config::Get(*config_info); this->*member = Config::Get(*config_info);
@ -132,6 +132,12 @@ void JitBase::RefreshConfig()
analyzer.SetFloatExceptionsEnabled(m_enable_float_exceptions); analyzer.SetFloatExceptionsEnabled(m_enable_float_exceptions);
analyzer.SetDivByZeroExceptionsEnabled(m_enable_div_by_zero_exceptions); analyzer.SetDivByZeroExceptionsEnabled(m_enable_div_by_zero_exceptions);
if (init_fastmem_arena != InitFastmemArena::No)
{
auto& memory = m_system.GetMemory();
jo.fastmem_arena = m_fastmem_enabled && memory.InitFastmemArena();
}
bool any_watchpoints = m_system.GetPowerPC().GetMemChecks().HasAny(); bool any_watchpoints = m_system.GetPowerPC().GetMemChecks().HasAny();
jo.fastmem = m_fastmem_enabled && jo.fastmem_arena && (m_ppc_state.msr.DR || !any_watchpoints) && jo.fastmem = m_fastmem_enabled && jo.fastmem_arena && (m_ppc_state.msr.DR || !any_watchpoints) &&
EMM::IsExceptionHandlerSupported(); EMM::IsExceptionHandlerSupported();

View File

@ -163,8 +163,14 @@ protected:
static const std::array<std::pair<bool JitBase::*, const Config::Info<bool>*>, 22> JIT_SETTINGS; static const std::array<std::pair<bool JitBase::*, const Config::Info<bool>*>, 22> JIT_SETTINGS;
enum class InitFastmemArena
{
No,
Yes,
};
bool DoesConfigNeedRefresh(); bool DoesConfigNeedRefresh();
void RefreshConfig(); void RefreshConfig(InitFastmemArena init_fastmem_arena);
void InitBLROptimization(); void InitBLROptimization();
void ProtectStack(); void ProtectStack();