Jit64: Merge memory allocations into a single allocation
Instead of each component allocating their own memory, we instead allocate the memory once and divvy that up among the components as required. This ensures that relative memory offsets remain within architecture limits.
This commit is contained in:
parent
da434e1a1c
commit
cb7d9556bf
|
@ -229,9 +229,14 @@ void Jit64::Init()
|
||||||
gpr.SetEmitter(this);
|
gpr.SetEmitter(this);
|
||||||
fpr.SetEmitter(this);
|
fpr.SetEmitter(this);
|
||||||
|
|
||||||
trampolines.Init(jo.memcheck ? TRAMPOLINE_CODE_SIZE_MMU : TRAMPOLINE_CODE_SIZE);
|
const size_t routines_size = asm_routines.CODE_SIZE;
|
||||||
|
const size_t trampolines_size = jo.memcheck ? TRAMPOLINE_CODE_SIZE_MMU : TRAMPOLINE_CODE_SIZE;
|
||||||
|
const size_t farcode_size = jo.memcheck ? FARCODE_SIZE_MMU : FARCODE_SIZE;
|
||||||
const size_t constpool_size = m_const_pool.CONST_POOL_SIZE;
|
const size_t constpool_size = m_const_pool.CONST_POOL_SIZE;
|
||||||
AllocCodeSpace(CODE_SIZE + constpool_size);
|
AllocCodeSpace(CODE_SIZE + routines_size + trampolines_size + farcode_size + constpool_size);
|
||||||
|
AddChildCodeSpace(&asm_routines, routines_size);
|
||||||
|
AddChildCodeSpace(&trampolines, trampolines_size);
|
||||||
|
AddChildCodeSpace(&m_far_code, farcode_size);
|
||||||
m_const_pool.Init(AllocChildCodeSpace(constpool_size), constpool_size);
|
m_const_pool.Init(AllocChildCodeSpace(constpool_size), constpool_size);
|
||||||
|
|
||||||
// BLR optimization has the same consequences as block linking, as well as
|
// BLR optimization has the same consequences as block linking, as well as
|
||||||
|
@ -250,7 +255,7 @@ void Jit64::Init()
|
||||||
// important: do this *after* generating the global asm routines, because we can't use farcode in
|
// important: do this *after* generating the global asm routines, because we can't use farcode in
|
||||||
// them.
|
// them.
|
||||||
// it'll crash because the farcode functions get cleared on JIT clears.
|
// it'll crash because the farcode functions get cleared on JIT clears.
|
||||||
m_far_code.Init(jo.memcheck ? FARCODE_SIZE_MMU : FARCODE_SIZE);
|
m_far_code.Init();
|
||||||
Clear();
|
Clear();
|
||||||
|
|
||||||
code_block.m_stats = &js.st;
|
code_block.m_stats = &js.st;
|
||||||
|
@ -276,8 +281,6 @@ void Jit64::Shutdown()
|
||||||
FreeCodeSpace();
|
FreeCodeSpace();
|
||||||
|
|
||||||
blocks.Shutdown();
|
blocks.Shutdown();
|
||||||
trampolines.Shutdown();
|
|
||||||
asm_routines.Shutdown();
|
|
||||||
m_far_code.Shutdown();
|
m_far_code.Shutdown();
|
||||||
m_const_pool.Shutdown();
|
m_const_pool.Shutdown();
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
// Licensed under GPLv2+
|
// Licensed under GPLv2+
|
||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
#include "Core/PowerPC/Jit64/Jit.h"
|
#include "Core/PowerPC/Jit64/JitAsm.h"
|
||||||
#include "Common/CommonTypes.h"
|
#include "Common/CommonTypes.h"
|
||||||
#include "Common/JitRegister.h"
|
#include "Common/JitRegister.h"
|
||||||
#include "Common/x64ABI.h"
|
#include "Common/x64ABI.h"
|
||||||
|
@ -11,7 +11,7 @@
|
||||||
#include "Core/CoreTiming.h"
|
#include "Core/CoreTiming.h"
|
||||||
#include "Core/HW/CPU.h"
|
#include "Core/HW/CPU.h"
|
||||||
#include "Core/HW/Memmap.h"
|
#include "Core/HW/Memmap.h"
|
||||||
#include "Core/PowerPC/Jit64/JitAsm.h"
|
#include "Core/PowerPC/Jit64/Jit.h"
|
||||||
#include "Core/PowerPC/Jit64Common/Jit64PowerPCState.h"
|
#include "Core/PowerPC/Jit64Common/Jit64PowerPCState.h"
|
||||||
#include "Core/PowerPC/PowerPC.h"
|
#include "Core/PowerPC/PowerPC.h"
|
||||||
|
|
||||||
|
@ -20,6 +20,14 @@ using namespace Gen;
|
||||||
// Not PowerPC state. Can't put in 'this' because it's out of range...
|
// Not PowerPC state. Can't put in 'this' because it's out of range...
|
||||||
static void* s_saved_rsp;
|
static void* s_saved_rsp;
|
||||||
|
|
||||||
|
void Jit64AsmRoutineManager::Init(u8* stack_top)
|
||||||
|
{
|
||||||
|
m_const_pool.Init(AllocChildCodeSpace(4096), 4096);
|
||||||
|
m_stack_top = stack_top;
|
||||||
|
Generate();
|
||||||
|
WriteProtect();
|
||||||
|
}
|
||||||
|
|
||||||
// PLAN: no more block numbers - crazy opcodes just contain offset within
|
// PLAN: no more block numbers - crazy opcodes just contain offset within
|
||||||
// dynarec buffer
|
// dynarec buffer
|
||||||
// At this offset - 4, there is an int specifying the block number.
|
// At this offset - 4, there is an int specifying the block number.
|
||||||
|
|
|
@ -34,16 +34,11 @@ private:
|
||||||
u8* m_stack_top;
|
u8* m_stack_top;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void Init(u8* stack_top)
|
// NOTE: When making large additions to the AsmCommon code, you might
|
||||||
{
|
// want to ensure this number is big enough.
|
||||||
m_stack_top = stack_top;
|
static constexpr size_t CODE_SIZE = 16384;
|
||||||
// NOTE: When making large additions to the AsmCommon code, you might
|
|
||||||
// want to ensure this number is big enough.
|
void Init(u8* stack_top);
|
||||||
AllocCodeSpace(16384);
|
|
||||||
Generate();
|
|
||||||
WriteProtect();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Shutdown() { FreeCodeSpace(); }
|
|
||||||
void ResetStack(Gen::X64CodeBlock& emitter);
|
void ResetStack(Gen::X64CodeBlock& emitter);
|
||||||
};
|
};
|
||||||
|
|
|
@ -4,15 +4,13 @@
|
||||||
|
|
||||||
#include "Core/PowerPC/Jit64Common/FarCodeCache.h"
|
#include "Core/PowerPC/Jit64Common/FarCodeCache.h"
|
||||||
|
|
||||||
void FarCodeCache::Init(size_t size)
|
void FarCodeCache::Init()
|
||||||
{
|
{
|
||||||
AllocCodeSpace(size);
|
|
||||||
m_enabled = true;
|
m_enabled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void FarCodeCache::Shutdown()
|
void FarCodeCache::Shutdown()
|
||||||
{
|
{
|
||||||
FreeCodeSpace();
|
|
||||||
m_enabled = false;
|
m_enabled = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@ constexpr size_t FARCODE_SIZE_MMU = 1024 * 1024 * 48;
|
||||||
class FarCodeCache : public Gen::X64CodeBlock
|
class FarCodeCache : public Gen::X64CodeBlock
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
void Init(size_t size);
|
void Init();
|
||||||
void Shutdown();
|
void Shutdown();
|
||||||
|
|
||||||
bool Enabled() const;
|
bool Enabled() const;
|
||||||
|
|
|
@ -23,21 +23,11 @@
|
||||||
|
|
||||||
using namespace Gen;
|
using namespace Gen;
|
||||||
|
|
||||||
void TrampolineCache::Init(size_t size)
|
|
||||||
{
|
|
||||||
AllocCodeSpace(size);
|
|
||||||
}
|
|
||||||
|
|
||||||
void TrampolineCache::ClearCodeSpace()
|
void TrampolineCache::ClearCodeSpace()
|
||||||
{
|
{
|
||||||
X64CodeBlock::ClearCodeSpace();
|
X64CodeBlock::ClearCodeSpace();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TrampolineCache::Shutdown()
|
|
||||||
{
|
|
||||||
FreeCodeSpace();
|
|
||||||
}
|
|
||||||
|
|
||||||
const u8* TrampolineCache::GenerateTrampoline(const TrampolineInfo& info)
|
const u8* TrampolineCache::GenerateTrampoline(const TrampolineInfo& info)
|
||||||
{
|
{
|
||||||
if (info.read)
|
if (info.read)
|
||||||
|
|
|
@ -24,8 +24,6 @@ class TrampolineCache : public EmuCodeBlock
|
||||||
const u8* GenerateWriteTrampoline(const TrampolineInfo& info);
|
const u8* GenerateWriteTrampoline(const TrampolineInfo& info);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void Init(size_t size);
|
|
||||||
void Shutdown();
|
|
||||||
const u8* GenerateTrampoline(const TrampolineInfo& info);
|
const u8* GenerateTrampoline(const TrampolineInfo& info);
|
||||||
void ClearCodeSpace();
|
void ClearCodeSpace();
|
||||||
};
|
};
|
||||||
|
|
|
@ -262,12 +262,19 @@ void JitIL::Init()
|
||||||
jo.accurateSinglePrecision = false;
|
jo.accurateSinglePrecision = false;
|
||||||
UpdateMemoryOptions();
|
UpdateMemoryOptions();
|
||||||
|
|
||||||
trampolines.Init(jo.memcheck ? TRAMPOLINE_CODE_SIZE_MMU : TRAMPOLINE_CODE_SIZE);
|
const size_t routines_size = asm_routines.CODE_SIZE;
|
||||||
AllocCodeSpace(CODE_SIZE);
|
const size_t trampolines_size = jo.memcheck ? TRAMPOLINE_CODE_SIZE_MMU : TRAMPOLINE_CODE_SIZE;
|
||||||
|
const size_t farcode_size = jo.memcheck ? FARCODE_SIZE_MMU : FARCODE_SIZE;
|
||||||
|
const size_t constpool_size = m_const_pool.CONST_POOL_SIZE;
|
||||||
|
AllocCodeSpace(CODE_SIZE + routines_size + trampolines_size + farcode_size + constpool_size);
|
||||||
|
AddChildCodeSpace(&asm_routines, routines_size);
|
||||||
|
AddChildCodeSpace(&trampolines, trampolines_size);
|
||||||
|
AddChildCodeSpace(&m_far_code, farcode_size);
|
||||||
|
m_const_pool.Init(AllocChildCodeSpace(constpool_size), constpool_size);
|
||||||
|
|
||||||
blocks.Init();
|
blocks.Init();
|
||||||
asm_routines.Init(nullptr);
|
asm_routines.Init(nullptr);
|
||||||
|
m_far_code.Init();
|
||||||
m_far_code.Init(jo.memcheck ? FARCODE_SIZE_MMU : FARCODE_SIZE);
|
|
||||||
Clear();
|
Clear();
|
||||||
|
|
||||||
code_block.m_stats = &js.st;
|
code_block.m_stats = &js.st;
|
||||||
|
@ -299,8 +306,6 @@ void JitIL::Shutdown()
|
||||||
FreeCodeSpace();
|
FreeCodeSpace();
|
||||||
|
|
||||||
blocks.Shutdown();
|
blocks.Shutdown();
|
||||||
trampolines.Shutdown();
|
|
||||||
asm_routines.Shutdown();
|
|
||||||
m_far_code.Shutdown();
|
m_far_code.Shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue