mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-04-21 12:05:23 +00:00
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:
parent
eb993781ef
commit
5d1fc546a8
3 changed files with 4 additions and 8 deletions
|
@ -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;
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Add table
Reference in a new issue