JitArm64: Remove the ability to reuse backpatch slowmem handlers
Reusing the slowmem handlers of existing blocks meshes badly with reusing the empty space left when destroying blocks. I don't think reusing slowmem handlers was much of a gain anyway.
This commit is contained in:
parent
a0a91ec4b8
commit
867cd99de1
|
@ -123,7 +123,6 @@ bool JitArm64::HandleStackFault()
|
||||||
void JitArm64::ClearCache()
|
void JitArm64::ClearCache()
|
||||||
{
|
{
|
||||||
m_fault_to_handler.clear();
|
m_fault_to_handler.clear();
|
||||||
m_handler_to_loc.clear();
|
|
||||||
|
|
||||||
blocks.Clear();
|
blocks.Clear();
|
||||||
const Common::ScopedJITPageWriteAndNoExecute enable_jit_page_writes;
|
const Common::ScopedJITPageWriteAndNoExecute enable_jit_page_writes;
|
||||||
|
|
|
@ -178,21 +178,6 @@ public:
|
||||||
bool IsFPRStoreSafe(size_t guest_reg) const;
|
bool IsFPRStoreSafe(size_t guest_reg) const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
struct SlowmemHandler
|
|
||||||
{
|
|
||||||
Arm64Gen::ARM64Reg dest_reg;
|
|
||||||
Arm64Gen::ARM64Reg addr_reg;
|
|
||||||
BitSet32 gprs;
|
|
||||||
BitSet32 fprs;
|
|
||||||
u32 flags;
|
|
||||||
|
|
||||||
bool operator<(const SlowmemHandler& rhs) const
|
|
||||||
{
|
|
||||||
return std::tie(dest_reg, addr_reg, gprs, fprs, flags) <
|
|
||||||
std::tie(rhs.dest_reg, rhs.addr_reg, rhs.gprs, rhs.fprs, rhs.flags);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct FastmemArea
|
struct FastmemArea
|
||||||
{
|
{
|
||||||
const u8* fastmem_code;
|
const u8* fastmem_code;
|
||||||
|
@ -296,7 +281,6 @@ protected:
|
||||||
|
|
||||||
// <Fastmem fault location, slowmem handler location>
|
// <Fastmem fault location, slowmem handler location>
|
||||||
std::map<const u8*, FastmemArea> m_fault_to_handler;
|
std::map<const u8*, FastmemArea> m_fault_to_handler;
|
||||||
std::map<SlowmemHandler, const u8*> m_handler_to_loc;
|
|
||||||
Arm64GPRCache gpr;
|
Arm64GPRCache gpr;
|
||||||
Arm64FPRCache fpr;
|
Arm64FPRCache fpr;
|
||||||
|
|
||||||
|
|
|
@ -121,40 +121,15 @@ void JitArm64::EmitBackpatchRoutine(u32 flags, bool fastmem, bool do_farcode, AR
|
||||||
if (!fastmem || do_farcode)
|
if (!fastmem || do_farcode)
|
||||||
{
|
{
|
||||||
if (fastmem && do_farcode)
|
if (fastmem && do_farcode)
|
||||||
{
|
|
||||||
if (emitting_routine)
|
|
||||||
{
|
{
|
||||||
in_far_code = true;
|
in_far_code = true;
|
||||||
SwitchToFarCode();
|
SwitchToFarCode();
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SlowmemHandler handler;
|
|
||||||
handler.dest_reg = RS;
|
|
||||||
handler.addr_reg = addr;
|
|
||||||
handler.gprs = gprs_to_push;
|
|
||||||
handler.fprs = fprs_to_push;
|
|
||||||
handler.flags = flags;
|
|
||||||
|
|
||||||
|
if (!emitting_routine)
|
||||||
|
{
|
||||||
FastmemArea* fastmem_area = &m_fault_to_handler[fastmem_end];
|
FastmemArea* fastmem_area = &m_fault_to_handler[fastmem_end];
|
||||||
auto handler_loc_iter = m_handler_to_loc.find(handler);
|
|
||||||
|
|
||||||
if (handler_loc_iter == m_handler_to_loc.end())
|
|
||||||
{
|
|
||||||
in_far_code = true;
|
|
||||||
SwitchToFarCode();
|
|
||||||
const u8* handler_loc = GetCodePtr();
|
|
||||||
m_handler_to_loc[handler] = handler_loc;
|
|
||||||
fastmem_area->fastmem_code = fastmem_start;
|
fastmem_area->fastmem_code = fastmem_start;
|
||||||
fastmem_area->slowmem_code = handler_loc;
|
fastmem_area->slowmem_code = GetCodePtr();
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
const u8* handler_loc = handler_loc_iter->second;
|
|
||||||
fastmem_area->fastmem_code = fastmem_start;
|
|
||||||
fastmem_area->slowmem_code = handler_loc;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue