diff --git a/Source/Core/Core/PowerPC/JitArm64/Jit.cpp b/Source/Core/Core/PowerPC/JitArm64/Jit.cpp index c1519450ed..a2aae7c2d3 100644 --- a/Source/Core/Core/PowerPC/JitArm64/Jit.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/Jit.cpp @@ -344,8 +344,9 @@ void JitArm64::IntializeSpeculativeConstants() STR(IndexType::Unsigned, DISPATCHER_PC, PPC_REG, PPCSTATE_OFF(pc)); MOVP2R(ARM64Reg::X8, &JitInterface::CompileExceptionCheck); MOVI2R(ARM64Reg::W0, static_cast(JitInterface::ExceptionType::SpeculativeConstants)); - BLR(ARM64Reg::X8); - B(dispatcher_no_check); + // Write dispatcher_no_check to LR for tail call + MOVP2R(ARM64Reg::X30, dispatcher_no_check); + BR(ARM64Reg::X8); SwitchToNearCode(); } @@ -837,10 +838,11 @@ bool JitArm64::DoJit(u32 em_address, JitBlock* b, u32 nextPC) SetJumpTarget(fail); MOVI2R(DISPATCHER_PC, js.blockStart); STR(IndexType::Unsigned, DISPATCHER_PC, PPC_REG, PPCSTATE_OFF(pc)); + MOVP2R(ARM64Reg::X8, &JitInterface::CompileExceptionCheck); MOVI2R(ARM64Reg::W0, static_cast(JitInterface::ExceptionType::PairedQuantize)); - MOVP2R(ARM64Reg::X1, &JitInterface::CompileExceptionCheck); - BLR(ARM64Reg::X1); - B(dispatcher_no_check); + // Write dispatcher_no_check to LR for tail call + MOVP2R(ARM64Reg::X30, dispatcher_no_check); + BR(ARM64Reg::X8); SwitchToNearCode(); SetJumpTarget(no_fail); js.assumeNoPairedQuantize = true;