From 5d1fc546a81c746683f4c53350d90076ab45747d Mon Sep 17 00:00:00 2001 From: Eladash Date: Thu, 2 Jul 2020 17:06:00 +0300 Subject: [PATCH] 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. --- rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp | 6 ++---- rpcs3/Emu/Cell/SPURecompiler.cpp | 4 +--- rpcs3/Emu/Cell/SPUThread.cpp | 2 +- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp b/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp index dbaf7eafbc..b17feddf1f 100644 --- a/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp +++ b/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp @@ -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; diff --git a/rpcs3/Emu/Cell/SPURecompiler.cpp b/rpcs3/Emu/Cell/SPURecompiler.cpp index 236288dd55..0d5bd8f6df 100644 --- a/rpcs3/Emu/Cell/SPURecompiler.cpp +++ b/rpcs3/Emu/Cell/SPURecompiler.cpp @@ -5585,9 +5585,7 @@ public: } case MFC_WrTagUpdate: { - res.value = m_ir->CreateLoad(spu_ptr(&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()); + res.value = m_ir->getInt32(1); break; } case MFC_Cmd: diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index b931bec5c4..781bfec486 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -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();