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:
cottonvibes 2009-01-29 23:02:22 +00:00 committed by Gregory Hainaut
parent b5f952fc5e
commit 240defef4e
1 changed files with 82 additions and 94 deletions

View File

@ -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);