[Android] get CArmRecompilerOps::SPECIAL_JALR to use dynamic registers

This commit is contained in:
zilmar 2016-10-01 21:40:58 +10:00
parent 8f6ca9c15a
commit 4a5ede2287
1 changed files with 31 additions and 10 deletions

View File

@ -2537,6 +2537,7 @@ void CArmRecompilerOps::SPECIAL_JALR()
g_Notify->BreakPoint(__FILE__, __LINE__); g_Notify->BreakPoint(__FILE__, __LINE__);
return; return;
} }
g_Notify->BreakPoint(__FILE__, __LINE__);
MoveVariableToArmReg(&_GPR[m_Opcode.rs].UW[0], CRegName::GPR_Lo[m_Opcode.rs], Arm_R0); MoveVariableToArmReg(&_GPR[m_Opcode.rs].UW[0], CRegName::GPR_Lo[m_Opcode.rs], Arm_R0);
MoveConstToArmReg(Arm_R1, (uint32_t)_PROGRAM_COUNTER, "PROGRAM_COUNTER"); MoveConstToArmReg(Arm_R1, (uint32_t)_PROGRAM_COUNTER, "PROGRAM_COUNTER");
StoreArmRegToArmRegPointer(Arm_R0, Arm_R1, 0); StoreArmRegToArmRegPointer(Arm_R0, Arm_R1, 0);
@ -2545,14 +2546,24 @@ void CArmRecompilerOps::SPECIAL_JALR()
MoveConstToVariable(m_CompilePC + 8, &_GPR[m_Opcode.rd].UW[0], CRegName::GPR_Lo[m_Opcode.rd]); MoveConstToVariable(m_CompilePC + 8, &_GPR[m_Opcode.rd].UW[0], CRegName::GPR_Lo[m_Opcode.rd]);
if ((m_CompilePC & 0xFFC) == 0xFFC) if ((m_CompilePC & 0xFFC) == 0xFFC)
{ {
if (IsKnown(m_Opcode.rs)) ArmReg TempRegRs = Arm_Unknown;
if (IsKnown(m_Opcode.rs) && IsMapped(m_Opcode.rs))
{ {
g_Notify->BreakPoint(__FILE__, __LINE__); g_Notify->BreakPoint(__FILE__, __LINE__);
return;
} }
MoveVariableToArmReg(&_GPR[m_Opcode.rs].UW[0], CRegName::GPR_Lo[m_Opcode.rs], Arm_R0); else if (IsKnown(m_Opcode.rs))
MoveConstToArmReg(Arm_R1, (uint32_t)&R4300iOp::m_JumpToLocation, "R4300iOp::m_JumpToLocation"); {
StoreArmRegToArmRegPointer(Arm_R0, Arm_R1, 0); g_Notify->BreakPoint(__FILE__, __LINE__);
}
else
{
TempRegRs = m_RegWorkingSet.Map_TempReg(Arm_Any, m_Opcode.rs, false);
}
ArmReg TempRegVar = m_RegWorkingSet.Map_TempReg(Arm_Any, -1, false);
MoveConstToArmReg(TempRegVar, (uint32_t)&R4300iOp::m_JumpToLocation, "R4300iOp::m_JumpToLocation");
StoreArmRegToArmRegPointer(TempRegRs, TempRegVar, 0);
m_RegWorkingSet.SetArmRegProtected(TempRegRs,false);
m_RegWorkingSet.SetArmRegProtected(TempRegVar,false);
m_RegWorkingSet.WriteBackRegisters(); m_RegWorkingSet.WriteBackRegisters();
OverflowDelaySlot(true); OverflowDelaySlot(true);
@ -2577,14 +2588,24 @@ void CArmRecompilerOps::SPECIAL_JALR()
else else
{ {
UpdateCounters(m_RegWorkingSet, true, true); UpdateCounters(m_RegWorkingSet, true, true);
if (IsKnown(m_Opcode.rs)) ArmReg ArmRegRs = Arm_Unknown;
if (IsKnown(m_Opcode.rs) && IsMapped(m_Opcode.rs))
{
ArmRegRs = GetMipsRegMapLo(m_Opcode.rs);
}
else if (IsKnown(m_Opcode.rs))
{ {
g_Notify->BreakPoint(__FILE__, __LINE__); g_Notify->BreakPoint(__FILE__, __LINE__);
return;
} }
MoveVariableToArmReg(&_GPR[m_Opcode.rs].UW[0], CRegName::GPR_Lo[m_Opcode.rs], Arm_R0); else
MoveConstToArmReg(Arm_R1, (uint32_t)_PROGRAM_COUNTER, "PROGRAM_COUNTER"); {
StoreArmRegToArmRegPointer(Arm_R0, Arm_R1, 0); ArmRegRs = m_RegWorkingSet.Map_TempReg(Arm_Any, m_Opcode.rs, false);
}
ArmReg TempRegPC = m_RegWorkingSet.Map_TempReg(Arm_Any, -1, false);
MoveConstToArmReg(TempRegPC, (uint32_t)_PROGRAM_COUNTER, "PROGRAM_COUNTER");
StoreArmRegToArmRegPointer(ArmRegRs, TempRegPC, 0);
m_RegWorkingSet.SetArmRegProtected(ArmRegRs,false);
m_RegWorkingSet.SetArmRegProtected(TempRegPC,false);
CompileExit((uint32_t)-1, (uint32_t)-1, m_RegWorkingSet, CExitInfo::Normal); CompileExit((uint32_t)-1, (uint32_t)-1, m_RegWorkingSet, CExitInfo::Normal);
if (m_Section->m_JumpSection) if (m_Section->m_JumpSection)
{ {