From 2acbb39e348aba044fc29e8669d55532fe8266c3 Mon Sep 17 00:00:00 2001 From: refractionpcsx2 Date: Fri, 28 Feb 2025 21:32:04 +0000 Subject: [PATCH] Core: Delete constant regs when flushing to interpreter --- pcsx2/x86/iCore.h | 2 +- pcsx2/x86/ix86-32/iCore.cpp | 8 +++++++- pcsx2/x86/ix86-32/iR5900.cpp | 4 ++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/pcsx2/x86/iCore.h b/pcsx2/x86/iCore.h index d9588e6703..311d297f16 100644 --- a/pcsx2/x86/iCore.h +++ b/pcsx2/x86/iCore.h @@ -109,7 +109,7 @@ void _freeX86reg(int x86reg); void _freeX86regWithoutWriteback(int x86reg); void _freeX86regs(); void _flushX86regs(); -void _flushConstRegs(); +void _flushConstRegs(bool delete_const); void _flushConstReg(int reg); void _validateRegs(); void _writebackX86Reg(int x86reg); diff --git a/pcsx2/x86/ix86-32/iCore.cpp b/pcsx2/x86/ix86-32/iCore.cpp index ddd365659e..02cadeb411 100644 --- a/pcsx2/x86/ix86-32/iCore.cpp +++ b/pcsx2/x86/ix86-32/iCore.cpp @@ -105,7 +105,7 @@ void _flushConstReg(int reg) } } -void _flushConstRegs() +void _flushConstRegs(bool delete_const) { int zero_reg_count = 0; int minusone_reg_count = 0; @@ -134,6 +134,8 @@ void _flushConstRegs() { xMOV(ptr64[&cpuRegs.GPR.r[i].UD[0]], rax); g_cpuFlushedConstReg |= 1u << i; + if (delete_const) + g_cpuHasConstReg &= ~(1u << i); } } rax_is_zero = true; @@ -154,6 +156,8 @@ void _flushConstRegs() { xMOV(ptr64[&cpuRegs.GPR.r[i].UD[0]], rax); g_cpuFlushedConstReg |= 1u << i; + if (delete_const) + g_cpuHasConstReg &= ~(1u << i); } } } @@ -166,6 +170,8 @@ void _flushConstRegs() xWriteImm64ToMem(&cpuRegs.GPR.r[i].UD[0], rax, g_cpuConstRegs[i].UD[0]); g_cpuFlushedConstReg |= 1u << i; + if (delete_const) + g_cpuHasConstReg &= ~(1u << i); } } diff --git a/pcsx2/x86/ix86-32/iR5900.cpp b/pcsx2/x86/ix86-32/iR5900.cpp index 115c0ae903..674d7d0e85 100644 --- a/pcsx2/x86/ix86-32/iR5900.cpp +++ b/pcsx2/x86/ix86-32/iR5900.cpp @@ -227,7 +227,7 @@ void _eeFlushAllDirty() _flushX86regs(); // flush constants, do them all at once for slightly better codegen - _flushConstRegs(); + _flushConstRegs(false); } void _eeMoveGPRtoR(const xRegister32& to, int fromgpr, bool allow_preload) @@ -1225,7 +1225,7 @@ void iFlushCall(int flushtype) _flushXMMregs(); if (flushtype & FLUSH_CONSTANT_REGS) - _flushConstRegs(); + _flushConstRegs(true); if ((flushtype & FLUSH_PC) && !g_cpuFlushedPC) {