Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request #12138 from JosJuice/jit-gp-check-discard
Jit: Don't discard before gather pipe interrupt check
  • Loading branch information
AdmiralCurtiss committed Sep 10, 2023
2 parents 1a0f0e7 + 34b0a6e commit 92d67df
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 2 deletions.
2 changes: 2 additions & 0 deletions Source/Core/Core/PowerPC/Jit64/RegCache/JitRegCache.cpp
Expand Up @@ -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.
Expand Down
10 changes: 8 additions & 2 deletions Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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);
}
}
Expand Down
18 changes: 18 additions & 0 deletions Source/Core/Core/PowerPC/PPCAnalyst.cpp
Expand Up @@ -757,6 +757,16 @@ bool PPCAnalyzer::IsBusyWaitLoop(CodeBlock* block, CodeOp* code, size_t instruct
return false;
}

static bool CanCauseGatherPipeInterruptCheck(const CodeOp& op)
{
// eieio
if (op.inst.OPCD == 31 && op.inst.SUBOP10 == 854)
return true;

return op.opinfo->type == OpType::Store || op.opinfo->type == OpType::StoreFP ||
op.opinfo->type == OpType::StorePS;
}

u32 PPCAnalyzer::Analyze(u32 address, CodeBlock* block, CodeBuffer* buffer,
std::size_t block_size) const
{
Expand Down Expand Up @@ -952,6 +962,14 @@ u32 PPCAnalyzer::Analyze(u32 address, CodeBlock* block, CodeBuffer* buffer,
{
CodeOp& op = code[i];

if (CanCauseGatherPipeInterruptCheck(op))
{
// If we're doing a gather pipe interrupt check after this instruction, we need to
// be able to flush all registers, so we can't have any discarded registers.
gprDiscardable = BitSet32{};
fprDiscardable = BitSet32{};
}

const BitSet8 opWantsCR = op.wantsCR;
const bool opWantsFPRF = op.wantsFPRF;
const bool opWantsCA = op.wantsCA;
Expand Down

0 comments on commit 92d67df

Please sign in to comment.