Cleaned up NOR

This commit is contained in:
zilmar 2012-10-03 09:03:21 +10:00
parent aa76a1d641
commit 2b83842076
1 changed files with 40 additions and 45 deletions

View File

@ -3078,7 +3078,16 @@ void CRecompilerOps::SPECIAL_NOR (void) {
if (IsConst(m_Opcode.rt) && IsConst(m_Opcode.rs)) { if (IsConst(m_Opcode.rt) && IsConst(m_Opcode.rs)) {
if (IsMapped(m_Opcode.rd)) { UnMap_GPR(m_Opcode.rd, FALSE); } if (IsMapped(m_Opcode.rd)) { UnMap_GPR(m_Opcode.rd, FALSE); }
if (Is64Bit(m_Opcode.rt) || Is64Bit(m_Opcode.rs)) { if (Is64Bit(m_Opcode.rt) || Is64Bit(m_Opcode.rs)) {
CRecompilerOps::UnknownOpcode(); 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){
MipsRegState(m_Opcode.rd) = CRegInfo::STATE_CONST_32;
} else if (MipsRegLo_S(m_Opcode.rd) >= 0 && MipsRegHi_S(m_Opcode.rd) == 0){
MipsRegState(m_Opcode.rd) = CRegInfo::STATE_CONST_32;
} else {
MipsRegState(m_Opcode.rd) = CRegInfo::STATE_CONST_64;
}
} else { } else {
MipsRegLo(m_Opcode.rd) = ~(cMipsRegLo(m_Opcode.rt) | cMipsRegLo(m_Opcode.rs)); MipsRegLo(m_Opcode.rd) = ~(cMipsRegLo(m_Opcode.rt) | cMipsRegLo(m_Opcode.rs));
MipsRegState(m_Opcode.rd) = CRegInfo::STATE_CONST_32; MipsRegState(m_Opcode.rd) = CRegInfo::STATE_CONST_32;
@ -3086,39 +3095,27 @@ void CRecompilerOps::SPECIAL_NOR (void) {
} 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;
int source2 = m_Opcode.rd == m_Opcode.rt?m_Opcode.rs:m_Opcode.rt; int source2 = m_Opcode.rd == m_Opcode.rt?m_Opcode.rs:m_Opcode.rt;
if (b32BitCore()) { _Notify->BreakPoint(__FILE__,__LINE__); }
ProtectGPR(m_Opcode.rt);
ProtectGPR(source1); ProtectGPR(m_Opcode.rs);
ProtectGPR(source2); if (Is64Bit(m_Opcode.rt) || Is64Bit(m_Opcode.rs)) {
if (!Is64Bit(m_Opcode.rt) || Is64Bit(m_Opcode.rs)) {
Map_GPR_64bit(m_Opcode.rd,source1); Map_GPR_64bit(m_Opcode.rd,source1);
if (Is64Bit(source2)) { if (Is64Bit(source2)) {
OrX86RegToX86Reg(cMipsRegMapHi(m_Opcode.rd),cMipsRegMapHi(source2)); OrX86RegToX86Reg(MipsRegMapHi(m_Opcode.rd),MipsRegMapHi(source2));
} else { } else {
OrX86RegToX86Reg(cMipsRegMapHi(m_Opcode.rd),Map_TempReg(x86_Any,source2,TRUE)); OrX86RegToX86Reg(MipsRegMapHi(m_Opcode.rd),Map_TempReg(x86_Any,source2,TRUE));
} }
OrX86RegToX86Reg(cMipsRegMapLo(m_Opcode.rd),cMipsRegMapLo(source2));
NotX86Reg(cMipsRegMapHi(m_Opcode.rd));
NotX86Reg(cMipsRegMapLo(m_Opcode.rd));
} else { } else {
ProtectGPR(source2); ProtectGPR(source2);
if (IsSigned(m_Opcode.rt) != IsSigned(m_Opcode.rs)) { Map_GPR_32bit(m_Opcode.rd,TRUE,source1);
Map_GPR_32bit(m_Opcode.rd,TRUE,source1);
} else {
Map_GPR_32bit(m_Opcode.rd,IsSigned(m_Opcode.rt),source1);
}
OrX86RegToX86Reg(cMipsRegMapLo(m_Opcode.rd),cMipsRegMapLo(source2));
NotX86Reg(cMipsRegMapLo(m_Opcode.rd));
} }
OrX86RegToX86Reg(cMipsRegMapLo(m_Opcode.rd),cMipsRegMapLo(source2));
} else { } else {
DWORD ConstReg = IsConst(m_Opcode.rt)?m_Opcode.rt:m_Opcode.rs; DWORD ConstReg = IsConst(m_Opcode.rt)?m_Opcode.rt:m_Opcode.rs;
DWORD MappedReg = IsConst(m_Opcode.rt)?m_Opcode.rs:m_Opcode.rt; DWORD MappedReg = IsConst(m_Opcode.rt)?m_Opcode.rs:m_Opcode.rt;
if ((Is64Bit(m_Opcode.rt) && Is64Bit(m_Opcode.rs)) || if (Is64Bit(m_Opcode.rt) || Is64Bit(m_Opcode.rs)) {
(!b32BitCore() && (Is64Bit(m_Opcode.rt) || Is64Bit(m_Opcode.rs))))
{
unsigned __int64 Value; unsigned __int64 Value;
if (b32BitCore()) { _Notify->BreakPoint(__FILE__,__LINE__); }
if (Is64Bit(ConstReg)) { if (Is64Bit(ConstReg)) {
Value = MipsReg(ConstReg); Value = MipsReg(ConstReg);
@ -3132,27 +3129,21 @@ void CRecompilerOps::SPECIAL_NOR (void) {
if ((DWORD)Value != 0) { if ((DWORD)Value != 0) {
OrConstToX86Reg((DWORD)Value,cMipsRegMapLo(m_Opcode.rd)); OrConstToX86Reg((DWORD)Value,cMipsRegMapLo(m_Opcode.rd));
} }
NotX86Reg(cMipsRegMapHi(m_Opcode.rd));
NotX86Reg(cMipsRegMapLo(m_Opcode.rd));
} else { } else {
int Value = cMipsRegLo(ConstReg); int Value = cMipsRegLo(ConstReg);
if (IsSigned(m_Opcode.rt) != IsSigned(m_Opcode.rs)) { Map_GPR_32bit(m_Opcode.rd,TRUE, MappedReg);
Map_GPR_32bit(m_Opcode.rd,TRUE, MappedReg);
} else {
Map_GPR_32bit(m_Opcode.rd,IsSigned(MappedReg)?TRUE:FALSE, MappedReg);
}
if (Value != 0) { OrConstToX86Reg(Value,cMipsRegMapLo(m_Opcode.rd)); } if (Value != 0) { OrConstToX86Reg(Value,cMipsRegMapLo(m_Opcode.rd)); }
NotX86Reg(cMipsRegMapLo(m_Opcode.rd));
} }
} }
} else if (IsKnown(m_Opcode.rt) || IsKnown(m_Opcode.rs)) { } else if (IsKnown(m_Opcode.rt) || IsKnown(m_Opcode.rs)) {
int KnownReg = IsKnown(m_Opcode.rt)?m_Opcode.rt: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; int UnknownReg = IsKnown(m_Opcode.rt)?m_Opcode.rs:m_Opcode.rt;
if (IsConst(KnownReg)) { if (IsConst(KnownReg)) {
unsigned __int64 Value; unsigned __int64 Value;
Value = Is64Bit(KnownReg)?MipsReg(KnownReg):MipsRegLo_S(KnownReg); Value = Is64Bit(KnownReg)?MipsReg(KnownReg):MipsRegLo_S(KnownReg);
if (b32BitCore() && Is32Bit(KnownReg)) if (b32BitCore() && Is32Bit(KnownReg))
{ {
Map_GPR_32bit(m_Opcode.rd,true,UnknownReg); Map_GPR_32bit(m_Opcode.rd,true,UnknownReg);
@ -3175,25 +3166,29 @@ void CRecompilerOps::SPECIAL_NOR (void) {
OrVariableToX86Reg(&_GPR[UnknownReg].W[0],CRegName::GPR_Lo[UnknownReg],cMipsRegMapLo(m_Opcode.rd)); OrVariableToX86Reg(&_GPR[UnknownReg].W[0],CRegName::GPR_Lo[UnknownReg],cMipsRegMapLo(m_Opcode.rd));
} else { } else {
Map_GPR_64bit(m_Opcode.rd,KnownReg); Map_GPR_64bit(m_Opcode.rd,KnownReg);
OrVariableToX86Reg(&_GPR[UnknownReg].W[1],CRegName::GPR_Hi[UnknownReg],cMipsRegMapHi(m_Opcode.rd)); 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)); OrVariableToX86Reg(&_GPR[UnknownReg].W[0],CRegName::GPR_Lo[UnknownReg],cMipsRegMapLo(m_Opcode.rd));
} }
} }
if (Is64Bit(m_Opcode.rd)) } 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));
} 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));
}
}
if (IsMapped(m_Opcode.rd))
{
if (Is64Bit(m_Opcode.rs))
{ {
NotX86Reg(cMipsRegMapHi(m_Opcode.rd)); NotX86Reg(cMipsRegMapHi(m_Opcode.rd));
} }
NotX86Reg(cMipsRegMapLo(m_Opcode.rd)); NotX86Reg(cMipsRegMapLo(m_Opcode.rd));
} 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));
} else {
Map_GPR_64bit(m_Opcode.rd,m_Opcode.rt);
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));
} }
} }