mirror of https://github.com/PCSX2/pcsx2.git
microVU: extra + preserve sign clamp mode now semi-implemented (before it would just do the same as 'normal' in mVU)
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@1615 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
parent
62cc3cfbf3
commit
864e49e69f
|
@ -39,8 +39,10 @@ void mVUclamp1(int reg, int regT1, int xyzw) {
|
|||
}
|
||||
|
||||
// Used for Operand Clamping
|
||||
void mVUclamp2(int reg, int regT1, int xyzw) {
|
||||
if (CHECK_VU_SIGN_OVERFLOW && (regT1 >= 0)) {
|
||||
void mVUclamp2(microVU* mVU, int reg, int regT1, int xyzw) {
|
||||
if (CHECK_VU_SIGN_OVERFLOW) {
|
||||
int regT1b = 0;
|
||||
if (regT1 < 0) { regT1 = mVU->regAlloc->allocReg(); regT1b = 1; }
|
||||
switch (xyzw) {
|
||||
case 1: case 2: case 4: case 8:
|
||||
SSE_MOVSS_XMM_to_XMM (regT1, reg);
|
||||
|
@ -57,6 +59,7 @@ void mVUclamp2(int reg, int regT1, int xyzw) {
|
|||
SSE_ORPS_XMM_to_XMM (reg, regT1);
|
||||
break;
|
||||
}
|
||||
if (regT1b) mVU->regAlloc->clearNeeded(regT1);
|
||||
}
|
||||
else mVUclamp1(reg, regT1, xyzw);
|
||||
}
|
||||
|
@ -355,7 +358,7 @@ void MIN_MAX_PS(microVU* mVU, int to, int from, int t1, int t2, bool min) {
|
|||
if (t2b) mVU->regAlloc->clearNeeded(t2);
|
||||
}
|
||||
|
||||
// Warning: Modifies from's upper 3 vectors, and t1
|
||||
// Warning: Modifies to's upper 3 vectors, and t1
|
||||
void MIN_MAX_SS(mV, int to, int from, int t1, bool min) {
|
||||
bool t1b = 0;
|
||||
if (t1 < 0) { t1 = mVU->regAlloc->allocReg(); t1b = 1; }
|
||||
|
|
|
@ -152,9 +152,9 @@ void mVU_FMACa(microVU* mVU, int recPass, int opCase, int opType, bool isACC, co
|
|||
}
|
||||
else { Fs = mVU->regAlloc->allocReg(_Fs_, _Fd_, _X_Y_Z_W); }
|
||||
|
||||
opCase1 { if((opType == 2) && _XYZW_PS) { mVUclamp1(Ft, -1, _X_Y_Z_W); } } // Clamp Needed for Ice Age 3 (VU0)
|
||||
opCase1 { if((opType == 2) && _XYZW_PS) { mVUclamp1(Fs, -1, _X_Y_Z_W); } } // Clamp Needed for Ice Age 3 (VU0)
|
||||
opCase2 { if (opType == 2) { mVUclamp1(Fs, -1, _X_Y_Z_W); } } // Clamp Needed for alot of games (TOTA, DoM, etc...)
|
||||
opCase1 { if((opType == 2) && _XYZW_PS) { mVUclamp2(mVU, Ft, -1, _X_Y_Z_W); } } // Clamp Needed for Ice Age 3 (VU0)
|
||||
opCase1 { if((opType == 2) && _XYZW_PS) { mVUclamp2(mVU, Fs, -1, _X_Y_Z_W); } } // Clamp Needed for Ice Age 3 (VU0)
|
||||
opCase2 { if (opType == 2) { mVUclamp2(mVU, Fs, -1, _X_Y_Z_W); } } // Clamp Needed for alot of games (TOTA, DoM, etc...)
|
||||
|
||||
if (_XYZW_SS) SSE_SS[opType](mVU, Fs, Ft, -1, -1);
|
||||
else SSE_PS[opType](mVU, Fs, Ft, -1, -1);
|
||||
|
@ -185,7 +185,7 @@ void mVU_FMACb(microVU* mVU, int recPass, int opCase, int opType, const char* op
|
|||
ACC = mVU->regAlloc->allocReg(32, 32, 0xf, 0);
|
||||
|
||||
if (_XYZW_SS2) { SSE2_PSHUFD_XMM_to_XMM(ACC, ACC, shuffleSS(_X_Y_Z_W)); }
|
||||
opCase2 { mVUclamp1(Fs, -1, _X_Y_Z_W); } // Clamp Needed for alot of games (TOTA, DoM, etc...)
|
||||
opCase2 { mVUclamp2(mVU, Fs, -1, _X_Y_Z_W); } // Clamp Needed for alot of games (TOTA, DoM, etc...)
|
||||
|
||||
if (_XYZW_SS) SSE_SS[2](mVU, Fs, Ft, -1, -1);
|
||||
else SSE_PS[2](mVU, Fs, Ft, -1, -1);
|
||||
|
@ -223,7 +223,7 @@ void mVU_FMACc(microVU* mVU, int recPass, int opCase, const char* opName) {
|
|||
Fs = mVU->regAlloc->allocReg(_Fs_, _Fd_, _X_Y_Z_W);
|
||||
|
||||
if (_XYZW_SS2) { SSE2_PSHUFD_XMM_to_XMM(ACC, ACC, shuffleSS(_X_Y_Z_W)); }
|
||||
opCase2 { mVUclamp1(Fs, -1, _X_Y_Z_W); } // Clamp Needed for alot of games (TOTA, DoM, etc...)
|
||||
opCase2 { mVUclamp2(mVU, Fs, -1, _X_Y_Z_W); } // Clamp Needed for alot of games (TOTA, DoM, etc...)
|
||||
|
||||
if (_XYZW_SS) { SSE_SS[2](mVU, Fs, Ft, -1, -1); SSE_SS[0](mVU, Fs, ACC, tempFt, -1); }
|
||||
else { SSE_PS[2](mVU, Fs, Ft, -1, -1); SSE_PS[0](mVU, Fs, ACC, tempFt, -1); }
|
||||
|
@ -248,7 +248,7 @@ void mVU_FMACd(microVU* mVU, int recPass, int opCase, const char* opName) {
|
|||
|
||||
Fs = mVU->regAlloc->allocReg(_Fs_, 0, _X_Y_Z_W);
|
||||
Fd = mVU->regAlloc->allocReg(32, _Fd_, _X_Y_Z_W);
|
||||
|
||||
|
||||
if (_XYZW_SS) { SSE_SS[2](mVU, Fs, Ft, -1, -1); SSE_SS[1](mVU, Fd, Fs, tempFt, -1); }
|
||||
else { SSE_PS[2](mVU, Fs, Ft, -1, -1); SSE_PS[1](mVU, Fd, Fs, tempFt, -1); }
|
||||
|
||||
|
|
Loading…
Reference in New Issue