From c657134c866af4b88962aca807bdf5a91d4666f4 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Tue, 15 Nov 2016 00:26:08 +1000 Subject: [PATCH 1/2] Jit64: Treat branch-to-self instruction as an idle loop --- Source/Core/Core/PowerPC/Jit64/Jit_Branch.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Source/Core/Core/PowerPC/Jit64/Jit_Branch.cpp b/Source/Core/Core/PowerPC/Jit64/Jit_Branch.cpp index f83acd8991..ce22493fa4 100644 --- a/Source/Core/Core/PowerPC/Jit64/Jit_Branch.cpp +++ b/Source/Core/Core/PowerPC/Jit64/Jit_Branch.cpp @@ -7,6 +7,7 @@ #include "Common/CommonTypes.h" #include "Common/x64Emitter.h" #include "Core/ConfigManager.h" +#include "Core/CoreTiming.h" #include "Core/PowerPC/Gekko.h" #include "Core/PowerPC/Jit64/JitRegCache.h" #include "Core/PowerPC/PPCAnalyst.h" @@ -90,11 +91,12 @@ void Jit64::bx(UGeckoInstruction inst) #endif if (destination == js.compilerPC) { - // PanicAlert("Idle loop detected at %08x", destination); - // CALL(ProtectFunction(&CoreTiming::Idle, 0)); - // JMP(Asm::testExceptions, true); - // make idle loops go faster - js.downcountAmount += 8; + ABI_PushRegistersAndAdjustStack({}, 0); + ABI_CallFunction(CoreTiming::Idle); + ABI_PopRegistersAndAdjustStack({}, 0); + MOV(32, PPCSTATE(pc), Imm32(destination)); + WriteExceptionExit(); + return; } WriteExit(destination, inst.LK, js.compilerPC + 4); } From e83bf5705a173e80c2d83d29dab1e41c8a41bd19 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Tue, 15 Nov 2016 00:28:14 +1000 Subject: [PATCH 2/2] JitArm64: Don't emit normal block exit for branch-to-self instructions The normal block exit is redundant as the exception exit will jump out of the block first, meaning this code is never executed. --- Source/Core/Core/PowerPC/JitArm64/JitArm64_Branch.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Branch.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Branch.cpp index 307ea6e220..7ed396fb77 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Branch.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Branch.cpp @@ -105,6 +105,7 @@ void JitArm64::bx(UGeckoInstruction inst) gpr.Unlock(WA); WriteExceptionExit(js.compilerPC); + return; } WriteExit(destination);