From 7fb8d0316b0b2f3b269d3a384268f0f053aaafaf Mon Sep 17 00:00:00 2001 From: sudonim1 Date: Thu, 11 Mar 2010 17:19:54 +0000 Subject: [PATCH] Subtle bug in iR5900Arit.cpp rewrite and a little more cleaning. git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2696 96395faa-99c1-11dd-bbfe-3dabce05a288 --- pcsx2/x86/iR5900.h | 1 + pcsx2/x86/ix86-32/iR5900-32.cpp | 8 ++++++++ pcsx2/x86/ix86-32/iR5900Arit.cpp | 28 ++++++++-------------------- pcsx2/x86/ix86-32/iR5900Shift.cpp | 13 +++---------- 4 files changed, 20 insertions(+), 30 deletions(-) diff --git a/pcsx2/x86/iR5900.h b/pcsx2/x86/iR5900.h index d4d135dbbd..98ad7c079a 100644 --- a/pcsx2/x86/iR5900.h +++ b/pcsx2/x86/iR5900.h @@ -123,6 +123,7 @@ u32* _eeGetConstReg(int reg); void _eeMoveGPRtoR(x86IntRegType to, int fromgpr); void _eeMoveGPRtoM(u32 to, int fromgpr); void _eeMoveGPRtoRm(x86IntRegType to, int fromgpr); +void eeSignExtendTo(int gpr, bool onlyupper=false); void _eeFlushAllUnused(); void _eeOnWriteReg(int reg, int signext); diff --git a/pcsx2/x86/ix86-32/iR5900-32.cpp b/pcsx2/x86/ix86-32/iR5900-32.cpp index b70c4576ac..faaca085ef 100644 --- a/pcsx2/x86/ix86-32/iR5900-32.cpp +++ b/pcsx2/x86/ix86-32/iR5900-32.cpp @@ -196,6 +196,14 @@ void _eeMoveGPRtoRm(x86IntRegType to, int fromgpr) } } +void eeSignExtendTo(int gpr, bool onlyupper) +{ + xCDQ(); + if (!onlyupper) + xMOV(ptr32[&cpuRegs.GPR.r[gpr].UL[0]], eax); + xMOV(ptr32[&cpuRegs.GPR.r[gpr].UL[1]], edx); +} + int _flushXMMunused() { int i; diff --git a/pcsx2/x86/ix86-32/iR5900Arit.cpp b/pcsx2/x86/ix86-32/iR5900Arit.cpp index 5f5586e759..c5cc4a6f4c 100644 --- a/pcsx2/x86/ix86-32/iR5900Arit.cpp +++ b/pcsx2/x86/ix86-32/iR5900Arit.cpp @@ -70,10 +70,7 @@ void recADD_constv(int info, int creg, int vreg) xMOV(eax, ptr32[&cpuRegs.GPR.r[vreg].SL[0]]); if (cval) xADD(eax, cval); - if (_Rd_ != vreg || cval) - xMOV(ptr32[&cpuRegs.GPR.r[_Rd_].SL[0]], eax); - xCDQ(); - xMOV(ptr32[&cpuRegs.GPR.r[_Rd_].SL[1]], edx); + eeSignExtendTo(_Rd_, _Rd_ == vreg && !cval); } // s is constant @@ -98,9 +95,7 @@ void recADD_(int info) xADD(eax, eax); else xADD(eax, ptr32[&cpuRegs.GPR.r[_Rt_].SL[0]]); - xMOV(ptr32[&cpuRegs.GPR.r[_Rd_].SL[0]], eax); - xCDQ(); - xMOV(ptr32[&cpuRegs.GPR.r[_Rd_].SL[1]], edx); + eeSignExtendTo(_Rd_); } EERECOMPILE_CODE0(ADD, XMMINFO_WRITED|XMMINFO_READS|XMMINFO_READT); @@ -207,9 +202,7 @@ void recSUB_consts(int info) xMOV(eax, sval); xSUB(eax, ptr32[&cpuRegs.GPR.r[_Rt_].SL[0]]); - xMOV(ptr32[&cpuRegs.GPR.r[_Rd_].SL[0]], eax); - xCDQ(); - xMOV(ptr32[&cpuRegs.GPR.r[_Rd_].SL[1]], edx); + eeSignExtendTo(_Rd_); } void recSUB_constt(int info) @@ -221,10 +214,7 @@ void recSUB_constt(int info) xMOV(eax, ptr32[&cpuRegs.GPR.r[_Rs_].SL[0]]); if (tval) xSUB(eax, tval); - if (_Rd_ != _Rs_ || tval) - xMOV(ptr32[&cpuRegs.GPR.r[_Rd_].SL[0]], eax); - xCDQ(); - xMOV(ptr32[&cpuRegs.GPR.r[_Rd_].SL[1]], edx); + eeSignExtendTo(_Rd_, _Rd_ == _Rs_ && !tval); } void recSUB_(int info) @@ -239,9 +229,7 @@ void recSUB_(int info) xMOV(eax, ptr32[&cpuRegs.GPR.r[_Rs_].SL[0]]); xSUB(eax, ptr32[&cpuRegs.GPR.r[_Rt_].SL[0]]); - xMOV(ptr32[&cpuRegs.GPR.r[_Rd_].SL[0]], eax); - xCDQ(); - xMOV(ptr32[&cpuRegs.GPR.r[_Rd_].SL[1]], edx); + eeSignExtendTo(_Rd_); } EERECOMPILE_CODE0(SUB, XMMINFO_READS|XMMINFO_READT|XMMINFO_WRITED); @@ -292,7 +280,7 @@ void recDSUB_constt(int info) GPR_reg64 tval = g_cpuConstRegs[_Rt_]; - if( _Rd_ == _Rs_ ) { + if (_Rd_ == _Rs_) { xSUB(ptr32[&cpuRegs.GPR.r[_Rd_].SL[0]], tval.SL[0]); xSBB(ptr32[&cpuRegs.GPR.r[_Rd_].SL[1]], tval.SL[1]); } else { @@ -605,7 +593,7 @@ void recSLTs_const(int info, int sign, int st) xForwardJump fail(st ? (sign ? Jcc_Greater : Jcc_Above) : (sign ? Jcc_Less : Jcc_Below)); { xCMP(ptr32[&cpuRegs.GPR.r[st ? _Rs_ : _Rt_].UL[0]], cval.UL[0]); - xForwardJump pass2(st ? (sign ? Jcc_Less : Jcc_Below) : (sign ? Jcc_Greater : Jcc_Above)); + xForwardJump pass2(st ? Jcc_Below : Jcc_Above); fail.SetTarget(); xMOV(eax, 0); @@ -630,7 +618,7 @@ void recSLTs_(int info, int sign) { xMOV(edx, ptr32[&cpuRegs.GPR.r[_Rs_].UL[0]]); xCMP(edx, ptr32[&cpuRegs.GPR.r[_Rt_].UL[0]]); - xForwardJump pass2(sign ? Jcc_Less : Jcc_Below); + xForwardJump pass2(Jcc_Below); fail.SetTarget(); xMOV(eax, 0); diff --git a/pcsx2/x86/ix86-32/iR5900Shift.cpp b/pcsx2/x86/ix86-32/iR5900Shift.cpp index c71fd73ccf..86e04ba74e 100644 --- a/pcsx2/x86/ix86-32/iR5900Shift.cpp +++ b/pcsx2/x86/ix86-32/iR5900Shift.cpp @@ -348,13 +348,6 @@ void recSetConstShiftV(int info, int* rsreg, int* rdreg, int* rstemp, int shift6 _flushConstReg(_Rt_); } -void recMoveSignToRd(int info) -{ - CDQ(); - MOV32RtoM( (int)&cpuRegs.GPR.r[ _Rd_ ].UL[ 0 ], EAX ); - MOV32RtoM( (int)&cpuRegs.GPR.r[ _Rd_ ].UL[ 1 ], EDX ); -} - //// SLLV void recSLLV_const() { @@ -374,7 +367,7 @@ void recSLLV_constt(int info) AND32ItoR( ECX, 0x1f ); SHL32CLtoR( EAX ); - recMoveSignToRd(info); + eeSignExtendTo(_Rd_); } void recSLLV_(int info) @@ -412,7 +405,7 @@ void recSRLV_constt(int info) AND32ItoR( ECX, 0x1f ); SHR32CLtoR( EAX ); - recMoveSignToRd(info); + eeSignExtendTo(_Rd_); } void recSRLV_(int info) @@ -450,7 +443,7 @@ void recSRAV_constt(int info) AND32ItoR( ECX, 0x1f ); SAR32CLtoR( EAX ); - recMoveSignToRd(info); + eeSignExtendTo(_Rd_); } void recSRAV_(int info)