mirror of https://github.com/PCSX2/pcsx2.git
microVU: fixed some bugs in stall calculations.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@1113 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
parent
df31bfc51a
commit
f8f4c7f136
|
@ -82,6 +82,7 @@ microVUt(void) mVUreset() {
|
||||||
mVU->prog.cleared = 1;
|
mVU->prog.cleared = 1;
|
||||||
mVU->prog.cur = -1;
|
mVU->prog.cur = -1;
|
||||||
mVU->prog.total = -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)
|
//mVU->prog.lpState = &mVU->prog.prog[15].allocInfo.block.pState; // Blank Pipeline State (ToDo: finish implementation)
|
||||||
|
|
||||||
// Setup Dynarec Cache Limits for Each Program
|
// Setup Dynarec Cache Limits for Each Program
|
||||||
|
|
|
@ -41,7 +41,7 @@ public:
|
||||||
microBlock* thisBlock = search(&pBlock->pState);
|
microBlock* thisBlock = search(&pBlock->pState);
|
||||||
if (!thisBlock) {
|
if (!thisBlock) {
|
||||||
listSize++;
|
listSize++;
|
||||||
listSize &= MaxBlocks;
|
if (listSize > MaxBlocks) { Console::Error("microVU Warning: Block List Overflow"); listSize &= MaxBlocks; }
|
||||||
memcpy_fast(&blockList[listSize], pBlock, sizeof(microBlock));
|
memcpy_fast(&blockList[listSize], pBlock, sizeof(microBlock));
|
||||||
thisBlock = &blockList[listSize];
|
thisBlock = &blockList[listSize];
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,6 +50,7 @@
|
||||||
|
|
||||||
#define startLoop() { mVUdebug1(); mVUstall = 0; memset(&mVUregsTemp, 0, sizeof(mVUregsTemp)); }
|
#define startLoop() { mVUdebug1(); mVUstall = 0; memset(&mVUregsTemp, 0, sizeof(mVUregsTemp)); }
|
||||||
#define calcCycles(reg, x) { reg = ((reg > x) ? (reg - x) : 0); }
|
#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 incP() { mVU->p = (mVU->p+1) & 1; }
|
||||||
#define incQ() { mVU->q = (mVU->q+1) & 1; }
|
#define incQ() { mVU->q = (mVU->q+1) & 1; }
|
||||||
#define doUpperOp() { mVUopU<vuIndex, 1>(); mVUdivSet<vuIndex>(); }
|
#define doUpperOp() { mVUopU<vuIndex, 1>(); mVUdivSet<vuIndex>(); }
|
||||||
|
@ -212,18 +213,26 @@ microVUt(void) mVUsetCycles() {
|
||||||
incCycles(mVUstall);
|
incCycles(mVUstall);
|
||||||
if (mVUregsTemp.VFreg[0] == mVUregsTemp.VFreg[1] && mVUregsTemp.VFreg[0]) { // If upper Op && lower Op write to same VF reg
|
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
|
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
|
tCycles(mVUregsTemp.VF[1].x, mVUregsTemp.VF[0].x) // Use max cycles from each vector
|
||||||
mVUregsTemp.VF[1].y = aMax(mVUregsTemp.VF[0].y, mVUregsTemp.VF[1].y);
|
tCycles(mVUregsTemp.VF[1].y, mVUregsTemp.VF[0].y)
|
||||||
mVUregsTemp.VF[1].z = aMax(mVUregsTemp.VF[0].z, mVUregsTemp.VF[1].z);
|
tCycles(mVUregsTemp.VF[1].z, mVUregsTemp.VF[0].z)
|
||||||
mVUregsTemp.VF[1].w = aMax(mVUregsTemp.VF[0].w, mVUregsTemp.VF[1].w);
|
tCycles(mVUregsTemp.VF[1].w, mVUregsTemp.VF[0].w)
|
||||||
}
|
}
|
||||||
mVUregs.VF[mVUregsTemp.VFreg[0]].reg = mVUregsTemp.VF[0].reg;
|
tCycles(mVUregs.VF[mVUregsTemp.VFreg[0]].x, mVUregsTemp.VF[0].x);
|
||||||
mVUregs.VF[mVUregsTemp.VFreg[1]].reg = mVUregsTemp.VF[1].reg;
|
tCycles(mVUregs.VF[mVUregsTemp.VFreg[0]].y, mVUregsTemp.VF[0].y);
|
||||||
mVUregs.VI[mVUregsTemp.VIreg] = mVUregsTemp.VI;
|
tCycles(mVUregs.VF[mVUregsTemp.VFreg[0]].z, mVUregsTemp.VF[0].z);
|
||||||
mVUregs.q = mVUregsTemp.q;
|
tCycles(mVUregs.VF[mVUregsTemp.VFreg[0]].w, mVUregsTemp.VF[0].w);
|
||||||
mVUregs.p = mVUregsTemp.p;
|
|
||||||
mVUregs.r = mVUregsTemp.r;
|
tCycles(mVUregs.VF[mVUregsTemp.VFreg[1]].x, mVUregsTemp.VF[1].x);
|
||||||
mVUregs.xgkick = mVUregsTemp.xgkick;
|
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() {
|
microVUt(void) mVUdivSet() {
|
||||||
|
|
Loading…
Reference in New Issue