Jit: Check for discarded registers when flushing

This adds a check for the bug addressed by the previous commit.
This commit is contained in:
JosJuice 2023-08-25 16:06:39 +02:00
parent 5902b5b113
commit 34b0a6ea90
2 changed files with 10 additions and 2 deletions

View File

@ -421,7 +421,9 @@ void RegCache::Flush(BitSet32 pregs)
switch (m_regs[i].GetLocationType()) switch (m_regs[i].GetLocationType())
{ {
case PPCCachedReg::LocationType::Default: case PPCCachedReg::LocationType::Default:
break;
case PPCCachedReg::LocationType::Discarded: case PPCCachedReg::LocationType::Discarded:
ASSERT_MSG(DYNA_REC, false, "Attempted to flush discarded PPC reg {}", i);
break; break;
case PPCCachedReg::LocationType::SpeculativeImmediate: case PPCCachedReg::LocationType::SpeculativeImmediate:
// We can have a cached value without a host register through speculative constants. // We can have a cached value without a host register through speculative constants.

View File

@ -245,11 +245,14 @@ void Arm64GPRCache::FlushRegisters(BitSet32 regs, bool maintain_state, ARM64Reg
{ {
if (regs[i]) 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]) if (i + 1 < GUEST_GPR_COUNT && regs[i + 1])
{ {
// We've got two guest registers in a row to store // We've got two guest registers in a row to store
OpArg& reg1 = m_guest_registers[i]; OpArg& reg1 = m_guest_registers[GUEST_GPR_OFFSET + i];
OpArg& reg2 = m_guest_registers[i + 1]; OpArg& reg2 = m_guest_registers[GUEST_GPR_OFFSET + i + 1];
if (reg1.IsDirty() && reg2.IsDirty() && reg1.GetType() == RegType::Register && if (reg1.IsDirty() && reg2.IsDirty() && reg1.GetType() == RegType::Register &&
reg2.GetType() == RegType::Register) reg2.GetType() == RegType::Register)
{ {
@ -283,6 +286,9 @@ void Arm64GPRCache::FlushCRRegisters(BitSet32 regs, bool maintain_state, ARM64Re
{ {
if (regs[i]) 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); FlushRegister(GUEST_CR_OFFSET + i, maintain_state, tmp_reg);
} }
} }