mirror of
https://github.com/izzy2lost/ppsspp.git
synced 2026-03-10 12:43:04 -07:00
Avoid clearing the jit cache on savestate.
Downside: saving state could "fix" some issues with games detecting jit, which won't happen anymore. However, it's now faster to savestate.
This commit is contained in:
@@ -71,7 +71,8 @@ op_agent_t agent;
|
||||
#endif
|
||||
|
||||
|
||||
#define INVALID_EXIT 0xFFFFFFFF
|
||||
const u32 INVALID_EXIT = 0xFFFFFFFF;
|
||||
const MIPSOpcode INVALID_ORIGINAL_OP = MIPSOpcode(0x00000001);
|
||||
|
||||
JitBlockCache::JitBlockCache(MIPSState *mips_, CodeBlock *codeBlock) :
|
||||
mips(mips_), codeBlock_(codeBlock), blocks(0), num_blocks(0) {
|
||||
@@ -328,6 +329,49 @@ void JitBlockCache::UnlinkBlock(int i)
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<u32> JitBlockCache::SaveAndClearEmuHackOps()
|
||||
{
|
||||
std::vector<u32> result;
|
||||
result.resize(num_blocks);
|
||||
|
||||
for (int block_num = 0; block_num < num_blocks; ++block_num)
|
||||
{
|
||||
JitBlock &b = blocks[block_num];
|
||||
if (b.invalid)
|
||||
continue;
|
||||
|
||||
const u32 emuhack = GetEmuHackOpForBlock(block_num).encoding;
|
||||
result[block_num] = emuhack;
|
||||
// The goal here is to prevent restoring it if it did not match (in case originalFirstOpcode does match.)
|
||||
if (Memory::ReadUnchecked_U32(b.originalAddress) != emuhack)
|
||||
b.originalFirstOpcode = INVALID_ORIGINAL_OP;
|
||||
else
|
||||
Memory::Write_Opcode_JIT(b.originalAddress, b.originalFirstOpcode);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void JitBlockCache::RestoreSavedEmuHackOps(std::vector<u32> saved)
|
||||
{
|
||||
if (num_blocks != (int)saved.size())
|
||||
{
|
||||
ERROR_LOG(JIT, "RestoreSavedEmuHackOps: Wrong saved block size.");
|
||||
return;
|
||||
}
|
||||
|
||||
for (int block_num = 0; block_num < num_blocks; ++block_num)
|
||||
{
|
||||
const JitBlock &b = blocks[block_num];
|
||||
if (b.invalid)
|
||||
continue;
|
||||
|
||||
// Only if we restored it, write it back.
|
||||
if (Memory::ReadUnchecked_U32(b.originalAddress) == b.originalFirstOpcode.encoding)
|
||||
Memory::Write_Opcode_JIT(b.originalAddress, MIPSOpcode(saved[block_num]));
|
||||
}
|
||||
}
|
||||
|
||||
void JitBlockCache::DestroyBlock(int block_num, bool invalidate)
|
||||
{
|
||||
if (block_num < 0 || block_num >= num_blocks) {
|
||||
|
||||
Reference in New Issue
Block a user