diff --git a/pcsx2/x86/iVUmicroUpper.cpp b/pcsx2/x86/iVUmicroUpper.cpp index 4936f6e1a8..097a2d107d 100644 --- a/pcsx2/x86/iVUmicroUpper.cpp +++ b/pcsx2/x86/iVUmicroUpper.cpp @@ -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);