From 1b7bd32ac1daa90a0f9f6dfdd6c7289845a3cbad Mon Sep 17 00:00:00 2001 From: JosJuice Date: Sun, 5 Nov 2023 09:15:08 +0100 Subject: [PATCH 1/2] JitArm64: Correctly flush non-dirty immediates Without this change, non-dirty immediates don't actually get flushed. This can be a problem if we for instance are flushing all registers in order to execute an interpreter fallback. If that interpreter fallback writes to a register that contained a non-dirty immediate, the JIT will keep using the old value instead of loading the updated value. --- Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp index a1400a5c9a..96c1e356db 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp @@ -232,10 +232,10 @@ void Arm64GPRCache::FlushRegister(size_t index, bool maintain_state, ARM64Reg tm if (allocated_tmp_reg) UnlockRegister(tmp_reg); } - - if (!maintain_state) - reg.Flush(); } + + if (!maintain_state) + reg.Flush(); } } From f9dd13a3092d414836dd99119dbf70952655d22a Mon Sep 17 00:00:00 2001 From: JosJuice Date: Sun, 5 Nov 2023 09:21:58 +0100 Subject: [PATCH 2/2] JitArm64: Preserve dirty flag when materializing immediate Before dbf5dca, the dirty flag had no meaning for an immediate value, so we made sure to always set the dirty flag when switching a register from Immediate to Register. But after dbf5dca, that is no longer the case. If an immediate is marked as not dirty, we can keep the register marked as not dirty after materializing the value. This way we skip having to write it back to ppcState later. --- Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp index 96c1e356db..ec9562f46c 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp @@ -317,7 +317,6 @@ ARM64Reg Arm64GPRCache::R(const GuestRegInfo& guest_reg) ARM64Reg host_reg = bitsize != 64 ? GetReg() : EncodeRegTo64(GetReg()); m_emit->MOVI2R(host_reg, reg.GetImm()); reg.Load(host_reg); - reg.SetDirty(true); return host_reg; } break;