diff --git a/Source/Core/Core/PowerPC/JitArm64/Jit.cpp b/Source/Core/Core/PowerPC/JitArm64/Jit.cpp index d055b24d78..4a94cec890 100644 --- a/Source/Core/Core/PowerPC/JitArm64/Jit.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/Jit.cpp @@ -97,6 +97,8 @@ void JitArm64::DoDownCount() // Exits void JitArm64::WriteExit(u32 destination) { + DoDownCount(); + //If nobody has taken care of this yet (this can be removed when all branches are done) JitBlock *b = js.curBlock; JitBlock::LinkData linkData; @@ -104,8 +106,6 @@ void JitArm64::WriteExit(u32 destination) linkData.exitPtrs = GetWritableCodePtr(); linkData.linkStatus = false; - DoDownCount(); - // Link opportunity! int block; if (jo.enableBlocklink && (block = blocks.GetBlockNumberFromStartAddress(destination)) >= 0) @@ -163,13 +163,12 @@ void JitArm64::SingleStep() pExecAddr(); } -void JitArm64::Jit(u32 em_address) +void JitArm64::Jit(u32) { if (GetSpaceLeft() < 0x10000 || blocks.IsFull() || SConfig::GetInstance().m_LocalCoreStartupParameter.bJITNoBlockCache) { ClearCache(); } - int block_num = blocks.AllocateBlock(PowerPC::ppcState.pc); JitBlock *b = blocks.GetBlock(block_num); const u8* BlockPtr = DoJit(PowerPC::ppcState.pc, &code_buffer, b); @@ -282,6 +281,7 @@ const u8* JitArm64::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitB b->codeSize = (u32)(GetCodePtr() - normalEntry); b->originalSize = code_block.m_num_instructions; + FlushIcache(); return start; } diff --git a/Source/Core/Core/PowerPC/JitArm64/Jit.h b/Source/Core/Core/PowerPC/JitArm64/Jit.h index 05aeb0609c..d52e7c5ba4 100644 --- a/Source/Core/Core/PowerPC/JitArm64/Jit.h +++ b/Source/Core/Core/PowerPC/JitArm64/Jit.h @@ -47,7 +47,7 @@ public: void Run(); void SingleStep(); - void Jit(u32 em_address); + void Jit(u32); const char *GetName() { diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64Cache.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64Cache.cpp index 55c319a7cc..89d2c40bf4 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64Cache.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64Cache.cpp @@ -8,9 +8,18 @@ void JitArm64BlockCache::WriteLinkBlock(u8* location, const u8* address) { + ARM64XEmitter emit(location); + emit.B(address); + emit.FlushIcache(); } void JitArm64BlockCache::WriteDestroyBlock(const u8* location, u32 address) { + ARM64XEmitter emit((u8 *)location); + emit.MOVI2R(W0, address); + emit.MOVI2R(X30, (u64)jit->GetAsmRoutines()->dispatcher); + emit.STR(INDEX_UNSIGNED, W0, X29, PPCSTATE_OFF(pc)); + emit.BR(X30); + emit.FlushIcache(); }