diff --git a/pcsx2/x86/microVU_Branch.inl b/pcsx2/x86/microVU_Branch.inl index bec40e3731..c580f6e122 100644 --- a/pcsx2/x86/microVU_Branch.inl +++ b/pcsx2/x86/microVU_Branch.inl @@ -390,12 +390,11 @@ void normBranch(mV, microFlagCycles& mFC) { DevCon.Warning("M-Bit on normal branch, report if broken"); u32 tempPC = iPC; - u32* cpS = (u32*)&mVUregs; - u32* lpS = (u32*)&mVU.prog.lpState; - for (size_t i = 0; i < (sizeof(microRegInfo) - 4) / 4; i++, lpS++, cpS++) - { - xMOV(ptr32[lpS], cpS[0]); - } + + memcpy(&mVUpBlock->pStateEnd, &mVUregs, sizeof(microRegInfo)); + xLoadFarAddr(rax, &mVUpBlock->pStateEnd); + xCALL((void*)mVU.copyPLState); + mVUsetupBranch(mVU, mFC); mVUendProgram(mVU, &mFC, 3); iPC = branchAddr(mVU) / 4; @@ -486,12 +485,11 @@ void condBranch(mV, microFlagCycles& mFC, int JMPcc) if (mVUup.mBit) { u32 tempPC = iPC; - u32* cpS = (u32*)&mVUregs; - u32* lpS = (u32*)&mVU.prog.lpState; - for (size_t i = 0; i < (sizeof(microRegInfo) - 4) / 4; i++, lpS++, cpS++) - { - xMOV(ptr32[lpS], cpS[0]); - } + + memcpy(&mVUpBlock->pStateEnd, &mVUregs, sizeof(microRegInfo)); + xLoadFarAddr(rax, &mVUpBlock->pStateEnd); + xCALL((void*)mVU.copyPLState); + mVUendProgram(mVU, &mFC, 3); xCMP(ptr16[&mVU.branch], 0); xForwardJump32 dJMP((JccComparisonType)JMPcc); @@ -554,15 +552,16 @@ void condBranch(mV, microFlagCycles& mFC, int JMPcc) { s32* ajmp = xJcc32((JccComparisonType)JMPcc); u32 bPC = iPC; // mVUcompile can modify iPC, mVUpBlock, and mVUregs so back them up - microBlock* pBlock = mVUpBlock; - memcpy(&pBlock->pStateEnd, &mVUregs, sizeof(microRegInfo)); + + microRegInfo regBackup; + memcpy(®Backup, &mVUregs, sizeof(microRegInfo)); incPC2(1); // Get PC for branch not-taken mVUcompile(mVU, xPC, (uptr)&mVUregs); iPC = bPC; incPC(-3); // Go back to branch opcode (to get branch imm addr) - uptr jumpAddr = (uptr)mVUblockFetch(mVU, branchAddr(mVU), (uptr)&pBlock->pStateEnd); + uptr jumpAddr = (uptr)mVUblockFetch(mVU, branchAddr(mVU), (uptr)®Backup); *ajmp = (jumpAddr - ((uptr)ajmp + 4)); } } diff --git a/pcsx2/x86/microVU_Compile.inl b/pcsx2/x86/microVU_Compile.inl index 3249fc47e7..21c29b7932 100644 --- a/pcsx2/x86/microVU_Compile.inl +++ b/pcsx2/x86/microVU_Compile.inl @@ -472,32 +472,13 @@ void mVUtestCycles(microVU& mVU, microFlagCycles& mFC) xForwardJNS32 skip; - u8* writeback = x86Ptr; - xLoadFarAddr(rax, x86Ptr); - xFastCall((void*)mVU.copyPLState); + xLoadFarAddr(rax, &mVUpBlock->pState); + xCALL((void*)mVU.copyPLState); if (EmuConfig.Gamefixes.VUSyncHack || EmuConfig.Gamefixes.FullVU0SyncHack) xMOV(ptr32[&mVU.regs().nextBlockCycles], mVUcycles); mVUendProgram(mVU, &mFC, 0); - { - if(x86caps.hasAVX2) - xAlignPtr(32); - else - xAlignPtr(16); - - u8* curx86Ptr = x86Ptr; - x86SetPtr(writeback); - xLoadFarAddr(rax, curx86Ptr); - x86SetPtr(curx86Ptr); - - static_assert((sizeof(microRegInfo) % 4) == 0); - const u32* lpPtr = reinterpret_cast(&mVU.prog.lpState); - const u32* lpEnd = lpPtr + (sizeof(microRegInfo) / 4); - while (lpPtr != lpEnd) - xWrite32(*(lpPtr++)); - } - skip.SetTarget(); xSUB(ptr32[&mVU.cycles], mVUcycles);