SPU MFC: Fix MFC_WrTagUpdate channel count

Always report available, in realhw this is just a hint if the previous tag update hasnt been checked yet by the MFC, avoiding blocking writes and allowing the SPU to execute some code while it processes the previous update request.
Except for MFC_TAG_UPDATE_IMMEDIATE, where it also waits for MFC to process it.
This commit is contained in:
Eladash 2020-07-02 17:06:00 +03:00 committed by Ivan
parent eb993781ef
commit 5d1fc546a8
3 changed files with 4 additions and 8 deletions

View File

@ -1715,10 +1715,8 @@ void spu_recompiler::RCHCNT(spu_opcode_t op)
{
const XmmLink& vr = XmmAlloc();
const XmmLink& v1 = XmmAlloc();
c->movd(vr, SPU_OFF_32(ch_tag_upd));
c->pxor(v1, v1);
c->pcmpeqd(vr, v1);
c->psrld(vr, 31);
c->mov(addr->r32(), 1);
c->movd(vr, addr->r32());
c->pslldq(vr, 12);
c->movdqa(SPU_OFF_128(gpr, op.rt), vr);
return;

View File

@ -5585,9 +5585,7 @@ public:
}
case MFC_WrTagUpdate:
{
res.value = m_ir->CreateLoad(spu_ptr<u32>(&spu_thread::ch_tag_upd), true);
res.value = m_ir->CreateICmpEQ(res.value, m_ir->getInt32(0));
res.value = m_ir->CreateZExt(res.value, get_type<u32>());
res.value = m_ir->getInt32(1);
break;
}
case MFC_Cmd:

View File

@ -2374,7 +2374,7 @@ u32 spu_thread::get_ch_count(u32 ch)
case SPU_RdInMbox: return ch_in_mbox.get_count();
case MFC_RdTagStat: return ch_tag_stat.get_count();
case MFC_RdListStallStat: return ch_stall_stat.get_count();
case MFC_WrTagUpdate: return ch_tag_upd == 0;
case MFC_WrTagUpdate: return 1;
case SPU_RdSigNotify1: return ch_snr1.get_count();
case SPU_RdSigNotify2: return ch_snr2.get_count();
case MFC_RdAtomicStat: return ch_atomic_stat.get_count();