diff --git a/Core/Debugger/Breakpoints.cpp b/Core/Debugger/Breakpoints.cpp index a850df55db..9f7a27d39f 100644 --- a/Core/Debugger/Breakpoints.cpp +++ b/Core/Debugger/Breakpoints.cpp @@ -540,7 +540,7 @@ void CBreakPoints::Update(u32 addr) if (addr != 0) MIPSComp::jit->InvalidateCacheAt(addr - 4, 8); else - MIPSComp::jit->InvalidateCache(); + MIPSComp::jit->ClearCache(); if (resume) Core_EnableStepping(false); diff --git a/Core/MIPS/ARM/ArmJit.cpp b/Core/MIPS/ARM/ArmJit.cpp index e89aa3bf95..33f17bfca7 100644 --- a/Core/MIPS/ARM/ArmJit.cpp +++ b/Core/MIPS/ARM/ArmJit.cpp @@ -154,11 +154,6 @@ void ArmJit::ClearCache() GenerateFixedCode(); } -void ArmJit::InvalidateCache() -{ - blocks.Clear(); -} - void ArmJit::InvalidateCacheAt(u32 em_address, int length) { blocks.InvalidateICache(em_address, length); diff --git a/Core/MIPS/ARM/ArmJit.h b/Core/MIPS/ARM/ArmJit.h index 3f55e87a66..511ce5fce1 100644 --- a/Core/MIPS/ARM/ArmJit.h +++ b/Core/MIPS/ARM/ArmJit.h @@ -174,7 +174,6 @@ public: void RestoreSavedEmuHackOps(std::vector saved) override { blocks.RestoreSavedEmuHackOps(saved); } void ClearCache() override; - void InvalidateCache() override; void InvalidateCacheAt(u32 em_address, int length = 4) override; void EatPrefix() override { js.EatPrefix(); } diff --git a/Core/MIPS/ARM64/Arm64Jit.cpp b/Core/MIPS/ARM64/Arm64Jit.cpp index 4184ca83d3..4f9e59252a 100644 --- a/Core/MIPS/ARM64/Arm64Jit.cpp +++ b/Core/MIPS/ARM64/Arm64Jit.cpp @@ -146,10 +146,6 @@ void Arm64Jit::ClearCache() { GenerateFixedCode(jo); } -void Arm64Jit::InvalidateCache() { - blocks.Clear(); -} - void Arm64Jit::InvalidateCacheAt(u32 em_address, int length) { blocks.InvalidateICache(em_address, length); } @@ -194,7 +190,7 @@ void Arm64Jit::Compile(u32 em_address) { ClearCache(); } - BeginWrite(); + BeginWrite(4); int block_num = blocks.AllocateBlock(em_address); JitBlock *b = blocks.GetBlock(block_num); @@ -203,6 +199,9 @@ void Arm64Jit::Compile(u32 em_address) { EndWrite(); + // Don't forget to zap the newly written instructions in the instruction cache! + FlushIcache(); + bool cleanSlate = false; if (js.hasSetRounding && !js.lastSetRounding) { @@ -336,9 +335,6 @@ const u8 *Arm64Jit::DoJit(u32 em_address, JitBlock *b) { if (dontLogBlocks > 0) dontLogBlocks--; - // Don't forget to zap the newly written instructions in the instruction cache! - FlushIcache(); - if (js.lastContinuedPC == 0) { b->originalSize = js.numInstructions; } else { @@ -406,7 +402,7 @@ void Arm64Jit::LinkBlock(u8 *exitPoint, const u8 *checkedEntry) { } ARM64XEmitter emit(exitPoint); emit.B(checkedEntry); - // TODO: Write stuff after. + // TODO: Write stuff after, convering up the now-unused instructions. emit.FlushIcache(); if (PlatformIsWXExclusive()) { ProtectMemoryPages(exitPoint, 32, MEM_PROT_READ | MEM_PROT_EXEC); diff --git a/Core/MIPS/ARM64/Arm64Jit.h b/Core/MIPS/ARM64/Arm64Jit.h index b4491e5384..2eed09ee0c 100644 --- a/Core/MIPS/ARM64/Arm64Jit.h +++ b/Core/MIPS/ARM64/Arm64Jit.h @@ -175,7 +175,6 @@ public: void RestoreSavedEmuHackOps(std::vector saved) override { blocks.RestoreSavedEmuHackOps(saved); } void ClearCache() override; - void InvalidateCache() override; void InvalidateCacheAt(u32 em_address, int length = 4) override; void EatPrefix() override { js.EatPrefix(); } diff --git a/Core/MIPS/IR/IRJit.cpp b/Core/MIPS/IR/IRJit.cpp index 7832456ab5..26f66bc6ad 100644 --- a/Core/MIPS/IR/IRJit.cpp +++ b/Core/MIPS/IR/IRJit.cpp @@ -69,10 +69,6 @@ void IRJit::ClearCache() { blocks_.Clear(); } -void IRJit::InvalidateCache() { - blocks_.Clear(); -} - void IRJit::InvalidateCacheAt(u32 em_address, int length) { blocks_.InvalidateICache(em_address, length); } diff --git a/Core/MIPS/IR/IRJit.h b/Core/MIPS/IR/IRJit.h index 0d085b86c3..84851df7f3 100644 --- a/Core/MIPS/IR/IRJit.h +++ b/Core/MIPS/IR/IRJit.h @@ -144,7 +144,6 @@ public: void RestoreSavedEmuHackOps(std::vector saved) override { blocks_.RestoreSavedEmuHackOps(saved); } void ClearCache() override; - void InvalidateCache() override; void InvalidateCacheAt(u32 em_address, int length = 4) override; const u8 *GetDispatcher() const override { return nullptr; } diff --git a/Core/MIPS/JitCommon/JitBlockCache.cpp b/Core/MIPS/JitCommon/JitBlockCache.cpp index 196140dcd0..ad6466e8d1 100644 --- a/Core/MIPS/JitCommon/JitBlockCache.cpp +++ b/Core/MIPS/JitCommon/JitBlockCache.cpp @@ -60,7 +60,7 @@ op_agent_t agent; const u32 INVALID_EXIT = 0xFFFFFFFF; JitBlockCache::JitBlockCache(MIPSState *mips, CodeBlockCommon *codeBlock) : - codeBlock_(codeBlock), blocks_(0), num_blocks_(0) { + codeBlock_(codeBlock), blocks_(nullptr), num_blocks_(0) { } JitBlockCache::~JitBlockCache() { diff --git a/Core/MIPS/JitCommon/JitCommon.h b/Core/MIPS/JitCommon/JitCommon.h index 004c7990f0..9e91664713 100644 --- a/Core/MIPS/JitCommon/JitCommon.h +++ b/Core/MIPS/JitCommon/JitCommon.h @@ -123,7 +123,6 @@ namespace MIPSComp { virtual bool DescribeCodePtr(const u8 *ptr, std::string &name) = 0; virtual const u8 *GetDispatcher() const = 0; virtual JitBlockCache *GetBlockCache() = 0; - virtual void InvalidateCache() = 0; virtual void InvalidateCacheAt(u32 em_address, int length = 4) = 0; virtual void DoState(PointerWrap &p) = 0; virtual void DoDummyState(PointerWrap &p) = 0; diff --git a/Core/MIPS/MIPS/MipsJit.cpp b/Core/MIPS/MIPS/MipsJit.cpp index 88b8594094..b669109899 100644 --- a/Core/MIPS/MIPS/MipsJit.cpp +++ b/Core/MIPS/MIPS/MipsJit.cpp @@ -99,11 +99,6 @@ void MipsJit::ClearCache() //GenerateFixedCode(); } -void MipsJit::InvalidateCache() -{ - blocks.Clear(); -} - void MipsJit::InvalidateCacheAt(u32 em_address, int length) { blocks.InvalidateICache(em_address, length); diff --git a/Core/MIPS/MIPS/MipsJit.h b/Core/MIPS/MIPS/MipsJit.h index 3afea13852..ad158f5de0 100644 --- a/Core/MIPS/MIPS/MipsJit.h +++ b/Core/MIPS/MIPS/MipsJit.h @@ -135,7 +135,6 @@ public: void RestoreSavedEmuHackOps(std::vector saved) override { blocks.RestoreSavedEmuHackOps(saved); } void ClearCache() override; - void InvalidateCache() override; void InvalidateCacheAt(u32 em_address, int length = 4) override; void EatPrefix() override { js.EatPrefix(); } diff --git a/Core/MIPS/fake/FakeJit.cpp b/Core/MIPS/fake/FakeJit.cpp index beb0d37188..1a521ee68b 100644 --- a/Core/MIPS/fake/FakeJit.cpp +++ b/Core/MIPS/fake/FakeJit.cpp @@ -94,11 +94,6 @@ void FakeJit::ClearCache() //GenerateFixedCode(); } -void FakeJit::InvalidateCache() -{ - blocks.Clear(); -} - void FakeJit::InvalidateCacheAt(u32 em_address, int length) { blocks.InvalidateICache(em_address, length); diff --git a/Core/MIPS/fake/FakeJit.h b/Core/MIPS/fake/FakeJit.h index cfb09a8a56..d23303a654 100644 --- a/Core/MIPS/fake/FakeJit.h +++ b/Core/MIPS/fake/FakeJit.h @@ -128,7 +128,6 @@ public: JitBlockCache *GetBlockCache() { return &blocks; } void ClearCache(); - void InvalidateCache(); void InvalidateCacheAt(u32 em_address, int length = 4); void EatPrefix() { js.EatPrefix(); } diff --git a/Core/MIPS/x86/Jit.cpp b/Core/MIPS/x86/Jit.cpp index 9e087bfd8b..2c73633cc3 100644 --- a/Core/MIPS/x86/Jit.cpp +++ b/Core/MIPS/x86/Jit.cpp @@ -245,11 +245,6 @@ void Jit::ClearCache() GenerateFixedCode(jo); } -void Jit::InvalidateCache() -{ - blocks.Clear(); -} - void Jit::CompileDelaySlot(int flags, RegCacheState *state) { // Need to offset the downcount which was already incremented for the branch + delay slot. diff --git a/Core/MIPS/x86/Jit.h b/Core/MIPS/x86/Jit.h index 51e8791d9b..72ca6d87b5 100644 --- a/Core/MIPS/x86/Jit.h +++ b/Core/MIPS/x86/Jit.h @@ -163,7 +163,6 @@ public: void RestoreSavedEmuHackOps(std::vector saved) override { blocks.RestoreSavedEmuHackOps(saved); } void ClearCache() override; - void InvalidateCache() override; void InvalidateCacheAt(u32 em_address, int length = 4) override { if (blocks.RangeMayHaveEmuHacks(em_address, em_address + length)) { blocks.InvalidateICache(em_address, length);