summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosJuice <josjuice@gmail.com>2023-08-25 16:06:39 +0200
committerJosJuice <josjuice@gmail.com>2023-09-10 12:54:52 +0200
commit34b0a6ea90b2a829ced39639d60fbdfbb7af4632 (patch)
treef57806c94cc650e1829d0f851aa2aa97955fb430
parent5902b5b11351625d347a694f5aadde5d7ade4aed (diff)
Jit: Check for discarded registers when flushing
This adds a check for the bug addressed by the previous commit.
-rw-r--r--Source/Core/Core/PowerPC/Jit64/RegCache/JitRegCache.cpp2
-rw-r--r--Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp10
2 files changed, 10 insertions, 2 deletions
diff --git a/Source/Core/Core/PowerPC/Jit64/RegCache/JitRegCache.cpp b/Source/Core/Core/PowerPC/Jit64/RegCache/JitRegCache.cpp
index 28276f5fa3..9c6c395a57 100644
--- a/Source/Core/Core/PowerPC/Jit64/RegCache/JitRegCache.cpp
+++ b/Source/Core/Core/PowerPC/Jit64/RegCache/JitRegCache.cpp
@@ -421,7 +421,9 @@ void RegCache::Flush(BitSet32 pregs)
switch (m_regs[i].GetLocationType())
{
case PPCCachedReg::LocationType::Default:
+ break;
case PPCCachedReg::LocationType::Discarded:
+ ASSERT_MSG(DYNA_REC, false, "Attempted to flush discarded PPC reg {}", i);
break;
case PPCCachedReg::LocationType::SpeculativeImmediate:
// We can have a cached value without a host register through speculative constants.
diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp
index 83bbfe1b3a..a1400a5c9a 100644
--- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp
+++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp
@@ -245,11 +245,14 @@ void Arm64GPRCache::FlushRegisters(BitSet32 regs, bool maintain_state, ARM64Reg
{
if (regs[i])
{
+ ASSERT_MSG(DYNA_REC, m_guest_registers[GUEST_GPR_OFFSET + i].GetType() != RegType::Discarded,
+ "Attempted to flush discarded register");
+
if (i + 1 < GUEST_GPR_COUNT && regs[i + 1])
{
// We've got two guest registers in a row to store
- OpArg& reg1 = m_guest_registers[i];
- OpArg& reg2 = m_guest_registers[i + 1];
+ OpArg& reg1 = m_guest_registers[GUEST_GPR_OFFSET + i];
+ OpArg& reg2 = m_guest_registers[GUEST_GPR_OFFSET + i + 1];
if (reg1.IsDirty() && reg2.IsDirty() && reg1.GetType() == RegType::Register &&
reg2.GetType() == RegType::Register)
{
@@ -283,6 +286,9 @@ void Arm64GPRCache::FlushCRRegisters(BitSet32 regs, bool maintain_state, ARM64Re
{
if (regs[i])
{
+ ASSERT_MSG(DYNA_REC, m_guest_registers[GUEST_CR_OFFSET + i].GetType() != RegType::Discarded,
+ "Attempted to flush discarded register");
+
FlushRegister(GUEST_CR_OFFSET + i, maintain_state, tmp_reg);
}
}