From 1c4155f800562040d38df0ed8bef72c0a2fd105e Mon Sep 17 00:00:00 2001 From: JosJuice Date: Mon, 13 Sep 2021 19:03:43 +0200 Subject: [PATCH] JitArm64: Fix fresx/frsqrtex unlocking W0 too early fpr.RW may clobber GPRs that are not locked. Fixes https://bugs.dolphin-emu.org/issues/12656. --- .../Core/Core/PowerPC/JitArm64/JitArm64_FloatingPoint.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_FloatingPoint.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_FloatingPoint.cpp index 799d212bda..158e174090 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_FloatingPoint.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_FloatingPoint.cpp @@ -564,13 +564,15 @@ void JitArm64::fresx(UGeckoInstruction inst) BL(GetAsmRoutines()->fres); - gpr.Unlock(ARM64Reg::W0, ARM64Reg::W1, ARM64Reg::W2, ARM64Reg::W3, ARM64Reg::W4, ARM64Reg::W30); + gpr.Unlock(ARM64Reg::W1, ARM64Reg::W2, ARM64Reg::W3, ARM64Reg::W4, ARM64Reg::W30); fpr.Unlock(ARM64Reg::Q0); const ARM64Reg VD = fpr.RW(d, RegType::Duplicated); m_float_emit.FMOV(EncodeRegToDouble(VD), ARM64Reg::X0); SetFPRFIfNeeded(false, ARM64Reg::X0); + + gpr.Unlock(ARM64Reg::W0); } void JitArm64::frsqrtex(UGeckoInstruction inst) @@ -591,13 +593,15 @@ void JitArm64::frsqrtex(UGeckoInstruction inst) BL(GetAsmRoutines()->frsqrte); - gpr.Unlock(ARM64Reg::W0, ARM64Reg::W1, ARM64Reg::W2, ARM64Reg::W3, ARM64Reg::W4, ARM64Reg::W30); + gpr.Unlock(ARM64Reg::W1, ARM64Reg::W2, ARM64Reg::W3, ARM64Reg::W4, ARM64Reg::W30); fpr.Unlock(ARM64Reg::Q0); const ARM64Reg VD = fpr.RW(d, RegType::LowerPair); m_float_emit.FMOV(EncodeRegToDouble(VD), ARM64Reg::X0); SetFPRFIfNeeded(false, ARM64Reg::X0); + + gpr.Unlock(ARM64Reg::W0); } // Since the following float conversion functions are used in non-arithmetic PPC float