From f8f4c7f136ccf26db87f4d89172faa29cb33d5f4 Mon Sep 17 00:00:00 2001 From: cottonvibes Date: Sat, 2 May 2009 06:13:43 +0000 Subject: [PATCH] microVU: fixed some bugs in stall calculations. git-svn-id: http://pcsx2.googlecode.com/svn/trunk@1113 96395faa-99c1-11dd-bbfe-3dabce05a288 --- pcsx2/x86/microVU.cpp | 1 + pcsx2/x86/microVU.h | 2 +- pcsx2/x86/microVU_Compile.inl | 31 ++++++++++++++++++++----------- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/pcsx2/x86/microVU.cpp b/pcsx2/x86/microVU.cpp index 670767ee78..72e8aa9cf1 100644 --- a/pcsx2/x86/microVU.cpp +++ b/pcsx2/x86/microVU.cpp @@ -82,6 +82,7 @@ microVUt(void) mVUreset() { mVU->prog.cleared = 1; mVU->prog.cur = -1; mVU->prog.total = -1; + memset(&mVU->prog.lpState, 0, sizeof(mVU->prog.lpState)); //mVU->prog.lpState = &mVU->prog.prog[15].allocInfo.block.pState; // Blank Pipeline State (ToDo: finish implementation) // Setup Dynarec Cache Limits for Each Program diff --git a/pcsx2/x86/microVU.h b/pcsx2/x86/microVU.h index e2152ed167..9dcbc0d1f5 100644 --- a/pcsx2/x86/microVU.h +++ b/pcsx2/x86/microVU.h @@ -41,7 +41,7 @@ public: microBlock* thisBlock = search(&pBlock->pState); if (!thisBlock) { listSize++; - listSize &= MaxBlocks; + if (listSize > MaxBlocks) { Console::Error("microVU Warning: Block List Overflow"); listSize &= MaxBlocks; } memcpy_fast(&blockList[listSize], pBlock, sizeof(microBlock)); thisBlock = &blockList[listSize]; } diff --git a/pcsx2/x86/microVU_Compile.inl b/pcsx2/x86/microVU_Compile.inl index 96187b529d..b0cddab4ca 100644 --- a/pcsx2/x86/microVU_Compile.inl +++ b/pcsx2/x86/microVU_Compile.inl @@ -50,6 +50,7 @@ #define startLoop() { mVUdebug1(); mVUstall = 0; memset(&mVUregsTemp, 0, sizeof(mVUregsTemp)); } #define calcCycles(reg, x) { reg = ((reg > x) ? (reg - x) : 0); } +#define tCycles(dest, src) { dest = aMax(dest, src); } #define incP() { mVU->p = (mVU->p+1) & 1; } #define incQ() { mVU->q = (mVU->q+1) & 1; } #define doUpperOp() { mVUopU(); mVUdivSet(); } @@ -212,18 +213,26 @@ microVUt(void) mVUsetCycles() { incCycles(mVUstall); if (mVUregsTemp.VFreg[0] == mVUregsTemp.VFreg[1] && mVUregsTemp.VFreg[0]) { // If upper Op && lower Op write to same VF reg mVUinfo |= (mVUregsTemp.r || mVUregsTemp.VI) ? _noWriteVF : _isNOP; // If lower Op doesn't modify anything else, then make it a NOP - mVUregsTemp.VF[1].x = aMax(mVUregsTemp.VF[0].x, mVUregsTemp.VF[1].x); // Use max cycles from each vector - mVUregsTemp.VF[1].y = aMax(mVUregsTemp.VF[0].y, mVUregsTemp.VF[1].y); - mVUregsTemp.VF[1].z = aMax(mVUregsTemp.VF[0].z, mVUregsTemp.VF[1].z); - mVUregsTemp.VF[1].w = aMax(mVUregsTemp.VF[0].w, mVUregsTemp.VF[1].w); + tCycles(mVUregsTemp.VF[1].x, mVUregsTemp.VF[0].x) // Use max cycles from each vector + tCycles(mVUregsTemp.VF[1].y, mVUregsTemp.VF[0].y) + tCycles(mVUregsTemp.VF[1].z, mVUregsTemp.VF[0].z) + tCycles(mVUregsTemp.VF[1].w, mVUregsTemp.VF[0].w) } - mVUregs.VF[mVUregsTemp.VFreg[0]].reg = mVUregsTemp.VF[0].reg; - mVUregs.VF[mVUregsTemp.VFreg[1]].reg = mVUregsTemp.VF[1].reg; - mVUregs.VI[mVUregsTemp.VIreg] = mVUregsTemp.VI; - mVUregs.q = mVUregsTemp.q; - mVUregs.p = mVUregsTemp.p; - mVUregs.r = mVUregsTemp.r; - mVUregs.xgkick = mVUregsTemp.xgkick; + tCycles(mVUregs.VF[mVUregsTemp.VFreg[0]].x, mVUregsTemp.VF[0].x); + tCycles(mVUregs.VF[mVUregsTemp.VFreg[0]].y, mVUregsTemp.VF[0].y); + tCycles(mVUregs.VF[mVUregsTemp.VFreg[0]].z, mVUregsTemp.VF[0].z); + tCycles(mVUregs.VF[mVUregsTemp.VFreg[0]].w, mVUregsTemp.VF[0].w); + + tCycles(mVUregs.VF[mVUregsTemp.VFreg[1]].x, mVUregsTemp.VF[1].x); + tCycles(mVUregs.VF[mVUregsTemp.VFreg[1]].y, mVUregsTemp.VF[1].y); + tCycles(mVUregs.VF[mVUregsTemp.VFreg[1]].z, mVUregsTemp.VF[1].z); + tCycles(mVUregs.VF[mVUregsTemp.VFreg[1]].w, mVUregsTemp.VF[1].w); + + tCycles(mVUregs.VI[mVUregsTemp.VIreg], mVUregsTemp.VI); + tCycles(mVUregs.q, mVUregsTemp.q); + tCycles(mVUregs.p, mVUregsTemp.p); + tCycles(mVUregs.r, mVUregsTemp.r); + tCycles(mVUregs.xgkick, mVUregsTemp.xgkick); } microVUt(void) mVUdivSet() {