From 502b48a690ece557c1c2c6eeff746d11ab0f6534 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Sat, 2 Nov 2024 15:46:40 +0100 Subject: [PATCH] JitArm64: Make FlushRegisters unlock condition more robust To find out whether a host register needs to be unlocked, FlushRegisters checks if the guest register is known to be a zero immediate. This works right now, but it will stop working correctly once we gain the ability to have a guest register be a known immediate and be in a host register at the same time, because a register that's known to be a zero immediate may have had a host register allocated prior to the call to FlushRegisters. Instead, we should check whether the register is RegType::Register after we're done calling BindForRead. --- Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp index 43631b2d9af..786f5be4a32 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp @@ -272,10 +272,10 @@ void Arm64GPRCache::FlushRegisters(BitSet32 regs, FlushMode mode, ARM64Reg tmp_r m_emit->STP(IndexType::Signed, RX1, RX2, PPC_REG, u32(ppc_offset)); if (flush_all) { - if (!reg1_zero) - UnlockRegister(EncodeRegTo32(RX1)); - if (!reg2_zero) - UnlockRegister(EncodeRegTo32(RX2)); + if (reg1.GetType() == RegType::Register) + UnlockRegister(reg1.GetReg()); + if (reg2.GetType() == RegType::Register) + UnlockRegister(reg2.GetReg()); reg1.Flush(); reg2.Flush(); }