mirror of https://github.com/PCSX2/pcsx2.git
x86/microVU: Reference StateEnd instead of inlining state
This commit is contained in:
parent
2f985b479e
commit
5eacfe1afb
|
@ -390,12 +390,11 @@ void normBranch(mV, microFlagCycles& mFC)
|
||||||
{
|
{
|
||||||
DevCon.Warning("M-Bit on normal branch, report if broken");
|
DevCon.Warning("M-Bit on normal branch, report if broken");
|
||||||
u32 tempPC = iPC;
|
u32 tempPC = iPC;
|
||||||
u32* cpS = (u32*)&mVUregs;
|
|
||||||
u32* lpS = (u32*)&mVU.prog.lpState;
|
memcpy(&mVUpBlock->pStateEnd, &mVUregs, sizeof(microRegInfo));
|
||||||
for (size_t i = 0; i < (sizeof(microRegInfo) - 4) / 4; i++, lpS++, cpS++)
|
xLoadFarAddr(rax, &mVUpBlock->pStateEnd);
|
||||||
{
|
xCALL((void*)mVU.copyPLState);
|
||||||
xMOV(ptr32[lpS], cpS[0]);
|
|
||||||
}
|
|
||||||
mVUsetupBranch(mVU, mFC);
|
mVUsetupBranch(mVU, mFC);
|
||||||
mVUendProgram(mVU, &mFC, 3);
|
mVUendProgram(mVU, &mFC, 3);
|
||||||
iPC = branchAddr(mVU) / 4;
|
iPC = branchAddr(mVU) / 4;
|
||||||
|
@ -486,12 +485,11 @@ void condBranch(mV, microFlagCycles& mFC, int JMPcc)
|
||||||
if (mVUup.mBit)
|
if (mVUup.mBit)
|
||||||
{
|
{
|
||||||
u32 tempPC = iPC;
|
u32 tempPC = iPC;
|
||||||
u32* cpS = (u32*)&mVUregs;
|
|
||||||
u32* lpS = (u32*)&mVU.prog.lpState;
|
memcpy(&mVUpBlock->pStateEnd, &mVUregs, sizeof(microRegInfo));
|
||||||
for (size_t i = 0; i < (sizeof(microRegInfo) - 4) / 4; i++, lpS++, cpS++)
|
xLoadFarAddr(rax, &mVUpBlock->pStateEnd);
|
||||||
{
|
xCALL((void*)mVU.copyPLState);
|
||||||
xMOV(ptr32[lpS], cpS[0]);
|
|
||||||
}
|
|
||||||
mVUendProgram(mVU, &mFC, 3);
|
mVUendProgram(mVU, &mFC, 3);
|
||||||
xCMP(ptr16[&mVU.branch], 0);
|
xCMP(ptr16[&mVU.branch], 0);
|
||||||
xForwardJump32 dJMP((JccComparisonType)JMPcc);
|
xForwardJump32 dJMP((JccComparisonType)JMPcc);
|
||||||
|
@ -554,15 +552,16 @@ void condBranch(mV, microFlagCycles& mFC, int JMPcc)
|
||||||
{
|
{
|
||||||
s32* ajmp = xJcc32((JccComparisonType)JMPcc);
|
s32* ajmp = xJcc32((JccComparisonType)JMPcc);
|
||||||
u32 bPC = iPC; // mVUcompile can modify iPC, mVUpBlock, and mVUregs so back them up
|
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
|
incPC2(1); // Get PC for branch not-taken
|
||||||
mVUcompile(mVU, xPC, (uptr)&mVUregs);
|
mVUcompile(mVU, xPC, (uptr)&mVUregs);
|
||||||
|
|
||||||
iPC = bPC;
|
iPC = bPC;
|
||||||
incPC(-3); // Go back to branch opcode (to get branch imm addr)
|
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));
|
*ajmp = (jumpAddr - ((uptr)ajmp + 4));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -472,32 +472,13 @@ void mVUtestCycles(microVU& mVU, microFlagCycles& mFC)
|
||||||
|
|
||||||
xForwardJNS32 skip;
|
xForwardJNS32 skip;
|
||||||
|
|
||||||
u8* writeback = x86Ptr;
|
xLoadFarAddr(rax, &mVUpBlock->pState);
|
||||||
xLoadFarAddr(rax, x86Ptr);
|
xCALL((void*)mVU.copyPLState);
|
||||||
xFastCall((void*)mVU.copyPLState);
|
|
||||||
|
|
||||||
if (EmuConfig.Gamefixes.VUSyncHack || EmuConfig.Gamefixes.FullVU0SyncHack)
|
if (EmuConfig.Gamefixes.VUSyncHack || EmuConfig.Gamefixes.FullVU0SyncHack)
|
||||||
xMOV(ptr32[&mVU.regs().nextBlockCycles], mVUcycles);
|
xMOV(ptr32[&mVU.regs().nextBlockCycles], mVUcycles);
|
||||||
mVUendProgram(mVU, &mFC, 0);
|
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<const u32*>(&mVU.prog.lpState);
|
|
||||||
const u32* lpEnd = lpPtr + (sizeof(microRegInfo) / 4);
|
|
||||||
while (lpPtr != lpEnd)
|
|
||||||
xWrite32(*(lpPtr++));
|
|
||||||
}
|
|
||||||
|
|
||||||
skip.SetTarget();
|
skip.SetTarget();
|
||||||
|
|
||||||
xSUB(ptr32[&mVU.cycles], mVUcycles);
|
xSUB(ptr32[&mVU.cycles], mVUcycles);
|
||||||
|
|
Loading…
Reference in New Issue