DSRL32 should not sign extend
This commit is contained in:
parent
c3a9ec1e5b
commit
bbd45d45ba
|
@ -687,7 +687,7 @@ void CCodeSection::SyncRegState ( const CRegInfo & SyncTo )
|
||||||
g_Notify->BreakPoint(__FILE__,__LINE__);
|
g_Notify->BreakPoint(__FILE__,__LINE__);
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
case CRegInfo::STATE_CONST_32:
|
case CRegInfo::STATE_CONST_32_SIGN:
|
||||||
if (GetMipsRegLo(i) != SyncTo.GetMipsRegLo(i))
|
if (GetMipsRegLo(i) != SyncTo.GetMipsRegLo(i))
|
||||||
{
|
{
|
||||||
CPU_Message("Value of const is different Reg %d (%s) Value: 0x%08X to 0x%08X",i,CRegName::GPR[i],GetMipsRegLo(i),SyncTo.GetMipsRegLo(i));
|
CPU_Message("Value of const is different Reg %d (%s) Value: 0x%08X to 0x%08X",i,CRegName::GPR[i],GetMipsRegLo(i),SyncTo.GetMipsRegLo(i));
|
||||||
|
@ -735,7 +735,7 @@ void CCodeSection::SyncRegState ( const CRegInfo & SyncTo )
|
||||||
MoveConstToX86reg(GetMipsRegHi(i),x86RegHi);
|
MoveConstToX86reg(GetMipsRegHi(i),x86RegHi);
|
||||||
MoveConstToX86reg(GetMipsRegLo(i),Reg);
|
MoveConstToX86reg(GetMipsRegLo(i),Reg);
|
||||||
break;
|
break;
|
||||||
case CRegInfo::STATE_CONST_32:
|
case CRegInfo::STATE_CONST_32_SIGN:
|
||||||
MoveConstToX86reg(GetMipsRegLo_S(i) >> 31,x86RegHi);
|
MoveConstToX86reg(GetMipsRegLo_S(i) >> 31,x86RegHi);
|
||||||
MoveConstToX86reg(GetMipsRegLo(i),Reg);
|
MoveConstToX86reg(GetMipsRegLo(i),Reg);
|
||||||
break;
|
break;
|
||||||
|
@ -759,7 +759,7 @@ void CCodeSection::SyncRegState ( const CRegInfo & SyncTo )
|
||||||
UnMap_X86reg(Reg);
|
UnMap_X86reg(Reg);
|
||||||
switch (GetMipsRegState(i)) {
|
switch (GetMipsRegState(i)) {
|
||||||
case CRegInfo::STATE_UNKNOWN: MoveVariableToX86reg(&_GPR[i].UW[0],CRegName::GPR_Lo[i],Reg); break;
|
case CRegInfo::STATE_UNKNOWN: MoveVariableToX86reg(&_GPR[i].UW[0],CRegName::GPR_Lo[i],Reg); break;
|
||||||
case CRegInfo::STATE_CONST_32: MoveConstToX86reg(GetMipsRegLo(i),Reg); break;
|
case CRegInfo::STATE_CONST_32_SIGN: MoveConstToX86reg(GetMipsRegLo(i),Reg); break;
|
||||||
case CRegInfo::STATE_MAPPED_32_SIGN:
|
case CRegInfo::STATE_MAPPED_32_SIGN:
|
||||||
MoveX86RegToX86Reg(GetMipsRegMapLo(i),Reg);
|
MoveX86RegToX86Reg(GetMipsRegMapLo(i),Reg);
|
||||||
m_RegWorkingSet.SetX86Mapped(GetMipsRegMapLo(i),CRegInfo::NotMapped);
|
m_RegWorkingSet.SetX86Mapped(GetMipsRegMapLo(i),CRegInfo::NotMapped);
|
||||||
|
@ -810,7 +810,7 @@ void CCodeSection::SyncRegState ( const CRegInfo & SyncTo )
|
||||||
g_Notify->BreakPoint(__FILE__,__LINE__);
|
g_Notify->BreakPoint(__FILE__,__LINE__);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CRegInfo::STATE_CONST_32:
|
case CRegInfo::STATE_CONST_32_SIGN:
|
||||||
if (!g_System->b32BitCore() && GetMipsRegLo_S(i) < 0)
|
if (!g_System->b32BitCore() && GetMipsRegLo_S(i) < 0)
|
||||||
{
|
{
|
||||||
CPU_Message("Sign Problems in SyncRegState\nSTATE_MAPPED_32_ZERO");
|
CPU_Message("Sign Problems in SyncRegState\nSTATE_MAPPED_32_ZERO");
|
||||||
|
@ -1827,7 +1827,7 @@ bool CCodeSection::InheritParentInfo ( void )
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CRegInfo::STATE_CONST_64: Map_GPR_64bit(i2,i2); break;
|
case CRegInfo::STATE_CONST_64: Map_GPR_64bit(i2,i2); break;
|
||||||
case CRegInfo::STATE_CONST_32:
|
case CRegInfo::STATE_CONST_32_SIGN:
|
||||||
if ((RegSet->GetMipsRegLo_S(i2) < 0) && IsUnsigned(i2)) {
|
if ((RegSet->GetMipsRegLo_S(i2) < 0) && IsUnsigned(i2)) {
|
||||||
m_RegWorkingSet.SetMipsRegState(i2,CRegInfo::STATE_MAPPED_32_SIGN);
|
m_RegWorkingSet.SetMipsRegState(i2,CRegInfo::STATE_MAPPED_32_SIGN);
|
||||||
}
|
}
|
||||||
|
@ -1952,7 +1952,7 @@ bool CCodeSection::InheritParentInfo ( void )
|
||||||
NeedSync = true;
|
NeedSync = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CRegInfo::STATE_CONST_32:
|
case CRegInfo::STATE_CONST_32_SIGN:
|
||||||
if (GetMipsRegLo(i2) != RegSet->GetMipsRegLo(i2))
|
if (GetMipsRegLo(i2) != RegSet->GetMipsRegLo(i2))
|
||||||
{
|
{
|
||||||
g_Notify->BreakPoint(__FILE__,__LINE__);
|
g_Notify->BreakPoint(__FILE__,__LINE__);
|
||||||
|
|
|
@ -294,7 +294,7 @@ bool LoopAnalysis::CheckLoopRegisterUsage( CCodeSection * Section)
|
||||||
g_Notify->BreakPoint(__FILE__,__LINE__);
|
g_Notify->BreakPoint(__FILE__,__LINE__);
|
||||||
#ifdef tofix
|
#ifdef tofix
|
||||||
m_Reg.GetMipsRegLo(31) = m_PC + 8;
|
m_Reg.GetMipsRegLo(31) = m_PC + 8;
|
||||||
m_Reg.SetMipsRegState(31,CRegInfo::STATE_CONST_32);
|
m_Reg.SetMipsRegState(31,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
Section->m_Cont.TargetPC = m_PC + 8;
|
Section->m_Cont.TargetPC = m_PC + 8;
|
||||||
Section->m_Jump.TargetPC = m_PC + ((short)m_Command.offset << 2) + 4;
|
Section->m_Jump.TargetPC = m_PC + ((short)m_Command.offset << 2) + 4;
|
||||||
if (m_PC == Section->m_Jump.TargetPC) {
|
if (m_PC == Section->m_Jump.TargetPC) {
|
||||||
|
@ -319,7 +319,7 @@ bool LoopAnalysis::CheckLoopRegisterUsage( CCodeSection * Section)
|
||||||
}
|
}
|
||||||
if (Value >= 0) {
|
if (Value >= 0) {
|
||||||
m_Reg.GetMipsRegLo(31) = m_PC + 8;
|
m_Reg.GetMipsRegLo(31) = m_PC + 8;
|
||||||
m_Reg.SetMipsRegState(31,CRegInfo::STATE_CONST_32);
|
m_Reg.SetMipsRegState(31,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
Section->m_Jump.TargetPC = m_PC + ((short)m_Command.offset << 2) + 4;
|
Section->m_Jump.TargetPC = m_PC + ((short)m_Command.offset << 2) + 4;
|
||||||
if (m_PC == Section->m_Jump.TargetPC) {
|
if (m_PC == Section->m_Jump.TargetPC) {
|
||||||
if (!DelaySlotEffectsCompare(m_PC,31,0)) {
|
if (!DelaySlotEffectsCompare(m_PC,31,0)) {
|
||||||
|
@ -332,7 +332,7 @@ bool LoopAnalysis::CheckLoopRegisterUsage( CCodeSection * Section)
|
||||||
|
|
||||||
|
|
||||||
m_Reg.GetMipsRegLo(31) = m_PC + 8;
|
m_Reg.GetMipsRegLo(31) = m_PC + 8;
|
||||||
m_Reg.SetMipsRegState(31,CRegInfo::STATE_CONST_32);
|
m_Reg.SetMipsRegState(31,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
Section->m_Cont.TargetPC = m_PC + 8;
|
Section->m_Cont.TargetPC = m_PC + 8;
|
||||||
Section->m_Jump.TargetPC = m_PC + ((short)m_Command.offset << 2) + 4;
|
Section->m_Jump.TargetPC = m_PC + ((short)m_Command.offset << 2) + 4;
|
||||||
if (m_PC == Section->m_Jump.TargetPC) {
|
if (m_PC == Section->m_Jump.TargetPC) {
|
||||||
|
@ -358,7 +358,7 @@ bool LoopAnalysis::CheckLoopRegisterUsage( CCodeSection * Section)
|
||||||
#ifdef tofix
|
#ifdef tofix
|
||||||
m_NextInstruction = DELAY_SLOT;
|
m_NextInstruction = DELAY_SLOT;
|
||||||
m_Reg.GetMipsRegLo(31) = m_PC + 8;
|
m_Reg.GetMipsRegLo(31) = m_PC + 8;
|
||||||
m_Reg.SetMipsRegState(31,CRegInfo::STATE_CONST_32);
|
m_Reg.SetMipsRegState(31,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
Section->m_Jump.TargetPC = (m_PC & 0xF0000000) + (m_Command.target << 2);
|
Section->m_Jump.TargetPC = (m_PC & 0xF0000000) + (m_Command.target << 2);
|
||||||
if (m_PC == Section->m_Jump.TargetPC) {
|
if (m_PC == Section->m_Jump.TargetPC) {
|
||||||
if (!DelaySlotEffectsCompare(m_PC,31,0)) {
|
if (!DelaySlotEffectsCompare(m_PC,31,0)) {
|
||||||
|
@ -447,7 +447,7 @@ bool LoopAnalysis::CheckLoopRegisterUsage( CCodeSection * Section)
|
||||||
if (m_Command.rt == 0) { break; }
|
if (m_Command.rt == 0) { break; }
|
||||||
/*if (m_Command.rs == 0) {
|
/*if (m_Command.rs == 0) {
|
||||||
m_Reg.GetMipsRegLo(m_Command.rt) = (short)m_Command.immediate;
|
m_Reg.GetMipsRegLo(m_Command.rt) = (short)m_Command.immediate;
|
||||||
m_Reg.SetMipsRegState(m_Command.rt,CRegInfo::STATE_CONST_32);
|
m_Reg.SetMipsRegState(m_Command.rt,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
} else {*/
|
} else {*/
|
||||||
m_Reg.SetMipsRegState(m_Command.rt,CRegInfo::STATE_MODIFIED);
|
m_Reg.SetMipsRegState(m_Command.rt,CRegInfo::STATE_MODIFIED);
|
||||||
//}
|
//}
|
||||||
|
@ -462,7 +462,7 @@ bool LoopAnalysis::CheckLoopRegisterUsage( CCodeSection * Section)
|
||||||
if (!m_Reg.IsModified(m_Command.rt))
|
if (!m_Reg.IsModified(m_Command.rt))
|
||||||
{
|
{
|
||||||
m_Reg.SetMipsRegLo(m_Command.rt,((short)m_Command.offset << 16));
|
m_Reg.SetMipsRegLo(m_Command.rt,((short)m_Command.offset << 16));
|
||||||
m_Reg.SetMipsRegState(m_Command.rt,CRegInfo::STATE_CONST_32);
|
m_Reg.SetMipsRegState(m_Command.rt,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case R4300i_ANDI:
|
case R4300i_ANDI:
|
||||||
|
@ -476,7 +476,7 @@ bool LoopAnalysis::CheckLoopRegisterUsage( CCodeSection * Section)
|
||||||
m_Reg.SetMipsRegState(m_Command.rt,CRegInfo::STATE_MODIFIED);
|
m_Reg.SetMipsRegState(m_Command.rt,CRegInfo::STATE_MODIFIED);
|
||||||
}
|
}
|
||||||
if (m_Reg.IsConst(m_Command.rs)) {
|
if (m_Reg.IsConst(m_Command.rs)) {
|
||||||
m_Reg.SetMipsRegState(m_Command.rt,CRegInfo::STATE_CONST_32);
|
m_Reg.SetMipsRegState(m_Command.rt,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
m_Reg.SetMipsRegLo(m_Command.rt,m_Reg.GetMipsRegLo(m_Command.rs) | m_Command.immediate);
|
m_Reg.SetMipsRegLo(m_Command.rt,m_Reg.GetMipsRegLo(m_Command.rs) | m_Command.immediate);
|
||||||
} else {
|
} else {
|
||||||
m_Reg.SetMipsRegState(m_Command.rt,CRegInfo::STATE_MODIFIED);
|
m_Reg.SetMipsRegState(m_Command.rt,CRegInfo::STATE_MODIFIED);
|
||||||
|
@ -489,7 +489,7 @@ bool LoopAnalysis::CheckLoopRegisterUsage( CCodeSection * Section)
|
||||||
m_Reg.SetMipsRegState(m_Command.rt,CRegInfo::STATE_MODIFIED);
|
m_Reg.SetMipsRegState(m_Command.rt,CRegInfo::STATE_MODIFIED);
|
||||||
}
|
}
|
||||||
if (m_Reg.IsConst(m_Command.rs)) {
|
if (m_Reg.IsConst(m_Command.rs)) {
|
||||||
m_Reg.SetMipsRegState(m_Command.rt,CRegInfo::STATE_CONST_32);
|
m_Reg.SetMipsRegState(m_Command.rt,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
m_Reg.SetMipsRegLo(m_Command.rt, m_Reg.GetMipsRegLo(m_Command.rs) ^ m_Command.immediate);
|
m_Reg.SetMipsRegLo(m_Command.rt, m_Reg.GetMipsRegLo(m_Command.rs) ^ m_Command.immediate);
|
||||||
} else {
|
} else {
|
||||||
m_Reg.SetMipsRegState(m_Command.rt,CRegInfo::STATE_MODIFIED);
|
m_Reg.SetMipsRegState(m_Command.rt,CRegInfo::STATE_MODIFIED);
|
||||||
|
@ -833,7 +833,7 @@ void LoopAnalysis::SPECIAL_SLLV ( void )
|
||||||
m_Reg.SetMipsRegState(m_Command.rd,CRegInfo::STATE_MODIFIED);
|
m_Reg.SetMipsRegState(m_Command.rd,CRegInfo::STATE_MODIFIED);
|
||||||
}
|
}
|
||||||
if (m_Reg.IsConst(m_Command.rt) && m_Reg.IsConst(m_Command.rs)) {
|
if (m_Reg.IsConst(m_Command.rt) && m_Reg.IsConst(m_Command.rs)) {
|
||||||
m_Reg.SetMipsRegState(m_Command.rd,CRegInfo::STATE_CONST_32);
|
m_Reg.SetMipsRegState(m_Command.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
m_Reg.SetMipsRegLo(m_Command.rd, m_Reg.GetMipsRegLo(m_Command.rt) << (m_Reg.GetMipsRegLo(m_Command.rs) & 0x1F));
|
m_Reg.SetMipsRegLo(m_Command.rd, m_Reg.GetMipsRegLo(m_Command.rt) << (m_Reg.GetMipsRegLo(m_Command.rs) & 0x1F));
|
||||||
} else {
|
} else {
|
||||||
m_Reg.SetMipsRegState(m_Command.rd,CRegInfo::STATE_MODIFIED);
|
m_Reg.SetMipsRegState(m_Command.rd,CRegInfo::STATE_MODIFIED);
|
||||||
|
@ -848,7 +848,7 @@ void LoopAnalysis::SPECIAL_SRLV ( void )
|
||||||
m_Reg.SetMipsRegState(m_Command.rd,CRegInfo::STATE_MODIFIED);
|
m_Reg.SetMipsRegState(m_Command.rd,CRegInfo::STATE_MODIFIED);
|
||||||
}
|
}
|
||||||
if (m_Reg.IsConst(m_Command.rt) && m_Reg.IsConst(m_Command.rs)) {
|
if (m_Reg.IsConst(m_Command.rt) && m_Reg.IsConst(m_Command.rs)) {
|
||||||
m_Reg.SetMipsRegState(m_Command.rd,CRegInfo::STATE_CONST_32);
|
m_Reg.SetMipsRegState(m_Command.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
m_Reg.SetMipsRegLo(m_Command.rd, m_Reg.GetMipsRegLo(m_Command.rt) >> (m_Reg.GetMipsRegLo(m_Command.rs) & 0x1F));
|
m_Reg.SetMipsRegLo(m_Command.rd, m_Reg.GetMipsRegLo(m_Command.rt) >> (m_Reg.GetMipsRegLo(m_Command.rs) & 0x1F));
|
||||||
} else {
|
} else {
|
||||||
m_Reg.SetMipsRegState(m_Command.rd,CRegInfo::STATE_MODIFIED);
|
m_Reg.SetMipsRegState(m_Command.rd,CRegInfo::STATE_MODIFIED);
|
||||||
|
@ -863,7 +863,7 @@ void LoopAnalysis::SPECIAL_SRAV ( void )
|
||||||
m_Reg.SetMipsRegState(m_Command.rd,CRegInfo::STATE_MODIFIED);
|
m_Reg.SetMipsRegState(m_Command.rd,CRegInfo::STATE_MODIFIED);
|
||||||
}
|
}
|
||||||
if (m_Reg.IsConst(m_Command.rt) && m_Reg.IsConst(m_Command.rs)) {
|
if (m_Reg.IsConst(m_Command.rt) && m_Reg.IsConst(m_Command.rs)) {
|
||||||
m_Reg.SetMipsRegState(m_Command.rd,CRegInfo::STATE_CONST_32);
|
m_Reg.SetMipsRegState(m_Command.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
m_Reg.SetMipsRegLo(m_Command.rd, m_Reg.GetMipsRegLo_S(m_Command.rt) >> (m_Reg.GetMipsRegLo(m_Command.rs) & 0x1F));
|
m_Reg.SetMipsRegLo(m_Command.rd, m_Reg.GetMipsRegLo_S(m_Command.rt) >> (m_Reg.GetMipsRegLo(m_Command.rs) & 0x1F));
|
||||||
} else {
|
} else {
|
||||||
m_Reg.SetMipsRegState(m_Command.rd,CRegInfo::STATE_MODIFIED);
|
m_Reg.SetMipsRegState(m_Command.rd,CRegInfo::STATE_MODIFIED);
|
||||||
|
@ -888,7 +888,7 @@ void LoopAnalysis::SPECIAL_JALR ( void )
|
||||||
g_Notify->BreakPoint(__FILE__,__LINE__);
|
g_Notify->BreakPoint(__FILE__,__LINE__);
|
||||||
#ifdef tofix
|
#ifdef tofix
|
||||||
m_Reg.GetMipsRegLo(m_Command.rd) = m_PC + 8;
|
m_Reg.GetMipsRegLo(m_Command.rd) = m_PC + 8;
|
||||||
m_Reg.SetMipsRegState(m_Command.rd,CRegInfo::STATE_CONST_32);
|
m_Reg.SetMipsRegState(m_Command.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
if (m_Reg.IsConst(m_Command.rs)) {
|
if (m_Reg.IsConst(m_Command.rs)) {
|
||||||
Section->m_Jump.TargetPC = m_Reg.GetMipsRegLo(m_Command.rs);
|
Section->m_Jump.TargetPC = m_Reg.GetMipsRegLo(m_Command.rs);
|
||||||
} else {
|
} else {
|
||||||
|
@ -1204,7 +1204,7 @@ void LoopAnalysis::SPECIAL_DSRL32 ( void )
|
||||||
m_Reg.SetMipsRegState(m_Command.rd,CRegInfo::STATE_MODIFIED);
|
m_Reg.SetMipsRegState(m_Command.rd,CRegInfo::STATE_MODIFIED);
|
||||||
}
|
}
|
||||||
if (m_Reg.IsConst(m_Command.rt)) {
|
if (m_Reg.IsConst(m_Command.rt)) {
|
||||||
m_Reg.SetMipsRegState(m_Command.rd,CRegInfo::STATE_CONST_32);
|
m_Reg.SetMipsRegState(m_Command.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
m_Reg.SetMipsRegLo(m_Command.rd,(DWORD)(m_Reg.GetMipsReg(m_Command.rt) >> (m_Command.sa + 32)));
|
m_Reg.SetMipsRegLo(m_Command.rd,(DWORD)(m_Reg.GetMipsReg(m_Command.rt) >> (m_Command.sa + 32)));
|
||||||
} else {
|
} else {
|
||||||
m_Reg.SetMipsRegState(m_Command.rd,CRegInfo::STATE_MODIFIED);
|
m_Reg.SetMipsRegState(m_Command.rd,CRegInfo::STATE_MODIFIED);
|
||||||
|
@ -1219,7 +1219,7 @@ void LoopAnalysis::SPECIAL_DSRA32 ( void )
|
||||||
m_Reg.SetMipsRegState(m_Command.rd,CRegInfo::STATE_MODIFIED);
|
m_Reg.SetMipsRegState(m_Command.rd,CRegInfo::STATE_MODIFIED);
|
||||||
}
|
}
|
||||||
if (m_Reg.IsConst(m_Command.rt)) {
|
if (m_Reg.IsConst(m_Command.rt)) {
|
||||||
m_Reg.SetMipsRegState(m_Command.rd,CRegInfo::STATE_CONST_32);
|
m_Reg.SetMipsRegState(m_Command.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
m_Reg.SetMipsRegLo(m_Command.rd,(DWORD)(m_Reg.GetMipsReg_S(m_Command.rt) >> (m_Command.sa + 32)));
|
m_Reg.SetMipsRegLo(m_Command.rd,(DWORD)(m_Reg.GetMipsReg_S(m_Command.rt) >> (m_Command.sa + 32)));
|
||||||
} else {
|
} else {
|
||||||
m_Reg.SetMipsRegState(m_Command.rd,CRegInfo::STATE_MODIFIED);
|
m_Reg.SetMipsRegState(m_Command.rd,CRegInfo::STATE_MODIFIED);
|
||||||
|
|
|
@ -116,7 +116,7 @@ void CRecompilerOps::Compile_Branch (CRecompilerOps::BranchFunction CompareFunc,
|
||||||
if (Link) {
|
if (Link) {
|
||||||
UnMap_GPR( 31, FALSE);
|
UnMap_GPR( 31, FALSE);
|
||||||
m_RegWorkingSet.SetMipsRegLo(31,m_CompilePC + 8);
|
m_RegWorkingSet.SetMipsRegLo(31,m_CompilePC + 8);
|
||||||
m_RegWorkingSet.SetMipsRegState(31,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(31,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
}
|
}
|
||||||
if (EffectDelaySlot) {
|
if (EffectDelaySlot) {
|
||||||
if ((m_CompilePC & 0xFFC) != 0xFFC)
|
if ((m_CompilePC & 0xFFC) != 0xFFC)
|
||||||
|
@ -348,7 +348,7 @@ void CRecompilerOps::Compile_BranchLikely (BranchFunction CompareFunc, BOOL Link
|
||||||
{
|
{
|
||||||
UnMap_GPR( 31, FALSE);
|
UnMap_GPR( 31, FALSE);
|
||||||
m_RegWorkingSet.SetMipsRegLo(31, m_CompilePC + 8);
|
m_RegWorkingSet.SetMipsRegLo(31, m_CompilePC + 8);
|
||||||
m_RegWorkingSet.SetMipsRegState(31,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(31,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
}
|
}
|
||||||
CompareFunc();
|
CompareFunc();
|
||||||
ResetX86Protection();
|
ResetX86Protection();
|
||||||
|
@ -1410,7 +1410,7 @@ void CRecompilerOps::ADDI (void) {
|
||||||
if (IsConst(m_Opcode.rs)) {
|
if (IsConst(m_Opcode.rs)) {
|
||||||
if (IsMapped(m_Opcode.rt)) { UnMap_GPR(m_Opcode.rt, FALSE); }
|
if (IsMapped(m_Opcode.rt)) { UnMap_GPR(m_Opcode.rt, FALSE); }
|
||||||
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rt, GetMipsRegLo(m_Opcode.rs) + (short)m_Opcode.immediate);
|
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rt, GetMipsRegLo(m_Opcode.rs) + (short)m_Opcode.immediate);
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rt,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rt,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
} else {
|
} else {
|
||||||
Map_GPR_32bit(m_Opcode.rt,TRUE,m_Opcode.rs);
|
Map_GPR_32bit(m_Opcode.rt,TRUE,m_Opcode.rs);
|
||||||
AddConstToX86Reg(GetMipsRegMapLo(m_Opcode.rt),(short)m_Opcode.immediate);
|
AddConstToX86Reg(GetMipsRegMapLo(m_Opcode.rt),(short)m_Opcode.immediate);
|
||||||
|
@ -1437,7 +1437,7 @@ void CRecompilerOps::ADDIU (void) {
|
||||||
if (IsConst(m_Opcode.rs)) {
|
if (IsConst(m_Opcode.rs)) {
|
||||||
if (IsMapped(m_Opcode.rt)) { UnMap_GPR(m_Opcode.rt, FALSE); }
|
if (IsMapped(m_Opcode.rt)) { UnMap_GPR(m_Opcode.rt, FALSE); }
|
||||||
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rt, GetMipsRegLo(m_Opcode.rs) + (short)m_Opcode.immediate);
|
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rt, GetMipsRegLo(m_Opcode.rs) + (short)m_Opcode.immediate);
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rt,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rt,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
} else {
|
} else {
|
||||||
Map_GPR_32bit(m_Opcode.rt,TRUE,m_Opcode.rs);
|
Map_GPR_32bit(m_Opcode.rt,TRUE,m_Opcode.rs);
|
||||||
AddConstToX86Reg(GetMipsRegMapLo(m_Opcode.rt),(short)m_Opcode.immediate);
|
AddConstToX86Reg(GetMipsRegMapLo(m_Opcode.rt),(short)m_Opcode.immediate);
|
||||||
|
@ -1458,7 +1458,7 @@ void CRecompilerOps::SLTIU (void) {
|
||||||
DWORD Result = Is64Bit(m_Opcode.rs) ? GetMipsReg(m_Opcode.rs) < ((unsigned)((__int64)((short)m_Opcode.immediate)))?1:0 :
|
DWORD Result = Is64Bit(m_Opcode.rs) ? GetMipsReg(m_Opcode.rs) < ((unsigned)((__int64)((short)m_Opcode.immediate)))?1:0 :
|
||||||
GetMipsRegLo(m_Opcode.rs) < ((unsigned)((short)m_Opcode.immediate))?1:0;
|
GetMipsRegLo(m_Opcode.rs) < ((unsigned)((short)m_Opcode.immediate))?1:0;
|
||||||
UnMap_GPR(m_Opcode.rt, FALSE);
|
UnMap_GPR(m_Opcode.rt, FALSE);
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rt,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rt,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rt,Result);
|
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rt,Result);
|
||||||
} else if (IsMapped(m_Opcode.rs)) {
|
} else if (IsMapped(m_Opcode.rs)) {
|
||||||
if (Is64Bit(m_Opcode.rs)) {
|
if (Is64Bit(m_Opcode.rs)) {
|
||||||
|
@ -1518,7 +1518,7 @@ void CRecompilerOps::SLTI (void)
|
||||||
( GetMipsRegLo_S(m_Opcode.rs) < (short)m_Opcode.immediate?1:0);
|
( GetMipsRegLo_S(m_Opcode.rs) < (short)m_Opcode.immediate?1:0);
|
||||||
|
|
||||||
UnMap_GPR(m_Opcode.rt, FALSE);
|
UnMap_GPR(m_Opcode.rt, FALSE);
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rt,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rt,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rt,Result);
|
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rt,Result);
|
||||||
} else if (IsMapped(m_Opcode.rs)) {
|
} else if (IsMapped(m_Opcode.rs)) {
|
||||||
if (Is64Bit(m_Opcode.rs)) {
|
if (Is64Bit(m_Opcode.rs)) {
|
||||||
|
@ -1600,7 +1600,7 @@ void CRecompilerOps::ANDI (void) {
|
||||||
|
|
||||||
if (IsConst(m_Opcode.rs)) {
|
if (IsConst(m_Opcode.rs)) {
|
||||||
if (IsMapped(m_Opcode.rt)) { UnMap_GPR(m_Opcode.rt, FALSE); }
|
if (IsMapped(m_Opcode.rt)) { UnMap_GPR(m_Opcode.rt, FALSE); }
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rt,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rt,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rt, GetMipsRegLo(m_Opcode.rs) & m_Opcode.immediate);
|
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rt, GetMipsRegLo(m_Opcode.rs) & m_Opcode.immediate);
|
||||||
} else if (m_Opcode.immediate != 0) {
|
} else if (m_Opcode.immediate != 0) {
|
||||||
Map_GPR_32bit(m_Opcode.rt,FALSE,m_Opcode.rs);
|
Map_GPR_32bit(m_Opcode.rt,FALSE,m_Opcode.rs);
|
||||||
|
@ -1690,7 +1690,7 @@ void CRecompilerOps::LUI (void) {
|
||||||
|
|
||||||
UnMap_GPR(m_Opcode.rt, FALSE);
|
UnMap_GPR(m_Opcode.rt, FALSE);
|
||||||
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rt, ((short)m_Opcode.offset << 16));
|
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rt, ((short)m_Opcode.offset << 16));
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rt,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rt,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CRecompilerOps::DADDIU (void) {
|
void CRecompilerOps::DADDIU (void) {
|
||||||
|
@ -1760,7 +1760,7 @@ void CRecompilerOps::SPECIAL_SLL (void) {
|
||||||
if (IsConst(m_Opcode.rt)) {
|
if (IsConst(m_Opcode.rt)) {
|
||||||
if (IsMapped(m_Opcode.rd)) { UnMap_GPR(m_Opcode.rd, FALSE); }
|
if (IsMapped(m_Opcode.rd)) { UnMap_GPR(m_Opcode.rd, FALSE); }
|
||||||
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd, GetMipsRegLo(m_Opcode.rt) << m_Opcode.sa);
|
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd, GetMipsRegLo(m_Opcode.rt) << m_Opcode.sa);
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (m_Opcode.rd != m_Opcode.rt && IsMapped(m_Opcode.rt)) {
|
if (m_Opcode.rd != m_Opcode.rt && IsMapped(m_Opcode.rt)) {
|
||||||
|
@ -1800,7 +1800,7 @@ void CRecompilerOps::SPECIAL_SRL (void) {
|
||||||
if (IsConst(m_Opcode.rt)) {
|
if (IsConst(m_Opcode.rt)) {
|
||||||
if (IsMapped(m_Opcode.rd)) { UnMap_GPR(m_Opcode.rd, FALSE); }
|
if (IsMapped(m_Opcode.rd)) { UnMap_GPR(m_Opcode.rd, FALSE); }
|
||||||
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd, GetMipsRegLo(m_Opcode.rt) >> m_Opcode.sa);
|
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd, GetMipsRegLo(m_Opcode.rt) >> m_Opcode.sa);
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Map_GPR_32bit(m_Opcode.rd,TRUE,m_Opcode.rt);
|
Map_GPR_32bit(m_Opcode.rd,TRUE,m_Opcode.rt);
|
||||||
|
@ -1814,7 +1814,7 @@ void CRecompilerOps::SPECIAL_SRA (void) {
|
||||||
if (IsConst(m_Opcode.rt)) {
|
if (IsConst(m_Opcode.rt)) {
|
||||||
if (IsMapped(m_Opcode.rd)) { UnMap_GPR(m_Opcode.rd, FALSE); }
|
if (IsMapped(m_Opcode.rd)) { UnMap_GPR(m_Opcode.rd, FALSE); }
|
||||||
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd, GetMipsRegLo_S(m_Opcode.rt) >> m_Opcode.sa);
|
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd, GetMipsRegLo_S(m_Opcode.rt) >> m_Opcode.sa);
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Map_GPR_32bit(m_Opcode.rd,TRUE,m_Opcode.rt);
|
Map_GPR_32bit(m_Opcode.rd,TRUE,m_Opcode.rt);
|
||||||
|
@ -1830,7 +1830,7 @@ void CRecompilerOps::SPECIAL_SLLV (void) {
|
||||||
if (IsConst(m_Opcode.rt)) {
|
if (IsConst(m_Opcode.rt)) {
|
||||||
if (IsMapped(m_Opcode.rd)) { UnMap_GPR(m_Opcode.rd, FALSE); }
|
if (IsMapped(m_Opcode.rd)) { UnMap_GPR(m_Opcode.rd, FALSE); }
|
||||||
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd, GetMipsRegLo(m_Opcode.rt) << Shift);
|
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd, GetMipsRegLo(m_Opcode.rt) << Shift);
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
} else {
|
} else {
|
||||||
Map_GPR_32bit(m_Opcode.rd,TRUE,m_Opcode.rt);
|
Map_GPR_32bit(m_Opcode.rd,TRUE,m_Opcode.rt);
|
||||||
ShiftLeftSignImmed(GetMipsRegMapLo(m_Opcode.rd),(BYTE)Shift);
|
ShiftLeftSignImmed(GetMipsRegMapLo(m_Opcode.rd),(BYTE)Shift);
|
||||||
|
@ -1852,7 +1852,7 @@ void CRecompilerOps::SPECIAL_SRLV (void) {
|
||||||
if (IsConst(m_Opcode.rt)) {
|
if (IsConst(m_Opcode.rt)) {
|
||||||
if (IsMapped(m_Opcode.rd)) { UnMap_GPR(m_Opcode.rd, FALSE); }
|
if (IsMapped(m_Opcode.rd)) { UnMap_GPR(m_Opcode.rd, FALSE); }
|
||||||
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd, GetMipsRegLo(m_Opcode.rt) >> Shift);
|
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd, GetMipsRegLo(m_Opcode.rt) >> Shift);
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Map_GPR_32bit(m_Opcode.rd,TRUE,m_Opcode.rt);
|
Map_GPR_32bit(m_Opcode.rd,TRUE,m_Opcode.rt);
|
||||||
|
@ -1874,7 +1874,7 @@ void CRecompilerOps::SPECIAL_SRAV (void) {
|
||||||
if (IsConst(m_Opcode.rt)) {
|
if (IsConst(m_Opcode.rt)) {
|
||||||
if (IsMapped(m_Opcode.rd)) { UnMap_GPR(m_Opcode.rd, FALSE); }
|
if (IsMapped(m_Opcode.rd)) { UnMap_GPR(m_Opcode.rd, FALSE); }
|
||||||
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd, GetMipsRegLo_S(m_Opcode.rt) >> Shift);
|
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd, GetMipsRegLo_S(m_Opcode.rt) >> Shift);
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Map_GPR_32bit(m_Opcode.rd,TRUE,m_Opcode.rt);
|
Map_GPR_32bit(m_Opcode.rd,TRUE,m_Opcode.rt);
|
||||||
|
@ -1962,7 +1962,7 @@ void CRecompilerOps::SPECIAL_JALR (void)
|
||||||
}
|
}
|
||||||
UnMap_GPR( m_Opcode.rd, FALSE);
|
UnMap_GPR( m_Opcode.rd, FALSE);
|
||||||
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd,m_CompilePC + 8);
|
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd,m_CompilePC + 8);
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
if ((m_CompilePC & 0xFFC) == 0xFFC)
|
if ((m_CompilePC & 0xFFC) == 0xFFC)
|
||||||
{
|
{
|
||||||
if (IsMapped(m_Opcode.rs)) {
|
if (IsMapped(m_Opcode.rs)) {
|
||||||
|
@ -2139,9 +2139,9 @@ void CRecompilerOps::SPECIAL_DSRLV (void) {
|
||||||
m_RegWorkingSet.SetMipsReg(m_Opcode.rd, Is64Bit(m_Opcode.rt)?GetMipsReg(m_Opcode.rt):(__int64)GetMipsRegLo_S(m_Opcode.rt));
|
m_RegWorkingSet.SetMipsReg(m_Opcode.rd, Is64Bit(m_Opcode.rt)?GetMipsReg(m_Opcode.rt):(__int64)GetMipsRegLo_S(m_Opcode.rt));
|
||||||
m_RegWorkingSet.SetMipsReg(m_Opcode.rd, GetMipsReg(m_Opcode.rd) >> Shift);
|
m_RegWorkingSet.SetMipsReg(m_Opcode.rd, GetMipsReg(m_Opcode.rd) >> Shift);
|
||||||
if ((GetMipsRegHi(m_Opcode.rd) == 0) && (GetMipsRegLo(m_Opcode.rd) & 0x80000000) == 0) {
|
if ((GetMipsRegHi(m_Opcode.rd) == 0) && (GetMipsRegLo(m_Opcode.rd) & 0x80000000) == 0) {
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
} else if ((GetMipsRegHi(m_Opcode.rd) == 0xFFFFFFFF) && (GetMipsRegLo(m_Opcode.rd) & 0x80000000) != 0) {
|
} else if ((GetMipsRegHi(m_Opcode.rd) == 0xFFFFFFFF) && (GetMipsRegLo(m_Opcode.rd) & 0x80000000) != 0) {
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
} else {
|
} else {
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_64);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_64);
|
||||||
}
|
}
|
||||||
|
@ -2508,7 +2508,7 @@ void CRecompilerOps::SPECIAL_ADD (void) {
|
||||||
DWORD temp = GetMipsRegLo(source1) + GetMipsRegLo(source2);
|
DWORD temp = GetMipsRegLo(source1) + GetMipsRegLo(source2);
|
||||||
if (IsMapped(m_Opcode.rd)) { UnMap_GPR(m_Opcode.rd, FALSE); }
|
if (IsMapped(m_Opcode.rd)) { UnMap_GPR(m_Opcode.rd, FALSE); }
|
||||||
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd,temp);
|
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd,temp);
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2537,7 +2537,7 @@ void CRecompilerOps::SPECIAL_ADDU (void) {
|
||||||
DWORD temp = GetMipsRegLo(source1) + GetMipsRegLo(source2);
|
DWORD temp = GetMipsRegLo(source1) + GetMipsRegLo(source2);
|
||||||
if (IsMapped(m_Opcode.rd)) { UnMap_GPR(m_Opcode.rd, FALSE); }
|
if (IsMapped(m_Opcode.rd)) { UnMap_GPR(m_Opcode.rd, FALSE); }
|
||||||
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd,temp);
|
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd,temp);
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2563,7 +2563,7 @@ void CRecompilerOps::SPECIAL_SUB (void) {
|
||||||
DWORD temp = GetMipsRegLo(m_Opcode.rs) - GetMipsRegLo(m_Opcode.rt);
|
DWORD temp = GetMipsRegLo(m_Opcode.rs) - GetMipsRegLo(m_Opcode.rt);
|
||||||
if (IsMapped(m_Opcode.rd)) { UnMap_GPR(m_Opcode.rd, FALSE); }
|
if (IsMapped(m_Opcode.rd)) { UnMap_GPR(m_Opcode.rd, FALSE); }
|
||||||
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd,temp);
|
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd,temp);
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
} else {
|
} else {
|
||||||
if (m_Opcode.rd == m_Opcode.rt) {
|
if (m_Opcode.rd == m_Opcode.rt) {
|
||||||
x86Reg Reg = Map_TempReg(x86_Any,m_Opcode.rt,FALSE);
|
x86Reg Reg = Map_TempReg(x86_Any,m_Opcode.rt,FALSE);
|
||||||
|
@ -2594,7 +2594,7 @@ void CRecompilerOps::SPECIAL_SUBU (void) {
|
||||||
DWORD temp = GetMipsRegLo(m_Opcode.rs) - GetMipsRegLo(m_Opcode.rt);
|
DWORD temp = GetMipsRegLo(m_Opcode.rs) - GetMipsRegLo(m_Opcode.rt);
|
||||||
if (IsMapped(m_Opcode.rd)) { UnMap_GPR(m_Opcode.rd, FALSE); }
|
if (IsMapped(m_Opcode.rd)) { UnMap_GPR(m_Opcode.rd, FALSE); }
|
||||||
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd,temp);
|
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd,temp);
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
} else {
|
} else {
|
||||||
if (m_Opcode.rd == m_Opcode.rt) {
|
if (m_Opcode.rd == m_Opcode.rt) {
|
||||||
x86Reg Reg = Map_TempReg(x86_Any,m_Opcode.rt,FALSE);
|
x86Reg Reg = Map_TempReg(x86_Any,m_Opcode.rt,FALSE);
|
||||||
|
@ -2631,15 +2631,15 @@ void CRecompilerOps::SPECIAL_AND (void)
|
||||||
);
|
);
|
||||||
|
|
||||||
if (GetMipsRegLo_S(m_Opcode.rd) < 0 && GetMipsRegHi_S(m_Opcode.rd) == -1){
|
if (GetMipsRegLo_S(m_Opcode.rd) < 0 && GetMipsRegHi_S(m_Opcode.rd) == -1){
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
} else if (GetMipsRegLo_S(m_Opcode.rd) >= 0 && GetMipsRegHi_S(m_Opcode.rd) == 0){
|
} else if (GetMipsRegLo_S(m_Opcode.rd) >= 0 && GetMipsRegHi_S(m_Opcode.rd) == 0){
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
} else {
|
} else {
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_64);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_64);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
m_RegWorkingSet.SetMipsReg(m_Opcode.rd, GetMipsRegLo(m_Opcode.rt) & GetMipsReg(m_Opcode.rs));
|
m_RegWorkingSet.SetMipsReg(m_Opcode.rd, GetMipsRegLo(m_Opcode.rt) & GetMipsReg(m_Opcode.rs));
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
}
|
}
|
||||||
} else if (IsMapped(m_Opcode.rt) && IsMapped(m_Opcode.rs)) {
|
} 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 source1 = m_Opcode.rd == m_Opcode.rt?m_Opcode.rt:m_Opcode.rs;
|
||||||
|
@ -2769,15 +2769,15 @@ void CRecompilerOps::SPECIAL_OR (void) {
|
||||||
(Is64Bit(m_Opcode.rs)?GetMipsReg(m_Opcode.rs):(__int64)GetMipsRegLo_S(m_Opcode.rs))
|
(Is64Bit(m_Opcode.rs)?GetMipsReg(m_Opcode.rs):(__int64)GetMipsRegLo_S(m_Opcode.rs))
|
||||||
);
|
);
|
||||||
if (GetMipsRegLo_S(m_Opcode.rd) < 0 && GetMipsRegHi_S(m_Opcode.rd) == -1){
|
if (GetMipsRegLo_S(m_Opcode.rd) < 0 && GetMipsRegHi_S(m_Opcode.rd) == -1){
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
} else if (GetMipsRegLo_S(m_Opcode.rd) >= 0 && GetMipsRegHi_S(m_Opcode.rd) == 0){
|
} else if (GetMipsRegLo_S(m_Opcode.rd) >= 0 && GetMipsRegHi_S(m_Opcode.rd) == 0){
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
} else {
|
} else {
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_64);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_64);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd, GetMipsRegLo(m_Opcode.rt) | GetMipsRegLo(m_Opcode.rs));
|
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd, GetMipsRegLo(m_Opcode.rt) | GetMipsRegLo(m_Opcode.rs));
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
}
|
}
|
||||||
} else if (IsMapped(m_Opcode.rt) && IsMapped(m_Opcode.rs)) {
|
} 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 source1 = m_Opcode.rd == m_Opcode.rt?m_Opcode.rt:m_Opcode.rs;
|
||||||
|
@ -2881,7 +2881,7 @@ void CRecompilerOps::SPECIAL_XOR (void) {
|
||||||
|
|
||||||
if (m_Opcode.rt == m_Opcode.rs) {
|
if (m_Opcode.rt == m_Opcode.rs) {
|
||||||
UnMap_GPR( m_Opcode.rd, FALSE);
|
UnMap_GPR( m_Opcode.rd, FALSE);
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd, 0);
|
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd, 0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2892,7 +2892,7 @@ void CRecompilerOps::SPECIAL_XOR (void) {
|
||||||
if (bHaveDebugger()) { g_Notify->DisplayError("XOR 1"); }
|
if (bHaveDebugger()) { g_Notify->DisplayError("XOR 1"); }
|
||||||
CRecompilerOps::UnknownOpcode();
|
CRecompilerOps::UnknownOpcode();
|
||||||
} else {
|
} else {
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd, GetMipsRegLo(m_Opcode.rt) ^ GetMipsRegLo(m_Opcode.rs));
|
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd, GetMipsRegLo(m_Opcode.rt) ^ GetMipsRegLo(m_Opcode.rs));
|
||||||
}
|
}
|
||||||
} else if (IsMapped(m_Opcode.rt) && IsMapped(m_Opcode.rs)) {
|
} else if (IsMapped(m_Opcode.rt) && IsMapped(m_Opcode.rs)) {
|
||||||
|
@ -2997,15 +2997,15 @@ void CRecompilerOps::SPECIAL_NOR (void) {
|
||||||
(Is64Bit(m_Opcode.rs)?GetMipsReg(m_Opcode.rs):(__int64)GetMipsRegLo_S(m_Opcode.rs)))
|
(Is64Bit(m_Opcode.rs)?GetMipsReg(m_Opcode.rs):(__int64)GetMipsRegLo_S(m_Opcode.rs)))
|
||||||
);
|
);
|
||||||
if (GetMipsRegLo_S(m_Opcode.rd) < 0 && GetMipsRegHi_S(m_Opcode.rd) == -1){
|
if (GetMipsRegLo_S(m_Opcode.rd) < 0 && GetMipsRegHi_S(m_Opcode.rd) == -1){
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
} else if (GetMipsRegLo_S(m_Opcode.rd) >= 0 && GetMipsRegHi_S(m_Opcode.rd) == 0){
|
} else if (GetMipsRegLo_S(m_Opcode.rd) >= 0 && GetMipsRegHi_S(m_Opcode.rd) == 0){
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
} else {
|
} else {
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_64);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_64);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd,~(GetMipsRegLo(m_Opcode.rt) | GetMipsRegLo(m_Opcode.rs)));
|
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd,~(GetMipsRegLo(m_Opcode.rt) | GetMipsRegLo(m_Opcode.rs)));
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
}
|
}
|
||||||
} else if (IsMapped(m_Opcode.rt) && IsMapped(m_Opcode.rs)) {
|
} 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 source1 = m_Opcode.rd == m_Opcode.rt?m_Opcode.rt:m_Opcode.rs;
|
||||||
|
@ -3118,7 +3118,7 @@ void CRecompilerOps::SPECIAL_SLT (void) {
|
||||||
CRecompilerOps::UnknownOpcode();
|
CRecompilerOps::UnknownOpcode();
|
||||||
} else {
|
} else {
|
||||||
if (IsMapped(m_Opcode.rd)) { UnMap_GPR(m_Opcode.rd, FALSE); }
|
if (IsMapped(m_Opcode.rd)) { UnMap_GPR(m_Opcode.rd, FALSE); }
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
if (GetMipsRegLo_S(m_Opcode.rs) < GetMipsRegLo_S(m_Opcode.rt)) {
|
if (GetMipsRegLo_S(m_Opcode.rs) < GetMipsRegLo_S(m_Opcode.rt)) {
|
||||||
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd,1);
|
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd,1);
|
||||||
} else {
|
} else {
|
||||||
|
@ -3351,7 +3351,7 @@ void CRecompilerOps::SPECIAL_SLTU (void) {
|
||||||
CRecompilerOps::UnknownOpcode();
|
CRecompilerOps::UnknownOpcode();
|
||||||
} else {
|
} else {
|
||||||
if (IsMapped(m_Opcode.rd)) { UnMap_GPR(m_Opcode.rd, FALSE); }
|
if (IsMapped(m_Opcode.rd)) { UnMap_GPR(m_Opcode.rd, FALSE); }
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
if (GetMipsRegLo(m_Opcode.rs) < GetMipsRegLo(m_Opcode.rt)) {
|
if (GetMipsRegLo(m_Opcode.rs) < GetMipsRegLo(m_Opcode.rt)) {
|
||||||
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd,1);
|
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd,1);
|
||||||
} else {
|
} else {
|
||||||
|
@ -3567,9 +3567,9 @@ void CRecompilerOps::SPECIAL_DADD (void) {
|
||||||
Is64Bit(m_Opcode.rt)?GetMipsReg(m_Opcode.rt):(__int64)GetMipsRegLo_S(m_Opcode.rt)
|
Is64Bit(m_Opcode.rt)?GetMipsReg(m_Opcode.rt):(__int64)GetMipsRegLo_S(m_Opcode.rt)
|
||||||
);
|
);
|
||||||
if (GetMipsRegLo_S(m_Opcode.rd) < 0 && GetMipsRegHi_S(m_Opcode.rd) == -1){
|
if (GetMipsRegLo_S(m_Opcode.rd) < 0 && GetMipsRegHi_S(m_Opcode.rd) == -1){
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
} else if (GetMipsRegLo_S(m_Opcode.rd) >= 0 && GetMipsRegHi_S(m_Opcode.rd) == 0){
|
} else if (GetMipsRegLo_S(m_Opcode.rd) >= 0 && GetMipsRegHi_S(m_Opcode.rd) == 0){
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
} else {
|
} else {
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_64);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_64);
|
||||||
}
|
}
|
||||||
|
@ -3603,9 +3603,9 @@ void CRecompilerOps::SPECIAL_DADDU (void) {
|
||||||
if (IsMapped(m_Opcode.rd)) { UnMap_GPR(m_Opcode.rd, FALSE); }
|
if (IsMapped(m_Opcode.rd)) { UnMap_GPR(m_Opcode.rd, FALSE); }
|
||||||
m_RegWorkingSet.SetMipsReg(m_Opcode.rd, ValRs + ValRt);
|
m_RegWorkingSet.SetMipsReg(m_Opcode.rd, ValRs + ValRt);
|
||||||
if ((GetMipsRegHi(m_Opcode.rd) == 0) && (GetMipsRegLo(m_Opcode.rd) & 0x80000000) == 0) {
|
if ((GetMipsRegHi(m_Opcode.rd) == 0) && (GetMipsRegLo(m_Opcode.rd) & 0x80000000) == 0) {
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
} else if ((GetMipsRegHi(m_Opcode.rd) == 0xFFFFFFFF) && (GetMipsRegLo(m_Opcode.rd) & 0x80000000) != 0) {
|
} else if ((GetMipsRegHi(m_Opcode.rd) == 0xFFFFFFFF) && (GetMipsRegLo(m_Opcode.rd) & 0x80000000) != 0) {
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
} else {
|
} else {
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_64);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_64);
|
||||||
}
|
}
|
||||||
|
@ -3640,9 +3640,9 @@ void CRecompilerOps::SPECIAL_DSUB (void) {
|
||||||
Is64Bit(m_Opcode.rt)?GetMipsReg(m_Opcode.rt):(__int64)GetMipsRegLo_S(m_Opcode.rt)
|
Is64Bit(m_Opcode.rt)?GetMipsReg(m_Opcode.rt):(__int64)GetMipsRegLo_S(m_Opcode.rt)
|
||||||
);
|
);
|
||||||
if (GetMipsRegLo_S(m_Opcode.rd) < 0 && GetMipsRegHi_S(m_Opcode.rd) == -1){
|
if (GetMipsRegLo_S(m_Opcode.rd) < 0 && GetMipsRegHi_S(m_Opcode.rd) == -1){
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
} else if (GetMipsRegLo_S(m_Opcode.rd) >= 0 && GetMipsRegHi_S(m_Opcode.rd) == 0){
|
} else if (GetMipsRegLo_S(m_Opcode.rd) >= 0 && GetMipsRegHi_S(m_Opcode.rd) == 0){
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
} else {
|
} else {
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_64);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_64);
|
||||||
}
|
}
|
||||||
|
@ -3683,9 +3683,9 @@ void CRecompilerOps::SPECIAL_DSUBU (void) {
|
||||||
Is64Bit(m_Opcode.rt)?GetMipsReg(m_Opcode.rt):(__int64)GetMipsRegLo_S(m_Opcode.rt)
|
Is64Bit(m_Opcode.rt)?GetMipsReg(m_Opcode.rt):(__int64)GetMipsRegLo_S(m_Opcode.rt)
|
||||||
);
|
);
|
||||||
if (GetMipsRegLo_S(m_Opcode.rd) < 0 && GetMipsRegHi_S(m_Opcode.rd) == -1){
|
if (GetMipsRegLo_S(m_Opcode.rd) < 0 && GetMipsRegHi_S(m_Opcode.rd) == -1){
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
} else if (GetMipsRegLo_S(m_Opcode.rd) >= 0 && GetMipsRegHi_S(m_Opcode.rd) == 0){
|
} else if (GetMipsRegLo_S(m_Opcode.rd) >= 0 && GetMipsRegHi_S(m_Opcode.rd) == 0){
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
} else {
|
} else {
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_64);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_64);
|
||||||
}
|
}
|
||||||
|
@ -3726,9 +3726,9 @@ void CRecompilerOps::SPECIAL_DSLL (void) {
|
||||||
__int64 Value = Is64Bit(m_Opcode.rt)?GetMipsReg_S(m_Opcode.rt):(__int64)GetMipsRegLo_S(m_Opcode.rt);
|
__int64 Value = Is64Bit(m_Opcode.rt)?GetMipsReg_S(m_Opcode.rt):(__int64)GetMipsRegLo_S(m_Opcode.rt);
|
||||||
m_RegWorkingSet.SetMipsReg(m_Opcode.rd, Value << m_Opcode.sa);
|
m_RegWorkingSet.SetMipsReg(m_Opcode.rd, Value << m_Opcode.sa);
|
||||||
if (GetMipsRegLo_S(m_Opcode.rd) < 0 && GetMipsRegHi_S(m_Opcode.rd) == -1){
|
if (GetMipsRegLo_S(m_Opcode.rd) < 0 && GetMipsRegHi_S(m_Opcode.rd) == -1){
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
} else if (GetMipsRegLo_S(m_Opcode.rd) >= 0 && GetMipsRegHi_S(m_Opcode.rd) == 0){
|
} else if (GetMipsRegLo_S(m_Opcode.rd) >= 0 && GetMipsRegHi_S(m_Opcode.rd) == 0){
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
} else {
|
} else {
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_64);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_64);
|
||||||
}
|
}
|
||||||
|
@ -3751,9 +3751,9 @@ void CRecompilerOps::SPECIAL_DSRL (void) {
|
||||||
__int64 Value = Is64Bit(m_Opcode.rt)?GetMipsReg_S(m_Opcode.rt):(__int64)GetMipsRegLo_S(m_Opcode.rt);
|
__int64 Value = Is64Bit(m_Opcode.rt)?GetMipsReg_S(m_Opcode.rt):(__int64)GetMipsRegLo_S(m_Opcode.rt);
|
||||||
m_RegWorkingSet.SetMipsReg(m_Opcode.rd,Value >> m_Opcode.sa);
|
m_RegWorkingSet.SetMipsReg(m_Opcode.rd,Value >> m_Opcode.sa);
|
||||||
if (GetMipsRegLo_S(m_Opcode.rd) < 0 && GetMipsRegHi_S(m_Opcode.rd) == -1){
|
if (GetMipsRegLo_S(m_Opcode.rd) < 0 && GetMipsRegHi_S(m_Opcode.rd) == -1){
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
} else if (GetMipsRegLo_S(m_Opcode.rd) >= 0 && GetMipsRegHi_S(m_Opcode.rd) == 0){
|
} else if (GetMipsRegLo_S(m_Opcode.rd) >= 0 && GetMipsRegHi_S(m_Opcode.rd) == 0){
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
} else {
|
} else {
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_64);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_64);
|
||||||
}
|
}
|
||||||
|
@ -3775,9 +3775,9 @@ void CRecompilerOps::SPECIAL_DSRA (void) {
|
||||||
__int64 Value = Is64Bit(m_Opcode.rt)?GetMipsReg_S(m_Opcode.rt):(__int64)GetMipsRegLo_S(m_Opcode.rt);
|
__int64 Value = Is64Bit(m_Opcode.rt)?GetMipsReg_S(m_Opcode.rt):(__int64)GetMipsRegLo_S(m_Opcode.rt);
|
||||||
m_RegWorkingSet.SetMipsReg_S(m_Opcode.rd, Value >> m_Opcode.sa);
|
m_RegWorkingSet.SetMipsReg_S(m_Opcode.rd, Value >> m_Opcode.sa);
|
||||||
if (GetMipsRegLo_S(m_Opcode.rd) < 0 && GetMipsRegHi_S(m_Opcode.rd) == -1){
|
if (GetMipsRegLo_S(m_Opcode.rd) < 0 && GetMipsRegHi_S(m_Opcode.rd) == -1){
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
} else if (GetMipsRegLo_S(m_Opcode.rd) >= 0 && GetMipsRegHi_S(m_Opcode.rd) == 0){
|
} else if (GetMipsRegLo_S(m_Opcode.rd) >= 0 && GetMipsRegHi_S(m_Opcode.rd) == 0){
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
} else {
|
} else {
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_64);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_64);
|
||||||
}
|
}
|
||||||
|
@ -3797,9 +3797,9 @@ void CRecompilerOps::SPECIAL_DSLL32 (void) {
|
||||||
m_RegWorkingSet.SetMipsRegHi(m_Opcode.rd,GetMipsRegLo(m_Opcode.rt) << m_Opcode.sa);
|
m_RegWorkingSet.SetMipsRegHi(m_Opcode.rd,GetMipsRegLo(m_Opcode.rt) << m_Opcode.sa);
|
||||||
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd,0);
|
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd,0);
|
||||||
if (GetMipsRegLo_S(m_Opcode.rd) < 0 && GetMipsRegHi_S(m_Opcode.rd) == -1){
|
if (GetMipsRegLo_S(m_Opcode.rd) < 0 && GetMipsRegHi_S(m_Opcode.rd) == -1){
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
} else if (GetMipsRegLo_S(m_Opcode.rd) >= 0 && GetMipsRegHi_S(m_Opcode.rd) == 0){
|
} else if (GetMipsRegLo_S(m_Opcode.rd) >= 0 && GetMipsRegHi_S(m_Opcode.rd) == 0){
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
} else {
|
} else {
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_64);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_64);
|
||||||
}
|
}
|
||||||
|
@ -3834,7 +3834,7 @@ void CRecompilerOps::SPECIAL_DSRL32 (void) {
|
||||||
|
|
||||||
if (IsConst(m_Opcode.rt)) {
|
if (IsConst(m_Opcode.rt)) {
|
||||||
if (m_Opcode.rt != m_Opcode.rd) { UnMap_GPR(m_Opcode.rd, FALSE); }
|
if (m_Opcode.rt != m_Opcode.rd) { UnMap_GPR(m_Opcode.rd, FALSE); }
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_ZERO);
|
||||||
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd, (DWORD)(GetMipsReg(m_Opcode.rt) >> (m_Opcode.sa + 32)));
|
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd, (DWORD)(GetMipsReg(m_Opcode.rt) >> (m_Opcode.sa + 32)));
|
||||||
} else if (IsMapped(m_Opcode.rt)) {
|
} else if (IsMapped(m_Opcode.rt)) {
|
||||||
ProtectGPR(m_Opcode.rt);
|
ProtectGPR(m_Opcode.rt);
|
||||||
|
@ -3869,7 +3869,7 @@ void CRecompilerOps::SPECIAL_DSRA32 (void) {
|
||||||
|
|
||||||
if (IsConst(m_Opcode.rt)) {
|
if (IsConst(m_Opcode.rt)) {
|
||||||
if (m_Opcode.rt != m_Opcode.rd) { UnMap_GPR(m_Opcode.rd, FALSE); }
|
if (m_Opcode.rt != m_Opcode.rd) { UnMap_GPR(m_Opcode.rd, FALSE); }
|
||||||
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32);
|
m_RegWorkingSet.SetMipsRegState(m_Opcode.rd,CRegInfo::STATE_CONST_32_SIGN);
|
||||||
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd,(DWORD)(GetMipsReg_S(m_Opcode.rt) >> (m_Opcode.sa + 32)));
|
m_RegWorkingSet.SetMipsRegLo(m_Opcode.rd,(DWORD)(GetMipsReg_S(m_Opcode.rt) >> (m_Opcode.sa + 32)));
|
||||||
} else if (IsMapped(m_Opcode.rt)) {
|
} else if (IsMapped(m_Opcode.rt)) {
|
||||||
ProtectGPR(m_Opcode.rt);
|
ProtectGPR(m_Opcode.rt);
|
||||||
|
|
|
@ -20,7 +20,7 @@ CRegInfo::CRegInfo ( void ) :
|
||||||
m_Fpu_Used(false),
|
m_Fpu_Used(false),
|
||||||
m_RoundingModel(RoundUnknown)
|
m_RoundingModel(RoundUnknown)
|
||||||
{
|
{
|
||||||
m_MIPS_RegState[0] = STATE_CONST_32;
|
m_MIPS_RegState[0] = STATE_CONST_32_SIGN;
|
||||||
m_MIPS_RegVal[0].DW = 0;
|
m_MIPS_RegVal[0].DW = 0;
|
||||||
m_RegMapLo[0] = x86_Unknown;
|
m_RegMapLo[0] = x86_Unknown;
|
||||||
m_RegMapHi[0] = x86_Unknown;
|
m_RegMapHi[0] = x86_Unknown;
|
||||||
|
@ -128,8 +128,8 @@ bool CRegInfo::operator!=(const CRegInfo& right) const
|
||||||
|
|
||||||
CRegInfo::REG_STATE CRegInfo::ConstantsType (__int64 Value)
|
CRegInfo::REG_STATE CRegInfo::ConstantsType (__int64 Value)
|
||||||
{
|
{
|
||||||
if (((Value >> 32) == -1) && ((Value & 0x80000000) != 0)) { return STATE_CONST_32; }
|
if (((Value >> 32) == -1) && ((Value & 0x80000000) != 0)) { return STATE_CONST_32_SIGN; }
|
||||||
if (((Value >> 32) == 0) && ((Value & 0x80000000) == 0)) { return STATE_CONST_32; }
|
if (((Value >> 32) == 0) && ((Value & 0x80000000) == 0)) { return STATE_CONST_32_SIGN; }
|
||||||
return STATE_CONST_64;
|
return STATE_CONST_64;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1131,8 +1131,8 @@ void CRegInfo::WriteBackRegisters ()
|
||||||
UnMap_AllFPRs();
|
UnMap_AllFPRs();
|
||||||
|
|
||||||
int count;
|
int count;
|
||||||
BOOL bEdiZero = FALSE;
|
bool bEdiZero = FALSE;
|
||||||
BOOL bEsiSign = FALSE;
|
bool bEsiSign = FALSE;
|
||||||
|
|
||||||
int X86RegCount = sizeof(x86_Registers)/ sizeof(x86_Registers[0]);
|
int X86RegCount = sizeof(x86_Registers)/ sizeof(x86_Registers[0]);
|
||||||
for (int i = 0; i < X86RegCount; i++) { SetX86Protected(x86_Registers[i],FALSE); }
|
for (int i = 0; i < X86RegCount; i++) { SetX86Protected(x86_Registers[i],FALSE); }
|
||||||
|
@ -1143,25 +1143,31 @@ void CRegInfo::WriteBackRegisters ()
|
||||||
for (count = 1; count < 32; count ++) {
|
for (count = 1; count < 32; count ++) {
|
||||||
switch (GetMipsRegState(count)) {
|
switch (GetMipsRegState(count)) {
|
||||||
case CRegInfo::STATE_UNKNOWN: break;
|
case CRegInfo::STATE_UNKNOWN: break;
|
||||||
case CRegInfo::STATE_CONST_32:
|
case CRegInfo::STATE_CONST_32_SIGN:
|
||||||
if (!g_System->b32BitCore())
|
if (!g_System->b32BitCore())
|
||||||
{
|
{
|
||||||
if (!bEdiZero && (!GetMipsRegLo(count) || !(GetMipsRegLo(count) & 0x80000000))) {
|
if (!bEdiZero && (!GetMipsRegLo(count) || !(GetMipsRegLo(count) & 0x80000000)))
|
||||||
|
{
|
||||||
XorX86RegToX86Reg(x86_EDI, x86_EDI);
|
XorX86RegToX86Reg(x86_EDI, x86_EDI);
|
||||||
bEdiZero = TRUE;
|
bEdiZero = TRUE;
|
||||||
}
|
}
|
||||||
if (!bEsiSign && (GetMipsRegLo(count) & 0x80000000)) {
|
if (!bEsiSign && (GetMipsRegLo(count) & 0x80000000))
|
||||||
|
{
|
||||||
MoveConstToX86reg(0xFFFFFFFF, x86_ESI);
|
MoveConstToX86reg(0xFFFFFFFF, x86_ESI);
|
||||||
bEsiSign = TRUE;
|
bEsiSign = TRUE;
|
||||||
}
|
}
|
||||||
if ((GetMipsRegLo(count) & 0x80000000) != 0) {
|
if ((GetMipsRegLo(count) & 0x80000000) != 0)
|
||||||
|
{
|
||||||
MoveX86regToVariable(x86_ESI,&_GPR[count].UW[1],CRegName::GPR_Hi[count]);
|
MoveX86regToVariable(x86_ESI,&_GPR[count].UW[1],CRegName::GPR_Hi[count]);
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
MoveX86regToVariable(x86_EDI,&_GPR[count].UW[1],CRegName::GPR_Hi[count]);
|
MoveX86regToVariable(x86_EDI,&_GPR[count].UW[1],CRegName::GPR_Hi[count]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GetMipsRegLo(count) == 0) {
|
if (GetMipsRegLo(count) == 0)
|
||||||
|
{
|
||||||
if (g_System->b32BitCore())
|
if (g_System->b32BitCore())
|
||||||
{
|
{
|
||||||
if (!bEdiZero)
|
if (!bEdiZero)
|
||||||
|
@ -1171,7 +1177,9 @@ void CRegInfo::WriteBackRegisters ()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
MoveX86regToVariable(x86_EDI,&_GPR[count].UW[0],CRegName::GPR_Lo[count]);
|
MoveX86regToVariable(x86_EDI,&_GPR[count].UW[0],CRegName::GPR_Lo[count]);
|
||||||
} else if (GetMipsRegLo(count) == 0xFFFFFFFF) {
|
}
|
||||||
|
else if (GetMipsRegLo(count) == 0xFFFFFFFF)
|
||||||
|
{
|
||||||
if (g_System->b32BitCore())
|
if (g_System->b32BitCore())
|
||||||
{
|
{
|
||||||
if (!bEsiSign)
|
if (!bEsiSign)
|
||||||
|
@ -1181,8 +1189,41 @@ void CRegInfo::WriteBackRegisters ()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
MoveX86regToVariable(x86_ESI,&_GPR[count].UW[0],CRegName::GPR_Lo[count]);
|
MoveX86regToVariable(x86_ESI,&_GPR[count].UW[0],CRegName::GPR_Lo[count]);
|
||||||
} else
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
MoveConstToVariable(GetMipsRegLo(count),&_GPR[count].UW[0],CRegName::GPR_Lo[count]);
|
MoveConstToVariable(GetMipsRegLo(count),&_GPR[count].UW[0],CRegName::GPR_Lo[count]);
|
||||||
|
}
|
||||||
|
|
||||||
|
SetMipsRegState(count, CRegInfo::STATE_UNKNOWN);
|
||||||
|
break;
|
||||||
|
case CRegInfo::STATE_CONST_32_ZERO:
|
||||||
|
if (!g_System->b32BitCore())
|
||||||
|
{
|
||||||
|
if (!bEdiZero)
|
||||||
|
{
|
||||||
|
XorX86RegToX86Reg(x86_EDI, x86_EDI);
|
||||||
|
bEdiZero = TRUE;
|
||||||
|
}
|
||||||
|
MoveX86regToVariable(x86_EDI,&_GPR[count].UW[1],CRegName::GPR_Hi[count]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GetMipsRegLo(count) == 0)
|
||||||
|
{
|
||||||
|
if (g_System->b32BitCore())
|
||||||
|
{
|
||||||
|
if (!bEdiZero)
|
||||||
|
{
|
||||||
|
XorX86RegToX86Reg(x86_EDI, x86_EDI);
|
||||||
|
bEdiZero = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MoveX86regToVariable(x86_EDI,&_GPR[count].UW[0],CRegName::GPR_Lo[count]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MoveConstToVariable(GetMipsRegLo(count),&_GPR[count].UW[0],CRegName::GPR_Lo[count]);
|
||||||
|
}
|
||||||
|
|
||||||
SetMipsRegState(count, CRegInfo::STATE_UNKNOWN);
|
SetMipsRegState(count, CRegInfo::STATE_UNKNOWN);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -29,7 +29,8 @@ public:
|
||||||
STATE_MAPPED_32_ZERO = (STATE_KNOWN_VALUE | STATE_X86_MAPPED | STATE_32BIT), // = 11
|
STATE_MAPPED_32_ZERO = (STATE_KNOWN_VALUE | STATE_X86_MAPPED | STATE_32BIT), // = 11
|
||||||
STATE_MAPPED_32_SIGN = (STATE_KNOWN_VALUE | STATE_X86_MAPPED | STATE_32BIT | STATE_SIGN), // = 15
|
STATE_MAPPED_32_SIGN = (STATE_KNOWN_VALUE | STATE_X86_MAPPED | STATE_32BIT | STATE_SIGN), // = 15
|
||||||
|
|
||||||
STATE_CONST_32 = (STATE_KNOWN_VALUE | STATE_32BIT | STATE_SIGN), // = 13
|
STATE_CONST_32_ZERO = (STATE_KNOWN_VALUE | STATE_32BIT), // = 9
|
||||||
|
STATE_CONST_32_SIGN = (STATE_KNOWN_VALUE | STATE_32BIT | STATE_SIGN), // = 13
|
||||||
STATE_CONST_64 = (STATE_KNOWN_VALUE), // = 1
|
STATE_CONST_64 = (STATE_KNOWN_VALUE), // = 1
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -144,7 +144,7 @@ void CRegInfo::Initilize ( void )
|
||||||
{
|
{
|
||||||
int count;
|
int count;
|
||||||
|
|
||||||
MIPS_RegState[0] = STATE_CONST_32;
|
MIPS_RegState[0] = STATE_CONST_32_SIGN;
|
||||||
MIPS_RegVal[0].DW = 0;
|
MIPS_RegVal[0].DW = 0;
|
||||||
for (count = 1; count < 32; count ++ ) {
|
for (count = 1; count < 32; count ++ ) {
|
||||||
MIPS_RegState[count] = STATE_UNKNOWN;
|
MIPS_RegState[count] = STATE_UNKNOWN;
|
||||||
|
|
Loading…
Reference in New Issue