From c5e8238cc721c123a4e04a706524d13523545b7e Mon Sep 17 00:00:00 2001 From: degasus Date: Thu, 19 May 2016 19:41:56 +0200 Subject: [PATCH] JitArm64: Fix dispatcher with MMU. --- Source/Core/Core/PowerPC/JitArm64/JitAsm.cpp | 36 ++++++++++++++++---- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/Source/Core/Core/PowerPC/JitArm64/JitAsm.cpp b/Source/Core/Core/PowerPC/JitArm64/JitAsm.cpp index 378b3c8768..11cfe363fd 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitAsm.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitAsm.cpp @@ -5,6 +5,7 @@ #include "Common/Arm64Emitter.h" #include "Common/CommonTypes.h" #include "Common/JitRegister.h" +#include "Common/MathUtil.h" #include "Core/CoreTiming.h" #include "Core/HW/Memmap.h" #include "Core/PowerPC/PowerPC.h" @@ -46,14 +47,36 @@ void JitArm64::GenerateAsm() dispatcherNoCheck = GetCodePtr(); - STR(INDEX_UNSIGNED, DISPATCHER_PC, PPC_REG, PPCSTATE_OFF(pc)); + FixupBranch exram, vmem, not_exram, not_vmem; + ARM64Reg pc_masked = W25; + ARM64Reg cache_base = X27; - // This block of code gets the address of the compiled block of code - // It runs though to the compiling portion if it isn't found - BFM(DISPATCHER_PC, WSP, 3, 2); // Wipe the top 3 bits. Same as PC & JIT_ICACHE_MASK + // VMEM + not_vmem = TBZ(DISPATCHER_PC, IntLog2(JIT_ICACHE_VMEM_BIT)); + ANDI2R(pc_masked, DISPATCHER_PC, JIT_ICACHE_MASK); + MOVI2R(cache_base, (u64)jit->GetBlockCache()->iCacheVMEM.data()); + vmem = B(); + SetJumpTarget(not_vmem); - MOVI2R(X27, (u64)jit->GetBlockCache()->iCache.data()); - LDR(W27, X27, EncodeRegTo64(DISPATCHER_PC)); + if (SConfig::GetInstance().bWii) + { + // Wii EX-RAM + not_exram = TBZ(DISPATCHER_PC, IntLog2(JIT_ICACHE_EXRAM_BIT)); + ANDI2R(pc_masked, DISPATCHER_PC, JIT_ICACHEEX_MASK); + MOVI2R(cache_base, (u64)jit->GetBlockCache()->iCacheEx.data()); + exram = B(); + SetJumpTarget(not_exram); + } + + // Common memory + ANDI2R(pc_masked, DISPATCHER_PC, JIT_ICACHE_MASK); + MOVI2R(cache_base, (u64)jit->GetBlockCache()->iCache.data()); + + SetJumpTarget(vmem); + if (SConfig::GetInstance().bWii) + SetJumpTarget(exram); + + LDR(W27, cache_base, EncodeRegTo64(pc_masked)); FixupBranch JitBlock = TBNZ(W27, 7); // Test the 7th bit // Success, it is our Jitblock. @@ -65,6 +88,7 @@ void JitArm64::GenerateAsm() SetJumpTarget(JitBlock); + STR(INDEX_UNSIGNED, DISPATCHER_PC, PPC_REG, PPCSTATE_OFF(pc)); MOVI2R(X30, (u64)&::Jit); BLR(X30);