JitCache: Get rid of reliance on the JIT global variable
This commit is contained in:
parent
f75aab1a85
commit
37d10064b8
|
@ -59,7 +59,7 @@ private:
|
||||||
const u8* GetCodePtr() { return (u8*)(m_code.data() + m_code.size()); }
|
const u8* GetCodePtr() { return (u8*)(m_code.data() + m_code.size()); }
|
||||||
void ExecuteOneBlock();
|
void ExecuteOneBlock();
|
||||||
|
|
||||||
BlockCache m_block_cache;
|
BlockCache m_block_cache{*this};
|
||||||
std::vector<Instruction> m_code;
|
std::vector<Instruction> m_code;
|
||||||
PPCAnalyst::CodeBuffer code_buffer;
|
PPCAnalyst::CodeBuffer code_buffer;
|
||||||
};
|
};
|
||||||
|
|
|
@ -3,8 +3,11 @@
|
||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
#include "Core/PowerPC/CachedInterpreter/InterpreterBlockCache.h"
|
#include "Core/PowerPC/CachedInterpreter/InterpreterBlockCache.h"
|
||||||
|
#include "Core/PowerPC/JitCommon/JitBase.h"
|
||||||
|
|
||||||
BlockCache::BlockCache() = default;
|
BlockCache::BlockCache(JitBase& jit) : JitBaseBlockCache{jit}
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void BlockCache::WriteLinkBlock(const JitBlock::LinkData& source, const JitBlock* dest)
|
void BlockCache::WriteLinkBlock(const JitBlock::LinkData& source, const JitBlock* dest)
|
||||||
{
|
{
|
||||||
|
|
|
@ -6,10 +6,12 @@
|
||||||
|
|
||||||
#include "Core/PowerPC/JitCommon/JitCache.h"
|
#include "Core/PowerPC/JitCommon/JitCache.h"
|
||||||
|
|
||||||
|
class JitBase;
|
||||||
|
|
||||||
class BlockCache final : public JitBaseBlockCache
|
class BlockCache final : public JitBaseBlockCache
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
BlockCache();
|
explicit BlockCache(JitBase& jit);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void WriteLinkBlock(const JitBlock::LinkData& source, const JitBlock* dest) override;
|
void WriteLinkBlock(const JitBlock::LinkData& source, const JitBlock* dest) override;
|
||||||
|
|
|
@ -8,10 +8,14 @@
|
||||||
#include "Common/x64Emitter.h"
|
#include "Common/x64Emitter.h"
|
||||||
#include "Core/PowerPC/JitCommon/JitBase.h"
|
#include "Core/PowerPC/JitCommon/JitBase.h"
|
||||||
|
|
||||||
|
JitBlockCache::JitBlockCache(JitBase& jit) : JitBaseBlockCache{jit}
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void JitBlockCache::WriteLinkBlock(const JitBlock::LinkData& source, const JitBlock* dest)
|
void JitBlockCache::WriteLinkBlock(const JitBlock::LinkData& source, const JitBlock* dest)
|
||||||
{
|
{
|
||||||
u8* location = source.exitPtrs;
|
u8* location = source.exitPtrs;
|
||||||
const u8* address = dest ? dest->checkedEntry : g_jit->GetAsmRoutines()->dispatcher;
|
const u8* address = dest ? dest->checkedEntry : m_jit.GetAsmRoutines()->dispatcher;
|
||||||
Gen::XEmitter emit(location);
|
Gen::XEmitter emit(location);
|
||||||
if (*location == 0xE8)
|
if (*location == 0xE8)
|
||||||
{
|
{
|
||||||
|
|
|
@ -6,8 +6,13 @@
|
||||||
|
|
||||||
#include "Core/PowerPC/JitCommon/JitCache.h"
|
#include "Core/PowerPC/JitCommon/JitCache.h"
|
||||||
|
|
||||||
|
class JitBase;
|
||||||
|
|
||||||
class JitBlockCache : public JitBaseBlockCache
|
class JitBlockCache : public JitBaseBlockCache
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
|
explicit JitBlockCache(JitBase& jit);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void WriteLinkBlock(const JitBlock::LinkData& source, const JitBlock* dest) override;
|
void WriteLinkBlock(const JitBlock::LinkData& source, const JitBlock* dest) override;
|
||||||
void WriteDestroyBlock(const JitBlock& block) override;
|
void WriteDestroyBlock(const JitBlock& block) override;
|
||||||
|
|
|
@ -39,7 +39,7 @@ class Jitx86Base : public JitBase, public QuantizedMemoryRoutines
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
bool BackPatch(u32 emAddress, SContext* ctx);
|
bool BackPatch(u32 emAddress, SContext* ctx);
|
||||||
JitBlockCache blocks;
|
JitBlockCache blocks{*this};
|
||||||
TrampolineCache trampolines;
|
TrampolineCache trampolines;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -178,7 +178,7 @@ private:
|
||||||
Arm64GPRCache gpr;
|
Arm64GPRCache gpr;
|
||||||
Arm64FPRCache fpr;
|
Arm64FPRCache fpr;
|
||||||
|
|
||||||
JitArm64BlockCache blocks;
|
JitArm64BlockCache blocks{*this};
|
||||||
|
|
||||||
PPCAnalyst::CodeBuffer code_buffer;
|
PPCAnalyst::CodeBuffer code_buffer;
|
||||||
|
|
||||||
|
|
|
@ -5,8 +5,13 @@
|
||||||
#include "Core/PowerPC/JitArm64/Jit.h"
|
#include "Core/PowerPC/JitArm64/Jit.h"
|
||||||
#include "Common/CommonTypes.h"
|
#include "Common/CommonTypes.h"
|
||||||
#include "Core/PowerPC/JitArm64/JitArm64Cache.h"
|
#include "Core/PowerPC/JitArm64/JitArm64Cache.h"
|
||||||
|
#include "Core/PowerPC/JitCommon/JitBase.h"
|
||||||
#include "Core/PowerPC/JitInterface.h"
|
#include "Core/PowerPC/JitInterface.h"
|
||||||
|
|
||||||
|
JitArm64BlockCache::JitArm64BlockCache(JitBase& jit) : JitBaseBlockCache{jit}
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void JitArm64BlockCache::WriteLinkBlock(const JitBlock::LinkData& source, const JitBlock* dest)
|
void JitArm64BlockCache::WriteLinkBlock(const JitBlock::LinkData& source, const JitBlock* dest)
|
||||||
{
|
{
|
||||||
u8* location = source.exitPtrs;
|
u8* location = source.exitPtrs;
|
||||||
|
@ -28,7 +33,7 @@ void JitArm64BlockCache::WriteLinkBlock(const JitBlock::LinkData& source, const
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
emit.MOVI2R(DISPATCHER_PC, source.exitAddress);
|
emit.MOVI2R(DISPATCHER_PC, source.exitAddress);
|
||||||
emit.B(g_jit->GetAsmRoutines()->dispatcher);
|
emit.B(m_jit.GetAsmRoutines()->dispatcher);
|
||||||
}
|
}
|
||||||
emit.FlushIcache();
|
emit.FlushIcache();
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,10 +6,15 @@
|
||||||
|
|
||||||
#include "Core/PowerPC/JitCommon/JitCache.h"
|
#include "Core/PowerPC/JitCommon/JitCache.h"
|
||||||
|
|
||||||
|
class JitBase;
|
||||||
|
|
||||||
typedef void (*CompiledCode)();
|
typedef void (*CompiledCode)();
|
||||||
|
|
||||||
class JitArm64BlockCache : public JitBaseBlockCache
|
class JitArm64BlockCache : public JitBaseBlockCache
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
|
explicit JitArm64BlockCache(JitBase& jit);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void WriteLinkBlock(const JitBlock::LinkData& source, const JitBlock* dest) override;
|
void WriteLinkBlock(const JitBlock::LinkData& source, const JitBlock* dest) override;
|
||||||
void WriteDestroyBlock(const JitBlock& block) override;
|
void WriteDestroyBlock(const JitBlock& block) override;
|
||||||
|
|
|
@ -35,7 +35,10 @@ static void ClearCacheThreadSafe(u64 userdata, s64 cyclesdata)
|
||||||
JitInterface::ClearCache();
|
JitInterface::ClearCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
JitBaseBlockCache::JitBaseBlockCache() = default;
|
JitBaseBlockCache::JitBaseBlockCache(JitBase& jit) : m_jit{jit}
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
JitBaseBlockCache::~JitBaseBlockCache() = default;
|
JitBaseBlockCache::~JitBaseBlockCache() = default;
|
||||||
|
|
||||||
void JitBaseBlockCache::Init()
|
void JitBaseBlockCache::Init()
|
||||||
|
@ -64,8 +67,8 @@ void JitBaseBlockCache::Clear()
|
||||||
else
|
else
|
||||||
Core::DisplayMessage("Clearing code cache.", 3000);
|
Core::DisplayMessage("Clearing code cache.", 3000);
|
||||||
#endif
|
#endif
|
||||||
g_jit->js.fifoWriteAddresses.clear();
|
m_jit.js.fifoWriteAddresses.clear();
|
||||||
g_jit->js.pairedQuantizeAddresses.clear();
|
m_jit.js.pairedQuantizeAddresses.clear();
|
||||||
for (int i = 1; i < num_blocks; i++)
|
for (int i = 1; i < num_blocks; i++)
|
||||||
{
|
{
|
||||||
DestroyBlock(i, false);
|
DestroyBlock(i, false);
|
||||||
|
@ -244,8 +247,8 @@ void JitBaseBlockCache::InvalidateICache(u32 address, const u32 length, bool for
|
||||||
{
|
{
|
||||||
for (u32 i = address; i < address + length; i += 4)
|
for (u32 i = address; i < address + length; i += 4)
|
||||||
{
|
{
|
||||||
g_jit->js.fifoWriteAddresses.erase(i);
|
m_jit.js.fifoWriteAddresses.erase(i);
|
||||||
g_jit->js.pairedQuantizeAddresses.erase(i);
|
m_jit.js.pairedQuantizeAddresses.erase(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,8 @@
|
||||||
|
|
||||||
#include "Common/CommonTypes.h"
|
#include "Common/CommonTypes.h"
|
||||||
|
|
||||||
|
class JitBase;
|
||||||
|
|
||||||
// A JitBlock is block of compiled code which corresponds to the PowerPC
|
// A JitBlock is block of compiled code which corresponds to the PowerPC
|
||||||
// code at a given address.
|
// code at a given address.
|
||||||
//
|
//
|
||||||
|
@ -112,7 +114,7 @@ public:
|
||||||
static constexpr u32 iCache_Num_Elements = 0x10000;
|
static constexpr u32 iCache_Num_Elements = 0x10000;
|
||||||
static constexpr u32 iCache_Mask = iCache_Num_Elements - 1;
|
static constexpr u32 iCache_Mask = iCache_Num_Elements - 1;
|
||||||
|
|
||||||
JitBaseBlockCache();
|
explicit JitBaseBlockCache(JitBase& jit);
|
||||||
virtual ~JitBaseBlockCache();
|
virtual ~JitBaseBlockCache();
|
||||||
|
|
||||||
void Init();
|
void Init();
|
||||||
|
@ -146,6 +148,9 @@ public:
|
||||||
|
|
||||||
u32* GetBlockBitSet() const;
|
u32* GetBlockBitSet() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
JitBase& m_jit;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual void WriteLinkBlock(const JitBlock::LinkData& source, const JitBlock* dest) = 0;
|
virtual void WriteLinkBlock(const JitBlock::LinkData& source, const JitBlock* dest) = 0;
|
||||||
virtual void WriteDestroyBlock(const JitBlock& block);
|
virtual void WriteDestroyBlock(const JitBlock& block);
|
||||||
|
|
Loading…
Reference in New Issue