[Android] Fix buf in CArmRecompilerOps::SPECIAL_XOR

This commit is contained in:
zilmar 2016-12-13 06:25:32 +11:00
parent e4a29ce003
commit 2394215349
1 changed files with 12 additions and 25 deletions

View File

@ -3381,6 +3381,7 @@ void CArmRecompilerOps::SPECIAL_XOR()
uint32_t ConstReg = IsConst(m_Opcode.rt) ? m_Opcode.rt : m_Opcode.rs; uint32_t ConstReg = IsConst(m_Opcode.rt) ? m_Opcode.rt : m_Opcode.rs;
uint32_t MappedReg = IsConst(m_Opcode.rt) ? m_Opcode.rs : m_Opcode.rt; uint32_t MappedReg = IsConst(m_Opcode.rt) ? m_Opcode.rs : m_Opcode.rt;
ProtectGPR(MappedReg);
if (Is64Bit(m_Opcode.rt) || Is64Bit(m_Opcode.rs)) if (Is64Bit(m_Opcode.rt) || Is64Bit(m_Opcode.rs))
{ {
g_Notify->BreakPoint(__FILE__, __LINE__); g_Notify->BreakPoint(__FILE__, __LINE__);
@ -3432,37 +3433,23 @@ void CArmRecompilerOps::SPECIAL_XOR()
} }
else else
{ {
if (g_System->b32BitCore()) ProtectGPR(KnownReg);
if (m_Opcode.rd == KnownReg)
{ {
if (m_Opcode.rd == KnownReg) ArmReg TempReg = Arm_Any;
if (Is64Bit(KnownReg))
{ {
XorArmRegToArmReg(GetMipsRegMapLo(m_Opcode.rd), Map_TempReg(Arm_Any, UnknownReg, false)); TempReg = Map_TempReg(Arm_Any, UnknownReg, true);
} XorArmRegToArmReg(GetMipsRegMapHi(m_Opcode.rd), TempReg);
else m_RegWorkingSet.SetArmRegProtected(TempReg, false);
{
Map_GPR_32bit(m_Opcode.rd, true, UnknownReg);
XorArmRegToArmReg(GetMipsRegMapLo(m_Opcode.rd), GetMipsRegMapLo(KnownReg));
} }
XorArmRegToArmReg(GetMipsRegMapLo(m_Opcode.rd), Map_TempReg(TempReg, UnknownReg, false));
} }
else else
{ {
if (m_Opcode.rd == KnownReg) Map_GPR_64bit(m_Opcode.rd, UnknownReg);
{ XorArmRegToArmReg(GetMipsRegMapHi(m_Opcode.rd), Is32Bit(KnownReg) ? Map_TempReg(Arm_Any, KnownReg, true) : GetMipsRegMapHi(KnownReg));
ArmReg TempReg = Arm_Any; XorArmRegToArmReg(GetMipsRegMapLo(m_Opcode.rd), GetMipsRegMapLo(KnownReg));
if (Is64Bit(KnownReg))
{
TempReg = Map_TempReg(Arm_Any, UnknownReg, true);
XorArmRegToArmReg(GetMipsRegMapHi(m_Opcode.rd), TempReg);
m_RegWorkingSet.SetArmRegProtected(TempReg, false);
}
XorArmRegToArmReg(GetMipsRegMapLo(m_Opcode.rd), Map_TempReg(TempReg, UnknownReg, false));
}
else
{
Map_GPR_64bit(m_Opcode.rd, UnknownReg);
XorArmRegToArmReg(GetMipsRegMapHi(m_Opcode.rd), Is32Bit(KnownReg) ? Map_TempReg(Arm_Any, KnownReg, true) : GetMipsRegMapHi(KnownReg));
XorArmRegToArmReg(GetMipsRegMapLo(m_Opcode.rd), GetMipsRegMapLo(KnownReg));
}
} }
} }
} }