2010-05-25 09:15:19 +00:00
# include "stdafx.h"
2010-05-30 01:54:42 +00:00
CCodeSection * CRecompilerOps : : m_Section = NULL ;
CRegInfo CRecompilerOps : : m_RegWorkingSet ;
STEP_TYPE CRecompilerOps : : m_NextInstruction ;
DWORD CRecompilerOps : : m_CompilePC ;
OPCODE CRecompilerOps : : m_Opcode ;
2010-06-04 06:25:07 +00:00
DWORD CRecompilerOps : : m_BranchCompare = 0 ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
void CRecompilerOps : : CompileReadTLBMiss ( int AddressReg , int LookUpReg )
2010-05-30 01:54:42 +00:00
{
2010-05-25 09:15:19 +00:00
# ifdef tofix
MoveX86regToVariable ( AddressReg , & TLBLoadAddress , " TLBLoadAddress " ) ;
TestX86RegToX86Reg ( LookUpReg , LookUpReg ) ;
2010-06-04 06:25:07 +00:00
m_Section - > CompileExit ( m_CompilePC , m_CompilePC , m_RegWorkingSet , CExitInfo : : TLBReadMiss , FALSE , JeLabel32 ) ;
2010-05-30 01:54:42 +00:00
# endif
2010-05-25 09:15:19 +00:00
}
2010-06-04 06:25:07 +00:00
void CRecompilerOps : : CompileWriteTLBMiss ( int AddressReg , int LookUpReg )
2010-05-25 09:15:19 +00:00
{
2010-05-30 01:54:42 +00:00
# ifdef tofix
2010-05-25 09:15:19 +00:00
MoveX86regToVariable ( AddressReg , & TLBStoreAddress , " TLBStoreAddress " ) ;
TestX86RegToX86Reg ( LookUpReg , LookUpReg ) ;
2010-06-04 06:25:07 +00:00
m_Section - > CompileExit ( m_CompilePC , m_CompilePC , m_RegWorkingSet , CExitInfo : : TLBReadMiss , FALSE , JeLabel32 ) ;
2010-05-30 01:54:42 +00:00
# endif
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
int DelaySlotEffectsCompare ( DWORD PC , DWORD Reg1 , DWORD Reg2 ) ;
2010-05-25 09:15:19 +00:00
/************************** Branch functions ************************/
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : Compile_Branch ( CRecompilerOps : : BranchFunction CompareFunc , BRANCH_TYPE BranchType , BOOL Link )
2010-05-25 09:15:19 +00:00
{
static int EffectDelaySlot , DoneJumpDelay , DoneContinueDelay ;
static CRegInfo RegBeforeDelay ;
2010-05-30 01:54:42 +00:00
if ( m_NextInstruction = = NORMAL ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-25 09:15:19 +00:00
2012-09-25 05:58:06 +00:00
if ( ( m_CompilePC & 0xFFC ) ! = 0xFFC )
{
2010-05-25 09:15:19 +00:00
switch ( BranchType ) {
2010-05-30 01:54:42 +00:00
case BranchTypeRs : EffectDelaySlot = DelaySlotEffectsCompare ( m_CompilePC , m_Opcode . rs , 0 ) ; break ;
case BranchTypeRsRt : EffectDelaySlot = DelaySlotEffectsCompare ( m_CompilePC , m_Opcode . rs , m_Opcode . rt ) ; break ;
2010-05-25 09:15:19 +00:00
case BranchTypeCop1 :
{
OPCODE Command ;
2010-06-07 02:23:58 +00:00
if ( ! _MMU - > LW_VAddr ( m_CompilePC + 4 , Command . Hex ) ) {
2010-05-25 09:15:19 +00:00
DisplayError ( GS ( MSG_FAIL_LOAD_WORD ) ) ;
ExitThread ( 0 ) ;
}
EffectDelaySlot = FALSE ;
if ( Command . op = = R4300i_CP1 ) {
if ( Command . fmt = = R4300i_COP1_S & & ( Command . funct & 0x30 ) = = 0x30 ) {
EffectDelaySlot = TRUE ;
}
if ( Command . fmt = = R4300i_COP1_D & & ( Command . funct & 0x30 ) = = 0x30 ) {
EffectDelaySlot = TRUE ;
}
}
}
break ;
# ifndef EXTERNAL_RELEASE
default :
DisplayError ( " Unknown branch type " ) ;
# endif
}
} else {
2012-09-25 05:58:06 +00:00
EffectDelaySlot = true ;
2010-05-25 09:15:19 +00:00
}
2010-10-23 18:53:01 +00:00
m_Section - > m_Jump . JumpPC = m_CompilePC ;
m_Section - > m_Jump . TargetPC = m_CompilePC + ( ( short ) m_Opcode . offset < < 2 ) + 4 ;
2010-05-30 01:54:42 +00:00
if ( m_Section - > m_JumpSection ! = NULL ) {
2010-05-31 00:21:08 +00:00
m_Section - > m_Jump . BranchLabel . Format ( " Section_%d " , m_Section - > m_JumpSection - > m_SectionID ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
m_Section - > m_Jump . BranchLabel . Format ( " Exit_%X_jump_%X " , m_Section - > m_EnterPC , m_Section - > m_Jump . TargetPC ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = NULL ;
m_Section - > m_Jump . LinkLocation2 = NULL ;
m_Section - > m_Jump . DoneDelaySlot = FALSE ;
2010-10-23 18:53:01 +00:00
m_Section - > m_Cont . JumpPC = m_CompilePC ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . TargetPC = m_CompilePC + 8 ;
2010-05-31 00:21:08 +00:00
if ( m_Section - > m_ContinueSection ! = NULL ) {
m_Section - > m_Cont . BranchLabel . Format ( " Section_%d " , m_Section - > m_ContinueSection - > m_SectionID ) ;
} else {
m_Section - > m_Cont . BranchLabel . Format ( " Exit_%X_continue_%X " , m_Section - > m_EnterPC , m_Section - > m_Cont . TargetPC ) ;
}
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = NULL ;
m_Section - > m_Cont . LinkLocation2 = NULL ;
m_Section - > m_Cont . DoneDelaySlot = FALSE ;
if ( m_Section - > m_Jump . TargetPC < m_Section - > m_Cont . TargetPC ) {
m_Section - > m_Cont . FallThrough = FALSE ;
m_Section - > m_Jump . FallThrough = TRUE ;
} else {
m_Section - > m_Cont . FallThrough = TRUE ;
m_Section - > m_Jump . FallThrough = FALSE ;
2010-05-25 09:15:19 +00:00
}
2010-10-23 18:53:01 +00:00
2010-05-25 09:15:19 +00:00
if ( Link ) {
2010-05-30 01:54:42 +00:00
UnMap_GPR ( 31 , FALSE ) ;
MipsRegLo ( 31 ) = m_CompilePC + 8 ;
MipsRegState ( 31 ) = CRegInfo : : STATE_CONST_32 ;
2010-05-25 09:15:19 +00:00
}
if ( EffectDelaySlot ) {
2012-09-25 05:58:06 +00:00
if ( ( m_CompilePC & 0xFFC ) ! = 0xFFC )
{
m_Section - > m_Cont . BranchLabel = m_Section - > m_ContinueSection ! = NULL ? " Continue " : " ExitBlock " ;
m_Section - > m_Jump . BranchLabel = m_Section - > m_JumpSection ! = NULL ? " Jump " : " ExitBlock " ;
} else {
m_Section - > m_Cont . BranchLabel = " Continue " ;
m_Section - > m_Jump . BranchLabel = " Jump " ;
}
2010-10-23 18:53:01 +00:00
if ( m_Section - > m_Jump . TargetPC ! = m_Section - > m_Cont . TargetPC )
{
CompareFunc ( ) ;
}
2010-05-30 01:54:42 +00:00
if ( ! m_Section - > m_Jump . FallThrough & & ! m_Section - > m_Cont . FallThrough ) {
if ( m_Section - > m_Jump . LinkLocation ! = NULL ) {
2010-05-25 09:15:19 +00:00
CPU_Message ( " " ) ;
2010-06-04 06:25:07 +00:00
CPU_Message ( " %s: " , m_Section - > m_Jump . BranchLabel . c_str ( ) ) ;
2010-05-30 01:54:42 +00:00
SetJump32 ( ( DWORD * ) m_Section - > m_Jump . LinkLocation , ( DWORD * ) m_RecompPos ) ;
m_Section - > m_Jump . LinkLocation = NULL ;
if ( m_Section - > m_Jump . LinkLocation2 ! = NULL ) {
SetJump32 ( ( DWORD * ) m_Section - > m_Jump . LinkLocation2 , ( DWORD * ) m_RecompPos ) ;
m_Section - > m_Jump . LinkLocation2 = NULL ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . FallThrough = TRUE ;
} else if ( m_Section - > m_Cont . LinkLocation ! = NULL ) {
2010-05-25 09:15:19 +00:00
CPU_Message ( " " ) ;
2010-06-04 06:25:07 +00:00
CPU_Message ( " %s: " , m_Section - > m_Cont . BranchLabel . c_str ( ) ) ;
2010-05-30 01:54:42 +00:00
SetJump32 ( ( DWORD * ) m_Section - > m_Cont . LinkLocation , ( DWORD * ) m_RecompPos ) ;
m_Section - > m_Cont . LinkLocation = NULL ;
if ( m_Section - > m_Cont . LinkLocation2 ! = NULL ) {
SetJump32 ( ( DWORD * ) m_Section - > m_Cont . LinkLocation2 , ( DWORD * ) m_RecompPos ) ;
m_Section - > m_Cont . LinkLocation2 = NULL ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . FallThrough = TRUE ;
2010-05-25 09:15:19 +00:00
}
}
2012-09-25 05:58:06 +00:00
if ( ( m_CompilePC & 0xFFC ) = = 0xFFC )
{
BYTE * DelayLinkLocation = NULL ;
if ( m_Section - > m_Jump . FallThrough )
{
if ( m_Section - > m_Jump . LinkLocation ! = NULL | | m_Section - > m_Jump . LinkLocation2 ! = NULL )
{
_Notify - > BreakPoint ( __FILE__ , __LINE__ ) ;
}
MoveConstToVariable ( m_Section - > m_Jump . TargetPC , & R4300iOp : : m_JumpToLocation , " R4300iOp::m_JumpToLocation " ) ;
}
else if ( m_Section - > m_Cont . FallThrough )
{
if ( m_Section - > m_Cont . LinkLocation ! = NULL | | m_Section - > m_Cont . LinkLocation2 ! = NULL )
{
_Notify - > BreakPoint ( __FILE__ , __LINE__ ) ;
}
MoveConstToVariable ( m_Section - > m_Cont . TargetPC , & R4300iOp : : m_JumpToLocation , " R4300iOp::m_JumpToLocation " ) ;
}
if ( m_Section - > m_Jump . LinkLocation ! = NULL | | m_Section - > m_Jump . LinkLocation2 ! = NULL )
{
JmpLabel8 ( " DoDelaySlot " , 0 ) ;
if ( DelayLinkLocation ! = NULL ) { _Notify - > BreakPoint ( __FILE__ , __LINE__ ) ; }
DelayLinkLocation = ( BYTE * ) ( m_RecompPos - 1 ) ;
CPU_Message ( " " ) ;
CPU_Message ( " %s: " , m_Section - > m_Jump . BranchLabel . c_str ( ) ) ;
SetJump32 ( m_Section - > m_Jump . LinkLocation , ( DWORD * ) m_RecompPos ) ;
m_Section - > m_Jump . LinkLocation = NULL ;
if ( m_Section - > m_Jump . LinkLocation2 ! = NULL ) {
SetJump32 ( m_Section - > m_Jump . LinkLocation2 , ( DWORD * ) m_RecompPos ) ;
m_Section - > m_Jump . LinkLocation2 = NULL ;
}
MoveConstToVariable ( m_Section - > m_Jump . TargetPC , & R4300iOp : : m_JumpToLocation , " R4300iOp::m_JumpToLocation " ) ;
}
if ( m_Section - > m_Cont . LinkLocation ! = NULL | | m_Section - > m_Cont . LinkLocation2 ! = NULL )
{
2012-09-26 01:31:17 +00:00
JmpLabel8 ( " DoDelaySlot " , 0 ) ;
if ( DelayLinkLocation ! = NULL ) { _Notify - > BreakPoint ( __FILE__ , __LINE__ ) ; }
DelayLinkLocation = ( BYTE * ) ( m_RecompPos - 1 ) ;
CPU_Message ( " " ) ;
CPU_Message ( " %s: " , m_Section - > m_Cont . BranchLabel . c_str ( ) ) ;
SetJump32 ( m_Section - > m_Cont . LinkLocation , ( DWORD * ) m_RecompPos ) ;
m_Section - > m_Cont . LinkLocation = NULL ;
if ( m_Section - > m_Cont . LinkLocation2 ! = NULL ) {
SetJump32 ( m_Section - > m_Cont . LinkLocation2 , ( DWORD * ) m_RecompPos ) ;
m_Section - > m_Cont . LinkLocation2 = NULL ;
}
MoveConstToVariable ( m_Section - > m_Cont . TargetPC , & R4300iOp : : m_JumpToLocation , " R4300iOp::m_JumpToLocation " ) ;
2012-09-25 05:58:06 +00:00
}
if ( DelayLinkLocation )
{
CPU_Message ( " " ) ;
CPU_Message ( " DoDelaySlot: " ) ;
SetJump8 ( DelayLinkLocation , m_RecompPos ) ;
}
2012-09-26 00:38:29 +00:00
OverflowDelaySlot ( false ) ;
2012-09-25 05:58:06 +00:00
return ;
}
2010-06-04 06:25:07 +00:00
ResetX86Protection ( ) ;
2010-05-30 01:54:42 +00:00
memcpy ( & RegBeforeDelay , & m_RegWorkingSet , sizeof ( CRegInfo ) ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
m_NextInstruction = DO_DELAY_SLOT ;
} else if ( m_NextInstruction = = DELAY_SLOT_DONE ) {
2010-05-25 09:15:19 +00:00
if ( EffectDelaySlot ) {
2010-05-30 01:54:42 +00:00
CJumpInfo * FallInfo = m_Section - > m_Jump . FallThrough ? & m_Section - > m_Jump : & m_Section - > m_Cont ;
CJumpInfo * JumpInfo = m_Section - > m_Jump . FallThrough ? & m_Section - > m_Cont : & m_Section - > m_Jump ;
2010-05-25 09:15:19 +00:00
if ( FallInfo - > FallThrough & & ! FallInfo - > DoneDelaySlot ) {
2010-06-04 06:25:07 +00:00
ResetX86Protection ( ) ;
2010-05-30 01:54:42 +00:00
FallInfo - > RegSet = m_RegWorkingSet ;
if ( FallInfo = = & m_Section - > m_Jump ) {
if ( m_Section - > m_JumpSection ! = NULL ) {
2010-05-31 00:21:08 +00:00
m_Section - > m_Jump . BranchLabel . Format ( " Section_%d " , m_Section - > m_JumpSection - > m_SectionID ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
m_Section - > m_Jump . BranchLabel = " ExitBlock " ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
if ( FallInfo - > TargetPC < = m_CompilePC )
2010-05-25 09:15:19 +00:00
{
2010-06-14 21:14:58 +00:00
UpdateCounters ( m_Section - > m_Jump . RegSet , true , true ) ;
2010-10-29 03:20:25 +00:00
CPU_Message ( " CompileSystemCheck 12 " ) ;
CompileSystemCheck ( FallInfo - > TargetPC , m_Section - > m_Jump . RegSet ) ;
2010-06-04 06:25:07 +00:00
ResetX86Protection ( ) ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-05-30 01:54:42 +00:00
if ( m_Section - > m_ContinueSection ! = NULL ) {
2010-05-31 00:21:08 +00:00
m_Section - > m_Cont . BranchLabel . Format ( " Section_%d " , m_Section - > m_ContinueSection - > m_SectionID ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
m_Section - > m_Cont . BranchLabel = " ExitBlock " ;
2010-05-25 09:15:19 +00:00
}
}
FallInfo - > DoneDelaySlot = TRUE ;
if ( ! JumpInfo - > DoneDelaySlot ) {
FallInfo - > FallThrough = FALSE ;
2010-05-31 00:21:08 +00:00
JmpLabel32 ( FallInfo - > BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
FallInfo - > LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
if ( JumpInfo - > LinkLocation ! = NULL ) {
2010-06-04 06:25:07 +00:00
CPU_Message ( " %s: " , JumpInfo - > BranchLabel . c_str ( ) ) ;
2010-05-30 01:54:42 +00:00
SetJump32 ( ( DWORD * ) JumpInfo - > LinkLocation , ( DWORD * ) m_RecompPos ) ;
2010-05-25 09:15:19 +00:00
JumpInfo - > LinkLocation = NULL ;
if ( JumpInfo - > LinkLocation2 ! = NULL ) {
2010-05-30 01:54:42 +00:00
SetJump32 ( ( DWORD * ) JumpInfo - > LinkLocation2 , ( DWORD * ) m_RecompPos ) ;
2010-05-25 09:15:19 +00:00
JumpInfo - > LinkLocation2 = NULL ;
}
JumpInfo - > FallThrough = TRUE ;
2010-05-30 01:54:42 +00:00
m_NextInstruction = DO_DELAY_SLOT ;
2010-06-14 21:14:58 +00:00
m_RegWorkingSet = RegBeforeDelay ;
2010-05-25 09:15:19 +00:00
return ;
}
}
}
} else {
2010-10-23 18:53:01 +00:00
if ( m_Section - > m_Jump . TargetPC ! = m_Section - > m_Cont . TargetPC )
{
CompareFunc ( ) ;
ResetX86Protection ( ) ;
m_Section - > m_Cont . RegSet = m_RegWorkingSet ;
m_Section - > m_Jump . RegSet = m_RegWorkingSet ;
} else {
m_Section - > m_Jump . FallThrough = false ;
m_Section - > m_Cont . FallThrough = true ;
m_Section - > m_Cont . RegSet = m_RegWorkingSet ;
if ( m_Section - > m_ContinueSection = = NULL & & m_Section - > m_JumpSection ! = NULL )
{
m_Section - > m_ContinueSection = m_Section - > m_JumpSection ;
m_Section - > m_JumpSection = NULL ;
}
if ( m_Section - > m_ContinueSection ! = NULL ) {
m_Section - > m_Cont . BranchLabel . Format ( " Section_%d " , m_Section - > m_ContinueSection - > m_SectionID ) ;
} else {
m_Section - > m_Cont . BranchLabel = " ExitBlock " ;
}
}
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
m_Section - > GenerateSectionLinkage ( ) ;
m_NextInstruction = END_BLOCK ;
2010-05-25 09:15:19 +00:00
} else {
# ifndef EXTERNAL_RELEASE
2010-05-30 01:54:42 +00:00
DisplayError ( " WTF \n \n Branch \n NextInstruction = %X " , m_NextInstruction ) ;
2010-05-25 09:15:19 +00:00
# endif
}
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : Compile_BranchLikely ( BranchFunction CompareFunc , BOOL Link )
{
if ( m_NextInstruction = = NORMAL ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-25 09:15:19 +00:00
2010-10-23 18:53:01 +00:00
m_Section - > m_Jump . JumpPC = m_CompilePC ;
2010-06-04 06:25:07 +00:00
m_Section - > m_Jump . TargetPC = m_CompilePC + ( ( short ) m_Opcode . offset < < 2 ) + 4 ;
2010-05-30 01:54:42 +00:00
if ( m_Section - > m_JumpSection ! = NULL ) {
2010-06-04 06:25:07 +00:00
m_Section - > m_Jump . BranchLabel . Format ( " Section_%d " , ( ( CCodeSection * ) m_Section - > m_JumpSection ) - > m_SectionID ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-06-04 06:25:07 +00:00
m_Section - > m_Jump . BranchLabel = " ExitBlock " ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . FallThrough = TRUE ;
m_Section - > m_Jump . LinkLocation = NULL ;
m_Section - > m_Jump . LinkLocation2 = NULL ;
2010-10-23 18:53:01 +00:00
m_Section - > m_Cont . JumpPC = m_CompilePC ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . TargetPC = m_CompilePC + 8 ;
2010-06-04 06:25:07 +00:00
if ( m_Section - > m_ContinueSection ! = NULL ) {
m_Section - > m_Cont . BranchLabel . Format ( " Section_%d " , ( ( CCodeSection * ) m_Section - > m_ContinueSection ) - > m_SectionID ) ;
} else {
m_Section - > m_Cont . BranchLabel = " ExitBlock " ;
}
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . FallThrough = FALSE ;
m_Section - > m_Cont . LinkLocation = NULL ;
m_Section - > m_Cont . LinkLocation2 = NULL ;
2010-05-25 09:15:19 +00:00
if ( Link ) {
2010-05-30 01:54:42 +00:00
UnMap_GPR ( 31 , FALSE ) ;
2010-06-04 06:25:07 +00:00
MipsRegLo ( 31 ) = m_CompilePC + 8 ;
2010-05-30 01:54:42 +00:00
MipsRegState ( 31 ) = CRegInfo : : STATE_CONST_32 ;
2010-05-25 09:15:19 +00:00
}
2010-06-04 06:25:07 +00:00
CompareFunc ( ) ;
ResetX86Protection ( ) ;
2010-06-14 21:14:58 +00:00
m_Section - > m_Cont . RegSet = m_RegWorkingSet ;
2010-11-12 05:30:08 +00:00
if ( m_Section - > m_Cont . FallThrough ) {
if ( m_Section - > m_Jump . LinkLocation ! = NULL ) {
# ifndef EXTERNAL_RELEASE
DisplayError ( " WTF .. problem with CRecompilerOps::BranchLikely " ) ;
# endif
2010-05-25 09:15:19 +00:00
}
2010-06-04 06:25:07 +00:00
m_Section - > GenerateSectionLinkage ( ) ;
2010-05-30 01:54:42 +00:00
m_NextInstruction = END_BLOCK ;
2010-05-25 09:15:19 +00:00
} else {
2010-11-12 05:30:08 +00:00
if ( ( m_CompilePC & 0xFFC ) = = 0xFFC ) {
2012-09-25 05:58:06 +00:00
if ( m_Section - > m_Cont . FallThrough ) { _Notify - > BreakPoint ( __FILE__ , __LINE__ ) ; }
2010-05-30 01:54:42 +00:00
if ( m_Section - > m_Jump . LinkLocation ! = NULL ) {
2010-11-12 05:30:08 +00:00
SetJump32 ( m_Section - > m_Jump . LinkLocation , ( DWORD * ) m_RecompPos ) ;
m_Section - > m_Jump . LinkLocation = NULL ;
if ( m_Section - > m_Jump . LinkLocation2 ! = NULL ) {
SetJump32 ( m_Section - > m_Jump . LinkLocation2 , ( DWORD * ) m_RecompPos ) ;
m_Section - > m_Jump . LinkLocation2 = NULL ;
}
2010-05-25 09:15:19 +00:00
}
2012-09-25 05:58:06 +00:00
MoveConstToVariable ( m_Section - > m_Jump . TargetPC , & R4300iOp : : m_JumpToLocation , " R4300iOp::m_JumpToLocation " ) ;
2012-09-26 00:38:29 +00:00
OverflowDelaySlot ( false ) ;
2010-11-12 05:30:08 +00:00
CPU_Message ( " " ) ;
CPU_Message ( " %s: " , m_Section - > m_Cont . BranchLabel . c_str ( ) ) ;
if ( m_Section - > m_Cont . LinkLocation ! = NULL ) {
SetJump32 ( m_Section - > m_Cont . LinkLocation , ( DWORD * ) m_RecompPos ) ;
m_Section - > m_Cont . LinkLocation = NULL ;
if ( m_Section - > m_Cont . LinkLocation2 ! = NULL ) {
SetJump32 ( m_Section - > m_Cont . LinkLocation2 , ( DWORD * ) m_RecompPos ) ;
m_Section - > m_Cont . LinkLocation2 = NULL ;
}
}
m_Section - > CompileExit ( m_CompilePC , m_CompilePC + 8 , m_Section - > m_Cont . RegSet , CExitInfo : : Normal , TRUE , NULL ) ;
2012-09-25 05:58:06 +00:00
return ;
2010-05-25 09:15:19 +00:00
} else {
2010-11-12 05:30:08 +00:00
m_NextInstruction = DO_DELAY_SLOT ;
2010-05-25 09:15:19 +00:00
}
}
2010-05-30 01:54:42 +00:00
} else if ( m_NextInstruction = = DELAY_SLOT_DONE ) {
2010-06-04 06:25:07 +00:00
ResetX86Protection ( ) ;
2010-05-30 01:54:42 +00:00
memcpy ( & m_Section - > m_Jump . RegSet , & m_RegWorkingSet , sizeof ( CRegInfo ) ) ;
2010-06-04 06:25:07 +00:00
m_Section - > GenerateSectionLinkage ( ) ;
2010-05-30 01:54:42 +00:00
m_NextInstruction = END_BLOCK ;
2010-05-25 09:15:19 +00:00
} else {
# ifndef EXTERNAL_RELEASE
2010-05-30 01:54:42 +00:00
DisplayError ( " WTF \n \n BranchLikely \n NextInstruction = %X " , m_NextInstruction ) ;
2010-05-25 09:15:19 +00:00
# endif
}
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : BNE_Compare ( void )
{
2010-10-23 18:53:01 +00:00
BYTE * Jump = NULL ;
2010-05-25 09:15:19 +00:00
2010-09-22 21:43:42 +00:00
if ( IsKnown ( m_Opcode . rs ) & & IsKnown ( m_Opcode . rt ) ) {
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rs ) & & IsConst ( m_Opcode . rt ) ) {
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( m_Opcode . rs ) | | Is64Bit ( m_Opcode . rt ) ) {
2010-05-30 01:54:42 +00:00
CRecompilerOps : : UnknownOpcode ( ) ;
} else if ( cMipsRegLo ( m_Opcode . rs ) ! = cMipsRegLo ( m_Opcode . rt ) ) {
m_Section - > m_Jump . FallThrough = TRUE ;
m_Section - > m_Cont . FallThrough = FALSE ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . FallThrough = FALSE ;
m_Section - > m_Cont . FallThrough = TRUE ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
} else if ( IsMapped ( m_Opcode . rs ) & & IsMapped ( m_Opcode . rt ) ) {
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( m_Opcode . rs ) | | Is64Bit ( m_Opcode . rt ) ) {
2010-05-30 01:54:42 +00:00
ProtectGPR ( m_Opcode . rs ) ;
ProtectGPR ( m_Opcode . rt ) ;
2010-05-25 09:15:19 +00:00
CompX86RegToX86Reg (
2010-09-22 21:43:42 +00:00
Is32Bit ( m_Opcode . rs ) ? Map_TempReg ( x86_Any , m_Opcode . rs , TRUE ) : MipsRegMapHi ( m_Opcode . rs ) ,
Is32Bit ( m_Opcode . rt ) ? Map_TempReg ( x86_Any , m_Opcode . rt , TRUE ) : MipsRegMapHi ( m_Opcode . rt )
2010-05-25 09:15:19 +00:00
) ;
2010-05-30 01:54:42 +00:00
if ( m_Section - > m_Jump . FallThrough ) {
2010-05-25 09:15:19 +00:00
JneLabel8 ( " continue " , 0 ) ;
2010-05-30 01:54:42 +00:00
Jump = m_RecompPos - 1 ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
JneLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
CompX86RegToX86Reg ( cMipsRegMapLo ( m_Opcode . rs ) , cMipsRegMapLo ( m_Opcode . rt ) ) ;
if ( m_Section - > m_Cont . FallThrough ) {
2010-05-31 00:21:08 +00:00
JneLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation2 = ( DWORD * ) ( m_RecompPos - 4 ) ;
} else if ( m_Section - > m_Jump . FallThrough ) {
2010-05-31 00:21:08 +00:00
JeLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
CPU_Message ( " " ) ;
CPU_Message ( " continue: " ) ;
2010-05-30 01:54:42 +00:00
SetJump8 ( Jump , m_RecompPos ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
JeLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-31 00:21:08 +00:00
JmpLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation2 = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-05-30 01:54:42 +00:00
CompX86RegToX86Reg ( cMipsRegMapLo ( m_Opcode . rs ) , cMipsRegMapLo ( m_Opcode . rt ) ) ;
if ( m_Section - > m_Cont . FallThrough ) {
2010-05-31 00:21:08 +00:00
JneLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
} else if ( m_Section - > m_Jump . FallThrough ) {
2010-05-31 00:21:08 +00:00
JeLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
JeLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-31 00:21:08 +00:00
JmpLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
}
}
} else {
2010-05-30 01:54:42 +00:00
DWORD ConstReg = IsConst ( m_Opcode . rt ) ? m_Opcode . rt : m_Opcode . rs ;
DWORD MappedReg = IsConst ( m_Opcode . rt ) ? m_Opcode . rs : m_Opcode . rt ;
2010-05-25 09:15:19 +00:00
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( ConstReg ) | | Is64Bit ( MappedReg ) ) {
2010-09-22 21:43:42 +00:00
if ( Is32Bit ( ConstReg ) | | Is32Bit ( MappedReg ) ) {
2010-05-30 01:54:42 +00:00
ProtectGPR ( MappedReg ) ;
2010-09-22 21:43:42 +00:00
if ( Is32Bit ( MappedReg ) ) {
2010-05-31 00:21:08 +00:00
CompConstToX86reg ( Map_TempReg ( x86_Any , MappedReg , TRUE ) , MipsRegHi ( ConstReg ) ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-06-04 06:25:07 +00:00
CompConstToX86reg ( MipsRegMapHi ( MappedReg ) , cMipsRegLo_S ( ConstReg ) > > 31 ) ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-06-04 06:25:07 +00:00
CompConstToX86reg ( MipsRegMapHi ( MappedReg ) , MipsRegHi ( ConstReg ) ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
if ( m_Section - > m_Jump . FallThrough ) {
2010-05-25 09:15:19 +00:00
JneLabel8 ( " continue " , 0 ) ;
2010-05-30 01:54:42 +00:00
Jump = m_RecompPos - 1 ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
JneLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
CompConstToX86reg ( cMipsRegMapLo ( MappedReg ) , cMipsRegLo ( ConstReg ) ) ;
if ( m_Section - > m_Cont . FallThrough ) {
2010-05-31 00:21:08 +00:00
JneLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation2 = ( DWORD * ) ( m_RecompPos - 4 ) ;
} else if ( m_Section - > m_Jump . FallThrough ) {
2010-05-31 00:21:08 +00:00
JeLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
CPU_Message ( " " ) ;
CPU_Message ( " continue: " ) ;
2010-05-30 01:54:42 +00:00
SetJump8 ( Jump , m_RecompPos ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
JeLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-31 00:21:08 +00:00
JmpLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation2 = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-05-30 01:54:42 +00:00
CompConstToX86reg ( cMipsRegMapLo ( MappedReg ) , cMipsRegLo ( ConstReg ) ) ;
if ( m_Section - > m_Cont . FallThrough ) {
2010-05-31 00:21:08 +00:00
JneLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
} else if ( m_Section - > m_Jump . FallThrough ) {
2010-05-31 00:21:08 +00:00
JeLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
JeLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-31 00:21:08 +00:00
JmpLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
}
}
}
2010-09-22 21:43:42 +00:00
} else if ( IsKnown ( m_Opcode . rs ) | | IsKnown ( m_Opcode . rt ) ) {
DWORD KnownReg = IsKnown ( m_Opcode . rt ) ? m_Opcode . rt : m_Opcode . rs ;
DWORD UnknownReg = IsKnown ( m_Opcode . rt ) ? m_Opcode . rs : m_Opcode . rt ;
2010-05-25 09:15:19 +00:00
2010-10-23 18:53:01 +00:00
if ( ! b32BitCore ( ) )
{
if ( IsConst ( KnownReg ) ) {
if ( Is64Bit ( KnownReg ) ) {
CompConstToVariable ( MipsRegHi ( KnownReg ) , & _GPR [ UnknownReg ] . W [ 1 ] , CRegName : : GPR_Hi [ UnknownReg ] ) ;
} else if ( IsSigned ( KnownReg ) ) {
CompConstToVariable ( ( cMipsRegLo_S ( KnownReg ) > > 31 ) , & _GPR [ UnknownReg ] . W [ 1 ] , CRegName : : GPR_Hi [ UnknownReg ] ) ;
} else {
CompConstToVariable ( 0 , & _GPR [ UnknownReg ] . W [ 1 ] , CRegName : : GPR_Hi [ UnknownReg ] ) ;
}
2010-05-25 09:15:19 +00:00
} else {
2010-10-23 18:53:01 +00:00
if ( Is64Bit ( KnownReg ) ) {
CompX86regToVariable ( MipsRegMapHi ( KnownReg ) , & _GPR [ UnknownReg ] . W [ 1 ] , CRegName : : GPR_Hi [ UnknownReg ] ) ;
} else if ( IsSigned ( KnownReg ) ) {
ProtectGPR ( KnownReg ) ;
CompX86regToVariable ( Map_TempReg ( x86_Any , KnownReg , TRUE ) , & _GPR [ UnknownReg ] . W [ 1 ] , CRegName : : GPR_Hi [ UnknownReg ] ) ;
} else {
CompConstToVariable ( 0 , & _GPR [ UnknownReg ] . W [ 1 ] , CRegName : : GPR_Hi [ UnknownReg ] ) ;
}
2010-05-25 09:15:19 +00:00
}
2010-10-23 18:53:01 +00:00
if ( m_Section - > m_Jump . FallThrough ) {
JneLabel8 ( " continue " , 0 ) ;
Jump = m_RecompPos - 1 ;
2010-05-25 09:15:19 +00:00
} else {
2010-10-23 18:53:01 +00:00
JneLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
}
}
2010-05-30 01:54:42 +00:00
if ( IsConst ( KnownReg ) ) {
CompConstToVariable ( cMipsRegLo ( KnownReg ) , & _GPR [ UnknownReg ] . W [ 0 ] , CRegName : : GPR_Lo [ UnknownReg ] ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
CompX86regToVariable ( cMipsRegMapLo ( KnownReg ) , & _GPR [ UnknownReg ] . W [ 0 ] , CRegName : : GPR_Lo [ UnknownReg ] ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
if ( m_Section - > m_Cont . FallThrough ) {
2010-05-31 00:21:08 +00:00
JneLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-10-23 18:53:01 +00:00
if ( b32BitCore ( ) )
{
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
} else {
m_Section - > m_Jump . LinkLocation2 = ( DWORD * ) ( m_RecompPos - 4 ) ;
}
2010-05-30 01:54:42 +00:00
} else if ( m_Section - > m_Jump . FallThrough ) {
2010-05-31 00:21:08 +00:00
JeLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-10-23 18:53:01 +00:00
if ( Jump )
{
CPU_Message ( " " ) ;
CPU_Message ( " continue: " ) ;
SetJump8 ( Jump , m_RecompPos ) ;
}
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
JeLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-31 00:21:08 +00:00
JmpLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-10-23 18:53:01 +00:00
if ( b32BitCore ( ) )
{
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
} else {
m_Section - > m_Jump . LinkLocation2 = ( DWORD * ) ( m_RecompPos - 4 ) ;
}
2010-05-25 09:15:19 +00:00
}
} else {
2010-10-23 18:53:01 +00:00
x86Reg Reg = x86_Any ;
2010-05-25 09:15:19 +00:00
2010-10-23 18:53:01 +00:00
if ( ! b32BitCore ( ) )
{
Reg = Map_TempReg ( x86_Any , m_Opcode . rt , TRUE ) ;
CompX86regToVariable ( Reg , & _GPR [ m_Opcode . rs ] . W [ 1 ] , CRegName : : GPR_Hi [ m_Opcode . rs ] ) ;
if ( m_Section - > m_Jump . FallThrough ) {
JneLabel8 ( " continue " , 0 ) ;
Jump = m_RecompPos - 1 ;
} else {
JneLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
}
2010-05-25 09:15:19 +00:00
}
2010-05-31 00:21:08 +00:00
Reg = Map_TempReg ( Reg , m_Opcode . rt , FALSE ) ;
2010-05-30 01:54:42 +00:00
CompX86regToVariable ( Reg , & _GPR [ m_Opcode . rs ] . W [ 0 ] , CRegName : : GPR_Lo [ m_Opcode . rs ] ) ;
if ( m_Section - > m_Cont . FallThrough ) {
2010-05-31 00:21:08 +00:00
JneLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-10-23 18:53:01 +00:00
if ( b32BitCore ( ) )
{
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
} else {
m_Section - > m_Jump . LinkLocation2 = ( DWORD * ) ( m_RecompPos - 4 ) ;
}
2010-05-30 01:54:42 +00:00
} else if ( m_Section - > m_Jump . FallThrough ) {
2010-05-31 00:21:08 +00:00
JeLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-10-23 18:53:01 +00:00
if ( Jump )
{
CPU_Message ( " " ) ;
CPU_Message ( " continue: " ) ;
SetJump8 ( Jump , m_RecompPos ) ;
}
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
JeLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-31 00:21:08 +00:00
JmpLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-10-23 18:53:01 +00:00
if ( b32BitCore ( ) )
{
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
} else {
m_Section - > m_Jump . LinkLocation2 = ( DWORD * ) ( m_RecompPos - 4 ) ;
}
2010-05-25 09:15:19 +00:00
}
}
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : BEQ_Compare ( void ) {
2010-10-23 18:53:01 +00:00
BYTE * Jump = NULL ;
2010-05-25 09:15:19 +00:00
2010-09-22 21:43:42 +00:00
if ( IsKnown ( m_Opcode . rs ) & & IsKnown ( m_Opcode . rt ) ) {
2010-10-23 18:53:01 +00:00
if ( IsConst ( m_Opcode . rs ) & & IsConst ( m_Opcode . rt ) ) {
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( m_Opcode . rs ) | | Is64Bit ( m_Opcode . rt ) ) {
2010-05-30 01:54:42 +00:00
CRecompilerOps : : UnknownOpcode ( ) ;
} else if ( cMipsRegLo ( m_Opcode . rs ) = = cMipsRegLo ( m_Opcode . rt ) ) {
m_Section - > m_Jump . FallThrough = TRUE ;
m_Section - > m_Cont . FallThrough = FALSE ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . FallThrough = FALSE ;
m_Section - > m_Cont . FallThrough = TRUE ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
} else if ( IsMapped ( m_Opcode . rs ) & & IsMapped ( m_Opcode . rt ) ) {
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( m_Opcode . rs ) | | Is64Bit ( m_Opcode . rt ) ) {
2010-05-30 01:54:42 +00:00
ProtectGPR ( m_Opcode . rs ) ;
ProtectGPR ( m_Opcode . rt ) ;
2010-05-25 09:15:19 +00:00
CompX86RegToX86Reg (
2010-09-22 21:43:42 +00:00
Is32Bit ( m_Opcode . rs ) ? Map_TempReg ( x86_Any , m_Opcode . rs , TRUE ) : MipsRegMapHi ( m_Opcode . rs ) ,
Is32Bit ( m_Opcode . rt ) ? Map_TempReg ( x86_Any , m_Opcode . rt , TRUE ) : MipsRegMapHi ( m_Opcode . rt )
2010-05-25 09:15:19 +00:00
) ;
2010-05-30 01:54:42 +00:00
if ( m_Section - > m_Cont . FallThrough ) {
2010-05-25 09:15:19 +00:00
JneLabel8 ( " continue " , 0 ) ;
2010-05-30 01:54:42 +00:00
Jump = m_RecompPos - 1 ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
JneLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
CompX86RegToX86Reg ( cMipsRegMapLo ( m_Opcode . rs ) , cMipsRegMapLo ( m_Opcode . rt ) ) ;
if ( m_Section - > m_Cont . FallThrough ) {
2010-05-31 00:21:08 +00:00
JeLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
CPU_Message ( " " ) ;
CPU_Message ( " continue: " ) ;
2010-05-30 01:54:42 +00:00
SetJump8 ( Jump , m_RecompPos ) ;
} else if ( m_Section - > m_Jump . FallThrough ) {
2010-05-31 00:21:08 +00:00
JneLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation2 = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
JneLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation2 = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-31 00:21:08 +00:00
JmpLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-05-30 01:54:42 +00:00
CompX86RegToX86Reg ( cMipsRegMapLo ( m_Opcode . rs ) , cMipsRegMapLo ( m_Opcode . rt ) ) ;
if ( m_Section - > m_Cont . FallThrough ) {
2010-05-31 00:21:08 +00:00
JeLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
} else if ( m_Section - > m_Jump . FallThrough ) {
2010-05-31 00:21:08 +00:00
JneLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
JneLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-31 00:21:08 +00:00
JmpLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
}
}
} else {
2010-05-30 01:54:42 +00:00
DWORD ConstReg = IsConst ( m_Opcode . rt ) ? m_Opcode . rt : m_Opcode . rs ;
DWORD MappedReg = IsConst ( m_Opcode . rt ) ? m_Opcode . rs : m_Opcode . rt ;
2010-05-25 09:15:19 +00:00
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( ConstReg ) | | Is64Bit ( MappedReg ) ) {
2010-09-22 21:43:42 +00:00
if ( Is32Bit ( ConstReg ) | | Is32Bit ( MappedReg ) ) {
if ( Is32Bit ( MappedReg ) ) {
2010-05-30 01:54:42 +00:00
ProtectGPR ( MappedReg ) ;
2010-05-31 00:21:08 +00:00
CompConstToX86reg ( Map_TempReg ( x86_Any , MappedReg , TRUE ) , MipsRegHi ( ConstReg ) ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-06-04 06:25:07 +00:00
CompConstToX86reg ( MipsRegMapHi ( MappedReg ) , cMipsRegLo_S ( ConstReg ) > > 31 ) ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-06-04 06:25:07 +00:00
CompConstToX86reg ( MipsRegMapHi ( MappedReg ) , MipsRegHi ( ConstReg ) ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
if ( m_Section - > m_Cont . FallThrough ) {
2010-05-25 09:15:19 +00:00
JneLabel8 ( " continue " , 0 ) ;
2010-05-30 01:54:42 +00:00
Jump = m_RecompPos - 1 ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
JneLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
}
2010-06-04 06:25:07 +00:00
CompConstToX86reg ( cMipsRegMapLo ( MappedReg ) , cMipsRegLo ( ConstReg ) ) ;
2010-05-30 01:54:42 +00:00
if ( m_Section - > m_Cont . FallThrough ) {
2010-05-31 00:21:08 +00:00
JeLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
CPU_Message ( " " ) ;
CPU_Message ( " continue: " ) ;
2010-05-30 01:54:42 +00:00
SetJump8 ( Jump , m_RecompPos ) ;
} else if ( m_Section - > m_Jump . FallThrough ) {
2010-05-31 00:21:08 +00:00
JneLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation2 = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
JneLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation2 = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-31 00:21:08 +00:00
JmpLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-06-04 06:25:07 +00:00
CompConstToX86reg ( cMipsRegMapLo ( MappedReg ) , cMipsRegLo ( ConstReg ) ) ;
2010-05-30 01:54:42 +00:00
if ( m_Section - > m_Cont . FallThrough ) {
2010-05-31 00:21:08 +00:00
JeLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
} else if ( m_Section - > m_Jump . FallThrough ) {
2010-05-31 00:21:08 +00:00
JneLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
JneLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-31 00:21:08 +00:00
JmpLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
}
}
}
2010-09-22 21:43:42 +00:00
} else if ( IsKnown ( m_Opcode . rs ) | | IsKnown ( m_Opcode . rt ) ) {
DWORD KnownReg = IsKnown ( m_Opcode . rt ) ? m_Opcode . rt : m_Opcode . rs ;
DWORD UnknownReg = IsKnown ( m_Opcode . rt ) ? m_Opcode . rs : m_Opcode . rt ;
2010-05-25 09:15:19 +00:00
2010-10-23 18:53:01 +00:00
if ( ! b32BitCore ( ) )
{
if ( IsConst ( KnownReg ) ) {
if ( Is64Bit ( KnownReg ) ) {
CompConstToVariable ( MipsRegHi ( KnownReg ) , & _GPR [ UnknownReg ] . W [ 1 ] , CRegName : : GPR_Hi [ UnknownReg ] ) ;
} else if ( IsSigned ( KnownReg ) ) {
CompConstToVariable ( cMipsRegLo_S ( KnownReg ) > > 31 , & _GPR [ UnknownReg ] . W [ 1 ] , CRegName : : GPR_Hi [ UnknownReg ] ) ;
} else {
CompConstToVariable ( 0 , & _GPR [ UnknownReg ] . W [ 1 ] , CRegName : : GPR_Hi [ UnknownReg ] ) ;
}
2010-05-25 09:15:19 +00:00
} else {
2010-10-23 18:53:01 +00:00
ProtectGPR ( KnownReg ) ;
if ( Is64Bit ( KnownReg ) ) {
CompX86regToVariable ( cMipsRegMapHi ( KnownReg ) , & _GPR [ UnknownReg ] . W [ 1 ] , CRegName : : GPR_Hi [ UnknownReg ] ) ;
} else if ( IsSigned ( KnownReg ) ) {
CompX86regToVariable ( Map_TempReg ( x86_Any , KnownReg , TRUE ) , & _GPR [ UnknownReg ] . W [ 1 ] , CRegName : : GPR_Hi [ UnknownReg ] ) ;
} else {
CompConstToVariable ( 0 , & _GPR [ UnknownReg ] . W [ 1 ] , CRegName : : GPR_Hi [ UnknownReg ] ) ;
}
2010-05-25 09:15:19 +00:00
}
2010-10-23 18:53:01 +00:00
if ( m_Section - > m_Cont . FallThrough ) {
JneLabel8 ( " continue " , 0 ) ;
Jump = m_RecompPos - 1 ;
2010-05-25 09:15:19 +00:00
} else {
2010-10-23 18:53:01 +00:00
JneLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
}
}
2010-05-30 01:54:42 +00:00
if ( IsConst ( KnownReg ) ) {
CompConstToVariable ( cMipsRegLo ( KnownReg ) , & _GPR [ UnknownReg ] . W [ 0 ] , CRegName : : GPR_Lo [ UnknownReg ] ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
CompX86regToVariable ( cMipsRegMapLo ( KnownReg ) , & _GPR [ UnknownReg ] . W [ 0 ] , CRegName : : GPR_Lo [ UnknownReg ] ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
if ( m_Section - > m_Cont . FallThrough ) {
2010-05-31 00:21:08 +00:00
JeLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-10-23 18:53:01 +00:00
if ( Jump )
{
CPU_Message ( " " ) ;
CPU_Message ( " continue: " ) ;
SetJump8 ( Jump , m_RecompPos ) ;
}
2010-05-30 01:54:42 +00:00
} else if ( m_Section - > m_Jump . FallThrough ) {
2010-05-31 00:21:08 +00:00
JneLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-10-23 18:53:01 +00:00
if ( b32BitCore ( ) )
{
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
} else {
m_Section - > m_Cont . LinkLocation2 = ( DWORD * ) ( m_RecompPos - 4 ) ;
}
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
JneLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation2 = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-31 00:21:08 +00:00
JmpLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-10-23 18:53:01 +00:00
x86Reg Reg = x86_Any ;
if ( ! b32BitCore ( ) )
{
Reg = Map_TempReg ( x86_Any , m_Opcode . rs , TRUE ) ;
CompX86regToVariable ( Reg , & _GPR [ m_Opcode . rt ] . W [ 1 ] , CRegName : : GPR_Hi [ m_Opcode . rt ] ) ;
if ( m_Section - > m_Cont . FallThrough ) {
JneLabel8 ( " continue " , 0 ) ;
Jump = m_RecompPos - 1 ;
} else {
JneLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
}
2010-05-25 09:15:19 +00:00
}
2010-05-31 00:21:08 +00:00
CompX86regToVariable ( Map_TempReg ( Reg , m_Opcode . rs , FALSE ) , & _GPR [ m_Opcode . rt ] . W [ 0 ] , CRegName : : GPR_Lo [ m_Opcode . rt ] ) ;
2010-05-30 01:54:42 +00:00
if ( m_Section - > m_Cont . FallThrough ) {
2010-05-31 00:21:08 +00:00
JeLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-10-23 18:53:01 +00:00
if ( Jump )
{
CPU_Message ( " " ) ;
CPU_Message ( " continue: " ) ;
SetJump8 ( Jump , m_RecompPos ) ;
}
2010-05-30 01:54:42 +00:00
} else if ( m_Section - > m_Jump . FallThrough ) {
2010-05-31 00:21:08 +00:00
JneLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-10-23 18:53:01 +00:00
if ( b32BitCore ( ) )
{
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
} else {
m_Section - > m_Cont . LinkLocation2 = ( DWORD * ) ( m_RecompPos - 4 ) ;
}
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
JneLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-10-23 18:53:01 +00:00
if ( b32BitCore ( ) )
{
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
} else {
m_Section - > m_Cont . LinkLocation2 = ( DWORD * ) ( m_RecompPos - 4 ) ;
}
2010-05-31 00:21:08 +00:00
JmpLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
}
}
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : BGTZ_Compare ( void ) {
if ( IsConst ( m_Opcode . rs ) ) {
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( m_Opcode . rs ) ) {
2010-09-22 21:43:42 +00:00
if ( MipsReg_S ( m_Opcode . rs ) > 0 ) {
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . FallThrough = TRUE ;
m_Section - > m_Cont . FallThrough = FALSE ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . FallThrough = FALSE ;
m_Section - > m_Cont . FallThrough = TRUE ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-09-22 21:43:42 +00:00
if ( MipsRegLo_S ( m_Opcode . rs ) > 0 ) {
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . FallThrough = TRUE ;
m_Section - > m_Cont . FallThrough = FALSE ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . FallThrough = FALSE ;
m_Section - > m_Cont . FallThrough = TRUE ;
2010-05-25 09:15:19 +00:00
}
}
2010-09-22 21:43:42 +00:00
} else if ( IsMapped ( m_Opcode . rs ) & & Is32Bit ( m_Opcode . rs ) ) {
2010-06-04 06:25:07 +00:00
CompConstToX86reg ( cMipsRegMapLo ( m_Opcode . rs ) , 0 ) ;
2010-05-30 01:54:42 +00:00
if ( m_Section - > m_Jump . FallThrough ) {
2010-05-31 00:21:08 +00:00
JleLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
} else if ( m_Section - > m_Cont . FallThrough ) {
2010-05-31 00:21:08 +00:00
JgLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
JleLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-31 00:21:08 +00:00
JmpLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
}
2010-10-23 18:53:01 +00:00
} else if ( IsUnknown ( m_Opcode . rs ) & & b32BitCore ( ) ) {
CompConstToVariable ( 0 , & _GPR [ m_Opcode . rs ] . W [ 0 ] , CRegName : : GPR_Lo [ m_Opcode . rs ] ) ;
if ( m_Section - > m_Jump . FallThrough ) {
JleLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
} else if ( m_Section - > m_Cont . FallThrough ) {
JgLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
} else {
JleLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
JmpLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
}
2010-05-25 09:15:19 +00:00
} else {
BYTE * Jump ;
2010-05-30 01:54:42 +00:00
if ( IsMapped ( m_Opcode . rs ) ) {
2010-06-04 06:25:07 +00:00
CompConstToX86reg ( MipsRegMapHi ( m_Opcode . rs ) , 0 ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
CompConstToVariable ( 0 , & _GPR [ m_Opcode . rs ] . W [ 1 ] , CRegName : : GPR_Hi [ m_Opcode . rs ] ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
if ( m_Section - > m_Jump . FallThrough ) {
2010-05-31 00:21:08 +00:00
JlLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
JgLabel8 ( " continue " , 0 ) ;
2010-05-30 01:54:42 +00:00
Jump = m_RecompPos - 1 ;
} else if ( m_Section - > m_Cont . FallThrough ) {
2010-05-25 09:15:19 +00:00
JlLabel8 ( " continue " , 0 ) ;
2010-05-30 01:54:42 +00:00
Jump = m_RecompPos - 1 ;
2010-05-31 00:21:08 +00:00
JgLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
JlLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-31 00:21:08 +00:00
JgLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
if ( IsMapped ( m_Opcode . rs ) ) {
2010-06-04 06:25:07 +00:00
CompConstToX86reg ( cMipsRegMapLo ( m_Opcode . rs ) , 0 ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
CompConstToVariable ( 0 , & _GPR [ m_Opcode . rs ] . W [ 0 ] , CRegName : : GPR_Lo [ m_Opcode . rs ] ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
if ( m_Section - > m_Jump . FallThrough ) {
2010-05-31 00:21:08 +00:00
JeLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation2 = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
CPU_Message ( " continue: " ) ;
2010-10-23 18:53:01 +00:00
SetJump8 ( Jump , m_RecompPos ) ;
2010-05-30 01:54:42 +00:00
} else if ( m_Section - > m_Cont . FallThrough ) {
2010-05-31 00:21:08 +00:00
JneLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
CPU_Message ( " continue: " ) ;
2010-10-23 18:53:01 +00:00
SetJump8 ( Jump , m_RecompPos ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
JneLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-31 00:21:08 +00:00
JmpLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation2 = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
}
}
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : BLEZ_Compare ( void ) {
if ( IsConst ( m_Opcode . rs ) ) {
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( m_Opcode . rs ) ) {
2010-09-22 21:43:42 +00:00
if ( MipsReg_S ( m_Opcode . rs ) < = 0 ) {
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . FallThrough = TRUE ;
m_Section - > m_Cont . FallThrough = FALSE ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . FallThrough = FALSE ;
m_Section - > m_Cont . FallThrough = TRUE ;
2010-05-25 09:15:19 +00:00
}
2010-09-22 21:43:42 +00:00
} else if ( IsSigned ( m_Opcode . rs ) ) {
if ( MipsRegLo_S ( m_Opcode . rs ) < = 0 ) {
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . FallThrough = TRUE ;
m_Section - > m_Cont . FallThrough = FALSE ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . FallThrough = FALSE ;
m_Section - > m_Cont . FallThrough = TRUE ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-05-30 01:54:42 +00:00
if ( cMipsRegLo ( m_Opcode . rs ) = = 0 ) {
m_Section - > m_Jump . FallThrough = TRUE ;
m_Section - > m_Cont . FallThrough = FALSE ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . FallThrough = FALSE ;
m_Section - > m_Cont . FallThrough = TRUE ;
2010-05-25 09:15:19 +00:00
}
}
2010-10-23 18:53:01 +00:00
} else if ( IsMapped ( m_Opcode . rs ) ) {
if ( Is32Bit ( m_Opcode . rs ) )
{
2010-06-04 06:25:07 +00:00
CompConstToX86reg ( cMipsRegMapLo ( m_Opcode . rs ) , 0 ) ;
2010-05-30 01:54:42 +00:00
if ( m_Section - > m_Jump . FallThrough ) {
2010-05-31 00:21:08 +00:00
JgLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
} else if ( m_Section - > m_Cont . FallThrough ) {
2010-05-31 00:21:08 +00:00
JleLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
JgLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-31 00:21:08 +00:00
JmpLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
}
} else {
BYTE * Jump ;
2010-05-30 01:54:42 +00:00
if ( IsMapped ( m_Opcode . rs ) ) {
2010-06-04 06:25:07 +00:00
CompConstToX86reg ( MipsRegMapHi ( m_Opcode . rs ) , 0 ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
CompConstToVariable ( 0 , & _GPR [ m_Opcode . rs ] . W [ 1 ] , CRegName : : GPR_Hi [ m_Opcode . rs ] ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
if ( m_Section - > m_Jump . FallThrough ) {
2010-05-31 00:21:08 +00:00
JgLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
JlLabel8 ( " Continue " , 0 ) ;
2010-05-30 01:54:42 +00:00
Jump = m_RecompPos - 1 ;
} else if ( m_Section - > m_Cont . FallThrough ) {
2010-05-25 09:15:19 +00:00
JgLabel8 ( " Continue " , 0 ) ;
2010-05-30 01:54:42 +00:00
Jump = m_RecompPos - 1 ;
2010-05-31 00:21:08 +00:00
JlLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
JgLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-31 00:21:08 +00:00
JlLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
if ( IsMapped ( m_Opcode . rs ) ) {
2010-06-04 06:25:07 +00:00
CompConstToX86reg ( cMipsRegMapLo ( m_Opcode . rs ) , 0 ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
CompConstToVariable ( 0 , & _GPR [ m_Opcode . rs ] . W [ 0 ] , CRegName : : GPR_Lo [ m_Opcode . rs ] ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
if ( m_Section - > m_Jump . FallThrough ) {
2010-05-31 00:21:08 +00:00
JneLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation2 = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
CPU_Message ( " continue: " ) ;
2010-10-23 18:53:01 +00:00
SetJump8 ( Jump , m_RecompPos ) ;
2010-05-30 01:54:42 +00:00
} else if ( m_Section - > m_Cont . FallThrough ) {
2010-05-31 00:21:08 +00:00
JeLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation2 = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
CPU_Message ( " continue: " ) ;
2010-10-23 18:53:01 +00:00
SetJump8 ( Jump , m_RecompPos ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
JneLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation2 = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
JmpLabel32 ( " BranchToJump " , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation2 = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
}
}
2010-10-23 18:53:01 +00:00
} else {
BYTE * Jump = NULL ;
if ( ! b32BitCore ( ) )
{
CompConstToVariable ( 0 , & _GPR [ m_Opcode . rs ] . W [ 1 ] , CRegName : : GPR_Hi [ m_Opcode . rs ] ) ;
if ( m_Section - > m_Jump . FallThrough ) {
JgLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
JlLabel8 ( " Continue " , 0 ) ;
Jump = m_RecompPos - 1 ;
} else if ( m_Section - > m_Cont . FallThrough ) {
JgLabel8 ( " Continue " , 0 ) ;
Jump = m_RecompPos - 1 ;
JlLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
} else {
JgLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
JlLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
}
CompConstToVariable ( 0 , & _GPR [ m_Opcode . rs ] . W [ 0 ] , CRegName : : GPR_Lo [ m_Opcode . rs ] ) ;
if ( m_Section - > m_Jump . FallThrough ) {
JneLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
if ( b32BitCore ( ) )
{
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
} else {
m_Section - > m_Cont . LinkLocation2 = ( DWORD * ) ( m_RecompPos - 4 ) ;
}
if ( Jump )
{
CPU_Message ( " continue: " ) ;
SetJump8 ( Jump , m_RecompPos ) ;
}
} else if ( m_Section - > m_Cont . FallThrough ) {
JeLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
m_Section - > m_Jump . LinkLocation2 = ( DWORD * ) ( m_RecompPos - 4 ) ;
if ( Jump )
{
CPU_Message ( " continue: " ) ;
SetJump8 ( Jump , m_RecompPos ) ;
}
} else {
JneLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
m_Section - > m_Cont . LinkLocation2 = ( DWORD * ) ( m_RecompPos - 4 ) ;
JmpLabel32 ( " BranchToJump " , 0 ) ;
m_Section - > m_Jump . LinkLocation2 = ( DWORD * ) ( m_RecompPos - 4 ) ;
}
} else {
CompConstToVariable ( 0 , & _GPR [ m_Opcode . rs ] . W [ 0 ] , CRegName : : GPR_Lo [ m_Opcode . rs ] ) ;
if ( m_Section - > m_Jump . FallThrough ) {
JgLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
} else if ( m_Section - > m_Cont . FallThrough ) {
JleLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
} else {
JgLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
JmpLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
}
}
2010-05-25 09:15:19 +00:00
}
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : BLTZ_Compare ( void ) {
if ( IsConst ( m_Opcode . rs ) ) {
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( m_Opcode . rs ) ) {
2010-09-22 21:43:42 +00:00
if ( MipsReg_S ( m_Opcode . rs ) < 0 ) {
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . FallThrough = TRUE ;
m_Section - > m_Cont . FallThrough = FALSE ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . FallThrough = FALSE ;
m_Section - > m_Cont . FallThrough = TRUE ;
2010-05-25 09:15:19 +00:00
}
2010-09-22 21:43:42 +00:00
} else if ( IsSigned ( m_Opcode . rs ) ) {
if ( MipsRegLo_S ( m_Opcode . rs ) < 0 ) {
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . FallThrough = TRUE ;
m_Section - > m_Cont . FallThrough = FALSE ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . FallThrough = FALSE ;
m_Section - > m_Cont . FallThrough = TRUE ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . FallThrough = FALSE ;
m_Section - > m_Cont . FallThrough = TRUE ;
}
} else if ( IsMapped ( m_Opcode . rs ) ) {
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( m_Opcode . rs ) ) {
CompConstToX86reg ( MipsRegMapHi ( m_Opcode . rs ) , 0 ) ;
2010-05-30 01:54:42 +00:00
if ( m_Section - > m_Jump . FallThrough ) {
2010-05-31 00:21:08 +00:00
JgeLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
} else if ( m_Section - > m_Cont . FallThrough ) {
2010-05-31 00:21:08 +00:00
JlLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
JgeLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-31 00:21:08 +00:00
JmpLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
}
2010-09-22 21:43:42 +00:00
} else if ( IsSigned ( m_Opcode . rs ) ) {
2010-06-04 06:25:07 +00:00
CompConstToX86reg ( cMipsRegMapLo ( m_Opcode . rs ) , 0 ) ;
2010-05-30 01:54:42 +00:00
if ( m_Section - > m_Jump . FallThrough ) {
2010-05-31 00:21:08 +00:00
JgeLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
} else if ( m_Section - > m_Cont . FallThrough ) {
2010-05-31 00:21:08 +00:00
JlLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
JgeLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-31 00:21:08 +00:00
JmpLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . FallThrough = FALSE ;
m_Section - > m_Cont . FallThrough = TRUE ;
2010-05-25 09:15:19 +00:00
}
2010-09-22 21:43:42 +00:00
} else if ( IsUnknown ( m_Opcode . rs ) ) {
2010-10-23 18:53:01 +00:00
if ( b32BitCore ( ) )
{
CompConstToVariable ( 0 , & _GPR [ m_Opcode . rs ] . W [ 0 ] , CRegName : : GPR_Lo [ m_Opcode . rs ] ) ;
} else {
CompConstToVariable ( 0 , & _GPR [ m_Opcode . rs ] . W [ 1 ] , CRegName : : GPR_Hi [ m_Opcode . rs ] ) ;
}
2010-05-30 01:54:42 +00:00
if ( m_Section - > m_Jump . FallThrough ) {
2010-05-31 00:21:08 +00:00
JgeLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
} else if ( m_Section - > m_Cont . FallThrough ) {
2010-05-31 00:21:08 +00:00
JlLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
JlLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-31 00:21:08 +00:00
JmpLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
}
}
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : BGEZ_Compare ( void ) {
if ( IsConst ( m_Opcode . rs ) ) {
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( m_Opcode . rs ) ) {
2010-05-25 09:15:19 +00:00
# ifndef EXTERNAL_RELEASE
DisplayError ( " BGEZ 1 " ) ;
# endif
2010-05-30 01:54:42 +00:00
CRecompilerOps : : UnknownOpcode ( ) ;
2010-09-22 21:43:42 +00:00
} else if ( IsSigned ( m_Opcode . rs ) ) {
if ( MipsRegLo_S ( m_Opcode . rs ) > = 0 ) {
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . FallThrough = TRUE ;
m_Section - > m_Cont . FallThrough = FALSE ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . FallThrough = FALSE ;
m_Section - > m_Cont . FallThrough = TRUE ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . FallThrough = TRUE ;
m_Section - > m_Cont . FallThrough = FALSE ;
}
} else if ( IsMapped ( m_Opcode . rs ) ) {
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( m_Opcode . rs ) ) {
CompConstToX86reg ( MipsRegMapHi ( m_Opcode . rs ) , 0 ) ;
2010-05-30 01:54:42 +00:00
if ( m_Section - > m_Cont . FallThrough ) {
2010-05-31 00:21:08 +00:00
JgeLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
} else if ( m_Section - > m_Jump . FallThrough ) {
2010-05-31 00:21:08 +00:00
JlLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
JlLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-31 00:21:08 +00:00
JmpLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
}
2010-09-22 21:43:42 +00:00
} else if ( IsSigned ( m_Opcode . rs ) ) {
2010-06-04 06:25:07 +00:00
CompConstToX86reg ( cMipsRegMapLo ( m_Opcode . rs ) , 0 ) ;
2010-05-30 01:54:42 +00:00
if ( m_Section - > m_Cont . FallThrough ) {
2010-05-31 00:21:08 +00:00
JgeLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
} else if ( m_Section - > m_Jump . FallThrough ) {
2010-05-31 00:21:08 +00:00
JlLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
JlLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-31 00:21:08 +00:00
JmpLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . FallThrough = TRUE ;
m_Section - > m_Cont . FallThrough = FALSE ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-10-23 18:53:01 +00:00
if ( b32BitCore ( ) )
{
CompConstToVariable ( 0 , & _GPR [ m_Opcode . rs ] . W [ 0 ] , CRegName : : GPR_Lo [ m_Opcode . rs ] ) ;
} else {
CompConstToVariable ( 0 , & _GPR [ m_Opcode . rs ] . W [ 1 ] , CRegName : : GPR_Hi [ m_Opcode . rs ] ) ;
}
2010-05-30 01:54:42 +00:00
if ( m_Section - > m_Cont . FallThrough ) {
2010-05-31 00:21:08 +00:00
JgeLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
} else if ( m_Section - > m_Jump . FallThrough ) {
2010-05-31 00:21:08 +00:00
JlLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
} else {
2010-05-31 00:21:08 +00:00
JlLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-31 00:21:08 +00:00
JmpLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
}
}
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : COP1_BCF_Compare ( void ) {
2010-05-25 09:15:19 +00:00
TestVariable ( FPCSR_C , & _FPCR [ 31 ] , " _FPCR[31] " ) ;
2010-05-30 01:54:42 +00:00
if ( m_Section - > m_Cont . FallThrough ) {
2010-05-31 00:21:08 +00:00
JeLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
} else if ( m_Section - > m_Jump . FallThrough ) {
2010-05-31 00:21:08 +00:00
JneLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
JneLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-31 00:21:08 +00:00
JmpLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
}
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : COP1_BCT_Compare ( void ) {
2010-05-25 09:15:19 +00:00
TestVariable ( FPCSR_C , & _FPCR [ 31 ] , " _FPCR[31] " ) ;
2010-05-30 01:54:42 +00:00
if ( m_Section - > m_Cont . FallThrough ) {
2010-05-31 00:21:08 +00:00
JneLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
} else if ( m_Section - > m_Jump . FallThrough ) {
2010-05-31 00:21:08 +00:00
JeLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
JeLabel32 ( m_Section - > m_Cont . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Cont . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-31 00:21:08 +00:00
JmpLabel32 ( m_Section - > m_Jump . BranchLabel . c_str ( ) , 0 ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . LinkLocation = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-25 09:15:19 +00:00
}
}
2010-05-30 01:54:42 +00:00
2010-05-25 09:15:19 +00:00
/************************* OpCode functions *************************/
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : J ( void ) {
if ( m_NextInstruction = = NORMAL ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2012-09-27 22:13:59 +00:00
if ( ( m_CompilePC & 0xFFC ) = = 0xFFC )
{
MoveConstToVariable ( ( m_CompilePC & 0xF0000000 ) + ( m_Opcode . target < < 2 ) , & R4300iOp : : m_JumpToLocation , " R4300iOp::m_JumpToLocation " ) ;
OverflowDelaySlot ( false ) ;
return ;
}
2010-05-25 09:15:19 +00:00
2010-06-04 06:25:07 +00:00
m_Section - > m_Jump . TargetPC = ( m_CompilePC & 0xF0000000 ) + ( m_Opcode . target < < 2 ) ; ;
2010-10-29 03:20:25 +00:00
m_Section - > m_Jump . JumpPC = m_CompilePC ;
2010-05-30 01:54:42 +00:00
if ( m_Section - > m_JumpSection ! = NULL ) {
2010-06-04 06:25:07 +00:00
m_Section - > m_Jump . BranchLabel . Format ( " Section_%d " , ( ( CCodeSection * ) m_Section - > m_JumpSection ) - > m_SectionID ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-06-04 06:25:07 +00:00
m_Section - > m_Jump . BranchLabel = " ExitBlock " ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . FallThrough = TRUE ;
m_Section - > m_Jump . LinkLocation = NULL ;
m_Section - > m_Jump . LinkLocation2 = NULL ;
m_NextInstruction = DO_DELAY_SLOT ;
} else if ( m_NextInstruction = = DELAY_SLOT_DONE ) {
2010-10-23 18:53:01 +00:00
m_Section - > m_Jump . RegSet = m_RegWorkingSet ;
2010-06-04 06:25:07 +00:00
m_Section - > GenerateSectionLinkage ( ) ;
2010-05-30 01:54:42 +00:00
m_NextInstruction = END_BLOCK ;
2010-05-25 09:15:19 +00:00
} else {
# ifndef EXTERNAL_RELEASE
2010-06-04 06:25:07 +00:00
DisplayError ( " WTF \n \n J \n NextInstruction = %X " , m_NextInstruction ) ;
2010-05-25 09:15:19 +00:00
# endif
}
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : JAL ( void ) {
if ( m_NextInstruction = = NORMAL ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
UnMap_GPR ( 31 , FALSE ) ;
2010-06-04 06:25:07 +00:00
MipsRegLo ( 31 ) = m_CompilePC + 8 ;
2010-05-30 01:54:42 +00:00
MipsRegState ( 31 ) = CRegInfo : : STATE_CONST_32 ;
2012-09-25 05:58:06 +00:00
if ( ( m_CompilePC & 0xFFC ) = = 0xFFC )
{
MoveConstToVariable ( ( m_CompilePC & 0xF0000000 ) + ( m_Opcode . target < < 2 ) , & R4300iOp : : m_JumpToLocation , " R4300iOp::m_JumpToLocation " ) ;
2012-09-26 00:38:29 +00:00
OverflowDelaySlot ( false ) ;
2012-09-25 05:58:06 +00:00
return ;
}
m_Section - > m_Jump . TargetPC = ( m_CompilePC & 0xF0000000 ) + ( m_Opcode . target < < 2 ) ;
2010-10-23 18:53:01 +00:00
m_Section - > m_Jump . JumpPC = m_CompilePC ;
if ( m_Section - > m_JumpSection ! = NULL ) {
m_Section - > m_Jump . BranchLabel . Format ( " Section_%d " , ( ( CCodeSection * ) m_Section - > m_JumpSection ) - > m_SectionID ) ;
} else {
m_Section - > m_Jump . BranchLabel = " ExitBlock " ;
}
m_Section - > m_Jump . FallThrough = TRUE ;
m_Section - > m_Jump . LinkLocation = NULL ;
m_Section - > m_Jump . LinkLocation2 = NULL ;
2012-09-25 05:58:06 +00:00
m_NextInstruction = DO_DELAY_SLOT ;
2010-05-30 01:54:42 +00:00
} else if ( m_NextInstruction = = DELAY_SLOT_DONE ) {
2010-10-23 18:53:01 +00:00
if ( m_Section - > m_JumpSection )
{
m_Section - > m_Jump . RegSet = m_RegWorkingSet ;
m_Section - > GenerateSectionLinkage ( ) ;
} else {
DWORD TargetPC = ( m_CompilePC & 0xF0000000 ) + ( m_Opcode . target < < 2 ) ;
m_Section - > CompileExit ( m_CompilePC , TargetPC , m_RegWorkingSet , CExitInfo : : Normal , TRUE , NULL ) ;
}
2010-05-30 01:54:42 +00:00
m_NextInstruction = END_BLOCK ;
2010-05-25 09:15:19 +00:00
} else {
# ifndef EXTERNAL_RELEASE
2010-05-30 01:54:42 +00:00
DisplayError ( " WTF \n \n Branch \n NextInstruction = %X " , m_NextInstruction ) ;
2010-05-25 09:15:19 +00:00
# endif
}
return ;
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : ADDI ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
if ( m_Opcode . rt = = 0 ) { return ; }
2010-05-25 09:15:19 +00:00
2010-07-23 10:45:35 +00:00
if ( bFastSP ( ) & & m_Opcode . rs = = 29 & & m_Opcode . rt = = 29 ) {
AddConstToX86Reg ( Map_MemoryStack ( x86_Any , true ) , ( short ) m_Opcode . immediate ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rs ) ) {
if ( IsMapped ( m_Opcode . rt ) ) { UnMap_GPR ( m_Opcode . rt , FALSE ) ; }
2010-05-31 00:21:08 +00:00
MipsRegLo ( m_Opcode . rt ) = cMipsRegLo ( m_Opcode . rs ) + ( short ) m_Opcode . immediate ;
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rt ) = CRegInfo : : STATE_CONST_32 ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rt , TRUE , m_Opcode . rs ) ;
2010-05-31 00:21:08 +00:00
AddConstToX86Reg ( cMipsRegMapLo ( m_Opcode . rt ) , ( short ) m_Opcode . immediate ) ;
2010-05-25 09:15:19 +00:00
}
2010-07-23 10:45:35 +00:00
if ( bFastSP ( ) & & m_Opcode . rt = = 29 & & m_Opcode . rs ! = 29 ) {
2010-06-04 06:25:07 +00:00
ResetX86Protection ( ) ;
2011-01-02 10:40:00 +00:00
_MMU - > ResetMemoryStack ( ) ;
2010-07-23 10:45:35 +00:00
}
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : ADDIU ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-25 09:15:19 +00:00
2010-05-31 00:21:08 +00:00
if ( m_Opcode . rt = = 0 | | ( m_Opcode . immediate = = 0 & & m_Opcode . rs = = m_Opcode . rt ) ) { return ; }
2010-05-25 09:15:19 +00:00
2010-07-23 10:45:35 +00:00
if ( bFastSP ( ) )
2010-05-25 09:15:19 +00:00
{
2010-05-30 01:54:42 +00:00
if ( m_Opcode . rs = = 29 & & m_Opcode . rt = = 29 )
2010-05-25 09:15:19 +00:00
{
2010-07-23 10:45:35 +00:00
AddConstToX86Reg ( Map_MemoryStack ( x86_Any , TRUE ) , ( short ) m_Opcode . immediate ) ;
2010-05-25 09:15:19 +00:00
}
}
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rs ) ) {
if ( IsMapped ( m_Opcode . rt ) ) { UnMap_GPR ( m_Opcode . rt , FALSE ) ; }
MipsRegLo ( m_Opcode . rt ) = cMipsRegLo ( m_Opcode . rs ) + ( short ) m_Opcode . immediate ;
MipsRegState ( m_Opcode . rt ) = CRegInfo : : STATE_CONST_32 ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rt , TRUE , m_Opcode . rs ) ;
AddConstToX86Reg ( cMipsRegMapLo ( m_Opcode . rt ) , ( short ) m_Opcode . immediate ) ;
2010-05-25 09:15:19 +00:00
}
2010-07-23 10:45:35 +00:00
if ( bFastSP ( ) & & m_Opcode . rt = = 29 & & m_Opcode . rs ! = 29 ) {
2010-06-04 06:25:07 +00:00
ResetX86Protection ( ) ;
2010-07-23 10:45:35 +00:00
_MMU - > ResetMemoryStack ( ) ;
2010-05-25 09:15:19 +00:00
}
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : SLTIU ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
if ( m_Opcode . rt = = 0 ) { return ; }
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rs ) ) {
2010-05-25 09:15:19 +00:00
DWORD Result ;
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( m_Opcode . rs ) ) {
__int64 Immediate = ( __int64 ) ( ( short ) m_Opcode . immediate ) ;
2010-09-22 21:43:42 +00:00
Result = MipsReg ( m_Opcode . rs ) < ( ( unsigned ) ( Immediate ) ) ? 1 : 0 ;
} else if ( Is32Bit ( m_Opcode . rs ) ) {
2010-05-30 01:54:42 +00:00
Result = cMipsRegLo ( m_Opcode . rs ) < ( ( unsigned ) ( ( short ) m_Opcode . immediate ) ) ? 1 : 0 ;
}
UnMap_GPR ( m_Opcode . rt , FALSE ) ;
MipsRegState ( m_Opcode . rt ) = CRegInfo : : STATE_CONST_32 ;
2010-05-31 00:21:08 +00:00
MipsRegLo ( m_Opcode . rt ) = Result ;
2010-05-30 01:54:42 +00:00
} else if ( IsMapped ( m_Opcode . rs ) ) {
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( m_Opcode . rs ) ) {
2010-05-25 09:15:19 +00:00
BYTE * Jump [ 2 ] ;
2010-06-04 06:25:07 +00:00
CompConstToX86reg ( cMipsRegMapHi ( m_Opcode . rs ) , ( ( short ) m_Opcode . immediate > > 31 ) ) ;
2010-05-25 09:15:19 +00:00
JeLabel8 ( " Low Compare " , 0 ) ;
2010-05-30 01:54:42 +00:00
Jump [ 0 ] = m_RecompPos - 1 ;
2010-06-04 06:25:07 +00:00
SetbVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
2010-05-25 09:15:19 +00:00
JmpLabel8 ( " Continue " , 0 ) ;
2010-05-30 01:54:42 +00:00
Jump [ 1 ] = m_RecompPos - 1 ;
2010-05-25 09:15:19 +00:00
CPU_Message ( " " ) ;
CPU_Message ( " Low Compare: " ) ;
2010-10-23 18:53:01 +00:00
SetJump8 ( Jump [ 0 ] , m_RecompPos ) ;
2010-06-04 06:25:07 +00:00
CompConstToX86reg ( cMipsRegMapLo ( m_Opcode . rs ) , ( short ) m_Opcode . immediate ) ;
SetbVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
2010-05-25 09:15:19 +00:00
CPU_Message ( " " ) ;
CPU_Message ( " Continue: " ) ;
2010-10-23 18:53:01 +00:00
SetJump8 ( Jump [ 1 ] , m_RecompPos ) ;
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rt , FALSE , - 1 ) ;
2010-06-04 06:25:07 +00:00
MoveVariableToX86reg ( & m_BranchCompare , " m_BranchCompare " , cMipsRegMapLo ( m_Opcode . rt ) ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-06-04 06:25:07 +00:00
CompConstToX86reg ( cMipsRegMapLo ( m_Opcode . rs ) , ( short ) m_Opcode . immediate ) ;
SetbVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rt , FALSE , - 1 ) ;
2010-06-04 06:25:07 +00:00
MoveVariableToX86reg ( & m_BranchCompare , " m_BranchCompare " , cMipsRegMapLo ( m_Opcode . rt ) ) ;
2010-05-25 09:15:19 +00:00
}
2010-10-23 18:53:01 +00:00
} else if ( b32BitCore ( ) ) {
CompConstToVariable ( ( short ) m_Opcode . immediate , & _GPR [ m_Opcode . rs ] . W [ 0 ] , CRegName : : GPR_Lo [ m_Opcode . rs ] ) ;
SetbVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
Map_GPR_32bit ( m_Opcode . rt , FALSE , - 1 ) ;
MoveVariableToX86reg ( & m_BranchCompare , " m_BranchCompare " , cMipsRegMapLo ( m_Opcode . rt ) ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-10-23 18:53:01 +00:00
BYTE * Jump = NULL ;
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
CompConstToVariable ( ( ( short ) m_Opcode . immediate > > 31 ) , & _GPR [ m_Opcode . rs ] . W [ 1 ] , CRegName : : GPR_Hi [ m_Opcode . rs ] ) ;
2010-05-25 09:15:19 +00:00
JneLabel8 ( " CompareSet " , 0 ) ;
2010-05-30 01:54:42 +00:00
Jump = m_RecompPos - 1 ;
CompConstToVariable ( ( short ) m_Opcode . immediate , & _GPR [ m_Opcode . rs ] . W [ 0 ] , CRegName : : GPR_Lo [ m_Opcode . rs ] ) ;
2010-05-25 09:15:19 +00:00
CPU_Message ( " " ) ;
CPU_Message ( " CompareSet: " ) ;
2010-10-23 18:53:01 +00:00
SetJump8 ( Jump , m_RecompPos ) ;
2010-06-04 06:25:07 +00:00
SetbVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rt , FALSE , - 1 ) ;
2010-10-23 18:53:01 +00:00
MoveVariableToX86reg ( & m_BranchCompare , " m_BranchCompare " , cMipsRegMapLo ( m_Opcode . rt ) ) ;
2010-05-25 09:15:19 +00:00
}
}
2010-06-04 06:25:07 +00:00
void CRecompilerOps : : SLTI ( void )
{
2010-05-30 01:54:42 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
if ( m_Opcode . rt = = 0 ) { return ; }
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rs ) ) {
2010-05-25 09:15:19 +00:00
DWORD Result ;
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( m_Opcode . rs ) ) {
__int64 Immediate = ( __int64 ) ( ( short ) m_Opcode . immediate ) ;
2010-09-22 21:43:42 +00:00
Result = ( __int64 ) MipsReg ( m_Opcode . rs ) < Immediate ? 1 : 0 ;
} else if ( Is32Bit ( m_Opcode . rs ) ) {
Result = MipsRegLo_S ( m_Opcode . rs ) < ( short ) m_Opcode . immediate ? 1 : 0 ;
2010-05-30 01:54:42 +00:00
}
UnMap_GPR ( m_Opcode . rt , FALSE ) ;
MipsRegState ( m_Opcode . rt ) = CRegInfo : : STATE_CONST_32 ;
2010-05-31 00:21:08 +00:00
MipsRegLo ( m_Opcode . rt ) = Result ;
2010-05-30 01:54:42 +00:00
} else if ( IsMapped ( m_Opcode . rs ) ) {
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( m_Opcode . rs ) ) {
2010-05-25 09:15:19 +00:00
BYTE * Jump [ 2 ] ;
2010-06-04 06:25:07 +00:00
CompConstToX86reg ( MipsRegMapHi ( m_Opcode . rs ) , ( ( short ) m_Opcode . immediate > > 31 ) ) ;
2010-05-25 09:15:19 +00:00
JeLabel8 ( " Low Compare " , 0 ) ;
2010-05-30 01:54:42 +00:00
Jump [ 0 ] = m_RecompPos - 1 ;
2010-06-04 06:25:07 +00:00
SetlVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
2010-05-25 09:15:19 +00:00
JmpLabel8 ( " Continue " , 0 ) ;
2010-05-30 01:54:42 +00:00
Jump [ 1 ] = m_RecompPos - 1 ;
2010-05-25 09:15:19 +00:00
CPU_Message ( " " ) ;
CPU_Message ( " Low Compare: " ) ;
2010-05-30 01:54:42 +00:00
* ( ( BYTE * ) ( Jump [ 0 ] ) ) = ( BYTE ) ( m_RecompPos - Jump [ 0 ] - 1 ) ;
2010-06-04 06:25:07 +00:00
CompConstToX86reg ( cMipsRegMapLo ( m_Opcode . rs ) , ( short ) m_Opcode . immediate ) ;
SetbVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
2010-05-25 09:15:19 +00:00
CPU_Message ( " " ) ;
CPU_Message ( " Continue: " ) ;
2010-05-30 01:54:42 +00:00
* ( ( BYTE * ) ( Jump [ 1 ] ) ) = ( BYTE ) ( m_RecompPos - Jump [ 1 ] - 1 ) ;
Map_GPR_32bit ( m_Opcode . rt , FALSE , - 1 ) ;
2010-06-04 06:25:07 +00:00
MoveVariableToX86reg ( & m_BranchCompare , " m_BranchCompare " , cMipsRegMapLo ( m_Opcode . rt ) ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-06-04 06:25:07 +00:00
/* CompConstToX86reg(cMipsRegMapLo(m_Opcode.rs),(short)m_Opcode.immediate);
SetlVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rt , FALSE , - 1 ) ;
2010-06-04 06:25:07 +00:00
MoveVariableToX86reg ( & m_BranchCompare , " m_BranchCompare " , cMipsRegMapLo ( m_Opcode . rt ) ) ;
2010-05-25 09:15:19 +00:00
*/
2010-05-30 01:54:42 +00:00
ProtectGPR ( m_Opcode . rs ) ;
Map_GPR_32bit ( m_Opcode . rt , FALSE , - 1 ) ;
2010-06-04 06:25:07 +00:00
CompConstToX86reg ( cMipsRegMapLo ( m_Opcode . rs ) , ( short ) m_Opcode . immediate ) ;
2010-05-25 09:15:19 +00:00
2010-06-04 06:25:07 +00:00
if ( cMipsRegMapLo ( m_Opcode . rt ) > x86_EBX ) {
SetlVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
MoveVariableToX86reg ( & m_BranchCompare , " m_BranchCompare " , cMipsRegMapLo ( m_Opcode . rt ) ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-06-04 06:25:07 +00:00
Setl ( cMipsRegMapLo ( m_Opcode . rt ) ) ;
AndConstToX86Reg ( cMipsRegMapLo ( m_Opcode . rt ) , 1 ) ;
2010-05-25 09:15:19 +00:00
}
}
2010-10-23 18:53:01 +00:00
} else if ( b32BitCore ( ) ) {
Map_GPR_32bit ( m_Opcode . rt , FALSE , - 1 ) ;
CompConstToVariable ( ( short ) m_Opcode . immediate , & _GPR [ m_Opcode . rs ] . W [ 0 ] , CRegName : : GPR_Lo [ m_Opcode . rs ] ) ;
2010-05-25 09:15:19 +00:00
2010-10-23 18:53:01 +00:00
if ( cMipsRegMapLo ( m_Opcode . rt ) > x86_EBX ) {
SetlVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
MoveVariableToX86reg ( & m_BranchCompare , " m_BranchCompare " , cMipsRegMapLo ( m_Opcode . rt ) ) ;
} else {
Setl ( cMipsRegMapLo ( m_Opcode . rt ) ) ;
AndConstToX86Reg ( cMipsRegMapLo ( m_Opcode . rt ) , 1 ) ;
}
} else {
BYTE * Jump [ 2 ] = { NULL , NULL } ;
2010-05-30 01:54:42 +00:00
CompConstToVariable ( ( ( short ) m_Opcode . immediate > > 31 ) , & _GPR [ m_Opcode . rs ] . W [ 1 ] , CRegName : : GPR_Hi [ m_Opcode . rs ] ) ;
2010-05-25 09:15:19 +00:00
JeLabel8 ( " Low Compare " , 0 ) ;
2010-05-30 01:54:42 +00:00
Jump [ 0 ] = m_RecompPos - 1 ;
2010-06-04 06:25:07 +00:00
SetlVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
2010-05-25 09:15:19 +00:00
JmpLabel8 ( " Continue " , 0 ) ;
2010-05-30 01:54:42 +00:00
Jump [ 1 ] = m_RecompPos - 1 ;
2010-05-25 09:15:19 +00:00
CPU_Message ( " " ) ;
CPU_Message ( " Low Compare: " ) ;
2010-10-23 18:53:01 +00:00
SetJump8 ( Jump [ 0 ] , m_RecompPos ) ;
2010-05-30 01:54:42 +00:00
CompConstToVariable ( ( short ) m_Opcode . immediate , & _GPR [ m_Opcode . rs ] . W [ 0 ] , CRegName : : GPR_Lo [ m_Opcode . rs ] ) ;
2010-06-04 06:25:07 +00:00
SetbVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
2010-10-23 18:53:01 +00:00
if ( Jump [ 1 ] )
{
CPU_Message ( " " ) ;
CPU_Message ( " Continue: " ) ;
SetJump8 ( Jump [ 1 ] , m_RecompPos ) ;
}
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rt , FALSE , - 1 ) ;
2010-06-04 06:25:07 +00:00
MoveVariableToX86reg ( & m_BranchCompare , " m_BranchCompare " , cMipsRegMapLo ( m_Opcode . rt ) ) ;
2010-05-25 09:15:19 +00:00
}
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : ANDI ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
if ( m_Opcode . rt = = 0 ) { return ; }
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rs ) ) {
if ( IsMapped ( m_Opcode . rt ) ) { UnMap_GPR ( m_Opcode . rt , FALSE ) ; }
MipsRegState ( m_Opcode . rt ) = CRegInfo : : STATE_CONST_32 ;
2010-05-31 00:21:08 +00:00
MipsRegLo ( m_Opcode . rt ) = cMipsRegLo ( m_Opcode . rs ) & m_Opcode . immediate ;
2010-05-30 01:54:42 +00:00
} else if ( m_Opcode . immediate ! = 0 ) {
Map_GPR_32bit ( m_Opcode . rt , FALSE , m_Opcode . rs ) ;
2010-06-04 06:25:07 +00:00
AndConstToX86Reg ( cMipsRegMapLo ( m_Opcode . rt ) , m_Opcode . immediate ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rt , FALSE , 0 ) ;
2010-05-25 09:15:19 +00:00
}
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : ORI ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
if ( m_Opcode . rt = = 0 ) { return ; }
2010-05-25 09:15:19 +00:00
2010-10-29 03:20:25 +00:00
if ( bFastSP ( ) & & m_Opcode . rs = = 29 & & m_Opcode . rt = = 29 ) {
OrConstToX86Reg ( m_Opcode . immediate , Map_MemoryStack ( x86_Any , true ) ) ;
}
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rs ) ) {
if ( IsMapped ( m_Opcode . rt ) ) { UnMap_GPR ( m_Opcode . rt , FALSE ) ; }
MipsRegState ( m_Opcode . rt ) = MipsRegState ( m_Opcode . rs ) ;
MipsRegHi ( m_Opcode . rt ) = MipsRegHi ( m_Opcode . rs ) ;
2010-05-31 00:21:08 +00:00
MipsRegLo ( m_Opcode . rt ) = cMipsRegLo ( m_Opcode . rs ) | m_Opcode . immediate ;
2010-05-30 01:54:42 +00:00
} else if ( IsMapped ( m_Opcode . rs ) ) {
2010-10-23 18:53:01 +00:00
if ( b32BitCore ( ) )
{
Map_GPR_32bit ( m_Opcode . rt , true , m_Opcode . rs ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-10-23 18:53:01 +00:00
if ( Is64Bit ( m_Opcode . rs ) ) {
Map_GPR_64bit ( m_Opcode . rt , m_Opcode . rs ) ;
} else {
Map_GPR_32bit ( m_Opcode . rt , IsSigned ( m_Opcode . rs ) , m_Opcode . rs ) ;
}
2010-05-25 09:15:19 +00:00
}
2010-05-31 00:21:08 +00:00
OrConstToX86Reg ( m_Opcode . immediate , cMipsRegMapLo ( m_Opcode . rt ) ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-10-23 18:53:01 +00:00
if ( b32BitCore ( ) )
{
Map_GPR_32bit ( m_Opcode . rt , true , m_Opcode . rs ) ;
} else {
Map_GPR_64bit ( m_Opcode . rt , m_Opcode . rs ) ;
}
2010-05-31 00:21:08 +00:00
OrConstToX86Reg ( m_Opcode . immediate , cMipsRegMapLo ( m_Opcode . rt ) ) ;
2010-05-25 09:15:19 +00:00
}
2010-10-29 03:20:25 +00:00
if ( bFastSP ( ) & & m_Opcode . rt = = 29 & & m_Opcode . rs ! = 29 ) {
ResetX86Protection ( ) ;
2011-01-02 10:40:00 +00:00
_MMU - > ResetMemoryStack ( ) ;
2010-10-29 03:20:25 +00:00
}
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : XORI ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
if ( m_Opcode . rt = = 0 ) { return ; }
if ( IsConst ( m_Opcode . rs ) ) {
if ( m_Opcode . rs ! = m_Opcode . rt ) { UnMap_GPR ( m_Opcode . rt , FALSE ) ; }
MipsRegState ( m_Opcode . rt ) = MipsRegState ( m_Opcode . rs ) ;
MipsRegHi ( m_Opcode . rt ) = MipsRegHi ( m_Opcode . rs ) ;
2010-05-31 00:21:08 +00:00
MipsRegLo ( m_Opcode . rt ) = cMipsRegLo ( m_Opcode . rs ) ^ m_Opcode . immediate ;
2010-05-25 09:15:19 +00:00
} else {
2010-09-22 21:43:42 +00:00
if ( IsMapped ( m_Opcode . rs ) & & Is32Bit ( m_Opcode . rs ) ) {
Map_GPR_32bit ( m_Opcode . rt , IsSigned ( m_Opcode . rs ) , m_Opcode . rs ) ;
2010-10-23 18:53:01 +00:00
} else if ( b32BitCore ( ) ) {
Map_GPR_32bit ( m_Opcode . rt , true , m_Opcode . rs ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
Map_GPR_64bit ( m_Opcode . rt , m_Opcode . rs ) ;
2010-05-25 09:15:19 +00:00
}
2010-06-04 06:25:07 +00:00
if ( m_Opcode . immediate ! = 0 ) { XorConstToX86Reg ( cMipsRegMapLo ( m_Opcode . rt ) , m_Opcode . immediate ) ; }
2010-05-25 09:15:19 +00:00
}
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : LUI ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
if ( m_Opcode . rt = = 0 ) { return ; }
2010-05-25 09:15:19 +00:00
2010-07-23 10:45:35 +00:00
if ( bFastSP ( ) & & m_Opcode . rt = = 29 ) {
2010-10-29 03:20:25 +00:00
x86Reg Reg = Map_MemoryStack ( x86_Any , true , false ) ;
2010-05-25 09:15:19 +00:00
DWORD Address ;
2010-07-23 10:45:35 +00:00
_TransVaddr - > TranslateVaddr ( ( ( short ) m_Opcode . offset < < 16 ) , Address ) ;
if ( Reg < 0 ) {
MoveConstToVariable ( ( DWORD ) ( Address + _MMU - > Rdram ( ) ) , & ( _Recompiler - > MemoryStackPos ( ) ) , " MemoryStack " ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-07-23 10:45:35 +00:00
MoveConstToX86reg ( ( DWORD ) ( Address + _MMU - > Rdram ( ) ) , Reg ) ;
2010-05-25 09:15:19 +00:00
}
}
2010-07-23 10:45:35 +00:00
2010-05-30 01:54:42 +00:00
UnMap_GPR ( m_Opcode . rt , FALSE ) ;
MipsRegLo ( m_Opcode . rt ) = ( ( short ) m_Opcode . offset < < 16 ) ;
MipsRegState ( m_Opcode . rt ) = CRegInfo : : STATE_CONST_32 ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : DADDIU ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
if ( m_Opcode . rs ! = 0 ) { UnMap_GPR ( m_Opcode . rs , TRUE ) ; }
if ( m_Opcode . rs ! = 0 ) { UnMap_GPR ( m_Opcode . rt , TRUE ) ; }
2010-06-14 21:14:58 +00:00
BeforeCallDirect ( m_RegWorkingSet ) ;
2010-06-04 06:25:07 +00:00
MoveConstToVariable ( m_Opcode . Hex , & R4300iOp : : m_Opcode . Hex , " R4300iOp::m_Opcode.Hex " ) ;
2010-05-25 09:15:19 +00:00
Call_Direct ( R4300iOp : : DADDIU , " R4300iOp::DADDIU " ) ;
2010-06-14 21:14:58 +00:00
AfterCallDirect ( m_RegWorkingSet ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-31 00:21:08 +00:00
void CRecompilerOps : : CACHE ( void ) {
2010-05-30 01:54:42 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-25 09:15:19 +00:00
2010-05-31 00:21:08 +00:00
if ( _Settings - > LoadDword ( Game_SMM_Cache ) = = 0 )
{
2010-05-25 09:15:19 +00:00
return ;
}
2010-05-31 00:21:08 +00:00
switch ( m_Opcode . rt ) {
case 0 :
case 16 :
2010-06-14 21:14:58 +00:00
BeforeCallDirect ( m_RegWorkingSet ) ;
2010-05-31 00:21:08 +00:00
PushImm32 ( " CRecompiler::Remove_Cache " , CRecompiler : : Remove_Cache ) ;
2010-06-14 21:14:58 +00:00
PushImm32 ( " 0x20 " , 0x20 ) ;
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . base ) ) {
DWORD Address = cMipsRegLo ( m_Opcode . base ) + ( short ) m_Opcode . offset ;
2010-05-31 00:21:08 +00:00
PushImm32 ( " Address " , Address ) ;
} else if ( IsMapped ( m_Opcode . base ) ) {
2010-06-04 06:25:07 +00:00
AddConstToX86Reg ( cMipsRegMapLo ( m_Opcode . base ) , ( short ) m_Opcode . offset ) ;
Push ( cMipsRegMapLo ( m_Opcode . base ) ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
MoveVariableToX86reg ( & _GPR [ m_Opcode . base ] . UW [ 0 ] , CRegName : : GPR_Lo [ m_Opcode . base ] , x86_EAX ) ;
AddConstToX86Reg ( x86_EAX , ( short ) m_Opcode . offset ) ;
Push ( x86_EAX ) ;
2010-05-25 09:15:19 +00:00
}
2010-06-12 02:02:06 +00:00
MoveConstToX86reg ( ( DWORD ) _Recompiler , x86_ECX ) ;
2010-09-22 21:43:42 +00:00
Call_Direct ( AddressOf ( & CRecompiler : : ClearRecompCode_Virt ) , " CRecompiler::ClearRecompCode_Virt " ) ;
2010-06-14 21:14:58 +00:00
AfterCallDirect ( m_RegWorkingSet ) ;
2010-05-25 09:15:19 +00:00
break ;
case 1 :
case 3 :
case 13 :
case 5 :
case 8 :
case 9 :
case 17 :
case 21 :
case 25 :
break ;
# ifndef EXTERNAL_RELEASE
default :
2010-05-30 01:54:42 +00:00
DisplayError ( " cache: %d " , m_Opcode . rt ) ;
2010-05-25 09:15:19 +00:00
# endif
2010-05-31 00:21:08 +00:00
}
2010-05-25 09:15:19 +00:00
}
2010-05-31 00:21:08 +00:00
void CRecompilerOps : : LL ( void ) {
2010-05-30 01:54:42 +00:00
_Notify - > BreakPoint ( __FILE__ , __LINE__ ) ;
# ifdef tofix
2010-06-04 06:25:07 +00:00
x86Reg TempReg1 , TempReg2 ;
2010-05-31 00:21:08 +00:00
2010-05-30 01:54:42 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
if ( m_Opcode . rt = = 0 ) return ;
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . base ) ) {
DWORD Address = cMipsRegLo ( m_Opcode . base ) + ( short ) m_Opcode . offset ;
2010-05-31 00:21:08 +00:00
Map_GPR_32bit ( m_Opcode . rt , TRUE , - 1 ) ;
_MMU - > Compile_LW ( m_Section , cMipsRegLo ( m_Opcode . rt ) , Address ) ;
MoveConstToVariable ( 1 , _LLBit , " LLBit " ) ;
_Notify - > BreakPoint ( __FILE__ , __LINE__ ) ;
# ifdef tofix
TranslateVaddr ( Address , & Address ) ;
# endif
MoveConstToVariable ( Address , _LLAddr , " LLAddr " ) ;
2010-05-25 09:15:19 +00:00
return ;
}
2012-09-24 01:14:02 +00:00
if ( bUseTlb ( ) ) {
2010-05-31 00:21:08 +00:00
if ( IsMapped ( m_Opcode . rt ) ) { ProtectGPR ( m_Opcode . rt ) ; }
if ( IsMapped ( m_Opcode . base ) & & m_Opcode . offset = = 0 ) {
2010-05-30 01:54:42 +00:00
ProtectGPR ( m_Opcode . base ) ;
TempReg1 = cMipsRegLo ( m_Opcode . base ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
if ( IsMapped ( m_Opcode . base ) ) {
ProtectGPR ( m_Opcode . base ) ;
if ( m_Opcode . offset ! = 0 ) {
TempReg1 = Map_TempReg ( x86_Any , - 1 , FALSE ) ;
LeaSourceAndOffset ( TempReg1 , cMipsRegLo ( m_Opcode . base ) , ( short ) m_Opcode . offset ) ;
} else {
TempReg1 = Map_TempReg ( x86_Any , m_Opcode . base , FALSE ) ;
}
} else {
TempReg1 = Map_TempReg ( x86_Any , m_Opcode . base , FALSE ) ;
AddConstToX86Reg ( TempReg1 , ( short ) m_Opcode . immediate ) ;
}
2010-05-25 09:15:19 +00:00
}
2010-05-31 00:21:08 +00:00
TempReg2 = Map_TempReg ( x86_Any , - 1 , FALSE ) ;
MoveX86RegToX86Reg ( TempReg1 , TempReg2 ) ;
ShiftRightUnsignImmed ( TempReg2 , 12 ) ;
MoveVariableDispToX86Reg ( TLB_ReadMap , " TLB_ReadMap " , TempReg2 , TempReg2 , 4 ) ;
CompileReadTLBMiss ( m_Section , TempReg1 , TempReg2 ) ;
Map_GPR_32bit ( m_Opcode . rt , TRUE , - 1 ) ;
MoveX86regPointerToX86reg ( TempReg1 , TempReg2 , cMipsRegLo ( m_Opcode . rt ) ) ;
MoveConstToVariable ( 1 , _LLBit , " LLBit " ) ;
MoveX86regToVariable ( TempReg1 , _LLAddr , " LLAddr " ) ;
AddX86regToVariable ( TempReg2 , _LLAddr , " LLAddr " ) ;
SubConstFromVariable ( ( DWORD ) _MMU - > Rdram ( ) , _LLAddr , " LLAddr " ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
if ( IsMapped ( m_Opcode . base ) ) {
ProtectGPR ( m_Opcode . base ) ;
if ( m_Opcode . offset ! = 0 ) {
2010-05-31 00:21:08 +00:00
Map_GPR_32bit ( m_Opcode . rt , TRUE , - 1 ) ;
LeaSourceAndOffset ( cMipsRegLo ( m_Opcode . rt ) , cMipsRegLo ( m_Opcode . base ) , ( short ) m_Opcode . offset ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
Map_GPR_32bit ( m_Opcode . rt , TRUE , m_Opcode . base ) ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-05-31 00:21:08 +00:00
Map_GPR_32bit ( m_Opcode . rt , TRUE , m_Opcode . base ) ;
AddConstToX86Reg ( cMipsRegMapLo ( m_Opcode . rt ) , ( short ) m_Opcode . immediate ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-31 00:21:08 +00:00
AndConstToX86Reg ( cMipsRegLo ( m_Opcode . rt ) , 0x1FFFFFFF ) ;
MoveX86regToVariable ( cMipsRegLo ( m_Opcode . rt ) , _LLAddr , " LLAddr " ) ;
MoveN64MemToX86reg ( cMipsRegLo ( m_Opcode . rt ) , cMipsRegLo ( m_Opcode . rt ) ) ;
MoveConstToVariable ( 1 , _LLBit , " LLBit " ) ;
2010-05-25 09:15:19 +00:00
}
# endif
}
2010-05-31 00:21:08 +00:00
void CRecompilerOps : : SC ( void ) {
2010-05-30 01:54:42 +00:00
# ifdef tofix
2010-06-04 06:25:07 +00:00
x86Reg TempReg1 , TempReg2 ;
2010-05-31 00:21:08 +00:00
BYTE * Jump ;
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-25 09:15:19 +00:00
2010-05-31 00:21:08 +00:00
CompConstToVariable ( 1 , _LLBit , " LLBit " ) ;
JneLabel32 ( " LLBitNotSet " , 0 ) ;
Jump = ( DWORD * ) ( m_RecompPos - 4 ) ;
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . base ) ) {
DWORD Address = cMipsRegLo ( m_Opcode . base ) + ( short ) m_Opcode . offset ;
2010-05-31 00:21:08 +00:00
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rt ) ) {
2010-05-31 00:21:08 +00:00
_MMU - > Compile_SW_Const ( cMipsRegLo ( m_Opcode . rt ) , Address ) ;
2010-05-30 01:54:42 +00:00
} else if ( IsMapped ( m_Opcode . rt ) ) {
2010-05-31 00:21:08 +00:00
_MMU - > Compile_SW_Register ( m_Section , cMipsRegLo ( m_Opcode . rt ) , Address ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
_MMU - > Compile_SW_Register ( m_Section , Map_TempReg ( x86_Any , m_Opcode . rt , FALSE ) , Address ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-31 00:21:08 +00:00
CPU_Message ( " LLBitNotSet: " ) ;
* ( ( DWORD * ) ( Jump ) ) = ( BYTE ) ( m_RecompPos - Jump - 4 ) ;
Map_GPR_32bit ( m_Opcode . rt , FALSE , - 1 ) ;
MoveVariableToX86reg ( _LLBit , " LLBit " , cMipsRegLo ( m_Opcode . rt ) ) ;
2010-05-25 09:15:19 +00:00
return ;
}
2010-05-30 01:54:42 +00:00
if ( IsMapped ( m_Opcode . rt ) ) { ProtectGPR ( m_Opcode . rt ) ; }
if ( IsMapped ( m_Opcode . base ) ) {
ProtectGPR ( m_Opcode . base ) ;
if ( m_Opcode . offset ! = 0 ) {
2010-05-31 00:21:08 +00:00
TempReg1 = Map_TempReg ( x86_Any , - 1 , FALSE ) ;
2010-05-30 01:54:42 +00:00
LeaSourceAndOffset ( TempReg1 , cMipsRegLo ( m_Opcode . base ) , ( short ) m_Opcode . offset ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
TempReg1 = Map_TempReg ( x86_Any , m_Opcode . base , FALSE ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-31 00:21:08 +00:00
UnProtectGPR ( m_Opcode . base ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
TempReg1 = Map_TempReg ( x86_Any , m_Opcode . base , FALSE ) ;
2010-05-30 01:54:42 +00:00
AddConstToX86Reg ( TempReg1 , ( short ) m_Opcode . immediate ) ;
2010-05-25 09:15:19 +00:00
}
2012-09-24 01:14:02 +00:00
if ( bUseTlb ( ) ) {
2010-05-31 00:21:08 +00:00
TempReg2 = Map_TempReg ( x86_Any , - 1 , FALSE ) ;
2010-05-25 09:15:19 +00:00
MoveX86RegToX86Reg ( TempReg1 , TempReg2 ) ;
ShiftRightUnsignImmed ( TempReg2 , 12 ) ;
MoveVariableDispToX86Reg ( TLB_WriteMap , " TLB_WriteMap " , TempReg2 , TempReg2 , 4 ) ;
//For tlb miss
//0041C522 85 C0 test eax,eax
//0041C524 75 01 jne 0041C527
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rt ) ) {
MoveConstToX86regPointer ( cMipsRegLo ( m_Opcode . rt ) , TempReg1 , TempReg2 ) ;
} else if ( IsMapped ( m_Opcode . rt ) ) {
MoveX86regToX86regPointer ( cMipsRegLo ( m_Opcode . rt ) , TempReg1 , TempReg2 ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
MoveX86regToX86regPointer ( Map_TempReg ( x86_Any , m_Opcode . rt , FALSE ) , TempReg1 , TempReg2 ) ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-05-31 00:21:08 +00:00
AndConstToX86Reg ( TempReg1 , 0x1FFFFFFF ) ;
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rt ) ) {
2010-05-31 00:21:08 +00:00
MoveConstToN64Mem ( cMipsRegLo ( m_Opcode . rt ) , TempReg1 ) ;
} else if ( IsMapped ( m_Opcode . rt ) ) {
MoveX86regToN64Mem ( cMipsRegLo ( m_Opcode . rt ) , TempReg1 ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
MoveX86regToN64Mem ( Map_TempReg ( x86_Any , m_Opcode . rt , FALSE ) , TempReg1 ) ;
2010-05-25 09:15:19 +00:00
}
}
2010-05-31 00:21:08 +00:00
CPU_Message ( " LLBitNotSet: " ) ;
* ( ( DWORD * ) ( Jump ) ) = ( BYTE ) ( m_RecompPos - Jump - 4 ) ;
Map_GPR_32bit ( m_Opcode . rt , FALSE , - 1 ) ;
MoveVariableToX86reg ( _LLBit , " LLBit " , cMipsRegLo ( m_Opcode . rt ) ) ;
2010-05-30 01:54:42 +00:00
# endif
2010-05-25 09:15:19 +00:00
}
/********************** R4300i OpCodes: Special **********************/
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : SPECIAL_SLL ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
if ( m_Opcode . rd = = 0 ) { return ; }
2010-10-23 18:53:01 +00:00
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rt ) ) {
if ( IsMapped ( m_Opcode . rd ) ) { UnMap_GPR ( m_Opcode . rd , FALSE ) ; }
MipsRegLo ( m_Opcode . rd ) = cMipsRegLo ( m_Opcode . rt ) < < m_Opcode . sa ;
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
2010-05-25 09:15:19 +00:00
return ;
}
2010-05-30 01:54:42 +00:00
if ( m_Opcode . rd ! = m_Opcode . rt & & IsMapped ( m_Opcode . rt ) ) {
switch ( m_Opcode . sa ) {
2010-05-25 09:15:19 +00:00
case 0 :
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , TRUE , m_Opcode . rt ) ;
2010-05-25 09:15:19 +00:00
break ;
case 1 :
2010-05-30 01:54:42 +00:00
ProtectGPR ( m_Opcode . rt ) ;
Map_GPR_32bit ( m_Opcode . rd , TRUE , - 1 ) ;
2010-06-16 07:31:47 +00:00
LeaRegReg ( cMipsRegMapLo ( m_Opcode . rd ) , cMipsRegMapLo ( m_Opcode . rt ) , 0 , Multip_x2 ) ;
2010-05-25 09:15:19 +00:00
break ;
case 2 :
2010-05-30 01:54:42 +00:00
ProtectGPR ( m_Opcode . rt ) ;
Map_GPR_32bit ( m_Opcode . rd , TRUE , - 1 ) ;
2010-06-16 07:31:47 +00:00
LeaRegReg ( cMipsRegMapLo ( m_Opcode . rd ) , cMipsRegMapLo ( m_Opcode . rt ) , 0 , Multip_x4 ) ;
2010-05-25 09:15:19 +00:00
break ;
case 3 :
2010-05-30 01:54:42 +00:00
ProtectGPR ( m_Opcode . rt ) ;
Map_GPR_32bit ( m_Opcode . rd , TRUE , - 1 ) ;
2010-06-16 07:31:47 +00:00
LeaRegReg ( cMipsRegMapLo ( m_Opcode . rd ) , cMipsRegMapLo ( m_Opcode . rt ) , 0 , Multip_x8 ) ;
2010-05-25 09:15:19 +00:00
break ;
default :
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , TRUE , m_Opcode . rt ) ;
ShiftLeftSignImmed ( cMipsRegMapLo ( m_Opcode . rd ) , ( BYTE ) m_Opcode . sa ) ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , TRUE , m_Opcode . rt ) ;
ShiftLeftSignImmed ( cMipsRegMapLo ( m_Opcode . rd ) , ( BYTE ) m_Opcode . sa ) ;
2010-05-25 09:15:19 +00:00
}
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : SPECIAL_SRL ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
if ( m_Opcode . rd = = 0 ) { return ; }
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rt ) ) {
if ( IsMapped ( m_Opcode . rd ) ) { UnMap_GPR ( m_Opcode . rd , FALSE ) ; }
2010-06-04 06:25:07 +00:00
MipsRegLo ( m_Opcode . rd ) = cMipsRegLo ( m_Opcode . rt ) > > m_Opcode . sa ;
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
2010-05-25 09:15:19 +00:00
return ;
}
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , TRUE , m_Opcode . rt ) ;
2010-06-04 06:25:07 +00:00
ShiftRightUnsignImmed ( cMipsRegMapLo ( m_Opcode . rd ) , ( BYTE ) m_Opcode . sa ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : SPECIAL_SRA ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
if ( m_Opcode . rd = = 0 ) { return ; }
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rt ) ) {
if ( IsMapped ( m_Opcode . rd ) ) { UnMap_GPR ( m_Opcode . rd , FALSE ) ; }
2010-09-22 21:43:42 +00:00
MipsRegLo ( m_Opcode . rd ) = MipsRegLo_S ( m_Opcode . rt ) > > m_Opcode . sa ;
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
2010-05-25 09:15:19 +00:00
return ;
}
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , TRUE , m_Opcode . rt ) ;
2010-06-04 06:25:07 +00:00
ShiftRightSignImmed ( cMipsRegMapLo ( m_Opcode . rd ) , ( BYTE ) m_Opcode . sa ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : SPECIAL_SLLV ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
if ( m_Opcode . rd = = 0 ) { return ; }
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rs ) ) {
DWORD Shift = ( cMipsRegLo ( m_Opcode . rs ) & 0x1F ) ;
if ( IsConst ( m_Opcode . rt ) ) {
if ( IsMapped ( m_Opcode . rd ) ) { UnMap_GPR ( m_Opcode . rd , FALSE ) ; }
2010-06-04 06:25:07 +00:00
MipsRegLo ( m_Opcode . rd ) = cMipsRegLo ( m_Opcode . rt ) < < Shift ;
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , TRUE , m_Opcode . rt ) ;
ShiftLeftSignImmed ( cMipsRegMapLo ( m_Opcode . rd ) , ( BYTE ) Shift ) ;
2010-05-25 09:15:19 +00:00
}
return ;
}
2010-05-31 00:21:08 +00:00
Map_TempReg ( x86_ECX , m_Opcode . rs , FALSE ) ;
2010-05-25 09:15:19 +00:00
AndConstToX86Reg ( x86_ECX , 0x1F ) ;
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , TRUE , m_Opcode . rt ) ;
2010-06-04 06:25:07 +00:00
ShiftLeftSign ( cMipsRegMapLo ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : SPECIAL_SRLV ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
if ( m_Opcode . rd = = 0 ) { return ; }
2010-05-25 09:15:19 +00:00
2010-09-22 21:43:42 +00:00
if ( IsKnown ( m_Opcode . rs ) & & IsConst ( m_Opcode . rs ) ) {
2010-05-30 01:54:42 +00:00
DWORD Shift = ( cMipsRegLo ( m_Opcode . rs ) & 0x1F ) ;
if ( IsConst ( m_Opcode . rt ) ) {
if ( IsMapped ( m_Opcode . rd ) ) { UnMap_GPR ( m_Opcode . rd , FALSE ) ; }
2010-06-04 06:25:07 +00:00
MipsRegLo ( m_Opcode . rd ) = cMipsRegLo ( m_Opcode . rt ) > > Shift ;
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
2010-05-25 09:15:19 +00:00
return ;
}
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , TRUE , m_Opcode . rt ) ;
2010-06-04 06:25:07 +00:00
ShiftRightUnsignImmed ( cMipsRegMapLo ( m_Opcode . rd ) , ( BYTE ) Shift ) ;
2010-05-25 09:15:19 +00:00
return ;
}
2010-05-31 00:21:08 +00:00
Map_TempReg ( x86_ECX , m_Opcode . rs , FALSE ) ;
2010-05-25 09:15:19 +00:00
AndConstToX86Reg ( x86_ECX , 0x1F ) ;
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , TRUE , m_Opcode . rt ) ;
2010-06-04 06:25:07 +00:00
ShiftRightUnsign ( cMipsRegMapLo ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : SPECIAL_SRAV ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
if ( m_Opcode . rd = = 0 ) { return ; }
2010-05-25 09:15:19 +00:00
2010-09-22 21:43:42 +00:00
if ( IsKnown ( m_Opcode . rs ) & & IsConst ( m_Opcode . rs ) ) {
2010-05-30 01:54:42 +00:00
DWORD Shift = ( cMipsRegLo ( m_Opcode . rs ) & 0x1F ) ;
if ( IsConst ( m_Opcode . rt ) ) {
if ( IsMapped ( m_Opcode . rd ) ) { UnMap_GPR ( m_Opcode . rd , FALSE ) ; }
2010-09-22 21:43:42 +00:00
MipsRegLo ( m_Opcode . rd ) = MipsRegLo_S ( m_Opcode . rt ) > > Shift ;
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
2010-05-25 09:15:19 +00:00
return ;
}
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , TRUE , m_Opcode . rt ) ;
2010-06-04 06:25:07 +00:00
ShiftRightSignImmed ( cMipsRegMapLo ( m_Opcode . rd ) , ( BYTE ) Shift ) ;
2010-05-25 09:15:19 +00:00
return ;
}
2010-05-31 00:21:08 +00:00
Map_TempReg ( x86_ECX , m_Opcode . rs , FALSE ) ;
2010-05-25 09:15:19 +00:00
AndConstToX86Reg ( x86_ECX , 0x1F ) ;
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , TRUE , m_Opcode . rt ) ;
2010-06-04 06:25:07 +00:00
ShiftRightSign ( cMipsRegMapLo ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : SPECIAL_JR ( void ) {
2012-09-26 00:55:09 +00:00
if ( m_NextInstruction = = NORMAL )
{
2010-05-30 01:54:42 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2012-09-25 05:58:06 +00:00
if ( ( m_CompilePC & 0xFFC ) = = 0xFFC )
{
if ( IsMapped ( m_Opcode . rs ) ) {
MoveX86regToVariable ( cMipsRegMapLo ( m_Opcode . rs ) , & R4300iOp : : m_JumpToLocation , " R4300iOp::m_JumpToLocation " ) ;
m_RegWorkingSet . WriteBackRegisters ( ) ;
} else {
m_RegWorkingSet . WriteBackRegisters ( ) ;
MoveX86regToVariable ( Map_TempReg ( x86_Any , m_Opcode . rs , FALSE ) , & R4300iOp : : m_JumpToLocation , " R4300iOp::m_JumpToLocation " ) ;
}
2012-09-26 00:38:29 +00:00
OverflowDelaySlot ( true ) ;
2012-09-25 05:58:06 +00:00
return ;
}
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rs ) ) {
2010-06-04 06:25:07 +00:00
m_Section - > m_Jump . BranchLabel . Format ( " 0x%08X " , cMipsRegLo ( m_Opcode . rs ) ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . TargetPC = cMipsRegLo ( m_Opcode . rs ) ;
2011-01-02 10:40:00 +00:00
m_Section - > m_Jump . JumpPC = m_Section - > m_Jump . TargetPC + 4 ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . FallThrough = TRUE ;
m_Section - > m_Jump . LinkLocation = NULL ;
m_Section - > m_Jump . LinkLocation2 = NULL ;
m_Section - > m_Cont . FallThrough = FALSE ;
m_Section - > m_Cont . LinkLocation = NULL ;
m_Section - > m_Cont . LinkLocation2 = NULL ;
2010-11-12 05:30:08 +00:00
} else {
m_Section - > m_Jump . FallThrough = false ;
m_Section - > m_Jump . LinkLocation = NULL ;
m_Section - > m_Jump . LinkLocation2 = NULL ;
m_Section - > m_Cont . FallThrough = FALSE ;
m_Section - > m_Cont . LinkLocation = NULL ;
m_Section - > m_Cont . LinkLocation2 = NULL ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
if ( DelaySlotEffectsCompare ( m_CompilePC , m_Opcode . rs , 0 ) ) {
if ( IsConst ( m_Opcode . rs ) ) {
MoveConstToVariable ( cMipsRegLo ( m_Opcode . rs ) , _PROGRAM_COUNTER , " PROGRAM_COUNTER " ) ;
} else if ( IsMapped ( m_Opcode . rs ) ) {
2010-06-04 06:25:07 +00:00
MoveX86regToVariable ( cMipsRegMapLo ( m_Opcode . rs ) , _PROGRAM_COUNTER , " PROGRAM_COUNTER " ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
MoveX86regToVariable ( Map_TempReg ( x86_Any , m_Opcode . rs , FALSE ) , _PROGRAM_COUNTER , " PROGRAM_COUNTER " ) ;
2010-05-25 09:15:19 +00:00
}
}
2010-05-30 01:54:42 +00:00
m_NextInstruction = DO_DELAY_SLOT ;
} else if ( m_NextInstruction = = DELAY_SLOT_DONE ) {
if ( DelaySlotEffectsCompare ( m_CompilePC , m_Opcode . rs , 0 ) ) {
2010-06-04 06:25:07 +00:00
m_Section - > CompileExit ( m_CompilePC , ( DWORD ) - 1 , m_RegWorkingSet , CExitInfo : : Normal , TRUE , NULL ) ;
2010-05-25 09:15:19 +00:00
} else {
2012-09-26 04:01:27 +00:00
UpdateCounters ( m_RegWorkingSet , true , true ) ;
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rs ) ) {
2010-11-12 05:30:08 +00:00
m_Section - > m_Jump . JumpPC = m_Section - > m_Jump . TargetPC + 4 ;
2010-06-22 20:36:28 +00:00
m_Section - > m_Jump . RegSet = m_RegWorkingSet ;
2010-06-04 06:25:07 +00:00
m_Section - > GenerateSectionLinkage ( ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
if ( IsMapped ( m_Opcode . rs ) ) {
2010-06-04 06:25:07 +00:00
MoveX86regToVariable ( cMipsRegMapLo ( m_Opcode . rs ) , _PROGRAM_COUNTER , " PROGRAM_COUNTER " ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
MoveX86regToVariable ( Map_TempReg ( x86_Any , m_Opcode . rs , FALSE ) , _PROGRAM_COUNTER , " PROGRAM_COUNTER " ) ;
2010-05-25 09:15:19 +00:00
}
2010-06-04 06:25:07 +00:00
m_Section - > CompileExit ( - 1 , ( DWORD ) - 1 , m_RegWorkingSet , CExitInfo : : Normal , TRUE , NULL ) ;
2010-10-23 18:53:01 +00:00
if ( m_Section - > m_JumpSection )
{
m_Section - > GenerateSectionLinkage ( ) ;
}
2010-05-25 09:15:19 +00:00
}
}
2010-05-30 01:54:42 +00:00
m_NextInstruction = END_BLOCK ;
2010-05-25 09:15:19 +00:00
} else {
# ifndef EXTERNAL_RELEASE
2010-05-30 01:54:42 +00:00
DisplayError ( " WTF \n \n Branch \n NextInstruction = %X " , m_NextInstruction ) ;
2010-05-25 09:15:19 +00:00
# endif
}
}
2012-09-26 00:55:09 +00:00
void CRecompilerOps : : SPECIAL_JALR ( void )
{
if ( m_NextInstruction = = NORMAL )
{
2010-05-30 01:54:42 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2012-09-26 00:55:09 +00:00
if ( DelaySlotEffectsCompare ( m_CompilePC , m_Opcode . rs , 0 ) )
{
2010-05-30 01:54:42 +00:00
CRecompilerOps : : UnknownOpcode ( ) ;
}
UnMap_GPR ( m_Opcode . rd , FALSE ) ;
2010-06-04 06:25:07 +00:00
MipsRegLo ( m_Opcode . rd ) = m_CompilePC + 8 ;
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
2012-09-26 00:55:09 +00:00
if ( ( m_CompilePC & 0xFFC ) = = 0xFFC )
{
2010-06-16 07:31:47 +00:00
if ( IsMapped ( m_Opcode . rs ) ) {
2012-09-26 00:55:09 +00:00
MoveX86regToVariable ( cMipsRegMapLo ( m_Opcode . rs ) , & R4300iOp : : m_JumpToLocation , " R4300iOp::m_JumpToLocation " ) ;
m_RegWorkingSet . WriteBackRegisters ( ) ;
2010-05-25 09:15:19 +00:00
} else {
2012-09-26 00:55:09 +00:00
m_RegWorkingSet . WriteBackRegisters ( ) ;
MoveX86regToVariable ( Map_TempReg ( x86_Any , m_Opcode . rs , FALSE ) , & R4300iOp : : m_JumpToLocation , " R4300iOp::m_JumpToLocation " ) ;
2010-05-25 09:15:19 +00:00
}
2012-09-26 00:55:09 +00:00
OverflowDelaySlot ( true ) ;
2010-05-25 09:15:19 +00:00
return ;
}
2010-05-30 01:54:42 +00:00
m_NextInstruction = DO_DELAY_SLOT ;
} else if ( m_NextInstruction = = DELAY_SLOT_DONE ) {
if ( IsConst ( m_Opcode . rs ) ) {
memcpy ( & m_Section - > m_Jump . RegSet , & m_RegWorkingSet , sizeof ( CRegInfo ) ) ;
2010-06-04 06:25:07 +00:00
m_Section - > m_Jump . BranchLabel . Format ( " 0x%08X " , cMipsRegLo ( m_Opcode . rs ) ) ;
2010-05-30 01:54:42 +00:00
m_Section - > m_Jump . TargetPC = cMipsRegLo ( m_Opcode . rs ) ;
m_Section - > m_Jump . FallThrough = TRUE ;
m_Section - > m_Jump . LinkLocation = NULL ;
m_Section - > m_Jump . LinkLocation2 = NULL ;
m_Section - > m_Cont . FallThrough = FALSE ;
m_Section - > m_Cont . LinkLocation = NULL ;
m_Section - > m_Cont . LinkLocation2 = NULL ;
2010-05-25 09:15:19 +00:00
2010-06-04 06:25:07 +00:00
m_Section - > GenerateSectionLinkage ( ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
if ( IsMapped ( m_Opcode . rs ) ) {
2010-06-04 06:25:07 +00:00
MoveX86regToVariable ( cMipsRegMapLo ( m_Opcode . rs ) , _PROGRAM_COUNTER , " PROGRAM_COUNTER " ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
MoveX86regToVariable ( Map_TempReg ( x86_Any , m_Opcode . rs , FALSE ) , _PROGRAM_COUNTER , " PROGRAM_COUNTER " ) ;
2010-05-25 09:15:19 +00:00
}
2010-06-07 02:23:58 +00:00
UpdateCounters ( m_RegWorkingSet , true , true ) ;
2010-06-04 06:25:07 +00:00
m_Section - > CompileExit ( m_CompilePC , ( DWORD ) - 1 , m_RegWorkingSet , CExitInfo : : Normal , TRUE , NULL ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
m_NextInstruction = END_BLOCK ;
2010-05-25 09:15:19 +00:00
} else {
# ifndef EXTERNAL_RELEASE
2010-05-30 01:54:42 +00:00
DisplayError ( " WTF \n \n Branch \n NextInstruction = %X " , m_NextInstruction ) ;
2010-05-25 09:15:19 +00:00
# endif
}
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : SPECIAL_SYSCALL ( void ) {
2010-06-14 21:14:58 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
m_Section - > CompileExit ( m_CompilePC , - 1 , m_RegWorkingSet , CExitInfo : : DoSysCall , TRUE , NULL ) ;
m_NextInstruction = END_BLOCK ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : SPECIAL_MFLO ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
if ( m_Opcode . rd = = 0 ) { return ; }
2010-05-25 09:15:19 +00:00
2010-05-31 00:21:08 +00:00
Map_GPR_64bit ( m_Opcode . rd , - 1 ) ;
2010-06-04 06:25:07 +00:00
MoveVariableToX86reg ( & _RegLO - > UW [ 0 ] , " _RegLO->UW[0] " , cMipsRegMapLo ( m_Opcode . rd ) ) ;
MoveVariableToX86reg ( & _RegLO - > UW [ 1 ] , " _RegLO->UW[1] " , cMipsRegMapHi ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : SPECIAL_MTLO ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-25 09:15:19 +00:00
2010-09-22 21:43:42 +00:00
if ( IsKnown ( m_Opcode . rs ) & & IsConst ( m_Opcode . rs ) ) {
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( m_Opcode . rs ) ) {
2010-05-30 01:54:42 +00:00
MoveConstToVariable ( MipsRegHi ( m_Opcode . rs ) , & _RegLO - > UW [ 1 ] , " _RegLO->UW[1] " ) ;
2010-09-22 21:43:42 +00:00
} else if ( IsSigned ( m_Opcode . rs ) & & ( ( cMipsRegLo ( m_Opcode . rs ) & 0x80000000 ) ! = 0 ) ) {
2010-05-25 09:15:19 +00:00
MoveConstToVariable ( 0xFFFFFFFF , & _RegLO - > UW [ 1 ] , " _RegLO->UW[1] " ) ;
} else {
MoveConstToVariable ( 0 , & _RegLO - > UW [ 1 ] , " _RegLO->UW[1] " ) ;
}
2010-05-30 01:54:42 +00:00
MoveConstToVariable ( cMipsRegLo ( m_Opcode . rs ) , & _RegLO - > UW [ 0 ] , " _RegLO->UW[0] " ) ;
2010-09-22 21:43:42 +00:00
} else if ( IsKnown ( m_Opcode . rs ) & & IsMapped ( m_Opcode . rs ) ) {
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( m_Opcode . rs ) ) {
MoveX86regToVariable ( MipsRegMapHi ( m_Opcode . rs ) , & _RegLO - > UW [ 1 ] , " _RegLO->UW[1] " ) ;
2010-09-22 21:43:42 +00:00
} else if ( IsSigned ( m_Opcode . rs ) ) {
2010-05-31 00:21:08 +00:00
MoveX86regToVariable ( Map_TempReg ( x86_Any , m_Opcode . rs , TRUE ) , & _RegLO - > UW [ 1 ] , " _RegLO->UW[1] " ) ;
2010-05-25 09:15:19 +00:00
} else {
MoveConstToVariable ( 0 , & _RegLO - > UW [ 1 ] , " _RegLO->UW[1] " ) ;
}
2010-06-04 06:25:07 +00:00
MoveX86regToVariable ( cMipsRegMapLo ( m_Opcode . rs ) , & _RegLO - > UW [ 0 ] , " _RegLO->UW[0] " ) ;
2010-10-23 18:53:01 +00:00
} else if ( b32BitCore ( ) ) {
x86Reg reg = Map_TempReg ( x86_Any , m_Opcode . rs , false ) ;
MoveX86regToVariable ( reg , & _RegLO - > UW [ 0 ] , " _RegLO->UW[0] " ) ;
ShiftRightSignImmed ( reg , 31 ) ;
MoveX86regToVariable ( reg , & _RegLO - > UW [ 1 ] , " _RegLO->UW[1] " ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-06-04 06:25:07 +00:00
x86Reg reg = Map_TempReg ( x86_Any , m_Opcode . rs , TRUE ) ;
MoveX86regToVariable ( reg , & _RegLO - > UW [ 1 ] , " _RegLO->UW[1] " ) ;
MoveX86regToVariable ( Map_TempReg ( reg , m_Opcode . rs , FALSE ) , & _RegLO - > UW [ 0 ] , " _RegLO->UW[0] " ) ;
2010-05-25 09:15:19 +00:00
}
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : SPECIAL_MFHI ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
if ( m_Opcode . rd = = 0 ) { return ; }
2010-05-31 00:21:08 +00:00
Map_GPR_64bit ( m_Opcode . rd , - 1 ) ;
2010-06-04 06:25:07 +00:00
MoveVariableToX86reg ( & _RegHI - > UW [ 0 ] , " _RegHI->UW[0] " , cMipsRegMapLo ( m_Opcode . rd ) ) ;
MoveVariableToX86reg ( & _RegHI - > UW [ 1 ] , " _RegHI->UW[1] " , cMipsRegMapHi ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : SPECIAL_MTHI ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-10-23 18:53:01 +00:00
2010-09-22 21:43:42 +00:00
if ( IsKnown ( m_Opcode . rs ) & & IsConst ( m_Opcode . rs ) ) {
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( m_Opcode . rs ) ) {
2010-05-30 01:54:42 +00:00
MoveConstToVariable ( MipsRegHi ( m_Opcode . rs ) , & _RegHI - > UW [ 1 ] , " _RegHI->UW[1] " ) ;
2010-09-22 21:43:42 +00:00
} else if ( IsSigned ( m_Opcode . rs ) & & ( ( cMipsRegLo ( m_Opcode . rs ) & 0x80000000 ) ! = 0 ) ) {
2010-05-25 09:15:19 +00:00
MoveConstToVariable ( 0xFFFFFFFF , & _RegHI - > UW [ 1 ] , " _RegHI->UW[1] " ) ;
} else {
MoveConstToVariable ( 0 , & _RegHI - > UW [ 1 ] , " _RegHI->UW[1] " ) ;
}
2010-05-30 01:54:42 +00:00
MoveConstToVariable ( cMipsRegLo ( m_Opcode . rs ) , & _RegHI - > UW [ 0 ] , " _RegHI->UW[0] " ) ;
2010-09-22 21:43:42 +00:00
} else if ( IsKnown ( m_Opcode . rs ) & & IsMapped ( m_Opcode . rs ) ) {
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( m_Opcode . rs ) ) {
MoveX86regToVariable ( MipsRegMapHi ( m_Opcode . rs ) , & _RegHI - > UW [ 1 ] , " _RegHI->UW[1] " ) ;
2010-09-22 21:43:42 +00:00
} else if ( IsSigned ( m_Opcode . rs ) ) {
2010-05-31 00:21:08 +00:00
MoveX86regToVariable ( Map_TempReg ( x86_Any , m_Opcode . rs , TRUE ) , & _RegHI - > UW [ 1 ] , " _RegHI->UW[1] " ) ;
2010-05-25 09:15:19 +00:00
} else {
MoveConstToVariable ( 0 , & _RegHI - > UW [ 1 ] , " _RegHI->UW[1] " ) ;
}
2010-06-04 06:25:07 +00:00
MoveX86regToVariable ( cMipsRegMapLo ( m_Opcode . rs ) , & _RegHI - > UW [ 0 ] , " _RegHI->UW[0] " ) ;
2010-10-23 18:53:01 +00:00
} else if ( b32BitCore ( ) ) {
x86Reg reg = Map_TempReg ( x86_Any , m_Opcode . rs , false ) ;
MoveX86regToVariable ( reg , & _RegHI - > UW [ 0 ] , " _RegHI->UW[0] " ) ;
ShiftRightSignImmed ( reg , 31 ) ;
MoveX86regToVariable ( reg , & _RegHI - > UW [ 1 ] , " _RegHI->UW[1] " ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-06-04 06:25:07 +00:00
x86Reg reg = Map_TempReg ( x86_Any , m_Opcode . rs , TRUE ) ;
MoveX86regToVariable ( reg , & _RegHI - > UW [ 1 ] , " _RegHI->UW[1] " ) ;
MoveX86regToVariable ( Map_TempReg ( reg , m_Opcode . rs , FALSE ) , & _RegHI - > UW [ 0 ] , " _RegHI->UW[0] " ) ;
2010-05-25 09:15:19 +00:00
}
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : SPECIAL_DSLLV ( void ) {
2010-05-25 09:15:19 +00:00
BYTE * Jump [ 2 ] ;
2010-05-30 01:54:42 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
if ( m_Opcode . rd = = 0 ) { return ; }
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rs ) ) {
DWORD Shift = ( cMipsRegLo ( m_Opcode . rs ) & 0x3F ) ;
CRecompilerOps : : UnknownOpcode ( ) ;
2010-05-25 09:15:19 +00:00
return ;
}
2010-05-31 00:21:08 +00:00
Map_TempReg ( x86_ECX , m_Opcode . rs , FALSE ) ;
2010-05-25 09:15:19 +00:00
AndConstToX86Reg ( x86_ECX , 0x3F ) ;
2010-05-31 00:21:08 +00:00
Map_GPR_64bit ( m_Opcode . rd , m_Opcode . rt ) ;
2010-05-25 09:15:19 +00:00
CompConstToX86reg ( x86_ECX , 0x20 ) ;
JaeLabel8 ( " MORE32 " , 0 ) ;
2010-05-30 01:54:42 +00:00
Jump [ 0 ] = m_RecompPos - 1 ;
2010-06-22 20:36:28 +00:00
ShiftLeftDouble ( cMipsRegMapHi ( m_Opcode . rd ) , cMipsRegMapLo ( m_Opcode . rd ) ) ;
ShiftLeftSign ( cMipsRegMapLo ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
JmpLabel8 ( " continue " , 0 ) ;
2010-05-30 01:54:42 +00:00
Jump [ 1 ] = m_RecompPos - 1 ;
2010-05-25 09:15:19 +00:00
//MORE32:
CPU_Message ( " " ) ;
CPU_Message ( " MORE32: " ) ;
2010-05-30 01:54:42 +00:00
* ( ( BYTE * ) ( Jump [ 0 ] ) ) = ( BYTE ) ( m_RecompPos - Jump [ 0 ] - 1 ) ;
2010-06-22 20:36:28 +00:00
MoveX86RegToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , cMipsRegMapHi ( m_Opcode . rd ) ) ;
XorX86RegToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , cMipsRegMapLo ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
AndConstToX86Reg ( x86_ECX , 0x1F ) ;
2010-06-22 20:36:28 +00:00
ShiftLeftSign ( cMipsRegMapHi ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
//continue:
CPU_Message ( " " ) ;
CPU_Message ( " continue: " ) ;
2010-05-30 01:54:42 +00:00
* ( ( BYTE * ) ( Jump [ 1 ] ) ) = ( BYTE ) ( m_RecompPos - Jump [ 1 ] - 1 ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : SPECIAL_DSRLV ( void ) {
2010-05-25 09:15:19 +00:00
BYTE * Jump [ 2 ] ;
2010-05-30 01:54:42 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
if ( m_Opcode . rd = = 0 ) { return ; }
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rs ) ) {
DWORD Shift = ( cMipsRegLo ( m_Opcode . rs ) & 0x3F ) ;
if ( IsConst ( m_Opcode . rt ) ) {
if ( IsMapped ( m_Opcode . rd ) ) { UnMap_GPR ( m_Opcode . rd , FALSE ) ; }
2010-09-22 21:43:42 +00:00
MipsReg ( m_Opcode . rd ) = Is64Bit ( m_Opcode . rt ) ? MipsReg ( m_Opcode . rt ) : ( __int64 ) MipsRegLo_S ( m_Opcode . rt ) ;
MipsReg ( m_Opcode . rd ) = MipsReg ( m_Opcode . rd ) > > Shift ;
2010-05-30 01:54:42 +00:00
if ( ( MipsRegHi ( m_Opcode . rd ) = = 0 ) & & ( cMipsRegLo ( m_Opcode . rd ) & 0x80000000 ) = = 0 ) {
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
} else if ( ( MipsRegHi ( m_Opcode . rd ) = = 0xFFFFFFFF ) & & ( cMipsRegLo ( m_Opcode . rd ) & 0x80000000 ) ! = 0 ) {
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_64 ;
2010-05-25 09:15:19 +00:00
}
return ;
}
//if (Shift < 0x20) {
//} else {
//}
2010-06-12 02:02:06 +00:00
CRecompilerOps : : UnknownOpcode ( ) ;
} else {
Map_TempReg ( x86_ECX , m_Opcode . rs , FALSE ) ;
AndConstToX86Reg ( x86_ECX , 0x3F ) ;
Map_GPR_64bit ( m_Opcode . rd , m_Opcode . rt ) ;
CompConstToX86reg ( x86_ECX , 0x20 ) ;
JaeLabel8 ( " MORE32 " , 0 ) ;
Jump [ 0 ] = m_RecompPos - 1 ;
ShiftRightDouble ( cMipsRegMapLo ( m_Opcode . rd ) , cMipsRegMapHi ( m_Opcode . rd ) ) ;
ShiftRightUnsign ( cMipsRegMapHi ( m_Opcode . rd ) ) ;
JmpLabel8 ( " continue " , 0 ) ;
Jump [ 1 ] = m_RecompPos - 1 ;
//MORE32:
CPU_Message ( " " ) ;
CPU_Message ( " MORE32: " ) ;
* ( ( BYTE * ) ( Jump [ 0 ] ) ) = ( BYTE ) ( m_RecompPos - Jump [ 0 ] - 1 ) ;
MoveX86RegToX86Reg ( cMipsRegMapHi ( m_Opcode . rd ) , cMipsRegMapLo ( m_Opcode . rd ) ) ;
XorX86RegToX86Reg ( cMipsRegMapHi ( m_Opcode . rd ) , cMipsRegMapHi ( m_Opcode . rd ) ) ;
AndConstToX86Reg ( x86_ECX , 0x1F ) ;
ShiftRightUnsign ( cMipsRegMapLo ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
2010-06-12 02:02:06 +00:00
//continue:
CPU_Message ( " " ) ;
CPU_Message ( " continue: " ) ;
* ( ( BYTE * ) ( Jump [ 1 ] ) ) = ( BYTE ) ( m_RecompPos - Jump [ 1 ] - 1 ) ;
}
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : SPECIAL_DSRAV ( void ) {
_Notify - > BreakPoint ( __FILE__ , __LINE__ ) ;
# ifdef tofix
2010-05-25 09:15:19 +00:00
BYTE * Jump [ 2 ] ;
2010-05-30 01:54:42 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
if ( m_Opcode . rd = = 0 ) { return ; }
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rs ) ) {
DWORD Shift = ( cMipsRegLo ( m_Opcode . rs ) & 0x3F ) ;
CRecompilerOps : : UnknownOpcode ( ) ;
2010-05-25 09:15:19 +00:00
return ;
}
2010-05-31 00:21:08 +00:00
Map_TempReg ( x86_ECX , m_Opcode . rs , FALSE ) ;
2010-05-25 09:15:19 +00:00
AndConstToX86Reg ( x86_ECX , 0x3F ) ;
2010-05-31 00:21:08 +00:00
Map_GPR_64bit ( m_Opcode . rd , m_Opcode . rt ) ;
2010-05-25 09:15:19 +00:00
CompConstToX86reg ( x86_ECX , 0x20 ) ;
JaeLabel8 ( " MORE32 " , 0 ) ;
2010-05-30 01:54:42 +00:00
Jump [ 0 ] = m_RecompPos - 1 ;
ShiftRightDouble ( cMipsRegLo ( m_Opcode . rd ) , MipsRegHi ( m_Opcode . rd ) ) ;
ShiftRightSign ( MipsRegHi ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
JmpLabel8 ( " continue " , 0 ) ;
2010-05-30 01:54:42 +00:00
Jump [ 1 ] = m_RecompPos - 1 ;
2010-05-25 09:15:19 +00:00
//MORE32:
CPU_Message ( " " ) ;
CPU_Message ( " MORE32: " ) ;
2010-05-30 01:54:42 +00:00
* ( ( BYTE * ) ( Jump [ 0 ] ) ) = ( BYTE ) ( m_RecompPos - Jump [ 0 ] - 1 ) ;
MoveX86RegToX86Reg ( MipsRegHi ( m_Opcode . rd ) , cMipsRegLo ( m_Opcode . rd ) ) ;
ShiftRightSignImmed ( MipsRegHi ( m_Opcode . rd ) , 0x1F ) ;
2010-05-25 09:15:19 +00:00
AndConstToX86Reg ( x86_ECX , 0x1F ) ;
2010-05-30 01:54:42 +00:00
ShiftRightSign ( cMipsRegLo ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
//continue:
CPU_Message ( " " ) ;
CPU_Message ( " continue: " ) ;
2010-05-30 01:54:42 +00:00
* ( ( BYTE * ) ( Jump [ 1 ] ) ) = ( BYTE ) ( m_RecompPos - Jump [ 1 ] - 1 ) ;
# endif
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : SPECIAL_MULT ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-25 09:15:19 +00:00
2010-06-12 02:02:06 +00:00
X86Protected ( x86_EDX ) = TRUE ;
2010-05-31 00:21:08 +00:00
Map_TempReg ( x86_EAX , m_Opcode . rs , FALSE ) ;
2010-06-12 02:02:06 +00:00
X86Protected ( x86_EDX ) = FALSE ;
2010-05-31 00:21:08 +00:00
Map_TempReg ( x86_EDX , m_Opcode . rt , FALSE ) ;
2010-05-25 09:15:19 +00:00
imulX86reg ( x86_EDX ) ;
MoveX86regToVariable ( x86_EAX , & _RegLO - > UW [ 0 ] , " _RegLO->UW[0] " ) ;
MoveX86regToVariable ( x86_EDX , & _RegHI - > UW [ 0 ] , " _RegHI->UW[0] " ) ;
ShiftRightSignImmed ( x86_EAX , 31 ) ; /* paired */
ShiftRightSignImmed ( x86_EDX , 31 ) ;
MoveX86regToVariable ( x86_EAX , & _RegLO - > UW [ 1 ] , " _RegLO->UW[1] " ) ;
MoveX86regToVariable ( x86_EDX , & _RegHI - > UW [ 1 ] , " _RegHI->UW[1] " ) ;
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : SPECIAL_MULTU ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-25 09:15:19 +00:00
2010-06-04 06:25:07 +00:00
X86Protected ( x86_EDX ) = TRUE ;
2010-05-31 00:21:08 +00:00
Map_TempReg ( x86_EAX , m_Opcode . rs , FALSE ) ;
2010-06-04 06:25:07 +00:00
X86Protected ( x86_EDX ) = FALSE ;
2010-05-31 00:21:08 +00:00
Map_TempReg ( x86_EDX , m_Opcode . rt , FALSE ) ;
2010-05-25 09:15:19 +00:00
MulX86reg ( x86_EDX ) ;
MoveX86regToVariable ( x86_EAX , & _RegLO - > UW [ 0 ] , " _RegLO->UW[0] " ) ;
MoveX86regToVariable ( x86_EDX , & _RegHI - > UW [ 0 ] , " _RegHI->UW[0] " ) ;
ShiftRightSignImmed ( x86_EAX , 31 ) ; /* paired */
ShiftRightSignImmed ( x86_EDX , 31 ) ;
MoveX86regToVariable ( x86_EAX , & _RegLO - > UW [ 1 ] , " _RegLO->UW[1] " ) ;
MoveX86regToVariable ( x86_EDX , & _RegHI - > UW [ 1 ] , " _RegHI->UW[1] " ) ;
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : SPECIAL_DIV ( void ) {
2010-05-25 09:15:19 +00:00
BYTE * Jump [ 2 ] ;
2010-05-30 01:54:42 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rt ) ) {
2010-05-31 00:21:08 +00:00
if ( MipsRegLo ( m_Opcode . rt ) = = 0 ) {
2010-05-25 09:15:19 +00:00
MoveConstToVariable ( 0 , & _RegLO - > UW [ 0 ] , " _RegLO->UW[0] " ) ;
MoveConstToVariable ( 0 , & _RegLO - > UW [ 1 ] , " _RegLO->UW[1] " ) ;
MoveConstToVariable ( 0 , & _RegHI - > UW [ 0 ] , " _RegHI->UW[0] " ) ;
MoveConstToVariable ( 0 , & _RegHI - > UW [ 1 ] , " _RegHI->UW[1] " ) ;
return ;
}
Jump [ 1 ] = NULL ;
} else {
2010-05-30 01:54:42 +00:00
if ( IsMapped ( m_Opcode . rt ) ) {
2010-06-04 06:25:07 +00:00
CompConstToX86reg ( cMipsRegMapLo ( m_Opcode . rt ) , 0 ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
CompConstToVariable ( 0 , & _GPR [ m_Opcode . rt ] . W [ 0 ] , CRegName : : GPR_Lo [ m_Opcode . rt ] ) ;
2010-05-25 09:15:19 +00:00
}
JneLabel8 ( " NoExcept " , 0 ) ;
2010-05-30 01:54:42 +00:00
Jump [ 0 ] = m_RecompPos - 1 ;
2010-05-25 09:15:19 +00:00
MoveConstToVariable ( 0 , & _RegLO - > UW [ 0 ] , " _RegLO->UW[0] " ) ;
MoveConstToVariable ( 0 , & _RegLO - > UW [ 1 ] , " _RegLO->UW[1] " ) ;
MoveConstToVariable ( 0 , & _RegHI - > UW [ 0 ] , " _RegHI->UW[0] " ) ;
MoveConstToVariable ( 0 , & _RegHI - > UW [ 1 ] , " _RegHI->UW[1] " ) ;
JmpLabel8 ( " EndDivu " , 0 ) ;
2010-05-30 01:54:42 +00:00
Jump [ 1 ] = m_RecompPos - 1 ;
2010-05-25 09:15:19 +00:00
CPU_Message ( " " ) ;
CPU_Message ( " NoExcept: " ) ;
2010-05-30 01:54:42 +00:00
* ( ( BYTE * ) ( Jump [ 0 ] ) ) = ( BYTE ) ( m_RecompPos - Jump [ 0 ] - 1 ) ;
2010-05-25 09:15:19 +00:00
}
/* lo = (SD)rs / (SD)rt;
hi = ( SD ) rs % ( SD ) rt ; */
2010-06-04 06:25:07 +00:00
X86Protected ( x86_EDX ) = TRUE ;
2010-05-31 00:21:08 +00:00
Map_TempReg ( x86_EAX , m_Opcode . rs , FALSE ) ;
2010-05-25 09:15:19 +00:00
/* edx is the signed portion to eax */
2010-06-04 06:25:07 +00:00
X86Protected ( x86_EDX ) = FALSE ;
2010-05-31 00:21:08 +00:00
Map_TempReg ( x86_EDX , - 1 , FALSE ) ;
2010-05-25 09:15:19 +00:00
MoveX86RegToX86Reg ( x86_EAX , x86_EDX ) ;
ShiftRightSignImmed ( x86_EDX , 31 ) ;
2010-05-30 01:54:42 +00:00
if ( IsMapped ( m_Opcode . rt ) ) {
2010-06-04 06:25:07 +00:00
idivX86reg ( cMipsRegMapLo ( m_Opcode . rt ) ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
idivX86reg ( Map_TempReg ( x86_Any , m_Opcode . rt , FALSE ) ) ;
2010-05-25 09:15:19 +00:00
}
MoveX86regToVariable ( x86_EAX , & _RegLO - > UW [ 0 ] , " _RegLO->UW[0] " ) ;
MoveX86regToVariable ( x86_EDX , & _RegHI - > UW [ 0 ] , " _RegHI->UW[0] " ) ;
ShiftRightSignImmed ( x86_EAX , 31 ) ; /* paired */
ShiftRightSignImmed ( x86_EDX , 31 ) ;
MoveX86regToVariable ( x86_EAX , & _RegLO - > UW [ 1 ] , " _RegLO->UW[1] " ) ;
MoveX86regToVariable ( x86_EDX , & _RegHI - > UW [ 1 ] , " _RegHI->UW[1] " ) ;
if ( Jump [ 1 ] ! = NULL ) {
CPU_Message ( " " ) ;
CPU_Message ( " EndDivu: " ) ;
2010-05-30 01:54:42 +00:00
* ( ( BYTE * ) ( Jump [ 1 ] ) ) = ( BYTE ) ( m_RecompPos - Jump [ 1 ] - 1 ) ;
2010-05-25 09:15:19 +00:00
}
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : SPECIAL_DIVU ( void ) {
2010-05-25 09:15:19 +00:00
BYTE * Jump [ 2 ] ;
2010-06-04 06:25:07 +00:00
x86Reg Reg ;
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rt ) ) {
2010-05-31 00:21:08 +00:00
if ( MipsRegLo ( m_Opcode . rt ) = = 0 ) {
2010-05-25 09:15:19 +00:00
MoveConstToVariable ( 0 , & _RegLO - > UW [ 0 ] , " _RegLO->UW[0] " ) ;
MoveConstToVariable ( 0 , & _RegLO - > UW [ 1 ] , " _RegLO->UW[1] " ) ;
MoveConstToVariable ( 0 , & _RegHI - > UW [ 0 ] , " _RegHI->UW[0] " ) ;
MoveConstToVariable ( 0 , & _RegHI - > UW [ 1 ] , " _RegHI->UW[1] " ) ;
return ;
}
Jump [ 1 ] = NULL ;
} else {
2010-05-30 01:54:42 +00:00
if ( IsMapped ( m_Opcode . rt ) ) {
2010-06-04 06:25:07 +00:00
CompConstToX86reg ( cMipsRegMapLo ( m_Opcode . rt ) , 0 ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
CompConstToVariable ( 0 , & _GPR [ m_Opcode . rt ] . W [ 0 ] , CRegName : : GPR_Lo [ m_Opcode . rt ] ) ;
2010-05-25 09:15:19 +00:00
}
JneLabel8 ( " NoExcept " , 0 ) ;
2010-05-30 01:54:42 +00:00
Jump [ 0 ] = m_RecompPos - 1 ;
2010-05-25 09:15:19 +00:00
MoveConstToVariable ( 0 , & _RegLO - > UW [ 0 ] , " _RegLO->UW[0] " ) ;
MoveConstToVariable ( 0 , & _RegLO - > UW [ 1 ] , " _RegLO->UW[1] " ) ;
MoveConstToVariable ( 0 , & _RegHI - > UW [ 0 ] , " _RegHI->UW[0] " ) ;
MoveConstToVariable ( 0 , & _RegHI - > UW [ 1 ] , " _RegHI->UW[1] " ) ;
JmpLabel8 ( " EndDivu " , 0 ) ;
2010-05-30 01:54:42 +00:00
Jump [ 1 ] = m_RecompPos - 1 ;
2010-05-25 09:15:19 +00:00
CPU_Message ( " " ) ;
CPU_Message ( " NoExcept: " ) ;
2010-05-30 01:54:42 +00:00
* ( ( BYTE * ) ( Jump [ 0 ] ) ) = ( BYTE ) ( m_RecompPos - Jump [ 0 ] - 1 ) ;
2010-05-25 09:15:19 +00:00
}
/* lo = (UD)rs / (UD)rt;
hi = ( UD ) rs % ( UD ) rt ; */
2010-06-04 06:25:07 +00:00
X86Protected ( x86_EAX ) = TRUE ;
2010-05-31 00:21:08 +00:00
Map_TempReg ( x86_EDX , 0 , FALSE ) ;
2010-06-04 06:25:07 +00:00
X86Protected ( x86_EAX ) = FALSE ;
2010-05-25 09:15:19 +00:00
2010-05-31 00:21:08 +00:00
Map_TempReg ( x86_EAX , m_Opcode . rs , FALSE ) ;
2010-06-04 06:25:07 +00:00
Reg = Map_TempReg ( x86_Any , m_Opcode . rt , FALSE ) ;
2010-05-25 09:15:19 +00:00
2010-06-04 06:25:07 +00:00
DivX86reg ( Reg ) ;
2010-05-25 09:15:19 +00:00
MoveX86regToVariable ( x86_EAX , & _RegLO - > UW [ 0 ] , " _RegLO->UW[0] " ) ;
MoveX86regToVariable ( x86_EDX , & _RegHI - > UW [ 0 ] , " _RegHI->UW[0] " ) ;
/* wouldnt these be zero (???) */
ShiftRightSignImmed ( x86_EAX , 31 ) ; /* paired */
ShiftRightSignImmed ( x86_EDX , 31 ) ;
MoveX86regToVariable ( x86_EAX , & _RegLO - > UW [ 1 ] , " _RegLO->UW[1] " ) ;
MoveX86regToVariable ( x86_EDX , & _RegHI - > UW [ 1 ] , " _RegHI->UW[1] " ) ;
if ( Jump [ 1 ] ! = NULL ) {
CPU_Message ( " " ) ;
CPU_Message ( " EndDivu: " ) ;
2010-05-30 01:54:42 +00:00
* ( ( BYTE * ) ( Jump [ 1 ] ) ) = ( BYTE ) ( m_RecompPos - Jump [ 1 ] - 1 ) ;
2010-05-25 09:15:19 +00:00
}
}
2010-06-22 20:36:28 +00:00
void CRecompilerOps : : SPECIAL_DMULT ( void )
{
2010-05-30 01:54:42 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
if ( m_Opcode . rs ! = 0 ) { UnMap_GPR ( m_Opcode . rs , TRUE ) ; }
if ( m_Opcode . rs ! = 0 ) { UnMap_GPR ( m_Opcode . rt , TRUE ) ; }
2010-06-22 20:36:28 +00:00
BeforeCallDirect ( m_RegWorkingSet ) ;
2010-06-04 06:25:07 +00:00
MoveConstToVariable ( m_Opcode . Hex , & R4300iOp : : m_Opcode . Hex , " R4300iOp::m_Opcode.Hex " ) ;
2010-05-25 09:15:19 +00:00
Call_Direct ( R4300iOp : : SPECIAL_DMULT , " R4300iOp::SPECIAL_DMULT " ) ;
2010-06-22 20:36:28 +00:00
AfterCallDirect ( m_RegWorkingSet ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : SPECIAL_DMULTU ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-25 09:15:19 +00:00
2010-06-22 20:36:28 +00:00
UnMap_GPR ( m_Opcode . rs , TRUE ) ;
UnMap_GPR ( m_Opcode . rt , TRUE ) ;
BeforeCallDirect ( m_RegWorkingSet ) ;
MoveConstToVariable ( m_Opcode . Hex , & R4300iOp : : m_Opcode . Hex , " R4300iOp::m_Opcode.Hex " ) ;
Call_Direct ( R4300iOp : : SPECIAL_DMULTU , " R4300iOp::SPECIAL_DMULTU " ) ;
AfterCallDirect ( m_RegWorkingSet ) ;
# ifdef toremove
2010-05-30 01:54:42 +00:00
/* _RegLO->UDW = (uint64)_GPR[m_Opcode.rs].UW[0] * (uint64)_GPR[m_Opcode.rt].UW[0]; */
2010-06-04 06:25:07 +00:00
X86Protected ( x86_EDX ) = TRUE ;
2010-05-31 00:21:08 +00:00
Map_TempReg ( x86_EAX , m_Opcode . rs , FALSE ) ;
2010-06-04 06:25:07 +00:00
X86Protected ( x86_EDX ) = FALSE ;
2010-05-31 00:21:08 +00:00
Map_TempReg ( x86_EDX , m_Opcode . rt , FALSE ) ;
2010-05-25 09:15:19 +00:00
MulX86reg ( x86_EDX ) ;
MoveX86regToVariable ( x86_EAX , & _RegLO - > UW [ 0 ] , " _RegLO->UW[0] " ) ;
MoveX86regToVariable ( x86_EDX , & _RegLO - > UW [ 1 ] , " _RegLO->UW[1] " ) ;
2010-05-30 01:54:42 +00:00
/* _RegHI->UDW = (uint64)_GPR[m_Opcode.rs].UW[1] * (uint64)_GPR[m_Opcode.rt].UW[1]; */
2010-05-31 00:21:08 +00:00
Map_TempReg ( x86_EAX , m_Opcode . rs , TRUE ) ;
Map_TempReg ( x86_EDX , m_Opcode . rt , TRUE ) ;
2010-05-25 09:15:19 +00:00
MulX86reg ( x86_EDX ) ;
MoveX86regToVariable ( x86_EAX , & _RegHI - > UW [ 0 ] , " _RegHI->UW[0] " ) ;
MoveX86regToVariable ( x86_EDX , & _RegHI - > UW [ 1 ] , " _RegHI->UW[1] " ) ;
2010-05-30 01:54:42 +00:00
/* Tmp[0].UDW = (uint64)_GPR[m_Opcode.rs].UW[1] * (uint64)_GPR[m_Opcode.rt].UW[0]; */
2010-05-31 00:21:08 +00:00
Map_TempReg ( x86_EAX , m_Opcode . rs , TRUE ) ;
Map_TempReg ( x86_EDX , m_Opcode . rt , FALSE ) ;
2010-05-25 09:15:19 +00:00
2010-05-31 00:21:08 +00:00
Map_TempReg ( x86_EBX , - 1 , FALSE ) ;
Map_TempReg ( x86_ECX , - 1 , FALSE ) ;
2010-05-25 09:15:19 +00:00
MulX86reg ( x86_EDX ) ;
MoveX86RegToX86Reg ( x86_EAX , x86_EBX ) ; /* EDX:EAX -> ECX:EBX */
MoveX86RegToX86Reg ( x86_EDX , x86_ECX ) ;
2010-05-30 01:54:42 +00:00
/* Tmp[1].UDW = (uint64)_GPR[m_Opcode.rs].UW[0] * (uint64)_GPR[m_Opcode.rt].UW[1]; */
2010-05-31 00:21:08 +00:00
Map_TempReg ( x86_EAX , m_Opcode . rs , FALSE ) ;
Map_TempReg ( x86_EDX , m_Opcode . rt , TRUE ) ;
2010-05-25 09:15:19 +00:00
MulX86reg ( x86_EDX ) ;
2010-05-31 00:21:08 +00:00
Map_TempReg ( x86_ESI , - 1 , FALSE ) ;
Map_TempReg ( x86_EDI , - 1 , FALSE ) ;
2010-05-25 09:15:19 +00:00
MoveX86RegToX86Reg ( x86_EAX , x86_ESI ) ; /* EDX:EAX -> EDI:ESI */
MoveX86RegToX86Reg ( x86_EDX , x86_EDI ) ;
/* Tmp[2].UDW = (uint64)_RegLO->UW[1] + (uint64)Tmp[0].UW[0] + (uint64)Tmp[1].UW[0]; */
XorX86RegToX86Reg ( x86_EDX , x86_EDX ) ;
MoveVariableToX86reg ( & _RegLO - > UW [ 1 ] , " _RegLO->UW[1] " , x86_EAX ) ;
AddX86RegToX86Reg ( x86_EAX , x86_EBX ) ;
AddConstToX86Reg ( x86_EDX , 0 ) ;
AddX86RegToX86Reg ( x86_EAX , x86_ESI ) ;
AddConstToX86Reg ( x86_EDX , 0 ) ; /* EDX:EAX */
/* _RegLO->UDW += ((uint64)Tmp[0].UW[0] + (uint64)Tmp[1].UW[0]) << 32; */
/* [low+4] += ebx + esi */
AddX86regToVariable ( x86_EBX , & _RegLO - > UW [ 1 ] , " _RegLO->UW[1] " ) ;
AddX86regToVariable ( x86_ESI , & _RegLO - > UW [ 1 ] , " _RegLO->UW[1] " ) ;
/* _RegHI->UDW += (uint64)Tmp[0].UW[1] + (uint64)Tmp[1].UW[1] + Tmp[2].UW[1]; */
/* [hi] += ecx + edi + edx */
AddX86regToVariable ( x86_ECX , & _RegHI - > UW [ 0 ] , " _RegHI->UW[0] " ) ;
AdcConstToVariable ( & _RegHI - > UW [ 1 ] , " _RegHI->UW[1] " , 0 ) ;
AddX86regToVariable ( x86_EDI , & _RegHI - > UW [ 0 ] , " _RegHI->UW[0] " ) ;
AdcConstToVariable ( & _RegHI - > UW [ 1 ] , " _RegHI->UW[1] " , 0 ) ;
AddX86regToVariable ( x86_EDX , & _RegHI - > UW [ 0 ] , " _RegHI->UW[0] " ) ;
AdcConstToVariable ( & _RegHI - > UW [ 1 ] , " _RegHI->UW[1] " , 0 ) ;
2010-06-22 20:36:28 +00:00
# endif
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : SPECIAL_DDIV ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
UnMap_GPR ( m_Opcode . rs , TRUE ) ;
UnMap_GPR ( m_Opcode . rt , TRUE ) ;
2010-06-14 21:14:58 +00:00
BeforeCallDirect ( m_RegWorkingSet ) ;
2010-06-04 06:25:07 +00:00
MoveConstToVariable ( m_Opcode . Hex , & R4300iOp : : m_Opcode . Hex , " R4300iOp::m_Opcode.Hex " ) ;
2010-05-25 09:15:19 +00:00
Call_Direct ( R4300iOp : : SPECIAL_DDIV , " R4300iOp::SPECIAL_DDIV " ) ;
2010-06-14 21:14:58 +00:00
AfterCallDirect ( m_RegWorkingSet ) ;
2010-05-25 09:15:19 +00:00
}
2010-06-04 06:25:07 +00:00
void CRecompilerOps : : SPECIAL_DDIVU ( void )
{
2010-05-30 01:54:42 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
UnMap_GPR ( m_Opcode . rs , TRUE ) ;
UnMap_GPR ( m_Opcode . rt , TRUE ) ;
2010-06-14 21:14:58 +00:00
BeforeCallDirect ( m_RegWorkingSet ) ;
2010-06-04 06:25:07 +00:00
MoveConstToVariable ( m_Opcode . Hex , & R4300iOp : : m_Opcode . Hex , " R4300iOp::m_Opcode.Hex " ) ;
2010-05-25 09:15:19 +00:00
Call_Direct ( R4300iOp : : SPECIAL_DDIVU , " R4300iOp::SPECIAL_DDIVU " ) ;
2010-06-14 21:14:58 +00:00
AfterCallDirect ( m_RegWorkingSet ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : SPECIAL_ADD ( void ) {
int source1 = m_Opcode . rd = = m_Opcode . rt ? m_Opcode . rt : m_Opcode . rs ;
int source2 = m_Opcode . rd = = m_Opcode . rt ? m_Opcode . rs : m_Opcode . rt ;
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
if ( m_Opcode . rd = = 0 ) { return ; }
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
if ( IsConst ( source1 ) & & IsConst ( source2 ) ) {
DWORD temp = cMipsRegLo ( source1 ) + cMipsRegLo ( source2 ) ;
if ( IsMapped ( m_Opcode . rd ) ) { UnMap_GPR ( m_Opcode . rd , FALSE ) ; }
2010-06-04 06:25:07 +00:00
MipsRegLo ( m_Opcode . rd ) = temp ;
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
2010-05-25 09:15:19 +00:00
return ;
}
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , TRUE , source1 ) ;
if ( IsConst ( source2 ) ) {
2010-06-04 06:25:07 +00:00
AddConstToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , cMipsRegLo ( source2 ) ) ;
2010-09-22 21:43:42 +00:00
} else if ( IsKnown ( source2 ) & & IsMapped ( source2 ) ) {
2010-06-04 06:25:07 +00:00
AddX86RegToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , cMipsRegMapLo ( source2 ) ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-06-04 06:25:07 +00:00
AddVariableToX86reg ( cMipsRegMapLo ( m_Opcode . rd ) , & _GPR [ source2 ] . W [ 0 ] , CRegName : : GPR_Lo [ source2 ] ) ;
2010-05-25 09:15:19 +00:00
}
2012-09-27 23:02:01 +00:00
if ( bFastSP ( ) & & m_Opcode . rd = = 29 )
{
_MMU - > ResetMemoryStack ( ) ;
}
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : SPECIAL_ADDU ( void ) {
int source1 = m_Opcode . rd = = m_Opcode . rt ? m_Opcode . rt : m_Opcode . rs ;
int source2 = m_Opcode . rd = = m_Opcode . rt ? m_Opcode . rs : m_Opcode . rt ;
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
if ( m_Opcode . rd = = 0 ) { return ; }
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
if ( IsConst ( source1 ) & & IsConst ( source2 ) ) {
DWORD temp = cMipsRegLo ( source1 ) + cMipsRegLo ( source2 ) ;
if ( IsMapped ( m_Opcode . rd ) ) { UnMap_GPR ( m_Opcode . rd , FALSE ) ; }
2010-06-04 06:25:07 +00:00
MipsRegLo ( m_Opcode . rd ) = temp ;
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
2010-05-25 09:15:19 +00:00
return ;
}
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , TRUE , source1 ) ;
if ( IsConst ( source2 ) ) {
2010-06-04 06:25:07 +00:00
AddConstToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , cMipsRegLo ( source2 ) ) ;
2010-09-22 21:43:42 +00:00
} else if ( IsKnown ( source2 ) & & IsMapped ( source2 ) ) {
2010-06-04 06:25:07 +00:00
AddX86RegToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , cMipsRegMapLo ( source2 ) ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-06-04 06:25:07 +00:00
AddVariableToX86reg ( cMipsRegMapLo ( m_Opcode . rd ) , & _GPR [ source2 ] . W [ 0 ] , CRegName : : GPR_Lo [ source2 ] ) ;
2010-05-25 09:15:19 +00:00
}
2012-09-27 23:02:01 +00:00
if ( bFastSP ( ) & & m_Opcode . rd = = 29 )
{
_MMU - > ResetMemoryStack ( ) ;
}
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : SPECIAL_SUB ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
if ( m_Opcode . rd = = 0 ) { return ; }
if ( IsConst ( m_Opcode . rt ) & & IsConst ( m_Opcode . rs ) ) {
DWORD temp = cMipsRegLo ( m_Opcode . rs ) - cMipsRegLo ( m_Opcode . rt ) ;
if ( IsMapped ( m_Opcode . rd ) ) { UnMap_GPR ( m_Opcode . rd , FALSE ) ; }
2010-06-04 06:25:07 +00:00
MipsRegLo ( m_Opcode . rd ) = temp ;
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
if ( m_Opcode . rd = = m_Opcode . rt ) {
2010-06-04 06:25:07 +00:00
x86Reg Reg = Map_TempReg ( x86_Any , m_Opcode . rt , FALSE ) ;
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , TRUE , m_Opcode . rs ) ;
2010-06-04 06:25:07 +00:00
SubX86RegToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , Reg ) ;
2010-05-25 09:15:19 +00:00
return ;
}
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , TRUE , m_Opcode . rs ) ;
if ( IsConst ( m_Opcode . rt ) ) {
2010-06-04 06:25:07 +00:00
SubConstFromX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , cMipsRegLo ( m_Opcode . rt ) ) ;
2010-05-30 01:54:42 +00:00
} else if ( IsMapped ( m_Opcode . rt ) ) {
2010-06-04 06:25:07 +00:00
SubX86RegToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , cMipsRegMapLo ( m_Opcode . rt ) ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-06-04 06:25:07 +00:00
SubVariableFromX86reg ( cMipsRegMapLo ( m_Opcode . rd ) , & _GPR [ m_Opcode . rt ] . W [ 0 ] , CRegName : : GPR_Lo [ m_Opcode . rt ] ) ;
2010-05-25 09:15:19 +00:00
}
}
2012-09-27 23:02:01 +00:00
if ( bFastSP ( ) & & m_Opcode . rd = = 29 )
{
_MMU - > ResetMemoryStack ( ) ;
}
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : SPECIAL_SUBU ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
if ( m_Opcode . rd = = 0 ) { return ; }
if ( IsConst ( m_Opcode . rt ) & & IsConst ( m_Opcode . rs ) ) {
DWORD temp = cMipsRegLo ( m_Opcode . rs ) - cMipsRegLo ( m_Opcode . rt ) ;
if ( IsMapped ( m_Opcode . rd ) ) { UnMap_GPR ( m_Opcode . rd , FALSE ) ; }
2010-06-04 06:25:07 +00:00
MipsRegLo ( m_Opcode . rd ) = temp ;
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
if ( m_Opcode . rd = = m_Opcode . rt ) {
2010-06-04 06:25:07 +00:00
x86Reg Reg = Map_TempReg ( x86_Any , m_Opcode . rt , FALSE ) ;
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , TRUE , m_Opcode . rs ) ;
2010-06-04 06:25:07 +00:00
SubX86RegToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , Reg ) ;
2010-05-25 09:15:19 +00:00
return ;
}
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , TRUE , m_Opcode . rs ) ;
if ( IsConst ( m_Opcode . rt ) ) {
2010-06-04 06:25:07 +00:00
SubConstFromX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , cMipsRegLo ( m_Opcode . rt ) ) ;
2010-05-30 01:54:42 +00:00
} else if ( IsMapped ( m_Opcode . rt ) ) {
2010-06-04 06:25:07 +00:00
SubX86RegToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , cMipsRegMapLo ( m_Opcode . rt ) ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-06-04 06:25:07 +00:00
SubVariableFromX86reg ( cMipsRegMapLo ( m_Opcode . rd ) , & _GPR [ m_Opcode . rt ] . W [ 0 ] , CRegName : : GPR_Lo [ m_Opcode . rt ] ) ;
2010-05-25 09:15:19 +00:00
}
}
2012-09-27 22:55:45 +00:00
if ( bFastSP ( ) & & m_Opcode . rd = = 29 )
{
_MMU - > ResetMemoryStack ( ) ;
}
2010-05-25 09:15:19 +00:00
}
2010-06-04 06:25:07 +00:00
void CRecompilerOps : : SPECIAL_AND ( void )
{
2010-05-30 01:54:42 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-10-23 18:53:01 +00:00
2010-09-22 21:43:42 +00:00
if ( IsKnown ( m_Opcode . rt ) & & IsKnown ( m_Opcode . rs ) ) {
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rt ) & & IsConst ( m_Opcode . rs ) ) {
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( m_Opcode . rt ) | | Is64Bit ( m_Opcode . rs ) ) {
2010-09-22 21:43:42 +00:00
MipsReg ( m_Opcode . rd ) =
( Is64Bit ( m_Opcode . rt ) ? MipsReg ( m_Opcode . rt ) : ( __int64 ) MipsRegLo_S ( m_Opcode . rt ) ) &
( Is64Bit ( m_Opcode . rs ) ? MipsReg ( m_Opcode . rs ) : ( __int64 ) MipsRegLo_S ( m_Opcode . rs ) ) ;
2010-05-25 09:15:19 +00:00
2010-09-22 21:43:42 +00:00
if ( MipsRegLo_S ( m_Opcode . rd ) < 0 & & MipsRegHi_S ( m_Opcode . rd ) = = - 1 ) {
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
2010-09-22 21:43:42 +00:00
} else if ( MipsRegLo_S ( m_Opcode . rd ) > = 0 & & MipsRegHi_S ( m_Opcode . rd ) = = 0 ) {
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_64 ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-09-22 21:43:42 +00:00
MipsReg ( m_Opcode . rd ) = cMipsRegLo ( m_Opcode . rt ) & MipsReg ( m_Opcode . rs ) ;
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
} else if ( IsMapped ( m_Opcode . rt ) & & IsMapped ( m_Opcode . rs ) ) {
int source1 = m_Opcode . rd = = m_Opcode . rt ? m_Opcode . rt : m_Opcode . rs ;
int source2 = m_Opcode . rd = = m_Opcode . rt ? m_Opcode . rs : m_Opcode . rt ;
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
ProtectGPR ( source1 ) ;
ProtectGPR ( source2 ) ;
2010-09-22 21:43:42 +00:00
if ( Is32Bit ( source1 ) & & Is32Bit ( source2 ) ) {
int Sign = ( IsSigned ( m_Opcode . rt ) & & IsSigned ( m_Opcode . rs ) ) ? TRUE : FALSE ;
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , Sign , source1 ) ;
2010-06-04 06:25:07 +00:00
AndX86RegToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , cMipsRegMapLo ( source2 ) ) ;
2010-09-22 21:43:42 +00:00
} else if ( Is32Bit ( source1 ) | | Is32Bit ( source2 ) ) {
if ( IsUnsigned ( Is32Bit ( source1 ) ? source1 : source2 ) ) {
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , FALSE , source1 ) ;
2010-06-04 06:25:07 +00:00
AndX86RegToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , cMipsRegMapLo ( source2 ) ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
Map_GPR_64bit ( m_Opcode . rd , source1 ) ;
2010-09-22 21:43:42 +00:00
if ( Is32Bit ( source2 ) ) {
2010-06-04 06:25:07 +00:00
AndX86RegToX86Reg ( MipsRegMapHi ( m_Opcode . rd ) , Map_TempReg ( x86_Any , source2 , TRUE ) ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-06-04 06:25:07 +00:00
AndX86RegToX86Reg ( MipsRegMapHi ( m_Opcode . rd ) , MipsRegMapHi ( source2 ) ) ;
2010-05-25 09:15:19 +00:00
}
2010-06-04 06:25:07 +00:00
AndX86RegToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , cMipsRegMapLo ( source2 ) ) ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-05-31 00:21:08 +00:00
Map_GPR_64bit ( m_Opcode . rd , source1 ) ;
2010-06-04 06:25:07 +00:00
AndX86RegToX86Reg ( cMipsRegMapHi ( m_Opcode . rd ) , cMipsRegMapHi ( source2 ) ) ;
AndX86RegToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , cMipsRegMapLo ( source2 ) ) ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-05-30 01:54:42 +00:00
int ConstReg = IsConst ( m_Opcode . rt ) ? m_Opcode . rt : m_Opcode . rs ;
int MappedReg = IsConst ( m_Opcode . rt ) ? m_Opcode . rs : m_Opcode . rt ;
2010-05-25 09:15:19 +00:00
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( ConstReg ) ) {
2010-09-22 21:43:42 +00:00
if ( Is32Bit ( MappedReg ) & & IsUnsigned ( MappedReg ) ) {
2010-05-30 01:54:42 +00:00
if ( cMipsRegLo ( ConstReg ) = = 0 ) {
Map_GPR_32bit ( m_Opcode . rd , FALSE , 0 ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
DWORD Value = cMipsRegLo ( ConstReg ) ;
Map_GPR_32bit ( m_Opcode . rd , FALSE , MappedReg ) ;
2010-06-04 06:25:07 +00:00
AndConstToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , Value ) ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-09-22 21:43:42 +00:00
__int64 Value = MipsReg ( ConstReg ) ;
2010-05-31 00:21:08 +00:00
Map_GPR_64bit ( m_Opcode . rd , MappedReg ) ;
2010-06-04 06:25:07 +00:00
AndConstToX86Reg ( cMipsRegMapHi ( m_Opcode . rd ) , ( DWORD ) ( Value > > 32 ) ) ;
AndConstToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , ( DWORD ) Value ) ;
2010-05-25 09:15:19 +00:00
}
2010-06-04 06:25:07 +00:00
} else if ( Is64Bit ( MappedReg ) ) {
2010-05-30 01:54:42 +00:00
DWORD Value = cMipsRegLo ( ConstReg ) ;
2010-05-25 09:15:19 +00:00
if ( Value ! = 0 ) {
2010-09-22 21:43:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , IsSigned ( ConstReg ) ? TRUE : FALSE , MappedReg ) ;
2010-06-04 06:25:07 +00:00
AndConstToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , ( DWORD ) Value ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-09-22 21:43:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , IsSigned ( ConstReg ) ? TRUE : FALSE , 0 ) ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-05-30 01:54:42 +00:00
DWORD Value = cMipsRegLo ( ConstReg ) ;
2010-05-25 09:15:19 +00:00
int Sign = FALSE ;
2010-09-22 21:43:42 +00:00
if ( IsSigned ( ConstReg ) & & IsSigned ( MappedReg ) ) { Sign = TRUE ; }
2010-05-25 09:15:19 +00:00
if ( Value ! = 0 ) {
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , Sign , MappedReg ) ;
2010-06-04 06:25:07 +00:00
AndConstToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , Value ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , FALSE , 0 ) ;
2010-05-25 09:15:19 +00:00
}
}
}
2010-09-22 21:43:42 +00:00
} else if ( IsKnown ( m_Opcode . rt ) | | IsKnown ( m_Opcode . rs ) ) {
DWORD KnownReg = IsKnown ( m_Opcode . rt ) ? m_Opcode . rt : m_Opcode . rs ;
DWORD UnknownReg = IsKnown ( m_Opcode . rt ) ? m_Opcode . rs : m_Opcode . rt ;
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
if ( IsConst ( KnownReg ) ) {
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( KnownReg ) ) {
2010-09-22 21:43:42 +00:00
unsigned __int64 Value = MipsReg ( KnownReg ) ;
2010-05-31 00:21:08 +00:00
Map_GPR_64bit ( m_Opcode . rd , UnknownReg ) ;
2010-06-04 06:25:07 +00:00
AndConstToX86Reg ( cMipsRegMapHi ( m_Opcode . rd ) , ( DWORD ) ( Value > > 32 ) ) ;
AndConstToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , ( DWORD ) Value ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
DWORD Value = cMipsRegLo ( KnownReg ) ;
2010-09-22 21:43:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , IsSigned ( KnownReg ) , UnknownReg ) ;
2010-06-04 06:25:07 +00:00
AndConstToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , ( DWORD ) Value ) ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-05-30 01:54:42 +00:00
ProtectGPR ( KnownReg ) ;
if ( KnownReg = = m_Opcode . rd ) {
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( KnownReg ) ) {
2010-05-31 00:21:08 +00:00
Map_GPR_64bit ( m_Opcode . rd , KnownReg ) ;
2010-06-04 06:25:07 +00:00
AndVariableToX86Reg ( & _GPR [ UnknownReg ] . W [ 1 ] , CRegName : : GPR_Hi [ UnknownReg ] , MipsRegMapHi ( m_Opcode . rd ) ) ;
AndVariableToX86Reg ( & _GPR [ UnknownReg ] . W [ 0 ] , CRegName : : GPR_Lo [ UnknownReg ] , cMipsRegMapLo ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-09-22 21:43:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , IsSigned ( KnownReg ) , KnownReg ) ;
2010-06-04 06:25:07 +00:00
AndVariableToX86Reg ( & _GPR [ UnknownReg ] . W [ 0 ] , CRegName : : GPR_Lo [ UnknownReg ] , cMipsRegMapLo ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( KnownReg ) ) {
2010-05-31 00:21:08 +00:00
Map_GPR_64bit ( m_Opcode . rd , UnknownReg ) ;
2010-06-04 06:25:07 +00:00
AndX86RegToX86Reg ( cMipsRegMapHi ( m_Opcode . rd ) , cMipsRegMapHi ( KnownReg ) ) ;
AndX86RegToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , cMipsRegMapLo ( KnownReg ) ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-09-22 21:43:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , IsSigned ( KnownReg ) , UnknownReg ) ;
2010-06-04 06:25:07 +00:00
AndX86RegToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , cMipsRegMapLo ( KnownReg ) ) ;
2010-05-25 09:15:19 +00:00
}
}
}
} else {
2010-10-23 18:53:01 +00:00
if ( b32BitCore ( ) )
{
Map_GPR_32bit ( m_Opcode . rd , true , m_Opcode . rt ) ;
} else {
Map_GPR_64bit ( m_Opcode . rd , m_Opcode . rt ) ;
AndVariableToX86Reg ( & _GPR [ m_Opcode . rs ] . W [ 1 ] , CRegName : : GPR_Hi [ m_Opcode . rs ] , cMipsRegMapHi ( m_Opcode . rd ) ) ;
}
2010-06-04 06:25:07 +00:00
AndVariableToX86Reg ( & _GPR [ m_Opcode . rs ] . W [ 0 ] , CRegName : : GPR_Lo [ m_Opcode . rs ] , cMipsRegMapLo ( m_Opcode . rd ) ) ;
2010-05-30 01:54:42 +00:00
}
}
void CRecompilerOps : : SPECIAL_OR ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-09-22 21:43:42 +00:00
if ( IsKnown ( m_Opcode . rt ) & & IsKnown ( m_Opcode . rs ) ) {
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rt ) & & IsConst ( m_Opcode . rs ) ) {
if ( IsMapped ( m_Opcode . rd ) ) { UnMap_GPR ( m_Opcode . rd , FALSE ) ; }
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( m_Opcode . rt ) | | Is64Bit ( m_Opcode . rs ) ) {
2010-09-22 21:43:42 +00:00
MipsReg ( m_Opcode . rd ) =
( Is64Bit ( m_Opcode . rt ) ? MipsReg ( m_Opcode . rt ) : ( __int64 ) MipsRegLo_S ( m_Opcode . rt ) ) |
( Is64Bit ( m_Opcode . rs ) ? MipsReg ( m_Opcode . rs ) : ( __int64 ) MipsRegLo_S ( m_Opcode . rs ) ) ;
if ( MipsRegLo_S ( m_Opcode . rd ) < 0 & & MipsRegHi_S ( m_Opcode . rd ) = = - 1 ) {
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
2010-09-22 21:43:42 +00:00
} else if ( MipsRegLo_S ( m_Opcode . rd ) > = 0 & & MipsRegHi_S ( m_Opcode . rd ) = = 0 ) {
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_64 ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-06-04 06:25:07 +00:00
MipsRegLo ( m_Opcode . rd ) = cMipsRegLo ( m_Opcode . rt ) | cMipsRegLo ( m_Opcode . rs ) ;
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
} else if ( IsMapped ( m_Opcode . rt ) & & IsMapped ( m_Opcode . rs ) ) {
int source1 = m_Opcode . rd = = m_Opcode . rt ? m_Opcode . rt : m_Opcode . rs ;
int source2 = m_Opcode . rd = = m_Opcode . rt ? m_Opcode . rs : m_Opcode . rt ;
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
ProtectGPR ( m_Opcode . rt ) ;
ProtectGPR ( m_Opcode . rs ) ;
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( m_Opcode . rt ) | | Is64Bit ( m_Opcode . rs ) ) {
2010-05-31 00:21:08 +00:00
Map_GPR_64bit ( m_Opcode . rd , source1 ) ;
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( source2 ) ) {
OrX86RegToX86Reg ( MipsRegMapHi ( m_Opcode . rd ) , MipsRegMapHi ( source2 ) ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-06-04 06:25:07 +00:00
OrX86RegToX86Reg ( MipsRegMapHi ( m_Opcode . rd ) , Map_TempReg ( x86_Any , source2 , TRUE ) ) ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-05-30 01:54:42 +00:00
ProtectGPR ( source2 ) ;
Map_GPR_32bit ( m_Opcode . rd , TRUE , source1 ) ;
2010-05-25 09:15:19 +00:00
}
2010-06-04 06:25:07 +00:00
OrX86RegToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , cMipsRegMapLo ( source2 ) ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
DWORD ConstReg = IsConst ( m_Opcode . rt ) ? m_Opcode . rt : m_Opcode . rs ;
DWORD MappedReg = IsConst ( m_Opcode . rt ) ? m_Opcode . rs : m_Opcode . rt ;
2010-05-25 09:15:19 +00:00
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( m_Opcode . rt ) | | Is64Bit ( m_Opcode . rs ) ) {
unsigned __int64 Value ;
2010-05-25 09:15:19 +00:00
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( ConstReg ) ) {
2010-09-22 21:43:42 +00:00
Value = MipsReg ( ConstReg ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-09-22 21:43:42 +00:00
Value = IsSigned ( ConstReg ) ? MipsRegLo_S ( ConstReg ) : cMipsRegLo ( ConstReg ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-31 00:21:08 +00:00
Map_GPR_64bit ( m_Opcode . rd , MappedReg ) ;
2010-05-25 09:15:19 +00:00
if ( ( Value > > 32 ) ! = 0 ) {
2010-06-04 06:25:07 +00:00
OrConstToX86Reg ( ( DWORD ) ( Value > > 32 ) , MipsRegMapHi ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
}
if ( ( DWORD ) Value ! = 0 ) {
2010-06-04 06:25:07 +00:00
OrConstToX86Reg ( ( DWORD ) Value , cMipsRegMapLo ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-05-30 01:54:42 +00:00
int Value = cMipsRegLo ( ConstReg ) ;
Map_GPR_32bit ( m_Opcode . rd , TRUE , MappedReg ) ;
2010-06-04 06:25:07 +00:00
if ( Value ! = 0 ) { OrConstToX86Reg ( Value , cMipsRegMapLo ( m_Opcode . rd ) ) ; }
2010-05-25 09:15:19 +00:00
}
}
2010-09-22 21:43:42 +00:00
} else if ( IsKnown ( m_Opcode . rt ) | | IsKnown ( m_Opcode . rs ) ) {
int KnownReg = IsKnown ( m_Opcode . rt ) ? m_Opcode . rt : m_Opcode . rs ;
int UnknownReg = IsKnown ( m_Opcode . rt ) ? m_Opcode . rs : m_Opcode . rt ;
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
if ( IsConst ( KnownReg ) ) {
2010-06-04 06:25:07 +00:00
unsigned __int64 Value ;
2010-05-25 09:15:19 +00:00
2010-09-22 21:43:42 +00:00
Value = Is64Bit ( KnownReg ) ? MipsReg ( KnownReg ) : MipsRegLo_S ( KnownReg ) ;
2010-10-23 18:53:01 +00:00
if ( b32BitCore ( ) & & Is32Bit ( KnownReg ) )
{
Map_GPR_32bit ( m_Opcode . rd , true , UnknownReg ) ;
if ( ( DWORD ) Value ! = 0 ) {
OrConstToX86Reg ( ( DWORD ) Value , cMipsRegMapLo ( m_Opcode . rd ) ) ;
}
} else {
Map_GPR_64bit ( m_Opcode . rd , UnknownReg ) ;
if ( ( Value > > 32 ) ! = 0 ) {
OrConstToX86Reg ( ( DWORD ) ( Value > > 32 ) , MipsRegMapHi ( m_Opcode . rd ) ) ;
}
if ( ( DWORD ) Value ! = 0 ) {
OrConstToX86Reg ( ( DWORD ) Value , cMipsRegMapLo ( m_Opcode . rd ) ) ;
}
2010-05-25 09:15:19 +00:00
}
} else {
2010-10-23 18:53:01 +00:00
if ( b32BitCore ( ) )
{
Map_GPR_32bit ( m_Opcode . rd , true , KnownReg ) ;
OrVariableToX86Reg ( & _GPR [ UnknownReg ] . W [ 0 ] , CRegName : : GPR_Lo [ UnknownReg ] , cMipsRegMapLo ( m_Opcode . rd ) ) ;
} else {
Map_GPR_64bit ( m_Opcode . rd , KnownReg ) ;
OrVariableToX86Reg ( & _GPR [ UnknownReg ] . W [ 1 ] , CRegName : : GPR_Hi [ UnknownReg ] , MipsRegMapHi ( m_Opcode . rd ) ) ;
OrVariableToX86Reg ( & _GPR [ UnknownReg ] . W [ 0 ] , CRegName : : GPR_Lo [ UnknownReg ] , cMipsRegMapLo ( m_Opcode . rd ) ) ;
}
2010-05-25 09:15:19 +00:00
}
} else {
2010-10-23 18:53:01 +00:00
if ( b32BitCore ( ) )
{
Map_GPR_32bit ( m_Opcode . rd , true , m_Opcode . rt ) ;
OrVariableToX86Reg ( & _GPR [ m_Opcode . rs ] . W [ 0 ] , CRegName : : GPR_Lo [ m_Opcode . rs ] , cMipsRegMapLo ( m_Opcode . rd ) ) ;
} else {
Map_GPR_64bit ( m_Opcode . rd , m_Opcode . rt ) ;
OrVariableToX86Reg ( & _GPR [ m_Opcode . rs ] . W [ 1 ] , CRegName : : GPR_Hi [ m_Opcode . rs ] , MipsRegMapHi ( m_Opcode . rd ) ) ;
OrVariableToX86Reg ( & _GPR [ m_Opcode . rs ] . W [ 0 ] , CRegName : : GPR_Lo [ m_Opcode . rs ] , cMipsRegMapLo ( m_Opcode . rd ) ) ;
}
2010-05-25 09:15:19 +00:00
}
2010-07-23 10:45:35 +00:00
if ( bFastSP ( ) & & m_Opcode . rd = = 29 ) {
2010-06-04 06:25:07 +00:00
ResetX86Protection ( ) ;
2010-07-23 10:45:35 +00:00
_MMU - > ResetMemoryStack ( ) ;
2010-05-25 09:15:19 +00:00
}
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : SPECIAL_XOR ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
if ( m_Opcode . rd = = 0 ) { return ; }
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
if ( m_Opcode . rt = = m_Opcode . rs ) {
UnMap_GPR ( m_Opcode . rd , FALSE ) ;
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
2010-06-04 06:25:07 +00:00
MipsRegLo ( m_Opcode . rd ) = 0 ;
2010-05-25 09:15:19 +00:00
return ;
}
2010-09-22 21:43:42 +00:00
if ( IsKnown ( m_Opcode . rt ) & & IsKnown ( m_Opcode . rs ) ) {
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rt ) & & IsConst ( m_Opcode . rs ) ) {
if ( IsMapped ( m_Opcode . rd ) ) { UnMap_GPR ( m_Opcode . rd , FALSE ) ; }
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( m_Opcode . rt ) | | Is64Bit ( m_Opcode . rs ) ) {
2010-05-25 09:15:19 +00:00
# ifndef EXTERNAL_RELEASE
DisplayError ( " XOR 1 " ) ;
# endif
2010-05-30 01:54:42 +00:00
CRecompilerOps : : UnknownOpcode ( ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
2010-06-04 06:25:07 +00:00
MipsRegLo ( m_Opcode . rd ) = cMipsRegLo ( m_Opcode . rt ) ^ cMipsRegLo ( m_Opcode . rs ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
} else if ( IsMapped ( m_Opcode . rt ) & & IsMapped ( m_Opcode . rs ) ) {
int source1 = m_Opcode . rd = = m_Opcode . rt ? m_Opcode . rt : m_Opcode . rs ;
int source2 = m_Opcode . rd = = m_Opcode . rt ? m_Opcode . rs : m_Opcode . rt ;
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
ProtectGPR ( source1 ) ;
ProtectGPR ( source2 ) ;
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( m_Opcode . rt ) | | Is64Bit ( m_Opcode . rs ) ) {
2010-05-31 00:21:08 +00:00
Map_GPR_64bit ( m_Opcode . rd , source1 ) ;
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( source2 ) ) {
XorX86RegToX86Reg ( cMipsRegMapHi ( m_Opcode . rd ) , cMipsRegMapHi ( source2 ) ) ;
2010-09-22 21:43:42 +00:00
} else if ( IsSigned ( source2 ) ) {
2010-06-04 06:25:07 +00:00
XorX86RegToX86Reg ( cMipsRegMapHi ( m_Opcode . rd ) , Map_TempReg ( x86_Any , source2 , TRUE ) ) ;
2010-05-25 09:15:19 +00:00
}
2010-06-04 06:25:07 +00:00
XorX86RegToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , cMipsRegMapLo ( source2 ) ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-09-22 21:43:42 +00:00
if ( IsSigned ( m_Opcode . rt ) ! = IsSigned ( m_Opcode . rs ) ) {
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , TRUE , source1 ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-09-22 21:43:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , IsSigned ( m_Opcode . rt ) , source1 ) ;
2010-05-25 09:15:19 +00:00
}
2010-06-04 06:25:07 +00:00
XorX86RegToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , cMipsRegMapLo ( source2 ) ) ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-05-30 01:54:42 +00:00
DWORD ConstReg = IsConst ( m_Opcode . rt ) ? m_Opcode . rt : m_Opcode . rs ;
DWORD MappedReg = IsConst ( m_Opcode . rt ) ? m_Opcode . rs : m_Opcode . rt ;
2010-05-25 09:15:19 +00:00
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( m_Opcode . rt ) | | Is64Bit ( m_Opcode . rs ) ) {
2010-05-25 09:15:19 +00:00
DWORD ConstHi , ConstLo ;
2010-09-22 21:43:42 +00:00
ConstHi = Is32Bit ( ConstReg ) ? ( DWORD ) ( MipsRegLo_S ( ConstReg ) > > 31 ) : MipsRegHi ( ConstReg ) ;
2010-05-30 01:54:42 +00:00
ConstLo = cMipsRegLo ( ConstReg ) ;
2010-05-31 00:21:08 +00:00
Map_GPR_64bit ( m_Opcode . rd , MappedReg ) ;
2010-06-04 06:25:07 +00:00
if ( ConstHi ! = 0 ) { XorConstToX86Reg ( cMipsRegMapHi ( m_Opcode . rd ) , ConstHi ) ; }
if ( ConstLo ! = 0 ) { XorConstToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , ConstLo ) ; }
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
int Value = cMipsRegLo ( ConstReg ) ;
2010-09-22 21:43:42 +00:00
if ( IsSigned ( m_Opcode . rt ) ! = IsSigned ( m_Opcode . rs ) ) {
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , TRUE , MappedReg ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-09-22 21:43:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , IsSigned ( MappedReg ) ? TRUE : FALSE , MappedReg ) ;
2010-05-25 09:15:19 +00:00
}
2010-06-04 06:25:07 +00:00
if ( Value ! = 0 ) { XorConstToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , Value ) ; }
2010-05-25 09:15:19 +00:00
}
}
2010-09-22 21:43:42 +00:00
} else if ( IsKnown ( m_Opcode . rt ) | | IsKnown ( m_Opcode . rs ) ) {
int KnownReg = IsKnown ( m_Opcode . rt ) ? m_Opcode . rt : m_Opcode . rs ;
int UnknownReg = IsKnown ( m_Opcode . rt ) ? m_Opcode . rs : m_Opcode . rt ;
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
if ( IsConst ( KnownReg ) ) {
2010-06-04 06:25:07 +00:00
unsigned __int64 Value ;
2010-05-25 09:15:19 +00:00
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( KnownReg ) ) {
2010-09-22 21:43:42 +00:00
Value = MipsReg ( KnownReg ) ;
2010-10-23 18:53:01 +00:00
Map_GPR_64bit ( m_Opcode . rd , UnknownReg ) ;
if ( ( Value > > 32 ) ! = 0 ) {
XorConstToX86Reg ( MipsRegMapHi ( m_Opcode . rd ) , ( DWORD ) ( Value > > 32 ) ) ;
}
2010-05-25 09:15:19 +00:00
} else {
2010-10-23 18:53:01 +00:00
Map_GPR_32bit ( m_Opcode . rd , true , UnknownReg ) ;
2010-09-22 21:43:42 +00:00
if ( IsSigned ( KnownReg ) ) {
2010-05-30 01:54:42 +00:00
Value = ( int ) cMipsRegLo ( KnownReg ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
Value = cMipsRegLo ( KnownReg ) ;
2010-05-25 09:15:19 +00:00
}
}
if ( ( DWORD ) Value ! = 0 ) {
2010-06-04 06:25:07 +00:00
XorConstToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , ( DWORD ) Value ) ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-10-23 18:53:01 +00:00
if ( b32BitCore ( ) )
{
Map_GPR_32bit ( m_Opcode . rd , true , KnownReg ) ;
XorVariableToX86reg ( & _GPR [ UnknownReg ] . W [ 0 ] , CRegName : : GPR_Lo [ UnknownReg ] , cMipsRegMapLo ( m_Opcode . rd ) ) ;
} else {
Map_GPR_64bit ( m_Opcode . rd , KnownReg ) ;
XorVariableToX86reg ( & _GPR [ UnknownReg ] . W [ 1 ] , CRegName : : GPR_Hi [ UnknownReg ] , cMipsRegMapHi ( m_Opcode . rd ) ) ;
XorVariableToX86reg ( & _GPR [ UnknownReg ] . W [ 0 ] , CRegName : : GPR_Lo [ UnknownReg ] , cMipsRegMapLo ( m_Opcode . rd ) ) ;
}
2010-05-25 09:15:19 +00:00
}
2010-10-23 18:53:01 +00:00
} else if ( b32BitCore ( ) ) {
Map_GPR_32bit ( m_Opcode . rd , true , m_Opcode . rt ) ;
XorVariableToX86reg ( & _GPR [ m_Opcode . rs ] . W [ 0 ] , CRegName : : GPR_Lo [ m_Opcode . rs ] , cMipsRegMapLo ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
Map_GPR_64bit ( m_Opcode . rd , m_Opcode . rt ) ;
2010-06-04 06:25:07 +00:00
XorVariableToX86reg ( & _GPR [ m_Opcode . rs ] . W [ 1 ] , CRegName : : GPR_Hi [ m_Opcode . rs ] , cMipsRegMapHi ( m_Opcode . rd ) ) ;
XorVariableToX86reg ( & _GPR [ m_Opcode . rs ] . W [ 0 ] , CRegName : : GPR_Lo [ m_Opcode . rs ] , cMipsRegMapLo ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
}
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : SPECIAL_NOR ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-25 09:15:19 +00:00
2010-09-22 21:43:42 +00:00
if ( IsKnown ( m_Opcode . rt ) & & IsKnown ( m_Opcode . rs ) ) {
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rt ) & & IsConst ( m_Opcode . rs ) ) {
if ( IsMapped ( m_Opcode . rd ) ) { UnMap_GPR ( m_Opcode . rd , FALSE ) ; }
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( m_Opcode . rt ) | | Is64Bit ( m_Opcode . rs ) ) {
2010-05-30 01:54:42 +00:00
CRecompilerOps : : UnknownOpcode ( ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-06-04 06:25:07 +00:00
MipsRegLo ( m_Opcode . rd ) = ~ ( cMipsRegLo ( m_Opcode . rt ) | cMipsRegLo ( m_Opcode . rs ) ) ;
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
} else if ( IsMapped ( m_Opcode . rt ) & & IsMapped ( m_Opcode . rs ) ) {
int source1 = m_Opcode . rd = = m_Opcode . rt ? m_Opcode . rt : m_Opcode . rs ;
int source2 = m_Opcode . rd = = m_Opcode . rt ? m_Opcode . rs : m_Opcode . rt ;
2010-10-23 18:53:01 +00:00
if ( b32BitCore ( ) ) { _Notify - > BreakPoint ( __FILE__ , __LINE__ ) ; }
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
ProtectGPR ( source1 ) ;
ProtectGPR ( source2 ) ;
2010-10-23 18:53:01 +00:00
if ( ! Is64Bit ( m_Opcode . rt ) | | Is64Bit ( m_Opcode . rs ) ) {
2010-05-31 00:21:08 +00:00
Map_GPR_64bit ( m_Opcode . rd , source1 ) ;
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( source2 ) ) {
OrX86RegToX86Reg ( cMipsRegMapHi ( m_Opcode . rd ) , cMipsRegMapHi ( source2 ) ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-06-04 06:25:07 +00:00
OrX86RegToX86Reg ( cMipsRegMapHi ( m_Opcode . rd ) , Map_TempReg ( x86_Any , source2 , TRUE ) ) ;
2010-05-25 09:15:19 +00:00
}
2010-06-04 06:25:07 +00:00
OrX86RegToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , cMipsRegMapLo ( source2 ) ) ;
NotX86Reg ( cMipsRegMapHi ( m_Opcode . rd ) ) ;
NotX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
ProtectGPR ( source2 ) ;
2010-09-22 21:43:42 +00:00
if ( IsSigned ( m_Opcode . rt ) ! = IsSigned ( m_Opcode . rs ) ) {
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , TRUE , source1 ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-09-22 21:43:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , IsSigned ( m_Opcode . rt ) , source1 ) ;
2010-05-25 09:15:19 +00:00
}
2010-06-04 06:25:07 +00:00
OrX86RegToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , cMipsRegMapLo ( source2 ) ) ;
2010-06-07 02:23:58 +00:00
NotX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-05-30 01:54:42 +00:00
DWORD ConstReg = IsConst ( m_Opcode . rt ) ? m_Opcode . rt : m_Opcode . rs ;
DWORD MappedReg = IsConst ( m_Opcode . rt ) ? m_Opcode . rs : m_Opcode . rt ;
2010-05-25 09:15:19 +00:00
2010-10-23 18:53:01 +00:00
if ( ( Is64Bit ( m_Opcode . rt ) & & Is64Bit ( m_Opcode . rs ) ) | |
( ! b32BitCore ( ) & & ( Is64Bit ( m_Opcode . rt ) | | Is64Bit ( m_Opcode . rs ) ) ) )
{
2010-06-04 06:25:07 +00:00
unsigned __int64 Value ;
2010-10-23 18:53:01 +00:00
if ( b32BitCore ( ) ) { _Notify - > BreakPoint ( __FILE__ , __LINE__ ) ; }
2010-05-25 09:15:19 +00:00
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( ConstReg ) ) {
2010-09-22 21:43:42 +00:00
Value = MipsReg ( ConstReg ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-09-22 21:43:42 +00:00
Value = IsSigned ( ConstReg ) ? MipsRegLo_S ( ConstReg ) : cMipsRegLo ( ConstReg ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-31 00:21:08 +00:00
Map_GPR_64bit ( m_Opcode . rd , MappedReg ) ;
2010-05-25 09:15:19 +00:00
if ( ( Value > > 32 ) ! = 0 ) {
2010-06-07 02:23:58 +00:00
OrConstToX86Reg ( ( DWORD ) ( Value > > 32 ) , MipsRegMapHi ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
}
if ( ( DWORD ) Value ! = 0 ) {
2010-06-07 02:23:58 +00:00
OrConstToX86Reg ( ( DWORD ) Value , cMipsRegMapLo ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
}
2010-06-07 02:23:58 +00:00
NotX86Reg ( cMipsRegMapHi ( m_Opcode . rd ) ) ;
NotX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
int Value = cMipsRegLo ( ConstReg ) ;
2010-09-22 21:43:42 +00:00
if ( IsSigned ( m_Opcode . rt ) ! = IsSigned ( m_Opcode . rs ) ) {
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , TRUE , MappedReg ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-09-22 21:43:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , IsSigned ( MappedReg ) ? TRUE : FALSE , MappedReg ) ;
2010-05-25 09:15:19 +00:00
}
2010-06-07 02:23:58 +00:00
if ( Value ! = 0 ) { OrConstToX86Reg ( Value , cMipsRegMapLo ( m_Opcode . rd ) ) ; }
NotX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
}
}
2010-09-22 21:43:42 +00:00
} else if ( IsKnown ( m_Opcode . rt ) | | IsKnown ( m_Opcode . rs ) ) {
int KnownReg = IsKnown ( m_Opcode . rt ) ? m_Opcode . rt : m_Opcode . rs ;
int UnknownReg = IsKnown ( m_Opcode . rt ) ? m_Opcode . rs : m_Opcode . rt ;
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
if ( IsConst ( KnownReg ) ) {
2010-06-04 06:25:07 +00:00
unsigned __int64 Value ;
2010-05-25 09:15:19 +00:00
2010-09-22 21:43:42 +00:00
Value = Is64Bit ( KnownReg ) ? MipsReg ( KnownReg ) : MipsRegLo_S ( KnownReg ) ;
2010-11-12 05:30:08 +00:00
if ( b32BitCore ( ) & & Is32Bit ( KnownReg ) )
{
Map_GPR_32bit ( m_Opcode . rd , true , UnknownReg ) ;
if ( ( DWORD ) Value ! = 0 ) {
OrConstToX86Reg ( ( DWORD ) Value , cMipsRegMapLo ( m_Opcode . rd ) ) ;
}
} else {
Map_GPR_64bit ( m_Opcode . rd , UnknownReg ) ;
if ( ( Value > > 32 ) ! = 0 ) {
OrConstToX86Reg ( ( DWORD ) ( Value > > 32 ) , MipsRegMapHi ( m_Opcode . rd ) ) ;
}
if ( ( DWORD ) Value ! = 0 ) {
OrConstToX86Reg ( ( DWORD ) Value , cMipsRegMapLo ( m_Opcode . rd ) ) ;
}
2010-05-25 09:15:19 +00:00
}
} else {
2010-11-12 05:30:08 +00:00
if ( b32BitCore ( ) )
{
Map_GPR_32bit ( m_Opcode . rd , true , KnownReg ) ;
OrVariableToX86Reg ( & _GPR [ UnknownReg ] . W [ 0 ] , CRegName : : GPR_Lo [ UnknownReg ] , cMipsRegMapLo ( m_Opcode . rd ) ) ;
} else {
Map_GPR_64bit ( m_Opcode . rd , KnownReg ) ;
OrVariableToX86Reg ( & _GPR [ UnknownReg ] . W [ 1 ] , CRegName : : GPR_Hi [ UnknownReg ] , cMipsRegMapHi ( m_Opcode . rd ) ) ;
OrVariableToX86Reg ( & _GPR [ UnknownReg ] . W [ 0 ] , CRegName : : GPR_Lo [ UnknownReg ] , cMipsRegMapLo ( m_Opcode . rd ) ) ;
}
}
if ( Is64Bit ( m_Opcode . rd ) )
{
NotX86Reg ( cMipsRegMapHi ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
}
2010-06-07 02:23:58 +00:00
NotX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) ) ;
2010-10-23 18:53:01 +00:00
} else if ( b32BitCore ( ) ) {
Map_GPR_32bit ( m_Opcode . rd , true , m_Opcode . rt ) ;
OrVariableToX86Reg ( & _GPR [ m_Opcode . rs ] . W [ 0 ] , CRegName : : GPR_Lo [ m_Opcode . rs ] , cMipsRegMapLo ( m_Opcode . rd ) ) ;
NotX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
Map_GPR_64bit ( m_Opcode . rd , m_Opcode . rt ) ;
2010-06-07 02:23:58 +00:00
OrVariableToX86Reg ( & _GPR [ m_Opcode . rs ] . W [ 1 ] , CRegName : : GPR_Hi [ m_Opcode . rs ] , cMipsRegMapHi ( m_Opcode . rd ) ) ;
OrVariableToX86Reg ( & _GPR [ m_Opcode . rs ] . W [ 0 ] , CRegName : : GPR_Lo [ m_Opcode . rs ] , cMipsRegMapLo ( m_Opcode . rd ) ) ;
NotX86Reg ( cMipsRegMapHi ( m_Opcode . rd ) ) ;
NotX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
}
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : SPECIAL_SLT ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-10-23 18:53:01 +00:00
if ( m_Opcode . rd = = 0 ) { return ; }
2010-05-25 09:15:19 +00:00
2010-09-22 21:43:42 +00:00
if ( IsKnown ( m_Opcode . rt ) & & IsKnown ( m_Opcode . rs ) ) {
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rt ) & & IsConst ( m_Opcode . rs ) ) {
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( m_Opcode . rt ) | | Is64Bit ( m_Opcode . rs ) ) {
2010-05-25 09:15:19 +00:00
DisplayError ( " 1 " ) ;
2010-05-30 01:54:42 +00:00
CRecompilerOps : : UnknownOpcode ( ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
if ( IsMapped ( m_Opcode . rd ) ) { UnMap_GPR ( m_Opcode . rd , FALSE ) ; }
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
2010-10-23 18:53:01 +00:00
if ( cMipsRegLo_S ( m_Opcode . rs ) < cMipsRegLo_S ( m_Opcode . rt ) ) {
2010-06-04 06:25:07 +00:00
MipsRegLo ( m_Opcode . rd ) = 1 ;
2010-05-25 09:15:19 +00:00
} else {
2010-06-04 06:25:07 +00:00
MipsRegLo ( m_Opcode . rd ) = 0 ;
2010-05-25 09:15:19 +00:00
}
}
2010-05-30 01:54:42 +00:00
} else if ( IsMapped ( m_Opcode . rt ) & & IsMapped ( m_Opcode . rs ) ) {
ProtectGPR ( m_Opcode . rt ) ;
ProtectGPR ( m_Opcode . rs ) ;
2010-10-23 18:53:01 +00:00
if ( ( Is64Bit ( m_Opcode . rt ) & & Is64Bit ( m_Opcode . rs ) ) | |
( ! b32BitCore ( ) & & ( Is64Bit ( m_Opcode . rt ) | | Is64Bit ( m_Opcode . rs ) ) ) )
{
2010-05-25 09:15:19 +00:00
BYTE * Jump [ 2 ] ;
CompX86RegToX86Reg (
2010-06-04 06:25:07 +00:00
Is64Bit ( m_Opcode . rs ) ? cMipsRegMapHi ( m_Opcode . rs ) : Map_TempReg ( x86_Any , m_Opcode . rs , TRUE ) ,
Is64Bit ( m_Opcode . rt ) ? cMipsRegMapHi ( m_Opcode . rt ) : Map_TempReg ( x86_Any , m_Opcode . rt , TRUE )
2010-10-23 18:53:01 +00:00
) ;
2010-05-25 09:15:19 +00:00
JeLabel8 ( " Low Compare " , 0 ) ;
2010-05-30 01:54:42 +00:00
Jump [ 0 ] = m_RecompPos - 1 ;
2010-06-04 06:25:07 +00:00
SetlVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
2010-05-25 09:15:19 +00:00
JmpLabel8 ( " Continue " , 0 ) ;
2010-05-30 01:54:42 +00:00
Jump [ 1 ] = m_RecompPos - 1 ;
2010-10-23 18:53:01 +00:00
2010-05-25 09:15:19 +00:00
CPU_Message ( " " ) ;
CPU_Message ( " Low Compare: " ) ;
2010-05-30 01:54:42 +00:00
* ( ( BYTE * ) ( Jump [ 0 ] ) ) = ( BYTE ) ( m_RecompPos - Jump [ 0 ] - 1 ) ;
2010-06-04 06:25:07 +00:00
CompX86RegToX86Reg ( cMipsRegMapLo ( m_Opcode . rs ) , cMipsRegMapLo ( m_Opcode . rt ) ) ;
SetbVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
2010-05-25 09:15:19 +00:00
CPU_Message ( " " ) ;
CPU_Message ( " Continue: " ) ;
2010-05-30 01:54:42 +00:00
* ( ( BYTE * ) ( Jump [ 1 ] ) ) = ( BYTE ) ( m_RecompPos - Jump [ 1 ] - 1 ) ;
Map_GPR_32bit ( m_Opcode . rd , TRUE , - 1 ) ;
2010-06-04 06:25:07 +00:00
MoveVariableToX86reg ( & m_BranchCompare , " m_BranchCompare " , cMipsRegMapLo ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , TRUE , - 1 ) ;
2010-06-04 06:25:07 +00:00
CompX86RegToX86Reg ( cMipsRegMapLo ( m_Opcode . rs ) , cMipsRegMapLo ( m_Opcode . rt ) ) ;
2010-05-25 09:15:19 +00:00
2010-06-04 06:25:07 +00:00
if ( cMipsRegMapLo ( m_Opcode . rd ) > x86_EBX ) {
SetlVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
MoveVariableToX86reg ( & m_BranchCompare , " m_BranchCompare " , cMipsRegMapLo ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-06-04 06:25:07 +00:00
Setl ( cMipsRegMapLo ( m_Opcode . rd ) ) ;
AndConstToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , 1 ) ;
2010-05-25 09:15:19 +00:00
}
}
} else {
2010-05-30 01:54:42 +00:00
DWORD ConstReg = IsConst ( m_Opcode . rs ) ? m_Opcode . rs : m_Opcode . rt ;
DWORD MappedReg = IsConst ( m_Opcode . rs ) ? m_Opcode . rt : m_Opcode . rs ;
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
ProtectGPR ( MappedReg ) ;
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( m_Opcode . rt ) | | Is64Bit ( m_Opcode . rs ) ) {
2010-05-25 09:15:19 +00:00
BYTE * Jump [ 2 ] ;
CompConstToX86reg (
2010-06-04 06:25:07 +00:00
Is64Bit ( MappedReg ) ? cMipsRegMapHi ( MappedReg ) : Map_TempReg ( x86_Any , MappedReg , TRUE ) ,
2010-09-22 21:43:42 +00:00
Is64Bit ( ConstReg ) ? MipsRegHi ( ConstReg ) : ( MipsRegLo_S ( ConstReg ) > > 31 )
2010-10-23 18:53:01 +00:00
) ;
2010-05-25 09:15:19 +00:00
JeLabel8 ( " Low Compare " , 0 ) ;
2010-05-30 01:54:42 +00:00
Jump [ 0 ] = m_RecompPos - 1 ;
if ( MappedReg = = m_Opcode . rs ) {
2010-06-04 06:25:07 +00:00
SetlVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-06-04 06:25:07 +00:00
SetgVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
2010-05-25 09:15:19 +00:00
}
JmpLabel8 ( " Continue " , 0 ) ;
2010-05-30 01:54:42 +00:00
Jump [ 1 ] = m_RecompPos - 1 ;
2010-10-23 18:53:01 +00:00
2010-05-25 09:15:19 +00:00
CPU_Message ( " " ) ;
CPU_Message ( " Low Compare: " ) ;
2010-05-30 01:54:42 +00:00
* ( ( BYTE * ) ( Jump [ 0 ] ) ) = ( BYTE ) ( m_RecompPos - Jump [ 0 ] - 1 ) ;
2010-06-04 06:25:07 +00:00
CompConstToX86reg ( cMipsRegMapLo ( MappedReg ) , cMipsRegLo ( ConstReg ) ) ;
2010-05-30 01:54:42 +00:00
if ( MappedReg = = m_Opcode . rs ) {
2010-06-04 06:25:07 +00:00
SetbVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-06-04 06:25:07 +00:00
SetaVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
2010-05-25 09:15:19 +00:00
}
CPU_Message ( " " ) ;
CPU_Message ( " Continue: " ) ;
2010-05-30 01:54:42 +00:00
* ( ( BYTE * ) ( Jump [ 1 ] ) ) = ( BYTE ) ( m_RecompPos - Jump [ 1 ] - 1 ) ;
Map_GPR_32bit ( m_Opcode . rd , TRUE , - 1 ) ;
2010-06-04 06:25:07 +00:00
MoveVariableToX86reg ( & m_BranchCompare , " m_BranchCompare " , cMipsRegMapLo ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
DWORD Constant = cMipsRegLo ( ConstReg ) ;
Map_GPR_32bit ( m_Opcode . rd , TRUE , - 1 ) ;
2010-06-04 06:25:07 +00:00
CompConstToX86reg ( cMipsRegMapLo ( MappedReg ) , Constant ) ;
2010-10-23 18:53:01 +00:00
2010-06-04 06:25:07 +00:00
if ( cMipsRegMapLo ( m_Opcode . rd ) > x86_EBX ) {
2010-05-30 01:54:42 +00:00
if ( MappedReg = = m_Opcode . rs ) {
2010-06-04 06:25:07 +00:00
SetlVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-06-04 06:25:07 +00:00
SetgVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
2010-05-25 09:15:19 +00:00
}
2010-06-04 06:25:07 +00:00
MoveVariableToX86reg ( & m_BranchCompare , " m_BranchCompare " , cMipsRegMapLo ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
if ( MappedReg = = m_Opcode . rs ) {
2010-06-04 06:25:07 +00:00
Setl ( cMipsRegMapLo ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-06-04 06:25:07 +00:00
Setg ( cMipsRegMapLo ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
}
2010-06-04 06:25:07 +00:00
AndConstToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , 1 ) ;
2010-05-25 09:15:19 +00:00
}
}
}
2010-09-22 21:43:42 +00:00
} else if ( IsKnown ( m_Opcode . rt ) | | IsKnown ( m_Opcode . rs ) ) {
DWORD KnownReg = IsKnown ( m_Opcode . rt ) ? m_Opcode . rt : m_Opcode . rs ;
DWORD UnknownReg = IsKnown ( m_Opcode . rt ) ? m_Opcode . rs : m_Opcode . rt ;
2010-05-25 09:15:19 +00:00
BYTE * Jump [ 2 ] ;
2010-10-23 18:53:01 +00:00
2012-09-28 20:11:16 +00:00
if ( ! b32BitCore ( ) )
2010-10-23 18:53:01 +00:00
{
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( KnownReg ) ) {
2010-10-23 18:53:01 +00:00
if ( IsConst ( KnownReg ) ) {
CompConstToVariable ( MipsRegHi ( KnownReg ) , & _GPR [ UnknownReg ] . W [ 1 ] , CRegName : : GPR_Hi [ UnknownReg ] ) ;
} else {
CompX86regToVariable ( cMipsRegMapHi ( KnownReg ) , & _GPR [ UnknownReg ] . W [ 1 ] , CRegName : : GPR_Hi [ UnknownReg ] ) ;
}
} else {
if ( IsConst ( KnownReg ) ) {
CompConstToVariable ( ( cMipsRegLo_S ( KnownReg ) > > 31 ) , & _GPR [ UnknownReg ] . W [ 1 ] , CRegName : : GPR_Hi [ UnknownReg ] ) ;
} else {
ProtectGPR ( KnownReg ) ;
CompX86regToVariable ( Map_TempReg ( x86_Any , KnownReg , TRUE ) , & _GPR [ UnknownReg ] . W [ 1 ] , CRegName : : GPR_Hi [ UnknownReg ] ) ;
}
}
JeLabel8 ( " Low Compare " , 0 ) ;
Jump [ 0 ] = m_RecompPos - 1 ;
if ( KnownReg = = ( IsConst ( KnownReg ) ? m_Opcode . rs : m_Opcode . rt ) ) {
SetgVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-10-23 18:53:01 +00:00
SetlVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
2010-05-25 09:15:19 +00:00
}
2010-10-23 18:53:01 +00:00
JmpLabel8 ( " Continue " , 0 ) ;
Jump [ 1 ] = m_RecompPos - 1 ;
CPU_Message ( " " ) ;
CPU_Message ( " Low Compare: " ) ;
SetJump8 ( Jump [ 0 ] , m_RecompPos ) ;
if ( IsConst ( KnownReg ) ) {
CompConstToVariable ( cMipsRegLo ( KnownReg ) , & _GPR [ UnknownReg ] . W [ 0 ] , CRegName : : GPR_Lo [ UnknownReg ] ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-10-23 18:53:01 +00:00
CompX86regToVariable ( cMipsRegMapLo ( KnownReg ) , & _GPR [ UnknownReg ] . W [ 0 ] , CRegName : : GPR_Lo [ UnknownReg ] ) ;
}
if ( KnownReg = = ( IsConst ( KnownReg ) ? m_Opcode . rs : m_Opcode . rt ) ) {
SetaVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
} else {
SetbVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
}
CPU_Message ( " " ) ;
CPU_Message ( " Continue: " ) ;
SetJump8 ( Jump [ 1 ] , m_RecompPos ) ;
Map_GPR_32bit ( m_Opcode . rd , TRUE , - 1 ) ;
MoveVariableToX86reg ( & m_BranchCompare , " m_BranchCompare " , cMipsRegMapLo ( m_Opcode . rd ) ) ;
} else {
if ( IsMapped ( KnownReg ) )
{
2010-05-30 01:54:42 +00:00
ProtectGPR ( KnownReg ) ;
2010-10-23 18:53:01 +00:00
}
bool bConstant = IsConst ( KnownReg ) ;
DWORD Value = IsConst ( KnownReg ) ? MipsRegLo ( KnownReg ) : 0 ;
Map_GPR_32bit ( m_Opcode . rd , TRUE , - 1 ) ;
if ( bConstant ) {
CompConstToVariable ( Value , & _GPR [ UnknownReg ] . W [ 0 ] , CRegName : : GPR_Lo [ UnknownReg ] ) ;
} else {
CompX86regToVariable ( cMipsRegMapLo ( KnownReg ) , & _GPR [ UnknownReg ] . W [ 0 ] , CRegName : : GPR_Lo [ UnknownReg ] ) ;
}
if ( cMipsRegMapLo ( m_Opcode . rd ) > x86_EBX ) {
if ( KnownReg = = ( bConstant ? m_Opcode . rs : m_Opcode . rt ) ) {
SetgVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
} else {
SetlVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
}
MoveVariableToX86reg ( & m_BranchCompare , " m_BranchCompare " , cMipsRegMapLo ( m_Opcode . rd ) ) ;
} else {
if ( KnownReg = = ( bConstant ? m_Opcode . rs : m_Opcode . rt ) ) {
Setg ( cMipsRegMapLo ( m_Opcode . rd ) ) ;
} else {
Setl ( cMipsRegMapLo ( m_Opcode . rd ) ) ;
}
AndConstToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , 1 ) ;
}
2010-05-25 09:15:19 +00:00
}
2010-10-23 18:53:01 +00:00
} else if ( b32BitCore ( ) ) {
x86Reg Reg = Map_TempReg ( x86_Any , m_Opcode . rs , false ) ;
Map_GPR_32bit ( m_Opcode . rd , false , - 1 ) ;
CompX86regToVariable ( Reg , & _GPR [ m_Opcode . rt ] . W [ 0 ] , CRegName : : GPR_Lo [ m_Opcode . rt ] ) ;
if ( cMipsRegMapLo ( m_Opcode . rd ) > x86_EBX ) {
2010-06-04 06:25:07 +00:00
SetlVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
2010-10-23 18:53:01 +00:00
MoveVariableToX86reg ( & m_BranchCompare , " m_BranchCompare " , cMipsRegMapLo ( m_Opcode . rd ) ) ;
} else {
Setl ( cMipsRegMapLo ( m_Opcode . rd ) ) ;
AndConstToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , 1 ) ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-10-23 18:53:01 +00:00
BYTE * Jump [ 2 ] = { NULL , NULL } ;
2010-05-25 09:15:19 +00:00
2010-06-04 06:25:07 +00:00
x86Reg Reg = Map_TempReg ( x86_Any , m_Opcode . rs , TRUE ) ;
CompX86regToVariable ( Reg , & _GPR [ m_Opcode . rt ] . W [ 1 ] , CRegName : : GPR_Hi [ m_Opcode . rt ] ) ;
2010-05-25 09:15:19 +00:00
JeLabel8 ( " Low Compare " , 0 ) ;
2010-05-30 01:54:42 +00:00
Jump [ 0 ] = m_RecompPos - 1 ;
2010-06-04 06:25:07 +00:00
SetlVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
2010-05-25 09:15:19 +00:00
JmpLabel8 ( " Continue " , 0 ) ;
2010-05-30 01:54:42 +00:00
Jump [ 1 ] = m_RecompPos - 1 ;
2010-10-23 18:53:01 +00:00
2010-05-25 09:15:19 +00:00
CPU_Message ( " " ) ;
CPU_Message ( " Low Compare: " ) ;
2010-10-23 18:53:01 +00:00
SetJump8 ( Jump [ 0 ] , m_RecompPos ) ;
2010-06-04 06:25:07 +00:00
CompX86regToVariable ( Map_TempReg ( Reg , m_Opcode . rs , FALSE ) , & _GPR [ m_Opcode . rt ] . W [ 0 ] , CRegName : : GPR_Lo [ m_Opcode . rt ] ) ;
SetbVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
2010-10-23 18:53:01 +00:00
if ( Jump [ 1 ] )
{
CPU_Message ( " " ) ;
CPU_Message ( " Continue: " ) ;
SetJump8 ( Jump [ 1 ] , m_RecompPos ) ;
}
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , TRUE , - 1 ) ;
2010-06-04 06:25:07 +00:00
MoveVariableToX86reg ( & m_BranchCompare , " m_BranchCompare " , cMipsRegMapLo ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
}
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : SPECIAL_SLTU ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
if ( m_Opcode . rd = = 0 ) { return ; }
2010-05-25 09:15:19 +00:00
2010-09-22 21:43:42 +00:00
if ( IsKnown ( m_Opcode . rt ) & & IsKnown ( m_Opcode . rs ) ) {
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rt ) & & IsConst ( m_Opcode . rs ) ) {
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( m_Opcode . rt ) | | Is64Bit ( m_Opcode . rs ) ) {
2010-05-25 09:15:19 +00:00
DisplayError ( " 1 " ) ;
2010-05-30 01:54:42 +00:00
CRecompilerOps : : UnknownOpcode ( ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
if ( IsMapped ( m_Opcode . rd ) ) { UnMap_GPR ( m_Opcode . rd , FALSE ) ; }
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
if ( cMipsRegLo ( m_Opcode . rs ) < cMipsRegLo ( m_Opcode . rt ) ) {
2010-06-04 06:25:07 +00:00
MipsRegLo ( m_Opcode . rd ) = 1 ;
2010-05-25 09:15:19 +00:00
} else {
2010-06-04 06:25:07 +00:00
MipsRegLo ( m_Opcode . rd ) = 0 ;
2010-05-25 09:15:19 +00:00
}
}
2010-05-30 01:54:42 +00:00
} else if ( IsMapped ( m_Opcode . rt ) & & IsMapped ( m_Opcode . rs ) ) {
ProtectGPR ( m_Opcode . rt ) ;
ProtectGPR ( m_Opcode . rs ) ;
2010-10-23 18:53:01 +00:00
if ( ( Is64Bit ( m_Opcode . rt ) & & Is64Bit ( m_Opcode . rs ) ) | |
( ! b32BitCore ( ) & & ( Is64Bit ( m_Opcode . rt ) | | Is64Bit ( m_Opcode . rs ) ) ) )
{
2010-05-25 09:15:19 +00:00
BYTE * Jump [ 2 ] ;
CompX86RegToX86Reg (
2010-06-04 06:25:07 +00:00
Is64Bit ( m_Opcode . rs ) ? cMipsRegMapHi ( m_Opcode . rs ) : Map_TempReg ( x86_Any , m_Opcode . rs , TRUE ) ,
Is64Bit ( m_Opcode . rt ) ? cMipsRegMapHi ( m_Opcode . rt ) : Map_TempReg ( x86_Any , m_Opcode . rt , TRUE )
2010-10-23 18:53:01 +00:00
) ;
2010-05-25 09:15:19 +00:00
JeLabel8 ( " Low Compare " , 0 ) ;
2010-05-30 01:54:42 +00:00
Jump [ 0 ] = m_RecompPos - 1 ;
2010-06-04 06:25:07 +00:00
SetbVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
2010-05-25 09:15:19 +00:00
JmpLabel8 ( " Continue " , 0 ) ;
2010-05-30 01:54:42 +00:00
Jump [ 1 ] = m_RecompPos - 1 ;
2010-10-23 18:53:01 +00:00
2010-05-25 09:15:19 +00:00
CPU_Message ( " " ) ;
CPU_Message ( " Low Compare: " ) ;
2010-05-30 01:54:42 +00:00
* ( ( BYTE * ) ( Jump [ 0 ] ) ) = ( BYTE ) ( m_RecompPos - Jump [ 0 ] - 1 ) ;
2010-06-04 06:25:07 +00:00
CompX86RegToX86Reg ( cMipsRegMapLo ( m_Opcode . rs ) , cMipsRegMapLo ( m_Opcode . rt ) ) ;
SetbVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
2010-05-25 09:15:19 +00:00
CPU_Message ( " " ) ;
CPU_Message ( " Continue: " ) ;
2010-05-30 01:54:42 +00:00
* ( ( BYTE * ) ( Jump [ 1 ] ) ) = ( BYTE ) ( m_RecompPos - Jump [ 1 ] - 1 ) ;
Map_GPR_32bit ( m_Opcode . rd , TRUE , - 1 ) ;
2010-06-04 06:25:07 +00:00
MoveVariableToX86reg ( & m_BranchCompare , " m_BranchCompare " , cMipsRegMapLo ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-06-04 06:25:07 +00:00
CompX86RegToX86Reg ( cMipsRegMapLo ( m_Opcode . rs ) , cMipsRegMapLo ( m_Opcode . rt ) ) ;
SetbVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , TRUE , - 1 ) ;
2010-06-04 06:25:07 +00:00
MoveVariableToX86reg ( & m_BranchCompare , " m_BranchCompare " , cMipsRegMapLo ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( m_Opcode . rt ) | | Is64Bit ( m_Opcode . rs ) ) {
DWORD ConstHi , ConstLo , ConstReg , MappedReg ;
x86Reg MappedRegHi , MappedRegLo ;
2010-05-25 09:15:19 +00:00
BYTE * Jump [ 2 ] ;
2010-05-30 01:54:42 +00:00
ConstReg = IsConst ( m_Opcode . rt ) ? m_Opcode . rt : m_Opcode . rs ;
MappedReg = IsConst ( m_Opcode . rt ) ? m_Opcode . rs : m_Opcode . rt ;
2010-10-23 18:53:01 +00:00
2010-06-04 06:25:07 +00:00
ConstLo = cMipsRegLo_S ( ConstReg ) ;
ConstHi = cMipsRegLo_S ( ConstReg ) > > 31 ;
if ( Is64Bit ( ConstReg ) ) { ConstHi = MipsRegHi ( ConstReg ) ; }
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
ProtectGPR ( MappedReg ) ;
2010-06-04 06:25:07 +00:00
MappedRegLo = cMipsRegMapLo ( MappedReg ) ;
MappedRegHi = cMipsRegMapHi ( MappedReg ) ;
2010-09-22 21:43:42 +00:00
if ( Is32Bit ( MappedReg ) ) {
2010-05-31 00:21:08 +00:00
MappedRegHi = Map_TempReg ( x86_Any , MappedReg , TRUE ) ;
2010-05-25 09:15:19 +00:00
}
2010-10-23 18:53:01 +00:00
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , TRUE , - 1 ) ;
2010-05-25 09:15:19 +00:00
CompConstToX86reg ( MappedRegHi , ConstHi ) ;
JeLabel8 ( " Low Compare " , 0 ) ;
2010-05-30 01:54:42 +00:00
Jump [ 0 ] = m_RecompPos - 1 ;
if ( MappedReg = = m_Opcode . rs ) {
2010-06-04 06:25:07 +00:00
SetbVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-06-04 06:25:07 +00:00
SetaVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
2010-05-25 09:15:19 +00:00
}
JmpLabel8 ( " Continue " , 0 ) ;
2010-05-30 01:54:42 +00:00
Jump [ 1 ] = m_RecompPos - 1 ;
2010-10-23 18:53:01 +00:00
2010-05-25 09:15:19 +00:00
CPU_Message ( " " ) ;
CPU_Message ( " Low Compare: " ) ;
2010-05-30 01:54:42 +00:00
* ( ( BYTE * ) ( Jump [ 0 ] ) ) = ( BYTE ) ( m_RecompPos - Jump [ 0 ] - 1 ) ;
2010-05-25 09:15:19 +00:00
CompConstToX86reg ( MappedRegLo , ConstLo ) ;
2010-05-30 01:54:42 +00:00
if ( MappedReg = = m_Opcode . rs ) {
2010-06-04 06:25:07 +00:00
SetbVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-06-04 06:25:07 +00:00
SetaVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
2010-05-25 09:15:19 +00:00
}
CPU_Message ( " " ) ;
CPU_Message ( " Continue: " ) ;
2010-05-30 01:54:42 +00:00
* ( ( BYTE * ) ( Jump [ 1 ] ) ) = ( BYTE ) ( m_RecompPos - Jump [ 1 ] - 1 ) ;
Map_GPR_32bit ( m_Opcode . rd , TRUE , - 1 ) ;
2010-06-04 06:25:07 +00:00
MoveVariableToX86reg ( & m_BranchCompare , " m_BranchCompare " , cMipsRegMapLo ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
DWORD Const = IsConst ( m_Opcode . rs ) ? cMipsRegLo ( m_Opcode . rs ) : cMipsRegLo ( m_Opcode . rt ) ;
DWORD MappedReg = IsConst ( m_Opcode . rt ) ? m_Opcode . rs : m_Opcode . rt ;
2010-05-25 09:15:19 +00:00
2010-06-04 06:25:07 +00:00
CompConstToX86reg ( cMipsRegMapLo ( MappedReg ) , Const ) ;
2010-05-30 01:54:42 +00:00
if ( MappedReg = = m_Opcode . rs ) {
2010-06-04 06:25:07 +00:00
SetbVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-06-04 06:25:07 +00:00
SetaVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , TRUE , - 1 ) ;
2010-06-04 06:25:07 +00:00
MoveVariableToX86reg ( & m_BranchCompare , " m_BranchCompare " , cMipsRegMapLo ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
}
}
2010-09-22 21:43:42 +00:00
} else if ( IsKnown ( m_Opcode . rt ) | | IsKnown ( m_Opcode . rs ) ) {
DWORD KnownReg = IsKnown ( m_Opcode . rt ) ? m_Opcode . rt : m_Opcode . rs ;
DWORD UnknownReg = IsKnown ( m_Opcode . rt ) ? m_Opcode . rs : m_Opcode . rt ;
2010-10-23 18:53:01 +00:00
BYTE * Jump [ 2 ] = { NULL , NULL } ;
ProtectGPR ( KnownReg ) ;
if ( b32BitCore ( ) )
{
int TestReg = IsConst ( KnownReg ) ? m_Opcode . rs : m_Opcode . rt ;
if ( IsConst ( KnownReg ) ) {
DWORD Value = MipsRegLo ( KnownReg ) ;
Map_GPR_32bit ( m_Opcode . rd , TRUE , - 1 ) ;
CompConstToVariable ( Value , & _GPR [ UnknownReg ] . W [ 0 ] , CRegName : : GPR_Lo [ UnknownReg ] ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-10-23 18:53:01 +00:00
CompX86regToVariable ( cMipsRegMapLo ( KnownReg ) , & _GPR [ UnknownReg ] . W [ 0 ] , CRegName : : GPR_Lo [ UnknownReg ] ) ;
2010-05-25 09:15:19 +00:00
}
2010-10-23 18:53:01 +00:00
if ( KnownReg = = TestReg ) {
SetaVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-10-23 18:53:01 +00:00
SetbVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
}
2010-05-25 09:15:19 +00:00
} else {
2010-10-23 18:53:01 +00:00
if ( IsConst ( KnownReg ) ) {
if ( Is64Bit ( KnownReg ) ) {
CompConstToVariable ( MipsRegHi ( KnownReg ) , & _GPR [ UnknownReg ] . W [ 1 ] , CRegName : : GPR_Hi [ UnknownReg ] ) ;
} else {
CompConstToVariable ( ( cMipsRegLo_S ( KnownReg ) > > 31 ) , & _GPR [ UnknownReg ] . W [ 1 ] , CRegName : : GPR_Hi [ UnknownReg ] ) ;
}
} else {
if ( Is64Bit ( KnownReg ) ) {
CompX86regToVariable ( cMipsRegMapHi ( KnownReg ) , & _GPR [ UnknownReg ] . W [ 1 ] , CRegName : : GPR_Hi [ UnknownReg ] ) ;
} else {
ProtectGPR ( KnownReg ) ;
CompX86regToVariable ( Map_TempReg ( x86_Any , KnownReg , TRUE ) , & _GPR [ UnknownReg ] . W [ 1 ] , CRegName : : GPR_Hi [ UnknownReg ] ) ;
}
}
JeLabel8 ( " Low Compare " , 0 ) ;
Jump [ 0 ] = m_RecompPos - 1 ;
if ( KnownReg = = ( IsConst ( KnownReg ) ? m_Opcode . rs : m_Opcode . rt ) ) {
SetaVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
} else {
SetbVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
}
JmpLabel8 ( " Continue " , 0 ) ;
Jump [ 1 ] = m_RecompPos - 1 ;
CPU_Message ( " " ) ;
CPU_Message ( " Low Compare: " ) ;
* ( ( BYTE * ) ( Jump [ 0 ] ) ) = ( BYTE ) ( m_RecompPos - Jump [ 0 ] - 1 ) ;
if ( IsConst ( KnownReg ) ) {
CompConstToVariable ( cMipsRegLo ( KnownReg ) , & _GPR [ UnknownReg ] . W [ 0 ] , CRegName : : GPR_Lo [ UnknownReg ] ) ;
} else {
CompX86regToVariable ( cMipsRegMapLo ( KnownReg ) , & _GPR [ UnknownReg ] . W [ 0 ] , CRegName : : GPR_Lo [ UnknownReg ] ) ;
}
if ( KnownReg = = ( IsConst ( KnownReg ) ? m_Opcode . rs : m_Opcode . rt ) ) {
SetaVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
} else {
SetbVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
}
if ( Jump [ 1 ] )
{
CPU_Message ( " " ) ;
CPU_Message ( " Continue: " ) ;
SetJump8 ( Jump [ 1 ] , m_RecompPos ) ;
}
2010-05-25 09:15:19 +00:00
}
2010-10-23 18:53:01 +00:00
Map_GPR_32bit ( m_Opcode . rd , TRUE , - 1 ) ;
MoveVariableToX86reg ( & m_BranchCompare , " m_BranchCompare " , cMipsRegMapLo ( m_Opcode . rd ) ) ;
} else if ( b32BitCore ( ) ) {
x86Reg Reg = Map_TempReg ( x86_Any , m_Opcode . rs , false ) ;
Map_GPR_32bit ( m_Opcode . rd , false , - 1 ) ;
CompX86regToVariable ( Reg , & _GPR [ m_Opcode . rt ] . W [ 0 ] , CRegName : : GPR_Lo [ m_Opcode . rt ] ) ;
SetbVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
2010-06-04 06:25:07 +00:00
MoveVariableToX86reg ( & m_BranchCompare , " m_BranchCompare " , cMipsRegMapLo ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-10-23 18:53:01 +00:00
BYTE * Jump [ 2 ] = { NULL , NULL } ;
2010-05-25 09:15:19 +00:00
2010-06-04 06:25:07 +00:00
x86Reg Reg = Map_TempReg ( x86_Any , m_Opcode . rs , TRUE ) ;
CompX86regToVariable ( Reg , & _GPR [ m_Opcode . rt ] . W [ 1 ] , CRegName : : GPR_Hi [ m_Opcode . rt ] ) ;
2010-05-25 09:15:19 +00:00
JeLabel8 ( " Low Compare " , 0 ) ;
2010-05-30 01:54:42 +00:00
Jump [ 0 ] = m_RecompPos - 1 ;
2010-06-04 06:25:07 +00:00
SetbVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
2010-05-25 09:15:19 +00:00
JmpLabel8 ( " Continue " , 0 ) ;
2010-05-30 01:54:42 +00:00
Jump [ 1 ] = m_RecompPos - 1 ;
2010-05-25 09:15:19 +00:00
CPU_Message ( " " ) ;
CPU_Message ( " Low Compare: " ) ;
2010-10-23 18:53:01 +00:00
SetJump8 ( Jump [ 0 ] , m_RecompPos ) ;
2010-06-04 06:25:07 +00:00
CompX86regToVariable ( Map_TempReg ( Reg , m_Opcode . rs , FALSE ) , & _GPR [ m_Opcode . rt ] . W [ 0 ] , CRegName : : GPR_Lo [ m_Opcode . rt ] ) ;
SetbVariable ( & m_BranchCompare , " m_BranchCompare " ) ;
2010-10-23 18:53:01 +00:00
if ( Jump [ 1 ] )
{
CPU_Message ( " " ) ;
CPU_Message ( " Continue: " ) ;
SetJump8 ( Jump [ 1 ] , m_RecompPos ) ;
}
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , TRUE , - 1 ) ;
2010-06-04 06:25:07 +00:00
MoveVariableToX86reg ( & m_BranchCompare , " m_BranchCompare " , cMipsRegMapLo ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
}
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : SPECIAL_DADD ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
if ( m_Opcode . rd = = 0 ) { return ; }
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rt ) & & IsConst ( m_Opcode . rs ) ) {
if ( IsMapped ( m_Opcode . rd ) ) { UnMap_GPR ( m_Opcode . rd , FALSE ) ; }
2010-09-22 21:43:42 +00:00
MipsReg ( m_Opcode . rd ) =
Is64Bit ( m_Opcode . rs ) ? MipsReg ( m_Opcode . rs ) : ( __int64 ) MipsRegLo_S ( m_Opcode . rs ) +
Is64Bit ( m_Opcode . rt ) ? MipsReg ( m_Opcode . rt ) : ( __int64 ) MipsRegLo_S ( m_Opcode . rt ) ;
if ( MipsRegLo_S ( m_Opcode . rd ) < 0 & & MipsRegHi_S ( m_Opcode . rd ) = = - 1 ) {
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
2010-09-22 21:43:42 +00:00
} else if ( MipsRegLo_S ( m_Opcode . rd ) > = 0 & & MipsRegHi_S ( m_Opcode . rd ) = = 0 ) {
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_64 ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-05-30 01:54:42 +00:00
int source1 = m_Opcode . rd = = m_Opcode . rt ? m_Opcode . rt : m_Opcode . rs ;
int source2 = m_Opcode . rd = = m_Opcode . rt ? m_Opcode . rs : m_Opcode . rt ;
2010-05-31 00:21:08 +00:00
Map_GPR_64bit ( m_Opcode . rd , source1 ) ;
2010-05-30 01:54:42 +00:00
if ( IsConst ( source2 ) ) {
2010-06-22 20:36:28 +00:00
AddConstToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , cMipsRegLo ( source2 ) ) ;
AddConstToX86Reg ( cMipsRegMapHi ( m_Opcode . rd ) , MipsRegHi ( source2 ) ) ;
2010-05-30 01:54:42 +00:00
} else if ( IsMapped ( source2 ) ) {
2010-06-04 06:25:07 +00:00
x86Reg HiReg = Is64Bit ( source2 ) ? MipsRegMapHi ( source2 ) : Map_TempReg ( x86_Any , source2 , TRUE ) ;
2010-05-30 01:54:42 +00:00
ProtectGPR ( source2 ) ;
2010-06-04 06:25:07 +00:00
AddX86RegToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , cMipsRegMapLo ( source2 ) ) ;
AdcX86RegToX86Reg ( cMipsRegMapHi ( m_Opcode . rd ) , HiReg ) ;
2010-05-30 01:54:42 +00:00
} else {
2010-06-22 20:36:28 +00:00
AddVariableToX86reg ( cMipsRegMapLo ( m_Opcode . rd ) , & _GPR [ source2 ] . W [ 0 ] , CRegName : : GPR_Lo [ source2 ] ) ;
AdcVariableToX86reg ( cMipsRegMapHi ( m_Opcode . rd ) , & _GPR [ source2 ] . W [ 1 ] , CRegName : : GPR_Hi [ source2 ] ) ;
2010-05-25 09:15:19 +00:00
}
}
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : SPECIAL_DADDU ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
if ( m_Opcode . rd = = 0 ) { return ; }
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rt ) & & IsConst ( m_Opcode . rs ) ) {
2010-09-22 21:43:42 +00:00
__int64 ValRs = Is64Bit ( m_Opcode . rs ) ? MipsReg ( m_Opcode . rs ) : ( __int64 ) MipsRegLo_S ( m_Opcode . rs ) ;
__int64 ValRt = Is64Bit ( m_Opcode . rt ) ? MipsReg ( m_Opcode . rt ) : ( __int64 ) MipsRegLo_S ( m_Opcode . rt ) ;
2010-05-30 01:54:42 +00:00
if ( IsMapped ( m_Opcode . rd ) ) { UnMap_GPR ( m_Opcode . rd , FALSE ) ; }
2010-09-22 21:43:42 +00:00
MipsReg ( m_Opcode . rd ) = ValRs + ValRt ;
2010-05-30 01:54:42 +00:00
if ( ( MipsRegHi ( m_Opcode . rd ) = = 0 ) & & ( cMipsRegLo ( m_Opcode . rd ) & 0x80000000 ) = = 0 ) {
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
} else if ( ( MipsRegHi ( m_Opcode . rd ) = = 0xFFFFFFFF ) & & ( cMipsRegLo ( m_Opcode . rd ) & 0x80000000 ) ! = 0 ) {
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_64 ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-05-30 01:54:42 +00:00
int source1 = m_Opcode . rd = = m_Opcode . rt ? m_Opcode . rt : m_Opcode . rs ;
int source2 = m_Opcode . rd = = m_Opcode . rt ? m_Opcode . rs : m_Opcode . rt ;
2010-05-31 00:21:08 +00:00
Map_GPR_64bit ( m_Opcode . rd , source1 ) ;
2010-05-30 01:54:42 +00:00
if ( IsConst ( source2 ) ) {
2010-06-22 20:36:28 +00:00
AddConstToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , cMipsRegLo ( source2 ) ) ;
AddConstToX86Reg ( cMipsRegMapHi ( m_Opcode . rd ) , MipsRegHi ( source2 ) ) ;
2010-05-30 01:54:42 +00:00
} else if ( IsMapped ( source2 ) ) {
2010-06-04 06:25:07 +00:00
x86Reg HiReg = Is64Bit ( source2 ) ? MipsRegMapHi ( source2 ) : Map_TempReg ( x86_Any , source2 , TRUE ) ;
2010-05-30 01:54:42 +00:00
ProtectGPR ( source2 ) ;
2010-06-04 06:25:07 +00:00
AddX86RegToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , cMipsRegMapLo ( source2 ) ) ;
AdcX86RegToX86Reg ( cMipsRegMapHi ( m_Opcode . rd ) , HiReg ) ;
2010-05-30 01:54:42 +00:00
} else {
2010-06-22 20:36:28 +00:00
AddVariableToX86reg ( cMipsRegMapLo ( m_Opcode . rd ) , & _GPR [ source2 ] . W [ 0 ] , CRegName : : GPR_Lo [ source2 ] ) ;
AdcVariableToX86reg ( cMipsRegMapHi ( m_Opcode . rd ) , & _GPR [ source2 ] . W [ 1 ] , CRegName : : GPR_Hi [ source2 ] ) ;
2010-05-25 09:15:19 +00:00
}
}
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : SPECIAL_DSUB ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
if ( m_Opcode . rd = = 0 ) { return ; }
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rt ) & & IsConst ( m_Opcode . rs ) ) {
if ( IsMapped ( m_Opcode . rd ) ) { UnMap_GPR ( m_Opcode . rd , FALSE ) ; }
2010-09-22 21:43:42 +00:00
MipsReg ( m_Opcode . rd ) =
Is64Bit ( m_Opcode . rs ) ? MipsReg ( m_Opcode . rs ) : ( __int64 ) MipsRegLo_S ( m_Opcode . rs ) -
Is64Bit ( m_Opcode . rt ) ? MipsReg ( m_Opcode . rt ) : ( __int64 ) MipsRegLo_S ( m_Opcode . rt ) ;
if ( MipsRegLo_S ( m_Opcode . rd ) < 0 & & MipsRegHi_S ( m_Opcode . rd ) = = - 1 ) {
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
2010-09-22 21:43:42 +00:00
} else if ( MipsRegLo_S ( m_Opcode . rd ) > = 0 & & MipsRegHi_S ( m_Opcode . rd ) = = 0 ) {
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_64 ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-05-30 01:54:42 +00:00
if ( m_Opcode . rd = = m_Opcode . rt ) {
2010-06-04 06:25:07 +00:00
x86Reg HiReg = Map_TempReg ( x86_Any , m_Opcode . rt , TRUE ) ;
x86Reg LoReg = Map_TempReg ( x86_Any , m_Opcode . rt , FALSE ) ;
2010-05-31 00:21:08 +00:00
Map_GPR_64bit ( m_Opcode . rd , m_Opcode . rs ) ;
2010-06-22 20:36:28 +00:00
SubX86RegToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , LoReg ) ;
2010-06-04 06:25:07 +00:00
SbbX86RegToX86Reg ( cMipsRegMapHi ( m_Opcode . rd ) , HiReg ) ;
2010-05-25 09:15:19 +00:00
return ;
}
2010-05-31 00:21:08 +00:00
Map_GPR_64bit ( m_Opcode . rd , m_Opcode . rs ) ;
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rt ) ) {
2010-06-22 20:36:28 +00:00
SubConstFromX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , cMipsRegLo ( m_Opcode . rt ) ) ;
SbbConstFromX86Reg ( cMipsRegMapHi ( m_Opcode . rd ) , MipsRegHi ( m_Opcode . rt ) ) ;
2010-05-30 01:54:42 +00:00
} else if ( IsMapped ( m_Opcode . rt ) ) {
2010-06-04 06:25:07 +00:00
x86Reg HiReg = Is64Bit ( m_Opcode . rt ) ? cMipsRegMapHi ( m_Opcode . rt ) : Map_TempReg ( x86_Any , m_Opcode . rt , TRUE ) ;
2010-05-30 01:54:42 +00:00
ProtectGPR ( m_Opcode . rt ) ;
2010-06-22 20:36:28 +00:00
SubX86RegToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , cMipsRegMapLo ( m_Opcode . rt ) ) ;
2010-06-04 06:25:07 +00:00
SbbX86RegToX86Reg ( cMipsRegMapHi ( m_Opcode . rd ) , HiReg ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-06-22 20:36:28 +00:00
SubVariableFromX86reg ( cMipsRegMapLo ( m_Opcode . rd ) , & _GPR [ m_Opcode . rt ] . W [ 0 ] , CRegName : : GPR_Lo [ m_Opcode . rt ] ) ;
SbbVariableFromX86reg ( cMipsRegMapHi ( m_Opcode . rd ) , & _GPR [ m_Opcode . rt ] . W [ 1 ] , CRegName : : GPR_Hi [ m_Opcode . rt ] ) ;
2010-05-25 09:15:19 +00:00
}
}
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : SPECIAL_DSUBU ( void ) {
_Notify - > BreakPoint ( __FILE__ , __LINE__ ) ;
# ifdef tofix
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
if ( m_Opcode . rd = = 0 ) { return ; }
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rt ) & & IsConst ( m_Opcode . rs ) ) {
if ( IsMapped ( m_Opcode . rd ) ) { UnMap_GPR ( m_Opcode . rd , FALSE ) ; }
2010-09-22 21:43:42 +00:00
MipsReg ( m_Opcode . rd ) =
Is64Bit ( m_Opcode . rs ) ? MipsReg ( m_Opcode . rs ) : ( __int64 ) MipsRegLo_S ( m_Opcode . rs ) -
Is64Bit ( m_Opcode . rt ) ? MipsReg ( m_Opcode . rt ) : ( __int64 ) MipsRegLo_S ( m_Opcode . rt ) ;
if ( MipsRegLo_S ( m_Opcode . rd ) < 0 & & MipsRegHi_S ( m_Opcode . rd ) = = - 1 ) {
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
2010-09-22 21:43:42 +00:00
} else if ( MipsRegLo_S ( m_Opcode . rd ) > = 0 & & MipsRegHi_S ( m_Opcode . rd ) = = 0 ) {
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_64 ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-05-30 01:54:42 +00:00
if ( m_Opcode . rd = = m_Opcode . rt ) {
2010-06-04 06:25:07 +00:00
x86Reg HiReg = Map_TempReg ( x86_Any , m_Opcode . rt , TRUE ) ;
x86Reg LoReg = Map_TempReg ( x86_Any , m_Opcode . rt , FALSE ) ;
2010-05-31 00:21:08 +00:00
Map_GPR_64bit ( m_Opcode . rd , m_Opcode . rs ) ;
2010-05-30 01:54:42 +00:00
SubX86RegToX86Reg ( cMipsRegLo ( m_Opcode . rd ) , LoReg ) ;
2010-06-04 06:25:07 +00:00
SbbX86RegToX86Reg ( cMipsRegMapHi ( m_Opcode . rd ) , HiReg ) ;
2010-05-25 09:15:19 +00:00
return ;
}
2010-05-31 00:21:08 +00:00
Map_GPR_64bit ( m_Opcode . rd , m_Opcode . rs ) ;
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rt ) ) {
SubConstFromX86Reg ( cMipsRegLo ( m_Opcode . rd ) , cMipsRegLo ( m_Opcode . rt ) ) ;
SbbConstFromX86Reg ( MipsRegHi ( m_Opcode . rd ) , MipsRegHi ( m_Opcode . rt ) ) ;
} else if ( IsMapped ( m_Opcode . rt ) ) {
2010-06-04 06:25:07 +00:00
x86Reg HiReg = Is64Bit ( m_Opcode . rt ) ? cMipsRegMapHi ( m_Opcode . rt ) : Map_TempReg ( x86_Any , m_Opcode . rt , TRUE ) ;
2010-05-30 01:54:42 +00:00
ProtectGPR ( m_Opcode . rt ) ;
SubX86RegToX86Reg ( cMipsRegLo ( m_Opcode . rd ) , cMipsRegLo ( m_Opcode . rt ) ) ;
2010-06-04 06:25:07 +00:00
SbbX86RegToX86Reg ( cMipsRegMapHi ( m_Opcode . rd ) , HiReg ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
SubVariableFromX86reg ( cMipsRegLo ( m_Opcode . rd ) , & _GPR [ m_Opcode . rt ] . W [ 0 ] , CRegName : : GPR_Lo [ m_Opcode . rt ] ) ;
SbbVariableFromX86reg ( MipsRegHi ( m_Opcode . rd ) , & _GPR [ m_Opcode . rt ] . W [ 1 ] , CRegName : : GPR_Hi [ m_Opcode . rt ] ) ;
2010-05-25 09:15:19 +00:00
}
}
2010-05-30 01:54:42 +00:00
# endif
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : SPECIAL_DSLL ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
if ( m_Opcode . rd = = 0 ) { return ; }
2010-11-12 05:30:08 +00:00
2010-06-14 21:14:58 +00:00
if ( IsConst ( m_Opcode . rt ) )
{
2010-05-30 01:54:42 +00:00
if ( IsMapped ( m_Opcode . rd ) ) { UnMap_GPR ( m_Opcode . rd , FALSE ) ; }
2010-05-25 09:15:19 +00:00
2010-09-22 21:43:42 +00:00
MipsReg ( m_Opcode . rd ) = Is64Bit ( m_Opcode . rt ) ? MipsReg ( m_Opcode . rt ) : ( __int64 ) MipsRegLo_S ( m_Opcode . rt ) < < m_Opcode . sa ;
if ( MipsRegLo_S ( m_Opcode . rd ) < 0 & & MipsRegHi_S ( m_Opcode . rd ) = = - 1 ) {
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
2010-09-22 21:43:42 +00:00
} else if ( MipsRegLo_S ( m_Opcode . rd ) > = 0 & & MipsRegHi_S ( m_Opcode . rd ) = = 0 ) {
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_64 ;
2010-05-25 09:15:19 +00:00
}
return ;
}
2010-05-31 00:21:08 +00:00
Map_GPR_64bit ( m_Opcode . rd , m_Opcode . rt ) ;
2010-06-14 21:14:58 +00:00
ShiftLeftDoubleImmed ( cMipsRegMapHi ( m_Opcode . rd ) , cMipsRegMapLo ( m_Opcode . rd ) , ( BYTE ) m_Opcode . sa ) ;
ShiftLeftSignImmed ( cMipsRegMapLo ( m_Opcode . rd ) , ( BYTE ) m_Opcode . sa ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : SPECIAL_DSRL ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
if ( m_Opcode . rd = = 0 ) { return ; }
2010-11-12 05:30:08 +00:00
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rt ) ) {
if ( IsMapped ( m_Opcode . rd ) ) { UnMap_GPR ( m_Opcode . rd , FALSE ) ; }
2010-05-25 09:15:19 +00:00
2010-09-22 21:43:42 +00:00
MipsReg ( m_Opcode . rd ) = Is64Bit ( m_Opcode . rt ) ? MipsReg ( m_Opcode . rt ) : ( QWORD ) MipsRegLo_S ( m_Opcode . rt ) > > m_Opcode . sa ;
if ( MipsRegLo_S ( m_Opcode . rd ) < 0 & & MipsRegHi_S ( m_Opcode . rd ) = = - 1 ) {
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
2010-09-22 21:43:42 +00:00
} else if ( MipsRegLo_S ( m_Opcode . rd ) > = 0 & & MipsRegHi_S ( m_Opcode . rd ) = = 0 ) {
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_64 ;
2010-05-25 09:15:19 +00:00
}
return ;
}
2010-05-31 00:21:08 +00:00
Map_GPR_64bit ( m_Opcode . rd , m_Opcode . rt ) ;
2010-06-14 21:14:58 +00:00
ShiftRightDoubleImmed ( cMipsRegMapLo ( m_Opcode . rd ) , cMipsRegMapHi ( m_Opcode . rd ) , ( BYTE ) m_Opcode . sa ) ;
ShiftRightUnsignImmed ( cMipsRegMapHi ( m_Opcode . rd ) , ( BYTE ) m_Opcode . sa ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : SPECIAL_DSRA ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
if ( m_Opcode . rd = = 0 ) { return ; }
2011-01-02 10:40:00 +00:00
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rt ) ) {
if ( IsMapped ( m_Opcode . rd ) ) { UnMap_GPR ( m_Opcode . rd , FALSE ) ; }
2010-05-25 09:15:19 +00:00
2010-09-22 21:43:42 +00:00
MipsReg_S ( m_Opcode . rd ) = Is64Bit ( m_Opcode . rt ) ? MipsReg_S ( m_Opcode . rt ) : ( __int64 ) MipsRegLo_S ( m_Opcode . rt ) > > m_Opcode . sa ;
if ( MipsRegLo_S ( m_Opcode . rd ) < 0 & & MipsRegHi_S ( m_Opcode . rd ) = = - 1 ) {
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
2010-09-22 21:43:42 +00:00
} else if ( MipsRegLo_S ( m_Opcode . rd ) > = 0 & & MipsRegHi_S ( m_Opcode . rd ) = = 0 ) {
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_64 ;
2010-05-25 09:15:19 +00:00
}
return ;
}
2010-05-31 00:21:08 +00:00
Map_GPR_64bit ( m_Opcode . rd , m_Opcode . rt ) ;
2010-06-04 06:25:07 +00:00
ShiftRightDoubleImmed ( cMipsRegMapLo ( m_Opcode . rd ) , cMipsRegMapHi ( m_Opcode . rd ) , ( BYTE ) m_Opcode . sa ) ;
ShiftRightSignImmed ( cMipsRegMapHi ( m_Opcode . rd ) , ( BYTE ) m_Opcode . sa ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : SPECIAL_DSLL32 ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
if ( m_Opcode . rd = = 0 ) { return ; }
if ( IsConst ( m_Opcode . rt ) ) {
if ( m_Opcode . rt ! = m_Opcode . rd ) { UnMap_GPR ( m_Opcode . rd , FALSE ) ; }
MipsRegHi ( m_Opcode . rd ) = cMipsRegLo ( m_Opcode . rt ) < < m_Opcode . sa ;
2010-06-04 06:25:07 +00:00
MipsRegLo ( m_Opcode . rd ) = 0 ;
2010-09-22 21:43:42 +00:00
if ( MipsRegLo_S ( m_Opcode . rd ) < 0 & & MipsRegHi_S ( m_Opcode . rd ) = = - 1 ) {
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
2010-09-22 21:43:42 +00:00
} else if ( MipsRegLo_S ( m_Opcode . rd ) > = 0 & & MipsRegHi_S ( m_Opcode . rd ) = = 0 ) {
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_64 ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
} else if ( IsMapped ( m_Opcode . rt ) ) {
ProtectGPR ( m_Opcode . rt ) ;
2010-05-31 00:21:08 +00:00
Map_GPR_64bit ( m_Opcode . rd , - 1 ) ;
2010-05-30 01:54:42 +00:00
if ( m_Opcode . rt ! = m_Opcode . rd ) {
2010-06-04 06:25:07 +00:00
MoveX86RegToX86Reg ( cMipsRegMapLo ( m_Opcode . rt ) , cMipsRegMapHi ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-06-04 06:25:07 +00:00
CPU_Message ( " regcache: switch hi (%s) with lo (%s) for %s " , x86_Name ( MipsRegMapHi ( m_Opcode . rt ) ) , x86_Name ( cMipsRegMapLo ( m_Opcode . rt ) ) , CRegName : : GPR [ m_Opcode . rt ] ) ;
x86Reg HiReg = MipsRegMapHi ( m_Opcode . rt ) ;
MipsRegMapHi ( m_Opcode . rt ) = cMipsRegMapLo ( m_Opcode . rt ) ;
MipsRegMapLo ( m_Opcode . rt ) = HiReg ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
if ( ( BYTE ) m_Opcode . sa ! = 0 ) {
2010-06-04 06:25:07 +00:00
ShiftLeftSignImmed ( cMipsRegMapHi ( m_Opcode . rd ) , ( BYTE ) m_Opcode . sa ) ;
2010-05-25 09:15:19 +00:00
}
2010-06-04 06:25:07 +00:00
XorX86RegToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , cMipsRegMapLo ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
Map_GPR_64bit ( m_Opcode . rd , - 1 ) ;
2010-06-04 06:25:07 +00:00
MoveVariableToX86reg ( & _GPR [ m_Opcode . rt ] , CRegName : : GPR_Hi [ m_Opcode . rt ] , MipsRegMapHi ( m_Opcode . rd ) ) ;
2010-05-30 01:54:42 +00:00
if ( ( BYTE ) m_Opcode . sa ! = 0 ) {
2010-06-04 06:25:07 +00:00
ShiftLeftSignImmed ( MipsRegMapHi ( m_Opcode . rd ) , ( BYTE ) m_Opcode . sa ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-04 06:25:07 +00:00
XorX86RegToX86Reg ( cMipsRegMapLo ( m_Opcode . rd ) , cMipsRegMapLo ( m_Opcode . rd ) ) ;
2010-05-30 01:54:42 +00:00
}
}
void CRecompilerOps : : SPECIAL_DSRL32 ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-10-23 18:53:01 +00:00
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rt ) ) {
if ( m_Opcode . rt ! = m_Opcode . rd ) { UnMap_GPR ( m_Opcode . rd , FALSE ) ; }
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
2010-09-22 21:43:42 +00:00
MipsRegLo ( m_Opcode . rd ) = ( DWORD ) ( MipsReg ( m_Opcode . rt ) > > ( m_Opcode . sa + 32 ) ) ;
2010-05-30 01:54:42 +00:00
} else if ( IsMapped ( m_Opcode . rt ) ) {
ProtectGPR ( m_Opcode . rt ) ;
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( m_Opcode . rt ) ) {
2010-05-30 01:54:42 +00:00
if ( m_Opcode . rt = = m_Opcode . rd ) {
2010-06-04 06:25:07 +00:00
CPU_Message ( " regcache: switch hi (%s) with lo (%s) for %s " , x86_Name ( MipsRegMapHi ( m_Opcode . rt ) ) , x86_Name ( cMipsRegMapLo ( m_Opcode . rt ) ) , CRegName : : GPR [ m_Opcode . rt ] ) ;
x86Reg HiReg = MipsRegMapHi ( m_Opcode . rt ) ;
MipsRegMapHi ( m_Opcode . rt ) = cMipsRegMapLo ( m_Opcode . rt ) ;
MipsRegMapLo ( m_Opcode . rt ) = HiReg ;
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , FALSE , - 1 ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , FALSE , - 1 ) ;
2010-06-04 06:25:07 +00:00
MoveX86RegToX86Reg ( MipsRegMapHi ( m_Opcode . rt ) , cMipsRegMapLo ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
if ( ( BYTE ) m_Opcode . sa ! = 0 ) {
2010-06-04 06:25:07 +00:00
ShiftRightUnsignImmed ( cMipsRegMapLo ( m_Opcode . rd ) , ( BYTE ) m_Opcode . sa ) ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-05-30 01:54:42 +00:00
CRecompilerOps : : UnknownOpcode ( ) ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , FALSE , - 1 ) ;
2010-11-12 05:30:08 +00:00
MoveVariableToX86reg ( & _GPR [ m_Opcode . rt ] . UW [ 1 ] , CRegName : : GPR_Hi [ m_Opcode . rt ] , cMipsRegMapLo ( m_Opcode . rd ) ) ;
2010-05-30 01:54:42 +00:00
if ( ( BYTE ) m_Opcode . sa ! = 0 ) {
2010-06-04 06:25:07 +00:00
ShiftRightUnsignImmed ( cMipsRegMapLo ( m_Opcode . rd ) , ( BYTE ) m_Opcode . sa ) ;
2010-05-30 01:54:42 +00:00
}
}
}
void CRecompilerOps : : SPECIAL_DSRA32 ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-10-23 18:53:01 +00:00
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rt ) ) {
if ( m_Opcode . rt ! = m_Opcode . rd ) { UnMap_GPR ( m_Opcode . rd , FALSE ) ; }
MipsRegState ( m_Opcode . rd ) = CRegInfo : : STATE_CONST_32 ;
2010-09-22 21:43:42 +00:00
MipsRegLo ( m_Opcode . rd ) = ( DWORD ) ( MipsReg_S ( m_Opcode . rt ) > > ( m_Opcode . sa + 32 ) ) ;
2010-05-30 01:54:42 +00:00
} else if ( IsMapped ( m_Opcode . rt ) ) {
ProtectGPR ( m_Opcode . rt ) ;
2010-06-04 06:25:07 +00:00
if ( Is64Bit ( m_Opcode . rt ) ) {
2010-05-30 01:54:42 +00:00
if ( m_Opcode . rt = = m_Opcode . rd ) {
2010-06-04 06:25:07 +00:00
CPU_Message ( " regcache: switch hi (%s) with lo (%s) for %s " , x86_Name ( MipsRegMapHi ( m_Opcode . rt ) ) , x86_Name ( cMipsRegMapLo ( m_Opcode . rt ) ) , CRegName : : GPR [ m_Opcode . rt ] ) ;
x86Reg HiReg = MipsRegMapHi ( m_Opcode . rt ) ;
MipsRegMapHi ( m_Opcode . rt ) = cMipsRegMapLo ( m_Opcode . rt ) ;
MipsRegMapLo ( m_Opcode . rt ) = HiReg ;
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , TRUE , - 1 ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , TRUE , - 1 ) ;
2010-06-04 06:25:07 +00:00
MoveX86RegToX86Reg ( cMipsRegMapHi ( m_Opcode . rt ) , cMipsRegMapLo ( m_Opcode . rd ) ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
if ( ( BYTE ) m_Opcode . sa ! = 0 ) {
2010-06-04 06:25:07 +00:00
ShiftRightSignImmed ( cMipsRegMapLo ( m_Opcode . rd ) , ( BYTE ) m_Opcode . sa ) ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-05-30 01:54:42 +00:00
CRecompilerOps : : UnknownOpcode ( ) ;
2010-05-25 09:15:19 +00:00
}
} else {
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rd , TRUE , - 1 ) ;
2010-06-04 06:25:07 +00:00
MoveVariableToX86reg ( & _GPR [ m_Opcode . rt ] . UW [ 1 ] , CRegName : : GPR_Lo [ m_Opcode . rt ] , cMipsRegMapLo ( m_Opcode . rd ) ) ;
2010-05-30 01:54:42 +00:00
if ( ( BYTE ) m_Opcode . sa ! = 0 ) {
2010-06-04 06:25:07 +00:00
ShiftRightSignImmed ( cMipsRegMapLo ( m_Opcode . rd ) , ( BYTE ) m_Opcode . sa ) ;
2010-05-25 09:15:19 +00:00
}
}
}
/************************** COP0 functions **************************/
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : COP0_MF ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
switch ( m_Opcode . rd ) {
2010-05-25 09:15:19 +00:00
case 9 : //Count
2012-09-28 20:07:45 +00:00
m_RegWorkingSet . SetBlockCycleCount ( m_RegWorkingSet . GetBlockCycleCount ( ) - CountPerOp ( ) ) ;
2010-07-05 11:29:46 +00:00
UpdateCounters ( m_RegWorkingSet , false , true ) ;
2012-09-28 20:07:45 +00:00
m_RegWorkingSet . SetBlockCycleCount ( m_RegWorkingSet . GetBlockCycleCount ( ) + CountPerOp ( ) ) ;
2010-07-05 11:29:46 +00:00
BeforeCallDirect ( m_RegWorkingSet ) ;
MoveConstToX86reg ( ( DWORD ) _SystemTimer , x86_ECX ) ;
2010-09-22 21:43:42 +00:00
Call_Direct ( AddressOf ( & CSystemTimer : : UpdateTimers ) , " CSystemTimer::UpdateTimers " ) ;
2010-07-05 11:29:46 +00:00
AfterCallDirect ( m_RegWorkingSet ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
Map_GPR_32bit ( m_Opcode . rt , TRUE , - 1 ) ;
2010-06-04 06:25:07 +00:00
MoveVariableToX86reg ( & _CP0 [ m_Opcode . rd ] , CRegName : : Cop0 [ m_Opcode . rd ] , cMipsRegMapLo ( m_Opcode . rt ) ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : COP0_MT ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-25 09:15:19 +00:00
2010-05-30 01:54:42 +00:00
BYTE * Jump ;
switch ( m_Opcode . rd ) {
2010-05-25 09:15:19 +00:00
case 0 : //Index
case 2 : //EntryLo0
case 3 : //EntryLo1
case 4 : //Context
case 5 : //PageMask
case 10 : //Entry Hi
case 14 : //EPC
case 16 : //Config
case 18 : //WatchLo
case 19 : //WatchHi
case 28 : //Tag lo
case 29 : //Tag Hi
case 30 : //ErrEPC
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rt ) ) {
MoveConstToVariable ( cMipsRegLo ( m_Opcode . rt ) , & _CP0 [ m_Opcode . rd ] , CRegName : : Cop0 [ m_Opcode . rd ] ) ;
} else if ( IsMapped ( m_Opcode . rt ) ) {
MoveX86regToVariable ( cMipsRegMapLo ( m_Opcode . rt ) , & _CP0 [ m_Opcode . rd ] , CRegName : : Cop0 [ m_Opcode . rd ] ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
MoveX86regToVariable ( Map_TempReg ( x86_Any , m_Opcode . rt , FALSE ) , & _CP0 [ m_Opcode . rd ] , CRegName : : Cop0 [ m_Opcode . rd ] ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
if ( m_Opcode . rd = = 4 ) //Context
{
AndConstToVariable ( 0xFF800000 , & _CP0 [ m_Opcode . rd ] , CRegName : : Cop0 [ m_Opcode . rd ] ) ;
2010-05-25 09:15:19 +00:00
}
break ;
2010-05-30 01:54:42 +00:00
case 11 : //Compare
2012-09-28 20:07:45 +00:00
m_RegWorkingSet . SetBlockCycleCount ( m_RegWorkingSet . GetBlockCycleCount ( ) - CountPerOp ( ) ) ;
2012-09-23 22:21:56 +00:00
UpdateCounters ( m_RegWorkingSet , false , true ) ;
2012-09-28 20:07:45 +00:00
m_RegWorkingSet . SetBlockCycleCount ( m_RegWorkingSet . GetBlockCycleCount ( ) + CountPerOp ( ) ) ;
2010-06-14 21:14:58 +00:00
BeforeCallDirect ( m_RegWorkingSet ) ;
2010-05-30 01:54:42 +00:00
MoveConstToX86reg ( ( DWORD ) _SystemTimer , x86_ECX ) ;
2010-09-22 21:43:42 +00:00
Call_Direct ( AddressOf ( & CSystemTimer : : UpdateTimers ) , " CSystemTimer::UpdateTimers " ) ;
2010-06-14 21:14:58 +00:00
AfterCallDirect ( m_RegWorkingSet ) ;
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rt ) ) {
MoveConstToVariable ( cMipsRegLo ( m_Opcode . rt ) , & _CP0 [ m_Opcode . rd ] , CRegName : : Cop0 [ m_Opcode . rd ] ) ;
} else if ( IsMapped ( m_Opcode . rt ) ) {
MoveX86regToVariable ( cMipsRegMapLo ( m_Opcode . rt ) , & _CP0 [ m_Opcode . rd ] , CRegName : : Cop0 [ m_Opcode . rd ] ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-30 01:54:42 +00:00
MoveX86regToVariable ( Map_TempReg ( x86_Any , m_Opcode . rt , FALSE ) , & _CP0 [ m_Opcode . rd ] , CRegName : : Cop0 [ m_Opcode . rd ] ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
AndConstToVariable ( ~ CAUSE_IP7 , & _Reg - > FAKE_CAUSE_REGISTER , " FAKE_CAUSE_REGISTER " ) ;
2010-06-14 21:14:58 +00:00
BeforeCallDirect ( m_RegWorkingSet ) ;
2010-05-30 01:54:42 +00:00
MoveConstToX86reg ( ( DWORD ) _SystemTimer , x86_ECX ) ;
2010-09-22 21:43:42 +00:00
Call_Direct ( AddressOf ( & CSystemTimer : : UpdateCompareTimer ) , " CSystemTimer::UpdateCompareTimer " ) ;
2010-06-14 21:14:58 +00:00
AfterCallDirect ( m_RegWorkingSet ) ;
2010-05-25 09:15:19 +00:00
break ;
2010-05-30 01:54:42 +00:00
case 9 : //Count
2012-09-28 20:07:45 +00:00
m_RegWorkingSet . SetBlockCycleCount ( m_RegWorkingSet . GetBlockCycleCount ( ) - CountPerOp ( ) ) ;
2010-07-05 11:29:46 +00:00
UpdateCounters ( m_RegWorkingSet , false , true ) ;
2012-09-28 20:07:45 +00:00
m_RegWorkingSet . SetBlockCycleCount ( m_RegWorkingSet . GetBlockCycleCount ( ) + CountPerOp ( ) ) ;
2010-06-14 21:14:58 +00:00
BeforeCallDirect ( m_RegWorkingSet ) ;
2010-05-30 01:54:42 +00:00
MoveConstToX86reg ( ( DWORD ) _SystemTimer , x86_ECX ) ;
2010-09-22 21:43:42 +00:00
Call_Direct ( AddressOf ( & CSystemTimer : : UpdateTimers ) , " CSystemTimer::UpdateTimers " ) ;
2010-06-14 21:14:58 +00:00
AfterCallDirect ( m_RegWorkingSet ) ;
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rt ) ) {
MoveConstToVariable ( cMipsRegLo ( m_Opcode . rt ) , & _CP0 [ m_Opcode . rd ] , CRegName : : Cop0 [ m_Opcode . rd ] ) ;
} else if ( IsMapped ( m_Opcode . rt ) ) {
MoveX86regToVariable ( cMipsRegMapLo ( m_Opcode . rt ) , & _CP0 [ m_Opcode . rd ] , CRegName : : Cop0 [ m_Opcode . rd ] ) ;
} else {
2010-05-31 00:21:08 +00:00
MoveX86regToVariable ( Map_TempReg ( x86_Any , m_Opcode . rt , FALSE ) , & _CP0 [ m_Opcode . rd ] , CRegName : : Cop0 [ m_Opcode . rd ] ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-14 21:14:58 +00:00
BeforeCallDirect ( m_RegWorkingSet ) ;
2010-05-30 01:54:42 +00:00
MoveConstToX86reg ( ( DWORD ) _SystemTimer , x86_ECX ) ;
2010-09-22 21:43:42 +00:00
Call_Direct ( AddressOf ( & CSystemTimer : : UpdateCompareTimer ) , " CSystemTimer::UpdateCompareTimer " ) ;
2010-06-14 21:14:58 +00:00
AfterCallDirect ( m_RegWorkingSet ) ;
2010-05-25 09:15:19 +00:00
break ;
2010-05-30 01:54:42 +00:00
case 12 : //Status
{
2010-05-31 00:21:08 +00:00
x86Reg OldStatusReg = Map_TempReg ( x86_Any , - 1 , FALSE ) ;
2010-05-30 01:54:42 +00:00
MoveVariableToX86reg ( & _CP0 [ m_Opcode . rd ] , CRegName : : Cop0 [ m_Opcode . rd ] , OldStatusReg ) ;
if ( IsConst ( m_Opcode . rt ) ) {
MoveConstToVariable ( cMipsRegLo ( m_Opcode . rt ) , & _CP0 [ m_Opcode . rd ] , CRegName : : Cop0 [ m_Opcode . rd ] ) ;
} else if ( IsMapped ( m_Opcode . rt ) ) {
MoveX86regToVariable ( cMipsRegMapLo ( m_Opcode . rt ) , & _CP0 [ m_Opcode . rd ] , CRegName : : Cop0 [ m_Opcode . rd ] ) ;
} else {
2010-05-31 00:21:08 +00:00
MoveX86regToVariable ( Map_TempReg ( x86_Any , m_Opcode . rt , FALSE ) , & _CP0 [ m_Opcode . rd ] , CRegName : : Cop0 [ m_Opcode . rd ] ) ;
2010-05-30 01:54:42 +00:00
}
XorVariableToX86reg ( & _CP0 [ m_Opcode . rd ] , CRegName : : Cop0 [ m_Opcode . rd ] , OldStatusReg ) ;
TestConstToX86Reg ( STATUS_FR , OldStatusReg ) ;
JeLabel8 ( " FpuFlagFine " , 0 ) ;
Jump = m_RecompPos - 1 ;
2010-06-14 21:14:58 +00:00
BeforeCallDirect ( m_RegWorkingSet ) ;
2010-05-30 01:54:42 +00:00
Call_Direct ( SetFpuLocations , " SetFpuLocations " ) ;
2010-06-14 21:14:58 +00:00
AfterCallDirect ( m_RegWorkingSet ) ;
2012-09-25 22:07:49 +00:00
SetJump8 ( Jump , m_RecompPos ) ;
2010-05-30 01:54:42 +00:00
//TestConstToX86Reg(STATUS_FR,OldStatusReg);
2010-06-04 06:25:07 +00:00
//BreakPoint(__FILE__,__LINE__); //m_Section->CompileExit(m_CompilePC+4,m_RegWorkingSet,ExitResetRecompCode,FALSE,JneLabel32);
2010-06-14 21:14:58 +00:00
BeforeCallDirect ( m_RegWorkingSet ) ;
2010-06-04 06:25:07 +00:00
MoveConstToX86reg ( ( DWORD ) _Reg , x86_ECX ) ;
2010-09-22 21:43:42 +00:00
Call_Direct ( AddressOf ( & CRegisters : : CheckInterrupts ) , " CRegisters::CheckInterrupts " ) ;
2010-06-14 21:14:58 +00:00
AfterCallDirect ( m_RegWorkingSet ) ;
2010-05-30 01:54:42 +00:00
}
break ;
2010-05-25 09:15:19 +00:00
case 6 : //Wired
2010-06-14 21:14:58 +00:00
BeforeCallDirect ( m_RegWorkingSet ) ;
2012-09-28 20:13:15 +00:00
MoveConstToX86reg ( ( DWORD ) _SystemTimer , x86_ECX ) ;
Call_Direct ( AddressOf ( & CSystemTimer : : UpdateTimers ) , " CSystemTimer::UpdateTimers " ) ;
2010-06-14 21:14:58 +00:00
AfterCallDirect ( m_RegWorkingSet ) ;
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rt ) ) {
MoveConstToVariable ( cMipsRegLo ( m_Opcode . rt ) , & _CP0 [ m_Opcode . rd ] , CRegName : : Cop0 [ m_Opcode . rd ] ) ;
} else if ( IsMapped ( m_Opcode . rt ) ) {
2010-11-12 05:30:08 +00:00
MoveX86regToVariable ( cMipsRegMapLo ( m_Opcode . rt ) , & _CP0 [ m_Opcode . rd ] , CRegName : : Cop0 [ m_Opcode . rd ] ) ;
2010-05-25 09:15:19 +00:00
} else {
2010-05-31 00:21:08 +00:00
MoveX86regToVariable ( Map_TempReg ( x86_Any , m_Opcode . rt , FALSE ) , & _CP0 [ m_Opcode . rd ] , CRegName : : Cop0 [ m_Opcode . rd ] ) ;
2010-05-25 09:15:19 +00:00
}
break ;
case 13 : //cause
2010-05-30 01:54:42 +00:00
if ( IsConst ( m_Opcode . rt ) ) {
AndConstToVariable ( 0xFFFFCFF , & _CP0 [ m_Opcode . rd ] , CRegName : : Cop0 [ m_Opcode . rd ] ) ;
2010-05-25 09:15:19 +00:00
# ifndef EXTERNAL_RELEASE
2010-05-30 01:54:42 +00:00
if ( ( cMipsRegLo ( m_Opcode . rt ) & 0x300 ) ! = 0 ) { DisplayError ( " Set IP0 or IP1 " ) ; }
2010-05-25 09:15:19 +00:00
# endif
} else {
2010-05-30 01:54:42 +00:00
_Notify - > BreakPoint ( __FILE__ , __LINE__ ) ;
# ifdef tofix
CRecompilerOps : : UnknownOpcode ( ) ;
# endif
2010-05-25 09:15:19 +00:00
}
2010-06-14 21:14:58 +00:00
BeforeCallDirect ( m_RegWorkingSet ) ;
2010-06-04 06:25:07 +00:00
MoveConstToX86reg ( ( DWORD ) _Reg , x86_ECX ) ;
2010-09-22 21:43:42 +00:00
Call_Direct ( AddressOf ( & CRegisters : : CheckInterrupts ) , " CRegisters::CheckInterrupts " ) ;
2010-06-14 21:14:58 +00:00
AfterCallDirect ( m_RegWorkingSet ) ;
2010-05-25 09:15:19 +00:00
break ;
default :
2010-05-30 01:54:42 +00:00
_Notify - > BreakPoint ( __FILE__ , __LINE__ ) ;
# ifdef tofix
CRecompilerOps : : UnknownOpcode ( ) ;
# endif
2010-05-25 09:15:19 +00:00
}
}
/************************** COP0 CO functions ***********************/
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : COP0_CO_TLBR ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2012-09-24 01:14:02 +00:00
if ( ! bUseTlb ( ) ) { return ; }
2010-06-16 07:31:47 +00:00
BeforeCallDirect ( m_RegWorkingSet ) ;
MoveConstToX86reg ( ( DWORD ) _TLB , x86_ECX ) ;
2010-09-22 21:43:42 +00:00
Call_Direct ( AddressOf ( & CTLB : : ReadEntry ) , " CTLB::ReadEntry " ) ;
2010-06-16 07:31:47 +00:00
AfterCallDirect ( m_RegWorkingSet ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : COP0_CO_TLBWI ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2012-09-24 01:14:02 +00:00
if ( ! bUseTlb ( ) ) { return ; }
2010-06-14 21:14:58 +00:00
BeforeCallDirect ( m_RegWorkingSet ) ;
2010-05-25 09:15:19 +00:00
PushImm32 ( " FALSE " , FALSE ) ;
MoveVariableToX86reg ( & _Reg - > INDEX_REGISTER , " INDEX_REGISTER " , x86_ECX ) ;
AndConstToX86Reg ( x86_ECX , 0x1F ) ;
Push ( x86_ECX ) ;
2010-06-04 06:25:07 +00:00
MoveConstToX86reg ( ( DWORD ) _TLB , x86_ECX ) ;
2010-09-22 21:43:42 +00:00
Call_Direct ( AddressOf ( & CTLB : : WriteEntry ) , " CTLB::WriteEntry " ) ;
2010-06-14 21:14:58 +00:00
AfterCallDirect ( m_RegWorkingSet ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : COP0_CO_TLBWR ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2012-09-24 01:14:02 +00:00
if ( ! bUseTlb ( ) ) { return ; }
2010-05-25 09:15:19 +00:00
2012-09-28 20:13:15 +00:00
m_RegWorkingSet . SetBlockCycleCount ( m_RegWorkingSet . GetBlockCycleCount ( ) - CountPerOp ( ) ) ;
UpdateCounters ( m_RegWorkingSet , false , true ) ;
m_RegWorkingSet . SetBlockCycleCount ( m_RegWorkingSet . GetBlockCycleCount ( ) + CountPerOp ( ) ) ;
BeforeCallDirect ( m_RegWorkingSet ) ;
MoveConstToX86reg ( ( DWORD ) _SystemTimer , x86_ECX ) ;
Call_Direct ( AddressOf ( & CSystemTimer : : UpdateTimers ) , " CSystemTimer::UpdateTimers " ) ;
PushImm32 ( " true " , true ) ;
2010-05-25 09:15:19 +00:00
MoveVariableToX86reg ( & _Reg - > RANDOM_REGISTER , " RANDOM_REGISTER " , x86_ECX ) ;
AndConstToX86Reg ( x86_ECX , 0x1F ) ;
Push ( x86_ECX ) ;
2012-09-28 20:13:15 +00:00
MoveConstToX86reg ( ( DWORD ) _TLB , x86_ECX ) ;
Call_Direct ( AddressOf ( & CTLB : : WriteEntry ) , " CTLB::WriteEntry " ) ;
AfterCallDirect ( m_RegWorkingSet ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : COP0_CO_TLBP ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-25 09:15:19 +00:00
2012-09-24 01:14:02 +00:00
if ( ! bUseTlb ( ) ) { return ; }
2010-06-14 21:14:58 +00:00
BeforeCallDirect ( m_RegWorkingSet ) ;
2010-05-25 09:15:19 +00:00
MoveConstToX86reg ( ( DWORD ) _TLB , x86_ECX ) ;
2010-09-22 21:43:42 +00:00
Call_Direct ( AddressOf ( & CTLB : : Probe ) , " CTLB::TLB_Probe " ) ;
2010-06-14 21:14:58 +00:00
AfterCallDirect ( m_RegWorkingSet ) ;
2010-05-25 09:15:19 +00:00
}
void compiler_COP0_CO_ERET ( void ) {
if ( ( _Reg - > STATUS_REGISTER & STATUS_ERL ) ! = 0 ) {
2010-06-04 06:25:07 +00:00
_Reg - > m_PROGRAM_COUNTER = _Reg - > ERROREPC_REGISTER ;
2010-05-25 09:15:19 +00:00
_Reg - > STATUS_REGISTER & = ~ STATUS_ERL ;
} else {
2010-06-04 06:25:07 +00:00
_Reg - > m_PROGRAM_COUNTER = _Reg - > EPC_REGISTER ;
2010-05-25 09:15:19 +00:00
_Reg - > STATUS_REGISTER & = ~ STATUS_EXL ;
}
2010-06-04 06:25:07 +00:00
_Reg - > m_LLBit = 0 ;
_Reg - > CheckInterrupts ( ) ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : COP0_CO_ERET ( void ) {
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-25 09:15:19 +00:00
2010-06-04 06:25:07 +00:00
m_RegWorkingSet . WriteBackRegisters ( ) ;
2010-05-25 09:15:19 +00:00
Call_Direct ( compiler_COP0_CO_ERET , " compiler_COP0_CO_ERET " ) ;
2010-06-07 02:23:58 +00:00
UpdateCounters ( m_RegWorkingSet , true , true ) ;
2010-06-04 06:25:07 +00:00
m_Section - > CompileExit ( m_CompilePC , ( DWORD ) - 1 , m_RegWorkingSet , CExitInfo : : Normal , TRUE , NULL ) ;
2010-05-30 01:54:42 +00:00
m_NextInstruction = END_BLOCK ;
2010-05-25 09:15:19 +00:00
}
2010-05-30 01:54:42 +00:00
/************************** FPU Options **************************/
2010-06-04 06:25:07 +00:00
void CRecompilerOps : : ChangeDefaultRoundingModel ( void ) {
2010-05-30 01:54:42 +00:00
switch ( ( _FPCR [ 31 ] & 3 ) ) {
2010-06-04 06:25:07 +00:00
case 0 : * _RoundingModel = ROUND_NEAR ; break ;
case 1 : * _RoundingModel = ROUND_CHOP ; break ;
case 2 : * _RoundingModel = ROUND_UP ; break ;
case 3 : * _RoundingModel = ROUND_DOWN ; break ;
2010-05-30 01:54:42 +00:00
}
}
/************************** COP1 functions **************************/
void CRecompilerOps : : COP1_MF ( void ) {
2010-06-04 06:25:07 +00:00
x86Reg TempReg ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
m_Section - > CompileCop1Test ( ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
UnMap_FPR ( m_Opcode . fs , TRUE ) ;
Map_GPR_32bit ( m_Opcode . rt , TRUE , - 1 ) ;
TempReg = Map_TempReg ( x86_Any , - 1 , FALSE ) ;
char Name [ 100 ] ;
sprintf ( Name , " _FPR_S[%d] " , m_Opcode . fs ) ;
MoveVariableToX86reg ( ( BYTE * ) & _FPR_S [ m_Opcode . fs ] , Name , TempReg ) ;
MoveX86PointerToX86reg ( cMipsRegMapLo ( m_Opcode . rt ) , TempReg ) ;
2010-05-30 01:54:42 +00:00
}
void CRecompilerOps : : COP1_DMF ( void ) {
2010-06-04 06:25:07 +00:00
x86Reg TempReg ;
2010-06-12 02:02:06 +00:00
char Name [ 50 ] ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
m_Section - > CompileCop1Test ( ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
UnMap_FPR ( m_Opcode . fs , TRUE ) ;
Map_GPR_64bit ( m_Opcode . rt , - 1 ) ;
TempReg = Map_TempReg ( x86_Any , - 1 , FALSE ) ;
2010-06-07 02:23:58 +00:00
sprintf ( Name , " _FPR_D[%d] " , m_Opcode . fs ) ;
MoveVariableToX86reg ( ( BYTE * ) & _FPR_D [ m_Opcode . fs ] , Name , TempReg ) ;
2010-05-30 01:54:42 +00:00
AddConstToX86Reg ( TempReg , 4 ) ;
2010-06-12 02:02:06 +00:00
MoveX86PointerToX86reg ( cMipsRegMapHi ( m_Opcode . rt ) , TempReg ) ;
2010-06-07 02:23:58 +00:00
sprintf ( Name , " _FPR_D[%d] " , m_Opcode . fs ) ;
MoveVariableToX86reg ( ( BYTE * ) & _FPR_D [ m_Opcode . fs ] , Name , TempReg ) ;
2010-06-12 02:02:06 +00:00
MoveX86PointerToX86reg ( cMipsRegMapLo ( m_Opcode . rt ) , TempReg ) ;
2010-05-30 01:54:42 +00:00
}
void CRecompilerOps : : COP1_CF ( void ) {
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
m_Section - > CompileCop1Test ( ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
if ( m_Opcode . fs ! = 31 & & m_Opcode . fs ! = 0 ) { UnknownOpcode ( ) ; return ; }
Map_GPR_32bit ( m_Opcode . rt , TRUE , - 1 ) ;
MoveVariableToX86reg ( & _FPCR [ m_Opcode . fs ] , CRegName : : FPR_Ctrl [ m_Opcode . fs ] , cMipsRegMapLo ( m_Opcode . rt ) ) ;
2010-05-30 01:54:42 +00:00
}
void CRecompilerOps : : COP1_MT ( void ) {
2010-06-04 06:25:07 +00:00
x86Reg TempReg ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
m_Section - > CompileCop1Test ( ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
if ( ( m_Opcode . fs & 1 ) ! = 0 ) {
if ( RegInStack ( m_Opcode . fs - 1 , CRegInfo : : FPU_Double ) | | RegInStack ( m_Opcode . fs - 1 , CRegInfo : : FPU_Qword ) ) {
UnMap_FPR ( m_Opcode . fs - 1 , TRUE ) ;
2010-05-30 01:54:42 +00:00
}
}
2010-06-04 06:25:07 +00:00
UnMap_FPR ( m_Opcode . fs , TRUE ) ;
TempReg = Map_TempReg ( x86_Any , - 1 , FALSE ) ;
char Name [ 50 ] ;
sprintf ( Name , " _FPR_S[%d] " , m_Opcode . fs ) ;
MoveVariableToX86reg ( ( BYTE * ) & _FPR_S [ m_Opcode . fs ] , Name , TempReg ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
if ( IsConst ( m_Opcode . rt ) ) {
MoveConstToX86Pointer ( cMipsRegLo ( m_Opcode . rt ) , TempReg ) ;
} else if ( IsMapped ( m_Opcode . rt ) ) {
MoveX86regToX86Pointer ( cMipsRegMapLo ( m_Opcode . rt ) , TempReg ) ;
2010-05-30 01:54:42 +00:00
} else {
2010-06-04 06:25:07 +00:00
MoveX86regToX86Pointer ( Map_TempReg ( x86_Any , m_Opcode . rt , FALSE ) , TempReg ) ;
2010-05-30 01:54:42 +00:00
}
}
void CRecompilerOps : : COP1_DMT ( void ) {
2010-06-04 06:25:07 +00:00
x86Reg TempReg ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
m_Section - > CompileCop1Test ( ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
if ( ( m_Opcode . fs & 1 ) = = 0 ) {
if ( RegInStack ( m_Opcode . fs + 1 , CRegInfo : : FPU_Float ) | | RegInStack ( m_Opcode . fs + 1 , CRegInfo : : FPU_Dword ) ) {
UnMap_FPR ( m_Opcode . fs + 1 , TRUE ) ;
2010-05-30 01:54:42 +00:00
}
}
2010-06-04 06:25:07 +00:00
UnMap_FPR ( m_Opcode . fs , TRUE ) ;
TempReg = Map_TempReg ( x86_Any , - 1 , FALSE ) ;
2010-06-12 02:02:06 +00:00
char Name [ 50 ] ;
2010-06-07 02:23:58 +00:00
sprintf ( Name , " _FPR_D[%d] " , m_Opcode . fs ) ;
MoveVariableToX86reg ( ( BYTE * ) & _FPR_D [ m_Opcode . fs ] , Name , TempReg ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
if ( IsConst ( m_Opcode . rt ) ) {
MoveConstToX86Pointer ( cMipsRegLo ( m_Opcode . rt ) , TempReg ) ;
2010-05-30 01:54:42 +00:00
AddConstToX86Reg ( TempReg , 4 ) ;
2010-06-12 02:02:06 +00:00
if ( Is64Bit ( m_Opcode . rt ) ) {
2010-06-04 06:25:07 +00:00
MoveConstToX86Pointer ( MipsRegHi ( m_Opcode . rt ) , TempReg ) ;
2010-05-30 01:54:42 +00:00
} else {
2010-06-12 02:02:06 +00:00
MoveConstToX86Pointer ( MipsRegLo_S ( m_Opcode . rt ) > > 31 , TempReg ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-04 06:25:07 +00:00
} else if ( IsMapped ( m_Opcode . rt ) ) {
MoveX86regToX86Pointer ( cMipsRegMapLo ( m_Opcode . rt ) , TempReg ) ;
2010-05-30 01:54:42 +00:00
AddConstToX86Reg ( TempReg , 4 ) ;
2010-06-12 02:02:06 +00:00
if ( Is64Bit ( m_Opcode . rt ) ) {
MoveX86regToX86Pointer ( cMipsRegMapHi ( m_Opcode . rt ) , TempReg ) ;
2010-05-30 01:54:42 +00:00
} else {
2010-06-04 06:25:07 +00:00
MoveX86regToX86Pointer ( Map_TempReg ( x86_Any , m_Opcode . rt , TRUE ) , TempReg ) ;
2010-05-30 01:54:42 +00:00
}
} else {
2010-06-04 06:25:07 +00:00
x86Reg Reg = Map_TempReg ( x86_Any , m_Opcode . rt , FALSE ) ;
MoveX86regToX86Pointer ( Reg , TempReg ) ;
2010-05-30 01:54:42 +00:00
AddConstToX86Reg ( TempReg , 4 ) ;
2010-06-04 06:25:07 +00:00
MoveX86regToX86Pointer ( Map_TempReg ( Reg , m_Opcode . rt , TRUE ) , TempReg ) ;
2010-05-30 01:54:42 +00:00
}
}
void CRecompilerOps : : COP1_CT ( void ) {
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
m_Section - > CompileCop1Test ( ) ;
if ( m_Opcode . fs ! = 31 ) { UnknownOpcode ( ) ; return ; }
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
if ( IsConst ( m_Opcode . rt ) ) {
MoveConstToVariable ( cMipsRegLo ( m_Opcode . rt ) , & _FPCR [ m_Opcode . fs ] , CRegName : : FPR_Ctrl [ m_Opcode . fs ] ) ;
} else if ( IsMapped ( m_Opcode . rt ) ) {
MoveX86regToVariable ( cMipsRegMapLo ( m_Opcode . rt ) , & _FPCR [ m_Opcode . fs ] , CRegName : : FPR_Ctrl [ m_Opcode . fs ] ) ;
2010-05-30 01:54:42 +00:00
} else {
2010-06-04 06:25:07 +00:00
MoveX86regToVariable ( Map_TempReg ( x86_Any , m_Opcode . rt , FALSE ) , & _FPCR [ m_Opcode . fs ] , CRegName : : FPR_Ctrl [ m_Opcode . fs ] ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-14 21:14:58 +00:00
BeforeCallDirect ( m_RegWorkingSet ) ;
2010-05-30 01:54:42 +00:00
Call_Direct ( ChangeDefaultRoundingModel , " ChangeDefaultRoundingModel " ) ;
2010-06-14 21:14:58 +00:00
AfterCallDirect ( m_RegWorkingSet ) ;
2010-07-23 10:45:35 +00:00
m_RegWorkingSet . SetRoundingModel ( CRegInfo : : RoundUnknown ) ;
2010-05-30 01:54:42 +00:00
}
/************************** COP1: S functions ************************/
void CRecompilerOps : : COP1_S_ADD ( void ) {
2010-06-04 06:25:07 +00:00
DWORD Reg1 = m_Opcode . ft = = m_Opcode . fd ? m_Opcode . ft : m_Opcode . fs ;
DWORD Reg2 = m_Opcode . ft = = m_Opcode . fd ? m_Opcode . fs : m_Opcode . ft ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
m_Section - > CompileCop1Test ( ) ;
FixRoundModel ( CRegInfo : : RoundDefault ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
Load_FPR_ToTop ( m_Opcode . fd , Reg1 , CRegInfo : : FPU_Float ) ;
if ( RegInStack ( Reg2 , CRegInfo : : FPU_Float ) ) {
fpuAddReg ( StackPosition ( Reg2 ) ) ;
2010-05-30 01:54:42 +00:00
} else {
2010-06-04 06:25:07 +00:00
x86Reg TempReg ;
UnMap_FPR ( Reg2 , TRUE ) ;
TempReg = Map_TempReg ( x86_Any , - 1 , FALSE ) ;
char Name [ 50 ] ;
sprintf ( Name , " _FPR_S[%d] " , Reg2 ) ;
MoveVariableToX86reg ( ( BYTE * ) & _FPR_S [ Reg2 ] , Name , TempReg ) ;
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fd , CRegInfo : : FPU_Float ) ;
2010-05-30 01:54:42 +00:00
fpuAddDwordRegPointer ( TempReg ) ;
}
2010-06-04 06:25:07 +00:00
UnMap_FPR ( m_Opcode . fd , TRUE ) ;
2010-05-30 01:54:42 +00:00
}
void CRecompilerOps : : COP1_S_SUB ( void ) {
2010-06-04 06:25:07 +00:00
DWORD Reg1 = m_Opcode . ft = = m_Opcode . fd ? m_Opcode . ft : m_Opcode . fs ;
DWORD Reg2 = m_Opcode . ft = = m_Opcode . fd ? m_Opcode . fs : m_Opcode . ft ;
x86Reg TempReg ;
2010-06-07 02:23:58 +00:00
char Name [ 50 ] ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
m_Section - > CompileCop1Test ( ) ;
FixRoundModel ( CRegInfo : : RoundDefault ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
if ( m_Opcode . fd = = m_Opcode . ft ) {
UnMap_FPR ( m_Opcode . fd , TRUE ) ;
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fs , CRegInfo : : FPU_Float ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
TempReg = Map_TempReg ( x86_Any , - 1 , FALSE ) ;
sprintf ( Name , " _FPR_S[%d] " , m_Opcode . ft ) ;
MoveVariableToX86reg ( ( BYTE * ) & _FPR_S [ m_Opcode . ft ] , Name , TempReg ) ;
2010-05-30 01:54:42 +00:00
fpuSubDwordRegPointer ( TempReg ) ;
} else {
2010-06-04 06:25:07 +00:00
Load_FPR_ToTop ( m_Opcode . fd , Reg1 , CRegInfo : : FPU_Float ) ;
if ( RegInStack ( Reg2 , CRegInfo : : FPU_Float ) ) {
fpuSubReg ( StackPosition ( Reg2 ) ) ;
2010-05-30 01:54:42 +00:00
} else {
2010-06-04 06:25:07 +00:00
UnMap_FPR ( Reg2 , TRUE ) ;
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fd , CRegInfo : : FPU_Float ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
TempReg = Map_TempReg ( x86_Any , - 1 , FALSE ) ;
sprintf ( Name , " _FPR_S[%d] " , Reg2 ) ;
MoveVariableToX86reg ( ( BYTE * ) & _FPR_S [ Reg2 ] , Name , TempReg ) ;
2010-05-30 01:54:42 +00:00
fpuSubDwordRegPointer ( TempReg ) ;
}
}
2010-06-04 06:25:07 +00:00
UnMap_FPR ( m_Opcode . fd , TRUE ) ;
2010-05-30 01:54:42 +00:00
}
void CRecompilerOps : : COP1_S_MUL ( void ) {
2010-06-04 06:25:07 +00:00
DWORD Reg1 = m_Opcode . ft = = m_Opcode . fd ? m_Opcode . ft : m_Opcode . fs ;
DWORD Reg2 = m_Opcode . ft = = m_Opcode . fd ? m_Opcode . fs : m_Opcode . ft ;
x86Reg TempReg ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
m_Section - > CompileCop1Test ( ) ;
FixRoundModel ( CRegInfo : : RoundDefault ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
Load_FPR_ToTop ( m_Opcode . fd , Reg1 , CRegInfo : : FPU_Float ) ;
if ( RegInStack ( Reg2 , CRegInfo : : FPU_Float ) ) {
fpuMulReg ( StackPosition ( Reg2 ) ) ;
2010-05-30 01:54:42 +00:00
} else {
2010-06-04 06:25:07 +00:00
UnMap_FPR ( Reg2 , TRUE ) ;
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fd , CRegInfo : : FPU_Float ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
TempReg = Map_TempReg ( x86_Any , - 1 , FALSE ) ;
char Name [ 50 ] ;
sprintf ( Name , " _FPR_S[%d] " , Reg2 ) ;
MoveVariableToX86reg ( ( BYTE * ) & _FPR_S [ Reg2 ] , Name , TempReg ) ;
2010-05-30 01:54:42 +00:00
fpuMulDwordRegPointer ( TempReg ) ;
}
2010-06-04 06:25:07 +00:00
UnMap_FPR ( m_Opcode . fd , TRUE ) ;
2010-05-30 01:54:42 +00:00
}
void CRecompilerOps : : COP1_S_DIV ( void ) {
2010-06-04 06:25:07 +00:00
DWORD Reg1 = m_Opcode . ft = = m_Opcode . fd ? m_Opcode . ft : m_Opcode . fs ;
DWORD Reg2 = m_Opcode . ft = = m_Opcode . fd ? m_Opcode . fs : m_Opcode . ft ;
x86Reg TempReg ;
char Name [ 50 ] ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
m_Section - > CompileCop1Test ( ) ;
FixRoundModel ( CRegInfo : : RoundDefault ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
if ( m_Opcode . fd = = m_Opcode . ft ) {
UnMap_FPR ( m_Opcode . fd , TRUE ) ;
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fs , CRegInfo : : FPU_Float ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
TempReg = Map_TempReg ( x86_Any , - 1 , FALSE ) ;
sprintf ( Name , " _FPR_S[%d] " , m_Opcode . ft ) ;
MoveVariableToX86reg ( ( BYTE * ) & _FPR_S [ m_Opcode . ft ] , Name , TempReg ) ;
2010-05-30 01:54:42 +00:00
fpuDivDwordRegPointer ( TempReg ) ;
} else {
2010-06-04 06:25:07 +00:00
Load_FPR_ToTop ( m_Opcode . fd , Reg1 , CRegInfo : : FPU_Float ) ;
if ( RegInStack ( Reg2 , CRegInfo : : FPU_Float ) ) {
fpuDivReg ( StackPosition ( Reg2 ) ) ;
2010-05-30 01:54:42 +00:00
} else {
2010-06-04 06:25:07 +00:00
UnMap_FPR ( Reg2 , TRUE ) ;
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fd , CRegInfo : : FPU_Float ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
TempReg = Map_TempReg ( x86_Any , - 1 , FALSE ) ;
sprintf ( Name , " _FPR_S[%d] " , Reg2 ) ;
MoveVariableToX86reg ( ( BYTE * ) & _FPR_S [ Reg2 ] , Name , TempReg ) ;
2010-05-30 01:54:42 +00:00
fpuDivDwordRegPointer ( TempReg ) ;
}
}
2010-06-04 06:25:07 +00:00
UnMap_FPR ( m_Opcode . fd , TRUE ) ;
2010-05-30 01:54:42 +00:00
}
void CRecompilerOps : : COP1_S_ABS ( void ) {
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
m_Section - > CompileCop1Test ( ) ;
FixRoundModel ( CRegInfo : : RoundDefault ) ;
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fs , CRegInfo : : FPU_Float ) ;
2010-05-30 01:54:42 +00:00
fpuAbs ( ) ;
2010-06-04 06:25:07 +00:00
UnMap_FPR ( m_Opcode . fd , TRUE ) ;
2010-05-30 01:54:42 +00:00
}
void CRecompilerOps : : COP1_S_NEG ( void ) {
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
m_Section - > CompileCop1Test ( ) ;
FixRoundModel ( CRegInfo : : RoundDefault ) ;
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fs , CRegInfo : : FPU_Float ) ;
2010-05-30 01:54:42 +00:00
fpuNeg ( ) ;
2010-06-04 06:25:07 +00:00
UnMap_FPR ( m_Opcode . fd , TRUE ) ;
2010-05-30 01:54:42 +00:00
}
void CRecompilerOps : : COP1_S_SQRT ( void ) {
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
m_Section - > CompileCop1Test ( ) ;
FixRoundModel ( CRegInfo : : RoundDefault ) ;
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fs , CRegInfo : : FPU_Float ) ;
2010-05-30 01:54:42 +00:00
fpuSqrt ( ) ;
2010-06-04 06:25:07 +00:00
UnMap_FPR ( m_Opcode . fd , TRUE ) ;
2010-05-30 01:54:42 +00:00
}
void CRecompilerOps : : COP1_S_MOV ( void ) {
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
m_Section - > CompileCop1Test ( ) ;
FixRoundModel ( CRegInfo : : RoundDefault ) ;
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fs , CRegInfo : : FPU_Float ) ;
2010-05-30 01:54:42 +00:00
}
void CRecompilerOps : : COP1_S_TRUNC_L ( void ) {
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
m_Section - > CompileCop1Test ( ) ;
if ( m_Opcode . fd ! = m_Opcode . fs | | ! RegInStack ( m_Opcode . fd , CRegInfo : : FPU_Float ) ) {
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fs , CRegInfo : : FPU_Float ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-04 06:25:07 +00:00
ChangeFPURegFormat ( m_Opcode . fd , CRegInfo : : FPU_Float , CRegInfo : : FPU_Qword , CRegInfo : : RoundTruncate ) ;
2010-05-30 01:54:42 +00:00
}
void CRecompilerOps : : COP1_S_CEIL_L ( void ) { //added by Witten
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
m_Section - > CompileCop1Test ( ) ;
if ( m_Opcode . fd ! = m_Opcode . fs | | ! RegInStack ( m_Opcode . fd , CRegInfo : : FPU_Float ) ) {
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fs , CRegInfo : : FPU_Float ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-04 06:25:07 +00:00
ChangeFPURegFormat ( m_Opcode . fd , CRegInfo : : FPU_Float , CRegInfo : : FPU_Qword , CRegInfo : : RoundUp ) ;
2010-05-30 01:54:42 +00:00
}
void CRecompilerOps : : COP1_S_FLOOR_L ( void ) { //added by Witten
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
m_Section - > CompileCop1Test ( ) ;
if ( m_Opcode . fd ! = m_Opcode . fs | | ! RegInStack ( m_Opcode . fd , CRegInfo : : FPU_Float ) ) {
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fs , CRegInfo : : FPU_Float ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-04 06:25:07 +00:00
ChangeFPURegFormat ( m_Opcode . fd , CRegInfo : : FPU_Float , CRegInfo : : FPU_Qword , CRegInfo : : RoundDown ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-14 21:14:58 +00:00
void CRecompilerOps : : COP1_S_ROUND_W ( void )
{
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
m_Section - > CompileCop1Test ( ) ;
if ( m_Opcode . fd ! = m_Opcode . fs | | ! RegInStack ( m_Opcode . fd , CRegInfo : : FPU_Float ) ) {
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fs , CRegInfo : : FPU_Float ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-04 06:25:07 +00:00
ChangeFPURegFormat ( m_Opcode . fd , CRegInfo : : FPU_Float , CRegInfo : : FPU_Dword , CRegInfo : : RoundNearest ) ;
2010-05-30 01:54:42 +00:00
}
void CRecompilerOps : : COP1_S_TRUNC_W ( void ) {
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
m_Section - > CompileCop1Test ( ) ;
if ( m_Opcode . fd ! = m_Opcode . fs | | ! RegInStack ( m_Opcode . fd , CRegInfo : : FPU_Float ) ) {
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fs , CRegInfo : : FPU_Float ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-04 06:25:07 +00:00
ChangeFPURegFormat ( m_Opcode . fd , CRegInfo : : FPU_Float , CRegInfo : : FPU_Dword , CRegInfo : : RoundTruncate ) ;
2010-05-30 01:54:42 +00:00
}
void CRecompilerOps : : COP1_S_CEIL_W ( void ) { // added by Witten
_Notify - > BreakPoint ( __FILE__ , __LINE__ ) ;
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
m_Section - > CompileCop1Test ( ) ;
if ( m_Opcode . fd ! = m_Opcode . fs | | ! RegInStack ( m_Opcode . fd , CRegInfo : : FPU_Float ) ) {
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fs , CRegInfo : : FPU_Float ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-04 06:25:07 +00:00
ChangeFPURegFormat ( m_Opcode . fd , CRegInfo : : FPU_Float , CRegInfo : : FPU_Dword , CRegInfo : : RoundUp ) ;
2010-05-30 01:54:42 +00:00
}
void CRecompilerOps : : COP1_S_FLOOR_W ( void ) {
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
m_Section - > CompileCop1Test ( ) ;
if ( m_Opcode . fd ! = m_Opcode . fs | | ! RegInStack ( m_Opcode . fd , CRegInfo : : FPU_Float ) ) {
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fs , CRegInfo : : FPU_Float ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-04 06:25:07 +00:00
ChangeFPURegFormat ( m_Opcode . fd , CRegInfo : : FPU_Float , CRegInfo : : FPU_Dword , CRegInfo : : RoundDown ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-07 02:23:58 +00:00
void CRecompilerOps : : COP1_S_CVT_D ( void )
{
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
m_Section - > CompileCop1Test ( ) ;
if ( m_Opcode . fd ! = m_Opcode . fs | | ! RegInStack ( m_Opcode . fd , CRegInfo : : FPU_Float ) ) {
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fs , CRegInfo : : FPU_Float ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-04 06:25:07 +00:00
ChangeFPURegFormat ( m_Opcode . fd , CRegInfo : : FPU_Float , CRegInfo : : FPU_Double , CRegInfo : : RoundDefault ) ;
2010-05-30 01:54:42 +00:00
}
void CRecompilerOps : : COP1_S_CVT_W ( void ) {
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
m_Section - > CompileCop1Test ( ) ;
if ( m_Opcode . fd ! = m_Opcode . fs | | ! RegInStack ( m_Opcode . fd , CRegInfo : : FPU_Float ) ) {
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fs , CRegInfo : : FPU_Float ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-04 06:25:07 +00:00
ChangeFPURegFormat ( m_Opcode . fd , CRegInfo : : FPU_Float , CRegInfo : : FPU_Dword , CRegInfo : : RoundDefault ) ;
2010-05-30 01:54:42 +00:00
}
void CRecompilerOps : : COP1_S_CVT_L ( void ) {
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
m_Section - > CompileCop1Test ( ) ;
if ( m_Opcode . fd ! = m_Opcode . fs | | ! RegInStack ( m_Opcode . fd , CRegInfo : : FPU_Float ) ) {
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fs , CRegInfo : : FPU_Float ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-04 06:25:07 +00:00
ChangeFPURegFormat ( m_Opcode . fd , CRegInfo : : FPU_Float , CRegInfo : : FPU_Qword , CRegInfo : : RoundDefault ) ;
2010-05-30 01:54:42 +00:00
}
void CRecompilerOps : : COP1_S_CMP ( void ) {
2010-06-07 02:23:58 +00:00
DWORD Reg1 = m_Opcode . fs ;
DWORD Reg2 = m_Opcode . ft ;
DWORD cmp = 0 ;
2010-05-30 01:54:42 +00:00
2010-06-07 02:23:58 +00:00
if ( ( m_Opcode . funct & 4 ) = = 0 )
{
Reg1 = RegInStack ( m_Opcode . ft , CRegInfo : : FPU_Float ) ? m_Opcode . ft : m_Opcode . fs ;
Reg2 = RegInStack ( m_Opcode . ft , CRegInfo : : FPU_Float ) ? m_Opcode . fs : m_Opcode . ft ;
}
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
m_Section - > CompileCop1Test ( ) ;
2010-06-22 20:36:28 +00:00
if ( ( m_Opcode . funct & 7 ) = = 0 ) { CRecompilerOps : : UnknownOpcode ( ) ; }
2010-06-04 06:25:07 +00:00
if ( ( m_Opcode . funct & 2 ) ! = 0 ) { cmp | = 0x4000 ; }
if ( ( m_Opcode . funct & 4 ) ! = 0 ) { cmp | = 0x0100 ; }
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
Load_FPR_ToTop ( Reg1 , Reg1 , CRegInfo : : FPU_Float ) ;
Map_TempReg ( x86_EAX , 0 , FALSE ) ;
if ( RegInStack ( Reg2 , CRegInfo : : FPU_Float ) ) {
fpuComReg ( StackPosition ( Reg2 ) , FALSE ) ;
2010-05-30 01:54:42 +00:00
} else {
2010-06-04 06:25:07 +00:00
UnMap_FPR ( Reg2 , TRUE ) ;
Load_FPR_ToTop ( Reg1 , Reg1 , CRegInfo : : FPU_Float ) ;
2010-05-30 01:54:42 +00:00
2010-06-07 02:23:58 +00:00
x86Reg TempReg = Map_TempReg ( x86_Any , - 1 , FALSE ) ;
char Name [ 50 ] ;
2010-06-04 06:25:07 +00:00
sprintf ( Name , " _FPR_S[%d] " , Reg2 ) ;
MoveVariableToX86reg ( ( BYTE * ) & _FPR_S [ Reg2 ] , Name , TempReg ) ;
2010-05-30 01:54:42 +00:00
fpuComDwordRegPointer ( TempReg , FALSE ) ;
}
2010-06-07 02:23:58 +00:00
AndConstToVariable ( ~ FPCSR_C , & _FPCR [ 31 ] , " _FPCR[31] " ) ;
2010-05-30 01:54:42 +00:00
fpuStoreStatus ( ) ;
2010-06-07 02:23:58 +00:00
x86Reg Reg = Map_TempReg ( x86_Any8Bit , 0 , FALSE ) ;
2010-05-30 01:54:42 +00:00
TestConstToX86Reg ( cmp , x86_EAX ) ;
2010-06-07 02:23:58 +00:00
Setnz ( Reg ) ;
2010-05-30 01:54:42 +00:00
if ( cmp ! = 0 ) {
TestConstToX86Reg ( cmp , x86_EAX ) ;
2010-06-07 02:23:58 +00:00
Setnz ( Reg ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
if ( ( m_Opcode . funct & 1 ) ! = 0 ) {
x86Reg Reg2 = Map_TempReg ( x86_Any8Bit , 0 , FALSE ) ;
2010-05-30 01:54:42 +00:00
AndConstToX86Reg ( x86_EAX , 0x4300 ) ;
CompConstToX86reg ( x86_EAX , 0x4300 ) ;
2010-06-07 02:23:58 +00:00
Setz ( Reg2 ) ;
2010-05-30 01:54:42 +00:00
2010-06-07 02:23:58 +00:00
OrX86RegToX86Reg ( Reg , Reg2 ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-04 06:25:07 +00:00
} else if ( ( m_Opcode . funct & 1 ) ! = 0 ) {
2010-05-30 01:54:42 +00:00
AndConstToX86Reg ( x86_EAX , 0x4300 ) ;
CompConstToX86reg ( x86_EAX , 0x4300 ) ;
2010-06-07 02:23:58 +00:00
Setz ( Reg ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-07 02:23:58 +00:00
ShiftLeftSignImmed ( Reg , 23 ) ;
OrX86RegToVariable ( & _FPCR [ 31 ] , " _FPCR[31] " , Reg ) ;
2010-05-30 01:54:42 +00:00
}
/************************** COP1: D functions ************************/
void CRecompilerOps : : COP1_D_ADD ( void ) {
2010-06-04 06:25:07 +00:00
DWORD Reg1 = m_Opcode . ft = = m_Opcode . fd ? m_Opcode . ft : m_Opcode . fs ;
DWORD Reg2 = m_Opcode . ft = = m_Opcode . fd ? m_Opcode . fs : m_Opcode . ft ;
2010-06-07 02:23:58 +00:00
char Name [ 50 ] ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
m_Section - > CompileCop1Test ( ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
Load_FPR_ToTop ( m_Opcode . fd , Reg1 , CRegInfo : : FPU_Double ) ;
if ( RegInStack ( Reg2 , CRegInfo : : FPU_Double ) ) {
fpuAddReg ( StackPosition ( Reg2 ) ) ;
2010-05-30 01:54:42 +00:00
} else {
2010-06-04 06:25:07 +00:00
x86Reg TempReg ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
UnMap_FPR ( Reg2 , TRUE ) ;
TempReg = Map_TempReg ( x86_Any , - 1 , FALSE ) ;
2010-06-07 02:23:58 +00:00
sprintf ( Name , " _FPR_D[%d] " , Reg2 ) ;
MoveVariableToX86reg ( ( BYTE * ) & _FPR_D [ Reg2 ] , Name , TempReg ) ;
2010-06-04 06:25:07 +00:00
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fd , CRegInfo : : FPU_Double ) ;
2010-05-30 01:54:42 +00:00
fpuAddQwordRegPointer ( TempReg ) ;
}
}
void CRecompilerOps : : COP1_D_SUB ( void ) {
2010-06-04 06:25:07 +00:00
DWORD Reg1 = m_Opcode . ft = = m_Opcode . fd ? m_Opcode . ft : m_Opcode . fs ;
DWORD Reg2 = m_Opcode . ft = = m_Opcode . fd ? m_Opcode . fs : m_Opcode . ft ;
x86Reg TempReg ;
2010-06-07 02:23:58 +00:00
char Name [ 50 ] ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
m_Section - > CompileCop1Test ( ) ;
if ( m_Opcode . fd = = m_Opcode . ft ) {
UnMap_FPR ( m_Opcode . fd , TRUE ) ;
TempReg = Map_TempReg ( x86_Any , - 1 , FALSE ) ;
2010-06-07 02:23:58 +00:00
sprintf ( Name , " _FPR_D[%d] " , m_Opcode . ft ) ;
MoveVariableToX86reg ( ( BYTE * ) & _FPR_D [ m_Opcode . ft ] , Name , TempReg ) ;
2010-06-04 06:25:07 +00:00
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fs , CRegInfo : : FPU_Double ) ;
2010-05-30 01:54:42 +00:00
fpuSubQwordRegPointer ( TempReg ) ;
} else {
2010-06-04 06:25:07 +00:00
Load_FPR_ToTop ( m_Opcode . fd , Reg1 , CRegInfo : : FPU_Double ) ;
if ( RegInStack ( Reg2 , CRegInfo : : FPU_Double ) ) {
fpuSubReg ( StackPosition ( Reg2 ) ) ;
2010-05-30 01:54:42 +00:00
} else {
2010-06-04 06:25:07 +00:00
UnMap_FPR ( Reg2 , TRUE ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
TempReg = Map_TempReg ( x86_Any , - 1 , FALSE ) ;
2010-06-07 02:23:58 +00:00
sprintf ( Name , " _FPR_D[%d] " , Reg2 ) ;
MoveVariableToX86reg ( ( BYTE * ) & _FPR_D [ Reg2 ] , Name , TempReg ) ;
2010-06-04 06:25:07 +00:00
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fd , CRegInfo : : FPU_Double ) ;
2010-05-30 01:54:42 +00:00
fpuSubQwordRegPointer ( TempReg ) ;
}
}
}
void CRecompilerOps : : COP1_D_MUL ( void ) {
2010-06-04 06:25:07 +00:00
DWORD Reg1 = m_Opcode . ft = = m_Opcode . fd ? m_Opcode . ft : m_Opcode . fs ;
DWORD Reg2 = m_Opcode . ft = = m_Opcode . fd ? m_Opcode . fs : m_Opcode . ft ;
x86Reg TempReg ;
2010-06-07 02:23:58 +00:00
char Name [ 50 ] ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
m_Section - > CompileCop1Test ( ) ;
FixRoundModel ( CRegInfo : : RoundDefault ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
Load_FPR_ToTop ( m_Opcode . fd , Reg1 , CRegInfo : : FPU_Double ) ;
if ( RegInStack ( Reg2 , CRegInfo : : FPU_Double ) ) {
fpuMulReg ( StackPosition ( Reg2 ) ) ;
2010-05-30 01:54:42 +00:00
} else {
2010-06-04 06:25:07 +00:00
UnMap_FPR ( Reg2 , TRUE ) ;
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fd , CRegInfo : : FPU_Double ) ;
TempReg = Map_TempReg ( x86_Any , - 1 , FALSE ) ;
2010-06-07 02:23:58 +00:00
sprintf ( Name , " _FPR_D[%d] " , Reg2 ) ;
MoveVariableToX86reg ( ( BYTE * ) & _FPR_D [ Reg2 ] , Name , TempReg ) ;
2010-05-30 01:54:42 +00:00
fpuMulQwordRegPointer ( TempReg ) ;
}
}
void CRecompilerOps : : COP1_D_DIV ( void ) {
2010-06-04 06:25:07 +00:00
DWORD Reg1 = m_Opcode . ft = = m_Opcode . fd ? m_Opcode . ft : m_Opcode . fs ;
DWORD Reg2 = m_Opcode . ft = = m_Opcode . fd ? m_Opcode . fs : m_Opcode . ft ;
x86Reg TempReg ;
2010-06-07 02:23:58 +00:00
char Name [ 50 ] ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
m_Section - > CompileCop1Test ( ) ;
if ( m_Opcode . fd = = m_Opcode . ft ) {
UnMap_FPR ( m_Opcode . fd , TRUE ) ;
TempReg = Map_TempReg ( x86_Any , - 1 , FALSE ) ;
2010-06-07 02:23:58 +00:00
sprintf ( Name , " _FPR_D[%d] " , m_Opcode . ft ) ;
MoveVariableToX86reg ( ( BYTE * ) & _FPR_D [ m_Opcode . ft ] , Name , TempReg ) ;
2010-06-04 06:25:07 +00:00
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fs , CRegInfo : : FPU_Double ) ;
2010-05-30 01:54:42 +00:00
fpuDivQwordRegPointer ( TempReg ) ;
} else {
2010-06-04 06:25:07 +00:00
Load_FPR_ToTop ( m_Opcode . fd , Reg1 , CRegInfo : : FPU_Double ) ;
if ( RegInStack ( Reg2 , CRegInfo : : FPU_Double ) ) {
fpuDivReg ( StackPosition ( Reg2 ) ) ;
2010-05-30 01:54:42 +00:00
} else {
2010-06-04 06:25:07 +00:00
UnMap_FPR ( Reg2 , TRUE ) ;
TempReg = Map_TempReg ( x86_Any , - 1 , FALSE ) ;
2010-06-07 02:23:58 +00:00
sprintf ( Name , " _FPR_D[%d] " , Reg2 ) ;
MoveVariableToX86reg ( ( BYTE * ) & _FPR_D [ Reg2 ] , Name , TempReg ) ;
2010-06-04 06:25:07 +00:00
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fd , CRegInfo : : FPU_Double ) ;
2010-05-30 01:54:42 +00:00
fpuDivQwordRegPointer ( TempReg ) ;
}
}
}
void CRecompilerOps : : COP1_D_ABS ( void ) {
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fs , CRegInfo : : FPU_Double ) ;
2010-05-30 01:54:42 +00:00
fpuAbs ( ) ;
}
void CRecompilerOps : : COP1_D_NEG ( void ) {
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fs , CRegInfo : : FPU_Double ) ;
2010-05-30 01:54:42 +00:00
fpuNeg ( ) ;
}
void CRecompilerOps : : COP1_D_SQRT ( void ) {
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fs , CRegInfo : : FPU_Double ) ;
2010-05-30 01:54:42 +00:00
fpuSqrt ( ) ;
}
void CRecompilerOps : : COP1_D_MOV ( void ) {
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fs , CRegInfo : : FPU_Double ) ;
2010-05-30 01:54:42 +00:00
}
void CRecompilerOps : : COP1_D_TRUNC_L ( void ) { //added by Witten
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
m_Section - > CompileCop1Test ( ) ;
if ( RegInStack ( m_Opcode . fs , CRegInfo : : FPU_Double ) | | RegInStack ( m_Opcode . fs , CRegInfo : : FPU_Qword ) ) {
UnMap_FPR ( m_Opcode . fs , TRUE ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-04 06:25:07 +00:00
if ( m_Opcode . fd ! = m_Opcode . fs | | ! RegInStack ( m_Opcode . fd , CRegInfo : : FPU_Double ) ) {
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fs , CRegInfo : : FPU_Double ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-04 06:25:07 +00:00
ChangeFPURegFormat ( m_Opcode . fd , CRegInfo : : FPU_Double , CRegInfo : : FPU_Qword , CRegInfo : : RoundTruncate ) ;
2010-05-30 01:54:42 +00:00
}
void CRecompilerOps : : COP1_D_CEIL_L ( void ) { //added by Witten
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
m_Section - > CompileCop1Test ( ) ;
if ( RegInStack ( m_Opcode . fs , CRegInfo : : FPU_Double ) | | RegInStack ( m_Opcode . fs , CRegInfo : : FPU_Qword ) ) {
UnMap_FPR ( m_Opcode . fs , TRUE ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-04 06:25:07 +00:00
if ( m_Opcode . fd ! = m_Opcode . fs | | ! RegInStack ( m_Opcode . fd , CRegInfo : : FPU_Double ) ) {
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fs , CRegInfo : : FPU_Double ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-04 06:25:07 +00:00
ChangeFPURegFormat ( m_Opcode . fd , CRegInfo : : FPU_Double , CRegInfo : : FPU_Qword , CRegInfo : : RoundUp ) ;
2010-05-30 01:54:42 +00:00
}
void CRecompilerOps : : COP1_D_FLOOR_L ( void ) { //added by Witten
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
m_Section - > CompileCop1Test ( ) ;
if ( RegInStack ( m_Opcode . fs , CRegInfo : : FPU_Double ) | | RegInStack ( m_Opcode . fs , CRegInfo : : FPU_Qword ) ) {
UnMap_FPR ( m_Opcode . fs , TRUE ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-04 06:25:07 +00:00
if ( m_Opcode . fd ! = m_Opcode . fs | | ! RegInStack ( m_Opcode . fd , CRegInfo : : FPU_Double ) ) {
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fs , CRegInfo : : FPU_Double ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-04 06:25:07 +00:00
ChangeFPURegFormat ( m_Opcode . fd , CRegInfo : : FPU_Double , CRegInfo : : FPU_Qword , CRegInfo : : RoundDown ) ;
2010-05-30 01:54:42 +00:00
}
void CRecompilerOps : : COP1_D_ROUND_W ( void ) {
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
m_Section - > CompileCop1Test ( ) ;
if ( RegInStack ( m_Opcode . fs , CRegInfo : : FPU_Double ) | | RegInStack ( m_Opcode . fs , CRegInfo : : FPU_Qword ) ) {
UnMap_FPR ( m_Opcode . fs , TRUE ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-04 06:25:07 +00:00
if ( m_Opcode . fd ! = m_Opcode . fs | | ! RegInStack ( m_Opcode . fd , CRegInfo : : FPU_Double ) ) {
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fs , CRegInfo : : FPU_Double ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-04 06:25:07 +00:00
ChangeFPURegFormat ( m_Opcode . fd , CRegInfo : : FPU_Double , CRegInfo : : FPU_Dword , CRegInfo : : RoundNearest ) ;
2010-05-30 01:54:42 +00:00
}
void CRecompilerOps : : COP1_D_TRUNC_W ( void ) {
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
m_Section - > CompileCop1Test ( ) ;
2010-06-07 02:23:58 +00:00
if ( RegInStack ( m_Opcode . fd , CRegInfo : : FPU_Double ) | | RegInStack ( m_Opcode . fd , CRegInfo : : FPU_Qword ) ) {
UnMap_FPR ( m_Opcode . fd , TRUE ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-04 06:25:07 +00:00
if ( m_Opcode . fd ! = m_Opcode . fs | | ! RegInStack ( m_Opcode . fd , CRegInfo : : FPU_Double ) ) {
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fs , CRegInfo : : FPU_Double ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-04 06:25:07 +00:00
ChangeFPURegFormat ( m_Opcode . fd , CRegInfo : : FPU_Double , CRegInfo : : FPU_Dword , CRegInfo : : RoundTruncate ) ;
2010-05-30 01:54:42 +00:00
}
void CRecompilerOps : : COP1_D_CEIL_W ( void ) { // added by Witten
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
m_Section - > CompileCop1Test ( ) ;
if ( RegInStack ( m_Opcode . fs , CRegInfo : : FPU_Double ) | | RegInStack ( m_Opcode . fs , CRegInfo : : FPU_Qword ) ) {
UnMap_FPR ( m_Opcode . fs , TRUE ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-04 06:25:07 +00:00
if ( m_Opcode . fd ! = m_Opcode . fs | | ! RegInStack ( m_Opcode . fd , CRegInfo : : FPU_Double ) ) {
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fs , CRegInfo : : FPU_Double ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-04 06:25:07 +00:00
ChangeFPURegFormat ( m_Opcode . fd , CRegInfo : : FPU_Double , CRegInfo : : FPU_Dword , CRegInfo : : RoundUp ) ;
2010-05-30 01:54:42 +00:00
}
void CRecompilerOps : : COP1_D_FLOOR_W ( void ) { //added by Witten
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
m_Section - > CompileCop1Test ( ) ;
if ( RegInStack ( m_Opcode . fs , CRegInfo : : FPU_Double ) | | RegInStack ( m_Opcode . fs , CRegInfo : : FPU_Qword ) ) {
UnMap_FPR ( m_Opcode . fs , TRUE ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-04 06:25:07 +00:00
if ( m_Opcode . fd ! = m_Opcode . fs | | ! RegInStack ( m_Opcode . fd , CRegInfo : : FPU_Double ) ) {
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fs , CRegInfo : : FPU_Double ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-04 06:25:07 +00:00
ChangeFPURegFormat ( m_Opcode . fd , CRegInfo : : FPU_Double , CRegInfo : : FPU_Dword , CRegInfo : : RoundDown ) ;
2010-05-30 01:54:42 +00:00
}
void CRecompilerOps : : COP1_D_CVT_S ( void ) {
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
m_Section - > CompileCop1Test ( ) ;
2010-06-07 02:23:58 +00:00
if ( RegInStack ( m_Opcode . fd , CRegInfo : : FPU_Double ) | | RegInStack ( m_Opcode . fd , CRegInfo : : FPU_Qword ) ) {
UnMap_FPR ( m_Opcode . fd , TRUE ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-04 06:25:07 +00:00
if ( m_Opcode . fd ! = m_Opcode . fs | | ! RegInStack ( m_Opcode . fd , CRegInfo : : FPU_Double ) ) {
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fs , CRegInfo : : FPU_Double ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-04 06:25:07 +00:00
ChangeFPURegFormat ( m_Opcode . fd , CRegInfo : : FPU_Double , CRegInfo : : FPU_Float , CRegInfo : : RoundDefault ) ;
2010-05-30 01:54:42 +00:00
}
void CRecompilerOps : : COP1_D_CVT_W ( void ) {
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
m_Section - > CompileCop1Test ( ) ;
if ( RegInStack ( m_Opcode . fs , CRegInfo : : FPU_Double ) | | RegInStack ( m_Opcode . fs , CRegInfo : : FPU_Qword ) ) {
UnMap_FPR ( m_Opcode . fs , TRUE ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-04 06:25:07 +00:00
if ( m_Opcode . fd ! = m_Opcode . fs | | ! RegInStack ( m_Opcode . fd , CRegInfo : : FPU_Double ) ) {
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fs , CRegInfo : : FPU_Double ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-04 06:25:07 +00:00
ChangeFPURegFormat ( m_Opcode . fd , CRegInfo : : FPU_Double , CRegInfo : : FPU_Dword , CRegInfo : : RoundDefault ) ;
2010-05-30 01:54:42 +00:00
}
void CRecompilerOps : : COP1_D_CVT_L ( void ) {
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
m_Section - > CompileCop1Test ( ) ;
if ( RegInStack ( m_Opcode . fs , CRegInfo : : FPU_Double ) | | RegInStack ( m_Opcode . fs , CRegInfo : : FPU_Qword ) ) {
UnMap_FPR ( m_Opcode . fs , TRUE ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-04 06:25:07 +00:00
if ( m_Opcode . fd ! = m_Opcode . fs | | ! RegInStack ( m_Opcode . fd , CRegInfo : : FPU_Double ) ) {
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fs , CRegInfo : : FPU_Double ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-04 06:25:07 +00:00
ChangeFPURegFormat ( m_Opcode . fd , CRegInfo : : FPU_Double , CRegInfo : : FPU_Qword , CRegInfo : : RoundDefault ) ;
2010-05-30 01:54:42 +00:00
}
void CRecompilerOps : : COP1_D_CMP ( void ) {
2010-06-07 02:23:58 +00:00
DWORD Reg1 = m_Opcode . fs ;
DWORD Reg2 = m_Opcode . ft ;
DWORD cmp = 0 ;
2010-05-30 01:54:42 +00:00
2010-06-07 02:23:58 +00:00
if ( ( m_Opcode . funct & 4 ) = = 0 )
{
Reg1 = RegInStack ( m_Opcode . ft , CRegInfo : : FPU_Double ) ? m_Opcode . ft : m_Opcode . fs ;
Reg2 = RegInStack ( m_Opcode . ft , CRegInfo : : FPU_Double ) ? m_Opcode . fs : m_Opcode . ft ;
}
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
m_Section - > CompileCop1Test ( ) ;
2010-06-07 02:23:58 +00:00
if ( ( m_Opcode . funct & 1 ) ! = 0 ) { CRecompilerOps : : UnknownOpcode ( ) ; }
2010-06-04 06:25:07 +00:00
if ( ( m_Opcode . funct & 2 ) ! = 0 ) { cmp | = 0x4000 ; }
if ( ( m_Opcode . funct & 4 ) ! = 0 ) { cmp | = 0x0100 ; }
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
Load_FPR_ToTop ( Reg1 , Reg1 , CRegInfo : : FPU_Double ) ;
Map_TempReg ( x86_EAX , 0 , FALSE ) ;
if ( RegInStack ( Reg2 , CRegInfo : : FPU_Double ) ) {
fpuComReg ( StackPosition ( Reg2 ) , FALSE ) ;
2010-05-30 01:54:42 +00:00
} else {
2010-06-07 02:23:58 +00:00
char Name [ 50 ] ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
UnMap_FPR ( Reg2 , TRUE ) ;
2010-06-07 02:23:58 +00:00
x86Reg TempReg = Map_TempReg ( x86_Any , - 1 , FALSE ) ;
sprintf ( Name , " _FPR_D[%d] " , Reg2 ) ;
MoveVariableToX86reg ( ( BYTE * ) & _FPR_D [ Reg2 ] , Name , TempReg ) ;
2010-06-04 06:25:07 +00:00
Load_FPR_ToTop ( Reg1 , Reg1 , CRegInfo : : FPU_Double ) ;
2010-05-30 01:54:42 +00:00
fpuComQwordRegPointer ( TempReg , FALSE ) ;
}
2010-06-07 02:23:58 +00:00
AndConstToVariable ( ~ FPCSR_C , & _FPCR [ 31 ] , " _FPCR[31] " ) ;
2010-05-30 01:54:42 +00:00
fpuStoreStatus ( ) ;
2010-06-07 02:23:58 +00:00
x86Reg Reg = Map_TempReg ( x86_Any8Bit , 0 , FALSE ) ;
2010-05-30 01:54:42 +00:00
TestConstToX86Reg ( cmp , x86_EAX ) ;
2010-06-07 02:23:58 +00:00
Setnz ( Reg ) ;
2010-05-30 01:54:42 +00:00
if ( cmp ! = 0 ) {
TestConstToX86Reg ( cmp , x86_EAX ) ;
2010-06-07 02:23:58 +00:00
Setnz ( Reg ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
if ( ( m_Opcode . funct & 1 ) ! = 0 ) {
x86Reg Reg2 = Map_TempReg ( x86_Any8Bit , 0 , FALSE ) ;
2010-05-30 01:54:42 +00:00
AndConstToX86Reg ( x86_EAX , 0x4300 ) ;
CompConstToX86reg ( x86_EAX , 0x4300 ) ;
2010-06-07 02:23:58 +00:00
Setz ( Reg2 ) ;
2010-05-30 01:54:42 +00:00
2010-06-07 02:23:58 +00:00
OrX86RegToX86Reg ( Reg , Reg2 ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-04 06:25:07 +00:00
} else if ( ( m_Opcode . funct & 1 ) ! = 0 ) {
2010-05-30 01:54:42 +00:00
AndConstToX86Reg ( x86_EAX , 0x4300 ) ;
CompConstToX86reg ( x86_EAX , 0x4300 ) ;
2010-06-07 02:23:58 +00:00
Setz ( Reg ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-07 02:23:58 +00:00
ShiftLeftSignImmed ( Reg , 23 ) ;
OrX86RegToVariable ( & _FPCR [ 31 ] , " _FPCR[31] " , Reg ) ;
2010-05-30 01:54:42 +00:00
}
/************************** COP1: W functions ************************/
void CRecompilerOps : : COP1_W_CVT_S ( void ) {
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
m_Section - > CompileCop1Test ( ) ;
if ( m_Opcode . fd ! = m_Opcode . fs | | ! RegInStack ( m_Opcode . fd , CRegInfo : : FPU_Dword ) ) {
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fs , CRegInfo : : FPU_Dword ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-04 06:25:07 +00:00
ChangeFPURegFormat ( m_Opcode . fd , CRegInfo : : FPU_Dword , CRegInfo : : FPU_Float , CRegInfo : : RoundDefault ) ;
2010-05-30 01:54:42 +00:00
}
void CRecompilerOps : : COP1_W_CVT_D ( void ) {
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
m_Section - > CompileCop1Test ( ) ;
if ( m_Opcode . fd ! = m_Opcode . fs | | ! RegInStack ( m_Opcode . fd , CRegInfo : : FPU_Dword ) ) {
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fs , CRegInfo : : FPU_Dword ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-04 06:25:07 +00:00
ChangeFPURegFormat ( m_Opcode . fd , CRegInfo : : FPU_Dword , CRegInfo : : FPU_Double , CRegInfo : : RoundDefault ) ;
2010-05-30 01:54:42 +00:00
}
/************************** COP1: L functions ************************/
void CRecompilerOps : : COP1_L_CVT_S ( void ) {
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
m_Section - > CompileCop1Test ( ) ;
if ( m_Opcode . fd ! = m_Opcode . fs | | ! RegInStack ( m_Opcode . fd , CRegInfo : : FPU_Qword ) ) {
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fs , CRegInfo : : FPU_Qword ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-04 06:25:07 +00:00
ChangeFPURegFormat ( m_Opcode . fd , CRegInfo : : FPU_Qword , CRegInfo : : FPU_Float , CRegInfo : : RoundDefault ) ;
2010-05-30 01:54:42 +00:00
}
void CRecompilerOps : : COP1_L_CVT_D ( void ) {
2010-06-04 06:25:07 +00:00
CPU_Message ( " %X %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
m_Section - > CompileCop1Test ( ) ;
if ( m_Opcode . fd ! = m_Opcode . fs | | ! RegInStack ( m_Opcode . fd , CRegInfo : : FPU_Qword ) ) {
Load_FPR_ToTop ( m_Opcode . fd , m_Opcode . fs , CRegInfo : : FPU_Qword ) ;
2010-05-30 01:54:42 +00:00
}
2010-06-04 06:25:07 +00:00
ChangeFPURegFormat ( m_Opcode . fd , CRegInfo : : FPU_Qword , CRegInfo : : FPU_Double , CRegInfo : : RoundDefault ) ;
2010-05-30 01:54:42 +00:00
}
/************************** Other functions **************************/
void CRecompilerOps : : UnknownOpcode ( void ) {
2010-06-22 20:36:28 +00:00
CPU_Message ( " %X Unhandled Opcode: %s " , m_CompilePC , R4300iOpcodeName ( m_Opcode . Hex , m_CompilePC ) ) ;
2010-05-30 01:54:42 +00:00
2010-06-04 06:25:07 +00:00
m_RegWorkingSet . WriteBackRegisters ( ) ;
2010-06-22 20:36:28 +00:00
UpdateCounters ( m_RegWorkingSet , false , true ) ;
MoveConstToVariable ( m_CompilePC , & _Reg - > m_PROGRAM_COUNTER , " PROGRAM_COUNTER " ) ;
if ( _SyncSystem ) { Call_Direct ( SyncSystem , " SyncSystem " ) ; }
2012-09-28 20:07:45 +00:00
m_RegWorkingSet . SetBlockCycleCount ( m_RegWorkingSet . GetBlockCycleCount ( ) - CountPerOp ( ) ) ;
2010-06-22 20:36:28 +00:00
MoveConstToVariable ( m_Opcode . Hex , & R4300iOp : : m_Opcode . Hex , " R4300iOp::m_Opcode.Hex " ) ;
2010-05-30 01:54:42 +00:00
Call_Direct ( R4300iOp : : UnknownOpcode , " R4300iOp::UnknownOpcode " ) ;
Ret ( ) ;
if ( m_NextInstruction = = NORMAL ) { m_NextInstruction = END_BLOCK ; }
}
2010-06-14 21:14:58 +00:00
void CRecompilerOps : : BeforeCallDirect ( CRegInfo & RegSet )
2010-06-07 02:23:58 +00:00
{
2010-06-14 21:14:58 +00:00
RegSet . UnMap_AllFPRs ( ) ;
2010-06-07 02:23:58 +00:00
Pushad ( ) ;
}
2010-06-14 21:14:58 +00:00
void CRecompilerOps : : AfterCallDirect ( CRegInfo & RegSet )
2010-06-07 02:23:58 +00:00
{
Popad ( ) ;
2010-07-23 10:45:35 +00:00
RegSet . SetRoundingModel ( CRegInfo : : RoundUnknown ) ;
2010-06-07 02:23:58 +00:00
}
2010-05-31 00:21:08 +00:00
void CRecompilerOps : : EnterCodeBlock ( void )
{
# ifdef _DEBUG
Push ( x86_ESI ) ;
2010-06-22 20:36:28 +00:00
# else
2012-09-25 22:45:39 +00:00
Push ( x86_EDI ) ;
2010-06-22 20:36:28 +00:00
Push ( x86_ESI ) ;
Push ( x86_EBX ) ;
2010-05-31 00:21:08 +00:00
# endif
}
void CRecompilerOps : : ExitCodeBlock ( void )
{
# ifdef _DEBUG
Pop ( x86_ESI ) ;
2010-06-22 20:36:28 +00:00
# else
Pop ( x86_EBX ) ;
Pop ( x86_ESI ) ;
2012-09-25 22:45:39 +00:00
Pop ( x86_EDI ) ;
2010-05-31 00:21:08 +00:00
# endif
Ret ( ) ;
}
2012-09-25 05:58:06 +00:00
void CRecompilerOps : : UpdateSyncCPU ( CRegInfo & RegSet , DWORD Cycles )
{
if ( ! _SyncSystem )
{
return ;
}
WriteX86Comment ( " Updating Sync CPU " ) ;
BeforeCallDirect ( RegSet ) ;
PushImm32 ( stdstr_f ( " %d " , Cycles ) . c_str ( ) , Cycles ) ;
PushImm32 ( " _SyncSystem " , ( DWORD ) _SyncSystem ) ;
MoveConstToX86reg ( ( DWORD ) _System , x86_ECX ) ;
Call_Direct ( AddressOf ( & CN64System : : UpdateSyncCPU ) , " CN64System::UpdateSyncCPU " ) ;
AfterCallDirect ( RegSet ) ;
}
2010-05-30 01:54:42 +00:00
void CRecompilerOps : : UpdateCounters ( CRegInfo & RegSet , bool CheckTimer , bool ClearValues )
{
if ( RegSet . GetBlockCycleCount ( ) ! = 0 )
{
2012-09-25 05:58:06 +00:00
UpdateSyncCPU ( RegSet , RegSet . GetBlockCycleCount ( ) ) ;
2010-05-30 01:54:42 +00:00
WriteX86Comment ( " Update Counter " ) ;
SubConstFromVariable ( RegSet . GetBlockCycleCount ( ) , _NextTimer , " _NextTimer " ) ; // updates compare flag
if ( ClearValues )
{
RegSet . SetBlockCycleCount ( 0 ) ;
}
} else if ( CheckTimer ) {
CompConstToVariable ( 0 , _NextTimer , " _NextTimer " ) ;
}
if ( CheckTimer )
{
JnsLabel8 ( " Continue_From_Timer_Test " , 0 ) ;
BYTE * Jump = m_RecompPos - 1 ;
Pushad ( ) ;
MoveConstToX86reg ( ( DWORD ) _SystemTimer , x86_ECX ) ;
2010-09-22 21:43:42 +00:00
Call_Direct ( AddressOf ( & CSystemTimer : : TimerDone ) , " CSystemTimer::TimerDone " ) ;
2010-05-30 01:54:42 +00:00
Popad ( ) ;
CPU_Message ( " " ) ;
CPU_Message ( " $Continue_From_Timer_Test: " ) ;
2010-10-23 18:53:01 +00:00
SetJump8 ( Jump , m_RecompPos ) ;
2010-05-30 01:54:42 +00:00
}
}
2010-05-25 09:15:19 +00:00
2010-10-23 18:53:01 +00:00
void CRecompilerOps : : CompileSystemCheck ( DWORD TargetPC , CRegInfo RegSet )
{
CompConstToVariable ( 0 , ( void * ) & _SystemEvents - > DoSomething ( ) , " _SystemEvents->DoSomething() " ) ;
JeLabel32 ( " Continue_From_Interrupt_Test " , 0 ) ;
DWORD * Jump = ( DWORD * ) ( m_RecompPos - 4 ) ;
if ( TargetPC ! = ( DWORD ) - 1 )
{
MoveConstToVariable ( TargetPC , & _Reg - > m_PROGRAM_COUNTER , " PROGRAM_COUNTER " ) ;
}
RegSet . WriteBackRegisters ( ) ;
MoveConstToX86reg ( ( DWORD ) _SystemEvents , x86_ECX ) ;
Call_Direct ( AddressOf ( & CSystemEvents : : ExecuteEvents ) , " CSystemEvents::ExecuteEvents " ) ;
if ( _SyncSystem ) { Call_Direct ( SyncSystem , " SyncSystem " ) ; }
ExitCodeBlock ( ) ;
CPU_Message ( " " ) ;
CPU_Message ( " $Continue_From_Interrupt_Test: " ) ;
SetJump32 ( Jump , ( DWORD * ) m_RecompPos ) ;
}
2012-09-26 00:38:29 +00:00
void CRecompilerOps : : OverflowDelaySlot ( BOOL TestTimer )
2012-09-25 05:58:06 +00:00
{
m_RegWorkingSet . WriteBackRegisters ( ) ;
UpdateCounters ( m_RegWorkingSet , false , true ) ;
MoveConstToVariable ( CompilePC ( ) + 4 , _PROGRAM_COUNTER , " PROGRAM_COUNTER " ) ;
if ( _SyncSystem ) { Call_Direct ( SyncSystem , " SyncSystem " ) ; }
MoveConstToVariable ( JUMP , & R4300iOp : : m_NextInstruction , " R4300iOp::m_NextInstruction " ) ;
2012-09-26 00:38:29 +00:00
if ( TestTimer )
{
MoveConstToVariable ( TestTimer , & R4300iOp : : m_TestTimer , " R4300iOp::m_TestTimer " ) ;
}
2012-09-25 05:58:06 +00:00
PushImm32 ( " CountPerOp() " , CountPerOp ( ) ) ;
Call_Direct ( CInterpreterCPU : : ExecuteOps , " CInterpreterCPU::ExecuteOps " ) ;
AddConstToX86Reg ( x86_ESP , 4 ) ;
2012-09-25 22:07:49 +00:00
if ( bFastSP ( ) & & _Recompiler )
{
MoveConstToX86reg ( ( DWORD ) _Recompiler , x86_ECX ) ;
Call_Direct ( AddressOf ( & CRecompiler : : ResetMemoryStackPos ) , " CRecompiler::ResetMemoryStackPos " ) ;
}
2012-09-25 05:58:06 +00:00
if ( _SyncSystem )
{
2012-09-28 20:07:45 +00:00
UpdateSyncCPU ( m_RegWorkingSet , CountPerOp ( ) ) ;
2012-09-25 05:58:06 +00:00
Call_Direct ( SyncSystem , " SyncSystem " ) ;
}
ExitCodeBlock ( ) ;
m_NextInstruction = END_BLOCK ;
}