From 51ad7981050f6891bef18a73a96907663116e8b5 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Tue, 2 Dec 2014 19:13:28 -0600 Subject: [PATCH] [AArch64] Implements block linking. Before block linking was enabled but it wasn't ever implemented. Implements link blocks and destroy block functions and moves the downcount check in the WriteExit function so it doesn't get overwritten when linking. --- Source/Core/Core/PowerPC/JitArm64/Jit.cpp | 8 ++++---- Source/Core/Core/PowerPC/JitArm64/Jit.h | 2 +- Source/Core/Core/PowerPC/JitArm64/JitArm64Cache.cpp | 9 +++++++++ 3 files changed, 14 insertions(+), 5 deletions(-) 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(); }