mirror of https://github.com/PCSX2/pcsx2.git
some clamping optimizations that also 'prevent' some XMM reg corruptions. current VU recs seem to not allocate VF0 for the opcodes, expecting 'special case' implementations i suppose. this fixes FFXII to work with DaZ according to Nneeve.
also changed min/max opcodes to always 'preserve sign' when clamping. this lets you 'see' the menu's in GT4 w/o having to use Extra clamping, however you still need Extra Clamping if you don't want SPS in-game. git-svn-id: http://pcsx2-playground.googlecode.com/svn/trunk@657 a6443dda-0b58-4228-96e9-037be469359c
This commit is contained in:
parent
b5f952fc5e
commit
240defef4e
|
@ -332,7 +332,7 @@ static u32 ecx_temp_loc;
|
|||
void VU_ADD_SUB(u32 regd, u32 regt, int is_sub, int info)
|
||||
{
|
||||
u8 *localptr[4][8];
|
||||
int temp1 = _allocX86reg(ECX, X86TYPE_TEMP, 0, 0); //receives regd//_allocX86reg(ECX, X86TYPE_TEMP, 0, ((info&PROCESS_VU_SUPER)?0:MODE_NOFRAME)|mode);
|
||||
int temp1 = _allocX86reg(ECX, X86TYPE_TEMP, 0, 0); //receives regd
|
||||
int temp2 = ALLOCTEMPX86(0);
|
||||
|
||||
SSE_MOVAPS_XMM_to_M128((uptr)&VU_addsub_reg[0][0], regd);
|
||||
|
@ -416,7 +416,7 @@ void VU_ADD_SUB(u32 regd, u32 regt, int is_sub, int info)
|
|||
void VU_ADD_SUB_SSE4(u32 regd, u32 regt, int is_sub, int info)
|
||||
{
|
||||
u8 *localptr[4][8];
|
||||
int temp1 = _allocX86reg(ECX, X86TYPE_TEMP, 0, 0); //receives regd//_allocX86reg(ECX, X86TYPE_TEMP, 0, ((info&PROCESS_VU_SUPER)?0:MODE_NOFRAME)|mode);
|
||||
int temp1 = _allocX86reg(ECX, X86TYPE_TEMP, 0, 0); //receives regd
|
||||
int temp2 = ALLOCTEMPX86(0);
|
||||
|
||||
SSE_MOVAPS_XMM_to_M128((uptr)&VU_addsub_reg[0][0], regd);
|
||||
|
@ -827,8 +827,8 @@ void recVUMI_ADD(VURegs *VU, int info)
|
|||
}
|
||||
else {
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) {
|
||||
vuFloat5_useEAX( EEREC_S, EEREC_TEMP, _X_Y_Z_W);
|
||||
vuFloat5_useEAX( EEREC_T, EEREC_TEMP, _X_Y_Z_W);
|
||||
if (_Fs_) vuFloat5_useEAX( EEREC_S, EEREC_TEMP, _X_Y_Z_W );
|
||||
if (_Ft_) vuFloat5_useEAX( EEREC_T, EEREC_TEMP, _X_Y_Z_W );
|
||||
}
|
||||
if( _X_Y_Z_W == 8 ) { // If only adding x, then we can do a Scalar Add
|
||||
if (EEREC_D == EEREC_S) SSE_ADDSS_XMM_to_XMM(EEREC_D, EEREC_T);
|
||||
|
@ -863,7 +863,7 @@ void recVUMI_ADD_iq(VURegs *VU, uptr addr, int info)
|
|||
if ( !_Fd_ ) info = (info & ~PROCESS_EE_SET_D(0xf)) | PROCESS_EE_SET_D(EEREC_TEMP);
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) {
|
||||
vuFloat3(addr);
|
||||
if (_Fs_) vuFloat5_useEAX( EEREC_S, EEREC_TEMP, _X_Y_Z_W);
|
||||
if (_Fs_) vuFloat5_useEAX( EEREC_S, EEREC_TEMP, _X_Y_Z_W );
|
||||
}
|
||||
|
||||
if ( _XYZW_SS ) {
|
||||
|
@ -922,7 +922,7 @@ void recVUMI_ADD_xyzw(VURegs *VU, int xyzw, int info)
|
|||
if ( _X_Y_Z_W == 0 ) goto flagUpdate;
|
||||
if ( !_Fd_ ) info = (info & ~PROCESS_EE_SET_D(0xf)) | PROCESS_EE_SET_D(EEREC_TEMP);
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) {
|
||||
if (_Fs_) vuFloat5_useEAX( EEREC_S, EEREC_TEMP, _X_Y_Z_W);
|
||||
if (_Fs_) vuFloat5_useEAX( EEREC_S, EEREC_TEMP, _X_Y_Z_W );
|
||||
if (_Ft_) vuFloat5_useEAX( EEREC_T, EEREC_TEMP, ( 1 << (3 - xyzw) ) );
|
||||
}
|
||||
|
||||
|
@ -985,8 +985,8 @@ void recVUMI_ADDA(VURegs *VU, int info)
|
|||
//SysPrintf("recVUMI_ADDA()\n");
|
||||
if ( _X_Y_Z_W == 0 ) goto flagUpdate;
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) {
|
||||
if (_Fs_) vuFloat5_useEAX( EEREC_S, EEREC_TEMP, _X_Y_Z_W);
|
||||
if (_Ft_) vuFloat5_useEAX( EEREC_T, EEREC_TEMP, _X_Y_Z_W);
|
||||
if (_Fs_) vuFloat5_useEAX( EEREC_S, EEREC_TEMP, _X_Y_Z_W );
|
||||
if (_Ft_) vuFloat5_useEAX( EEREC_T, EEREC_TEMP, _X_Y_Z_W );
|
||||
}
|
||||
|
||||
if( _X_Y_Z_W == 8 ) {
|
||||
|
@ -1021,7 +1021,7 @@ void recVUMI_ADDA_iq(VURegs *VU, uptr addr, int info)
|
|||
if ( _X_Y_Z_W == 0 ) goto flagUpdate;
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) {
|
||||
vuFloat3(addr);
|
||||
if (_Fs_) vuFloat5_useEAX( EEREC_S, EEREC_TEMP, _X_Y_Z_W);
|
||||
if (_Fs_) vuFloat5_useEAX( EEREC_S, EEREC_TEMP, _X_Y_Z_W );
|
||||
}
|
||||
|
||||
if( _XYZW_SS ) {
|
||||
|
@ -1072,7 +1072,7 @@ void recVUMI_ADDA_xyzw(VURegs *VU, int xyzw, int info)
|
|||
//SysPrintf("recVUMI_ADDA_xyzw()\n");
|
||||
if ( _X_Y_Z_W == 0 ) goto flagUpdate;
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) {
|
||||
if (_Fs_) vuFloat5_useEAX( EEREC_S, EEREC_TEMP, _X_Y_Z_W);
|
||||
if (_Fs_) vuFloat5_useEAX( EEREC_S, EEREC_TEMP, _X_Y_Z_W );
|
||||
if (_Ft_) vuFloat5_useEAX( EEREC_T, EEREC_TEMP, ( 1 << (3 - xyzw) ) );
|
||||
}
|
||||
|
||||
|
@ -1137,8 +1137,8 @@ void recVUMI_SUB(VURegs *VU, int info)
|
|||
}
|
||||
else if( _X_Y_Z_W == 8 ) {
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) {
|
||||
if (_Fs_) vuFloat5_useEAX( EEREC_S, EEREC_TEMP, _X_Y_Z_W);
|
||||
if (_Ft_) vuFloat5_useEAX( EEREC_T, EEREC_TEMP, _X_Y_Z_W);
|
||||
if (_Fs_) vuFloat5_useEAX( EEREC_S, EEREC_TEMP, _X_Y_Z_W );
|
||||
if (_Ft_) vuFloat5_useEAX( EEREC_T, EEREC_TEMP, _X_Y_Z_W );
|
||||
}
|
||||
if (EEREC_D == EEREC_S) {
|
||||
if (_Ft_) SSE_SUBSS_XMM_to_XMM(EEREC_D, EEREC_T);
|
||||
|
@ -1158,8 +1158,8 @@ void recVUMI_SUB(VURegs *VU, int info)
|
|||
}
|
||||
else {
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) {
|
||||
if (_Fs_) vuFloat5_useEAX( EEREC_S, EEREC_TEMP, _X_Y_Z_W);
|
||||
if (_Ft_) vuFloat5_useEAX( EEREC_T, EEREC_TEMP, _X_Y_Z_W);
|
||||
if (_Fs_) vuFloat5_useEAX( EEREC_S, EEREC_TEMP, _X_Y_Z_W );
|
||||
if (_Ft_) vuFloat5_useEAX( EEREC_T, EEREC_TEMP, _X_Y_Z_W );
|
||||
}
|
||||
if (_X_Y_Z_W != 0xf) {
|
||||
SSE_MOVAPS_XMM_to_XMM(EEREC_TEMP, EEREC_S);
|
||||
|
@ -1190,7 +1190,7 @@ void recVUMI_SUB_iq(VURegs *VU, uptr addr, int info)
|
|||
if ( _X_Y_Z_W == 0 ) goto flagUpdate;
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) {
|
||||
vuFloat3(addr);
|
||||
if (_Fs_) vuFloat5_useEAX( EEREC_S, EEREC_TEMP, _X_Y_Z_W);
|
||||
if (_Fs_) vuFloat5_useEAX( EEREC_S, EEREC_TEMP, _X_Y_Z_W );
|
||||
}
|
||||
if ( !_Fd_ ) info = (info & ~PROCESS_EE_SET_D(0xf)) | PROCESS_EE_SET_D(EEREC_TEMP);
|
||||
|
||||
|
@ -1263,7 +1263,7 @@ void recVUMI_SUB_xyzw(VURegs *VU, int xyzw, int info)
|
|||
if ( _X_Y_Z_W == 0 ) goto flagUpdate;
|
||||
if ( !_Fd_ ) info = (info & ~PROCESS_EE_SET_D(0xf)) | PROCESS_EE_SET_D(EEREC_TEMP);
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) {
|
||||
if (_Fs_) vuFloat5_useEAX( EEREC_S, EEREC_TEMP, _X_Y_Z_W);
|
||||
if (_Fs_) vuFloat5_useEAX( EEREC_S, EEREC_TEMP, _X_Y_Z_W );
|
||||
if (_Ft_) vuFloat5_useEAX( EEREC_T, EEREC_TEMP, ( 1 << (3 - xyzw) ) );
|
||||
}
|
||||
|
||||
|
@ -1340,8 +1340,8 @@ void recVUMI_SUBA(VURegs *VU, int info)
|
|||
//SysPrintf("recVUMI_SUBA()\n");
|
||||
if ( _X_Y_Z_W == 0 ) goto flagUpdate;
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) {
|
||||
if (_Fs_) vuFloat5_useEAX( EEREC_S, EEREC_TEMP, _X_Y_Z_W);
|
||||
if (_Ft_) vuFloat5_useEAX( EEREC_T, EEREC_TEMP, _X_Y_Z_W);
|
||||
if (_Fs_) vuFloat5_useEAX( EEREC_S, EEREC_TEMP, _X_Y_Z_W );
|
||||
if (_Ft_) vuFloat5_useEAX( EEREC_T, EEREC_TEMP, _X_Y_Z_W );
|
||||
}
|
||||
|
||||
if( EEREC_S == EEREC_T ) {
|
||||
|
@ -1387,7 +1387,7 @@ void recVUMI_SUBA_iq(VURegs *VU, uptr addr, int info)
|
|||
//SysPrintf ("recVUMI_SUBA_iq \n");
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) {
|
||||
vuFloat3(addr);
|
||||
if (_Fs_) vuFloat5_useEAX( EEREC_S, EEREC_TEMP, _X_Y_Z_W);
|
||||
if (_Fs_) vuFloat5_useEAX( EEREC_S, EEREC_TEMP, _X_Y_Z_W );
|
||||
}
|
||||
|
||||
if( _XYZW_SS ) {
|
||||
|
@ -1443,7 +1443,7 @@ void recVUMI_SUBA_xyzw(VURegs *VU, int xyzw, int info)
|
|||
{
|
||||
//SysPrintf ("recVUMI_SUBA_xyzw \n");
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) {
|
||||
if (_Fs_) vuFloat5_useEAX( EEREC_S, EEREC_TEMP, _X_Y_Z_W);
|
||||
if (_Fs_) vuFloat5_useEAX( EEREC_S, EEREC_TEMP, _X_Y_Z_W );
|
||||
if (_Ft_) vuFloat5_useEAX( EEREC_T, EEREC_TEMP, ( 1 << (3 - xyzw) ) );
|
||||
}
|
||||
|
||||
|
@ -1503,8 +1503,8 @@ void recVUMI_MUL_toD(VURegs *VU, int regd, int info)
|
|||
//SysPrintf ("recVUMI_MUL_toD \n");
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) {
|
||||
//using vuFloat instead of vuFloat2 incase regd == EEREC_TEMP
|
||||
if (_Fs_) vuFloat_useEAX( info, EEREC_S, _X_Y_Z_W);
|
||||
if (_Ft_) vuFloat_useEAX( info, EEREC_T, _X_Y_Z_W);
|
||||
if (_Fs_) vuFloat_useEAX( info, EEREC_S, _X_Y_Z_W );
|
||||
if (_Ft_) vuFloat_useEAX( info, EEREC_T, _X_Y_Z_W );
|
||||
}
|
||||
|
||||
if (_X_Y_Z_W == 1 && (_Ft_ == 0 || _Fs_==0) ) { // W
|
||||
|
@ -1545,7 +1545,7 @@ void recVUMI_MUL_iq_toD(VURegs *VU, uptr addr, int regd, int info)
|
|||
//SysPrintf ("recVUMI_MUL_iq_toD \n");
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) {
|
||||
vuFloat3(addr);
|
||||
if (_Fs_) vuFloat_useEAX( info, EEREC_S, _X_Y_Z_W);
|
||||
if (_Fs_) vuFloat_useEAX( info, EEREC_S, _X_Y_Z_W );
|
||||
}
|
||||
|
||||
if( _XYZW_SS ) {
|
||||
|
@ -1602,7 +1602,7 @@ void recVUMI_MUL_xyzw_toD(VURegs *VU, int xyzw, int regd, int info)
|
|||
if (_Ft_) vuFloat_useEAX( info, EEREC_T, ( 1 << (3 - xyzw) ) );
|
||||
}
|
||||
// This is needed for alot of games
|
||||
vFloats1_useEAX[_X_Y_Z_W]( EEREC_S, EEREC_S ); // Always clamp EEREC_S, regardless if CHECK_VU_OVERFLOW is set
|
||||
if (_Fs_) vFloats1_useEAX[_X_Y_Z_W]( EEREC_S, EEREC_S ); // Always clamp EEREC_S, regardless if CHECK_VU_OVERFLOW is set
|
||||
|
||||
if( _Ft_ == 0 ) {
|
||||
if( xyzw < 3 ) {
|
||||
|
@ -1736,9 +1736,9 @@ void recVUMI_MADD_toD(VURegs *VU, int regd, int info)
|
|||
{
|
||||
//SysPrintf ("recVUMI_MADD_toD \n");
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) {
|
||||
vuFloat_useEAX( info, EEREC_S, _X_Y_Z_W);
|
||||
vuFloat_useEAX( info, EEREC_T, _X_Y_Z_W);
|
||||
vuFloat_useEAX( info, regd, _X_Y_Z_W);
|
||||
if (_Fs_) vuFloat_useEAX( info, EEREC_S, _X_Y_Z_W );
|
||||
if (_Ft_) vuFloat_useEAX( info, EEREC_T, _X_Y_Z_W );
|
||||
vuFloat_useEAX( info, EEREC_ACC, _X_Y_Z_W );
|
||||
}
|
||||
|
||||
if( _X_Y_Z_W == 8 ) {
|
||||
|
@ -1768,7 +1768,7 @@ void recVUMI_MADD_toD(VURegs *VU, int regd, int info)
|
|||
else if (_X_Y_Z_W != 0xf) {
|
||||
SSE_MOVAPS_XMM_to_XMM(EEREC_TEMP, EEREC_S);
|
||||
SSE_MULPS_XMM_to_XMM(EEREC_TEMP, EEREC_T);
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, EEREC_TEMP, _X_Y_Z_W); }
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, EEREC_TEMP, _X_Y_Z_W ); }
|
||||
SSE_ADDPS_XMM_to_XMM(EEREC_TEMP, EEREC_ACC);
|
||||
|
||||
VU_MERGE_REGS(regd, EEREC_TEMP);
|
||||
|
@ -1777,23 +1777,23 @@ void recVUMI_MADD_toD(VURegs *VU, int regd, int info)
|
|||
if( regd == EEREC_ACC ) {
|
||||
SSE_MOVAPS_XMM_to_XMM(EEREC_TEMP, EEREC_S);
|
||||
SSE_MULPS_XMM_to_XMM(EEREC_TEMP, EEREC_T);
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, EEREC_TEMP, _X_Y_Z_W); }
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, EEREC_TEMP, _X_Y_Z_W ); }
|
||||
SSE_ADDPS_XMM_to_XMM(regd, EEREC_TEMP);
|
||||
}
|
||||
else if (regd == EEREC_T) {
|
||||
SSE_MULPS_XMM_to_XMM(regd, EEREC_S);
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, regd, _X_Y_Z_W); }
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, regd, _X_Y_Z_W ); }
|
||||
SSE_ADDPS_XMM_to_XMM(regd, EEREC_ACC);
|
||||
}
|
||||
else if (regd == EEREC_S) {
|
||||
SSE_MULPS_XMM_to_XMM(regd, EEREC_T);
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, regd, _X_Y_Z_W); }
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, regd, _X_Y_Z_W ); }
|
||||
SSE_ADDPS_XMM_to_XMM(regd, EEREC_ACC);
|
||||
}
|
||||
else {
|
||||
SSE_MOVAPS_XMM_to_XMM(regd, EEREC_S);
|
||||
SSE_MULPS_XMM_to_XMM(regd, EEREC_T);
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, regd, _X_Y_Z_W); }
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, regd, _X_Y_Z_W ); }
|
||||
SSE_ADDPS_XMM_to_XMM(regd, EEREC_ACC);
|
||||
}
|
||||
}
|
||||
|
@ -1804,8 +1804,8 @@ void recVUMI_MADD_iq_toD(VURegs *VU, uptr addr, int regd, int info)
|
|||
//SysPrintf ("recVUMI_MADD_iq_toD \n");
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) {
|
||||
vuFloat3(addr);
|
||||
vuFloat_useEAX( info, EEREC_S, _X_Y_Z_W);
|
||||
vuFloat_useEAX( info, regd, _X_Y_Z_W);
|
||||
if (_Fs_) vuFloat_useEAX( info, EEREC_S, _X_Y_Z_W );
|
||||
vuFloat_useEAX( info, EEREC_ACC, _X_Y_Z_W );
|
||||
}
|
||||
|
||||
if( _X_Y_Z_W == 8 ) {
|
||||
|
@ -1826,13 +1826,13 @@ void recVUMI_MADD_iq_toD(VURegs *VU, uptr addr, int regd, int info)
|
|||
}
|
||||
else if( regd == EEREC_S ) {
|
||||
SSE_MULSS_M32_to_XMM(regd, addr);
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, regd, _X_Y_Z_W); }
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, regd, _X_Y_Z_W ); }
|
||||
SSE_ADDSS_XMM_to_XMM(regd, EEREC_ACC);
|
||||
}
|
||||
else {
|
||||
SSE_MOVSS_XMM_to_XMM(regd, EEREC_S);
|
||||
SSE_MULSS_M32_to_XMM(regd, addr);
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, regd, _X_Y_Z_W); }
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, regd, _X_Y_Z_W ); }
|
||||
SSE_ADDSS_XMM_to_XMM(regd, EEREC_ACC);
|
||||
}
|
||||
}
|
||||
|
@ -1855,7 +1855,7 @@ void recVUMI_MADD_iq_toD(VURegs *VU, uptr addr, int regd, int info)
|
|||
|
||||
if (_X_Y_Z_W != 0xf) {
|
||||
SSE_MULPS_XMM_to_XMM(EEREC_TEMP, EEREC_S);
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, EEREC_TEMP, _X_Y_Z_W); }
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, EEREC_TEMP, _X_Y_Z_W ); }
|
||||
SSE_ADDPS_XMM_to_XMM(EEREC_TEMP, EEREC_ACC);
|
||||
|
||||
VU_MERGE_REGS(regd, EEREC_TEMP);
|
||||
|
@ -1863,24 +1863,24 @@ void recVUMI_MADD_iq_toD(VURegs *VU, uptr addr, int regd, int info)
|
|||
else {
|
||||
if( regd == EEREC_ACC ) {
|
||||
SSE_MULPS_XMM_to_XMM(EEREC_TEMP, EEREC_S);
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, EEREC_TEMP, _X_Y_Z_W); }
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, EEREC_TEMP, _X_Y_Z_W ); }
|
||||
SSE_ADDPS_XMM_to_XMM(regd, EEREC_TEMP);
|
||||
}
|
||||
else if( regd == EEREC_S ) {
|
||||
SSE_MULPS_XMM_to_XMM(regd, EEREC_TEMP);
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, regd, _X_Y_Z_W); }
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, regd, _X_Y_Z_W ); }
|
||||
SSE_ADDPS_XMM_to_XMM(regd, EEREC_ACC);
|
||||
}
|
||||
else if( regd == EEREC_TEMP ) {
|
||||
SSE_MULPS_XMM_to_XMM(regd, EEREC_S);
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, regd, _X_Y_Z_W); }
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, regd, _X_Y_Z_W ); }
|
||||
SSE_ADDPS_XMM_to_XMM(regd, EEREC_ACC);
|
||||
}
|
||||
else {
|
||||
SSE_MOVSS_M32_to_XMM(regd, addr);
|
||||
SSE_SHUFPS_XMM_to_XMM(regd, regd, 0x00);
|
||||
SSE_MULPS_XMM_to_XMM(regd, EEREC_S);
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, regd, _X_Y_Z_W); }
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, regd, _X_Y_Z_W ); }
|
||||
SSE_ADDPS_XMM_to_XMM(regd, EEREC_ACC);
|
||||
}
|
||||
}
|
||||
|
@ -1891,12 +1891,11 @@ void recVUMI_MADD_xyzw_toD(VURegs *VU, int xyzw, int regd, int info)
|
|||
{
|
||||
//SysPrintf ("recVUMI_MADD_xyzw_toD \n");
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) {
|
||||
vuFloat_useEAX( info, EEREC_T, ( 1 << (3 - xyzw) ) );
|
||||
vuFloat_useEAX( info, EEREC_ACC, _X_Y_Z_W);
|
||||
vuFloat_useEAX( info, regd, _X_Y_Z_W);
|
||||
if (_Ft_) vuFloat_useEAX( info, EEREC_T, ( 1 << (3 - xyzw) ) );
|
||||
vuFloat_useEAX( info, EEREC_ACC, _X_Y_Z_W );
|
||||
}
|
||||
// This is needed for alot of games
|
||||
vFloats1_useEAX[_X_Y_Z_W]( EEREC_S, EEREC_S ); // Always clamp EEREC_S, regardless if CHECK_VU_OVERFLOW is set
|
||||
if (_Fs_) vFloats1_useEAX[_X_Y_Z_W]( EEREC_S, EEREC_S ); // Always clamp EEREC_S, regardless if CHECK_VU_OVERFLOW is set
|
||||
|
||||
if( _Ft_ == 0 ) {
|
||||
|
||||
|
@ -1969,7 +1968,7 @@ void recVUMI_MADD_xyzw_toD(VURegs *VU, int xyzw, int regd, int info)
|
|||
|
||||
if (_X_Y_Z_W != 0xf) {
|
||||
SSE_MULPS_XMM_to_XMM(EEREC_TEMP, EEREC_S);
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, EEREC_TEMP, _X_Y_Z_W); }
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, EEREC_TEMP, _X_Y_Z_W ); }
|
||||
SSE_ADDPS_XMM_to_XMM(EEREC_TEMP, EEREC_ACC);
|
||||
|
||||
VU_MERGE_REGS(regd, EEREC_TEMP);
|
||||
|
@ -1977,23 +1976,23 @@ void recVUMI_MADD_xyzw_toD(VURegs *VU, int xyzw, int regd, int info)
|
|||
else {
|
||||
if( regd == EEREC_ACC ) {
|
||||
SSE_MULPS_XMM_to_XMM(EEREC_TEMP, EEREC_S);
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, EEREC_TEMP, _X_Y_Z_W); }
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, EEREC_TEMP, _X_Y_Z_W ); }
|
||||
SSE_ADDPS_XMM_to_XMM(regd, EEREC_TEMP);
|
||||
}
|
||||
else if( regd == EEREC_S ) {
|
||||
SSE_MULPS_XMM_to_XMM(regd, EEREC_TEMP);
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, regd, _X_Y_Z_W); }
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, regd, _X_Y_Z_W ); }
|
||||
SSE_ADDPS_XMM_to_XMM(regd, EEREC_ACC);
|
||||
}
|
||||
else if( regd == EEREC_TEMP ) {
|
||||
SSE_MULPS_XMM_to_XMM(regd, EEREC_S);
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, regd, _X_Y_Z_W); }
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, regd, _X_Y_Z_W ); }
|
||||
SSE_ADDPS_XMM_to_XMM(regd, EEREC_ACC);
|
||||
}
|
||||
else {
|
||||
_unpackVF_xyzw(regd, EEREC_T, xyzw);
|
||||
SSE_MULPS_XMM_to_XMM(regd, EEREC_S);
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, regd, _X_Y_Z_W); }
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, regd, _X_Y_Z_W ); }
|
||||
SSE_ADDPS_XMM_to_XMM(regd, EEREC_ACC);
|
||||
}
|
||||
}
|
||||
|
@ -2095,9 +2094,9 @@ void recVUMI_MSUB_toD(VURegs *VU, int regd, int info)
|
|||
{
|
||||
//SysPrintf ("recVUMI_MSUB_toD \n");
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) {
|
||||
vuFloat_useEAX( info, EEREC_S, _X_Y_Z_W);
|
||||
vuFloat_useEAX( info, EEREC_T, _X_Y_Z_W);
|
||||
vuFloat_useEAX( info, regd, _X_Y_Z_W);
|
||||
if (_Fs_) vuFloat_useEAX( info, EEREC_S, _X_Y_Z_W );
|
||||
if (_Ft_) vuFloat_useEAX( info, EEREC_T, _X_Y_Z_W );
|
||||
vuFloat_useEAX( info, EEREC_ACC, _X_Y_Z_W );
|
||||
}
|
||||
|
||||
if (_X_Y_Z_W != 0xf) {
|
||||
|
@ -2105,7 +2104,7 @@ void recVUMI_MSUB_toD(VURegs *VU, int regd, int info)
|
|||
|
||||
SSE_MOVAPS_XMM_to_XMM(EEREC_TEMP, EEREC_S);
|
||||
SSE_MULPS_XMM_to_XMM(EEREC_TEMP, EEREC_T);
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, EEREC_TEMP, _X_Y_Z_W); }
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, EEREC_TEMP, _X_Y_Z_W ); }
|
||||
|
||||
if( t1reg >= 0 ) {
|
||||
SSE_MOVAPS_XMM_to_XMM(t1reg, EEREC_ACC);
|
||||
|
@ -2124,21 +2123,21 @@ void recVUMI_MSUB_toD(VURegs *VU, int regd, int info)
|
|||
if( regd == EEREC_S ) {
|
||||
assert( regd != EEREC_ACC );
|
||||
SSE_MULPS_XMM_to_XMM(regd, EEREC_T);
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, regd, _X_Y_Z_W); }
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, regd, _X_Y_Z_W ); }
|
||||
SSE_SUBPS_XMM_to_XMM(regd, EEREC_ACC);
|
||||
SSE_XORPS_M128_to_XMM(regd, (uptr)&const_clip[4]);
|
||||
}
|
||||
else if( regd == EEREC_T ) {
|
||||
assert( regd != EEREC_ACC );
|
||||
SSE_MULPS_XMM_to_XMM(regd, EEREC_S);
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, regd, _X_Y_Z_W); }
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, regd, _X_Y_Z_W ); }
|
||||
SSE_SUBPS_XMM_to_XMM(regd, EEREC_ACC);
|
||||
SSE_XORPS_M128_to_XMM(regd, (uptr)&const_clip[4]);
|
||||
}
|
||||
else if( regd == EEREC_TEMP ) {
|
||||
SSE_MOVAPS_XMM_to_XMM(regd, EEREC_S);
|
||||
SSE_MULPS_XMM_to_XMM(regd, EEREC_T);
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, regd, _X_Y_Z_W); }
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, regd, _X_Y_Z_W ); }
|
||||
SSE_SUBPS_XMM_to_XMM(regd, EEREC_ACC);
|
||||
SSE_XORPS_M128_to_XMM(regd, (uptr)&const_clip[4]);
|
||||
}
|
||||
|
@ -2146,7 +2145,7 @@ void recVUMI_MSUB_toD(VURegs *VU, int regd, int info)
|
|||
SSE_MOVAPS_XMM_to_XMM(EEREC_TEMP, EEREC_S);
|
||||
SSE_MOVAPS_XMM_to_XMM(regd, EEREC_ACC);
|
||||
SSE_MULPS_XMM_to_XMM(EEREC_TEMP, EEREC_T);
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, EEREC_TEMP, _X_Y_Z_W); }
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, EEREC_TEMP, _X_Y_Z_W ); }
|
||||
SSE_SUBPS_XMM_to_XMM(regd, EEREC_TEMP);
|
||||
}
|
||||
}
|
||||
|
@ -2156,16 +2155,15 @@ void recVUMI_MSUB_temp_toD(VURegs *VU, int regd, int info)
|
|||
{
|
||||
//SysPrintf ("recVUMI_MSUB_temp_toD \n");
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) {
|
||||
vuFloat_useEAX( info, EEREC_S, _X_Y_Z_W);
|
||||
vuFloat_useEAX( info, EEREC_ACC, _X_Y_Z_W);
|
||||
vuFloat_useEAX( info, regd, _X_Y_Z_W);
|
||||
if (_Fs_) vuFloat_useEAX( info, EEREC_S, _X_Y_Z_W );
|
||||
vuFloat_useEAX( info, EEREC_ACC, _X_Y_Z_W );
|
||||
}
|
||||
|
||||
if (_X_Y_Z_W != 0xf) {
|
||||
int t1reg = _vuGetTempXMMreg(info);
|
||||
|
||||
SSE_MULPS_XMM_to_XMM(EEREC_TEMP, EEREC_S);
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, EEREC_TEMP, _X_Y_Z_W); }
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, EEREC_TEMP, _X_Y_Z_W ); }
|
||||
|
||||
if( t1reg >= 0 ) {
|
||||
SSE_MOVAPS_XMM_to_XMM(t1reg, EEREC_ACC);
|
||||
|
@ -2185,25 +2183,25 @@ void recVUMI_MSUB_temp_toD(VURegs *VU, int regd, int info)
|
|||
else {
|
||||
if( regd == EEREC_ACC ) {
|
||||
SSE_MULPS_XMM_to_XMM(EEREC_TEMP, EEREC_S);
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, EEREC_TEMP, _X_Y_Z_W); }
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, EEREC_TEMP, _X_Y_Z_W ); }
|
||||
SSE_SUBPS_XMM_to_XMM(regd, EEREC_TEMP);
|
||||
}
|
||||
else if( regd == EEREC_S ) {
|
||||
SSE_MULPS_XMM_to_XMM(regd, EEREC_TEMP);
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, regd, _X_Y_Z_W); }
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, regd, _X_Y_Z_W ); }
|
||||
SSE_SUBPS_XMM_to_XMM(regd, EEREC_ACC);
|
||||
SSE_XORPS_M128_to_XMM(regd, (uptr)&const_clip[4]);
|
||||
}
|
||||
else if( regd == EEREC_TEMP ) {
|
||||
SSE_MULPS_XMM_to_XMM(regd, EEREC_S);
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, regd, _X_Y_Z_W); }
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, regd, _X_Y_Z_W ); }
|
||||
SSE_SUBPS_XMM_to_XMM(regd, EEREC_ACC);
|
||||
SSE_XORPS_M128_to_XMM(regd, (uptr)&const_clip[4]);
|
||||
}
|
||||
else {
|
||||
SSE_MOVAPS_XMM_to_XMM(regd, EEREC_ACC);
|
||||
SSE_MULPS_XMM_to_XMM(EEREC_TEMP, EEREC_S);
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, EEREC_TEMP, _X_Y_Z_W); }
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat_useEAX( info, EEREC_TEMP, _X_Y_Z_W ); }
|
||||
SSE_SUBPS_XMM_to_XMM(regd, EEREC_TEMP);
|
||||
}
|
||||
}
|
||||
|
@ -2338,10 +2336,8 @@ void recVUMI_MAX(VURegs *VU, int info)
|
|||
if ( _Fd_ == 0 ) return;
|
||||
|
||||
//SysPrintf ("recVUMI_MAX \n");
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) {
|
||||
vuFloat5_useEAX( EEREC_S, EEREC_TEMP, _X_Y_Z_W);
|
||||
vuFloat5_useEAX( EEREC_T, EEREC_TEMP, _X_Y_Z_W);
|
||||
}
|
||||
if (_Fs_) vuFloat4_useEAX( EEREC_S, EEREC_TEMP, _X_Y_Z_W ); // Always do Preserved Sign Clamping
|
||||
if (_Ft_) vuFloat4_useEAX( EEREC_T, EEREC_TEMP, _X_Y_Z_W );
|
||||
|
||||
if( _X_Y_Z_W == 8 ) {
|
||||
if (EEREC_D == EEREC_S) SSE_MAXSS_XMM_to_XMM(EEREC_D, EEREC_T);
|
||||
|
@ -2372,10 +2368,8 @@ void recVUMI_MAX_iq(VURegs *VU, uptr addr, int info)
|
|||
if ( _Fd_ == 0 ) return;
|
||||
|
||||
//SysPrintf ("recVUMI_MAX_iq \n");
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) {
|
||||
vuFloat_useEAX( info, EEREC_S, _X_Y_Z_W);
|
||||
vuFloat3(addr);
|
||||
}
|
||||
if (_Fs_) vuFloat4_useEAX( EEREC_S, EEREC_TEMP, _X_Y_Z_W ); // Always do Preserved Sign Clamping
|
||||
vuFloat3(addr);
|
||||
|
||||
if( _XYZW_SS ) {
|
||||
if( EEREC_D == EEREC_TEMP ) {
|
||||
|
@ -2432,10 +2426,8 @@ void recVUMI_MAX_xyzw(VURegs *VU, int xyzw, int info)
|
|||
if ( _Fd_ == 0 ) return;
|
||||
|
||||
//SysPrintf ("recVUMI_MAX_xyzw \n");
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) {
|
||||
vuFloat_useEAX( info, EEREC_S, _X_Y_Z_W);
|
||||
vuFloat_useEAX( info, EEREC_T, ( 1 << (3 - xyzw) ) );
|
||||
}
|
||||
if (_Fs_) vuFloat4_useEAX( EEREC_S, EEREC_TEMP, _X_Y_Z_W ); // Always do Preserved Sign Clamping
|
||||
if (_Ft_) vuFloat4_useEAX( EEREC_T, EEREC_TEMP, ( 1 << (3 - xyzw) ) );
|
||||
|
||||
if( _X_Y_Z_W == 8 && (EEREC_D != EEREC_TEMP)) {
|
||||
if( _Fs_ == 0 && _Ft_ == 0 ) {
|
||||
|
@ -2511,9 +2503,11 @@ void recVUMI_MINI(VURegs *VU, int info)
|
|||
{
|
||||
if ( _Fd_ == 0 ) return;
|
||||
|
||||
//SysPrintf ("recVUMI_MINI \n");
|
||||
//SysPrintf ("recVUMI_MINI\n");
|
||||
if (_Fs_) vuFloat4_useEAX( EEREC_S, EEREC_TEMP, _X_Y_Z_W ); // Always do Preserved Sign Clamping
|
||||
if (_Ft_) vuFloat4_useEAX( EEREC_T, EEREC_TEMP, _X_Y_Z_W );
|
||||
|
||||
if( _X_Y_Z_W == 8 ) {
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat5_useEAX( EEREC_S, EEREC_TEMP, 8); vuFloat5_useEAX( EEREC_T, EEREC_TEMP, 8); }
|
||||
if (EEREC_D == EEREC_S) SSE_MINSS_XMM_to_XMM(EEREC_D, EEREC_T);
|
||||
else if (EEREC_D == EEREC_T) SSE_MINSS_XMM_to_XMM(EEREC_D, EEREC_S);
|
||||
else {
|
||||
|
@ -2522,14 +2516,12 @@ void recVUMI_MINI(VURegs *VU, int info)
|
|||
}
|
||||
}
|
||||
else if (_X_Y_Z_W != 0xf) {
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat5_useEAX( EEREC_S, EEREC_TEMP, _X_Y_Z_W); vuFloat5_useEAX( EEREC_T, EEREC_TEMP, _X_Y_Z_W); }
|
||||
SSE_MOVAPS_XMM_to_XMM(EEREC_TEMP, EEREC_S);
|
||||
SSE_MINPS_XMM_to_XMM(EEREC_TEMP, EEREC_T);
|
||||
|
||||
VU_MERGE_REGS(EEREC_D, EEREC_TEMP);
|
||||
}
|
||||
else {
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) { vuFloat5_useEAX( EEREC_S, EEREC_TEMP, 0xf); vuFloat5_useEAX( EEREC_T, EEREC_TEMP, 0xf); }
|
||||
if( EEREC_D == EEREC_S ) {
|
||||
//ClampUnordered(EEREC_T, EEREC_TEMP, 0); // need for GT4 vu0rec
|
||||
SSE_MINPS_XMM_to_XMM(EEREC_D, EEREC_T);
|
||||
|
@ -2550,10 +2542,8 @@ void recVUMI_MINI_iq(VURegs *VU, uptr addr, int info)
|
|||
if ( _Fd_ == 0 ) return;
|
||||
|
||||
//SysPrintf ("recVUMI_MINI_iq \n");
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) {
|
||||
vuFloat_useEAX( info, EEREC_S, _X_Y_Z_W);
|
||||
vuFloat3(addr);
|
||||
}
|
||||
if (_Fs_) vuFloat4_useEAX( EEREC_S, EEREC_TEMP, _X_Y_Z_W ); // Always do Preserved Sign Clamping
|
||||
vuFloat3(addr);
|
||||
|
||||
if( _XYZW_SS ) {
|
||||
if( EEREC_D == EEREC_TEMP ) {
|
||||
|
@ -2610,10 +2600,8 @@ void recVUMI_MINI_xyzw(VURegs *VU, int xyzw, int info)
|
|||
if ( _Fd_ == 0 ) return;
|
||||
|
||||
//SysPrintf ("recVUMI_MINI_xyzw \n");
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) {
|
||||
vuFloat_useEAX( info, EEREC_S, _X_Y_Z_W);
|
||||
vuFloat_useEAX( info, EEREC_T, ( 1 << (3 - xyzw) ) );
|
||||
}
|
||||
if (_Fs_) vuFloat4_useEAX( EEREC_S, EEREC_TEMP, _X_Y_Z_W ); // Always do Preserved Sign Clamping
|
||||
if (_Ft_) vuFloat4_useEAX( EEREC_T, EEREC_TEMP, ( 1 << (3 - xyzw) ) );
|
||||
|
||||
if( _X_Y_Z_W == 8 && (EEREC_D != EEREC_TEMP)) {
|
||||
if( xyzw == 0 ) {
|
||||
|
@ -2662,8 +2650,8 @@ void recVUMI_OPMULA( VURegs *VU, int info )
|
|||
{
|
||||
//SysPrintf ("recVUMI_OPMULA \n");
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) {
|
||||
vuFloat5_useEAX( EEREC_S, EEREC_TEMP, 0xE);
|
||||
vuFloat5_useEAX( EEREC_T, EEREC_TEMP, 0xE);
|
||||
if (_Fs_) vuFloat5_useEAX( EEREC_S, EEREC_TEMP, 0xE);
|
||||
if (_Ft_) vuFloat5_useEAX( EEREC_T, EEREC_TEMP, 0xE);
|
||||
}
|
||||
|
||||
SSE_MOVAPS_XMM_to_XMM( EEREC_TEMP, EEREC_S );
|
||||
|
@ -2689,8 +2677,8 @@ void recVUMI_OPMSUB( VURegs *VU, int info )
|
|||
{
|
||||
//SysPrintf ("recVUMI_OPMSUB \n");
|
||||
if (CHECK_VU_EXTRA_OVERFLOW) {
|
||||
vuFloat5_useEAX( EEREC_S, EEREC_TEMP, 0xE);
|
||||
vuFloat5_useEAX( EEREC_T, EEREC_TEMP, 0xE);
|
||||
if (_Fs_) vuFloat5_useEAX( EEREC_S, EEREC_TEMP, 0xE);
|
||||
if (_Ft_) vuFloat5_useEAX( EEREC_T, EEREC_TEMP, 0xE);
|
||||
}
|
||||
|
||||
if( !_Fd_ ) info |= PROCESS_EE_SET_D(EEREC_TEMP);
|
||||
|
|
Loading…
Reference in New Issue