core: make CX86RecompilerOps::SPECIAL_JALR handle 64bit PC
This commit is contained in:
parent
5e029ecf6a
commit
fa57ce7fb8
|
@ -4621,15 +4621,24 @@ void CX86RecompilerOps::SPECIAL_JALR()
|
||||||
{
|
{
|
||||||
if (m_RegWorkingSet.IsConst(m_Opcode.rs))
|
if (m_RegWorkingSet.IsConst(m_Opcode.rs))
|
||||||
{
|
{
|
||||||
m_Assembler.MoveConstToVariable(&m_Reg.m_PROGRAM_COUNTER, "PROGRAM_COUNTER", m_RegWorkingSet.GetMipsRegLo(m_Opcode.rs));
|
if (((int)m_CompilePC >> 31) != (m_RegWorkingSet.Is64Bit(m_Opcode.rs) ? (int)m_RegWorkingSet.GetMipsRegHi(m_Opcode.rs) : (m_RegWorkingSet.GetMipsRegLo_S(m_Opcode.rs) >> 31)))
|
||||||
|
{
|
||||||
|
m_Assembler.MoveConst64ToVariable(&m_Reg.m_PROGRAM_COUNTER, "PROGRAM_COUNTER", m_RegWorkingSet.Is64Bit(m_Opcode.rs) ? m_RegWorkingSet.GetMipsReg(m_Opcode.rs) : (int)m_RegWorkingSet.GetMipsRegLo_S(m_Opcode.rs));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_Assembler.MoveConstToVariable(&m_Reg.m_PROGRAM_COUNTER, "PROGRAM_COUNTER", m_RegWorkingSet.GetMipsRegLo(m_Opcode.rs));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (m_RegWorkingSet.IsMapped(m_Opcode.rs))
|
else if (m_RegWorkingSet.IsMapped(m_Opcode.rs))
|
||||||
{
|
{
|
||||||
m_Assembler.MoveX86regToVariable(&m_Reg.m_PROGRAM_COUNTER, "PROGRAM_COUNTER", m_RegWorkingSet.GetMipsRegMapLo(m_Opcode.rs));
|
m_Assembler.MoveX86regToVariable(&m_Reg.m_PROGRAM_COUNTER, "PROGRAM_COUNTER", m_RegWorkingSet.GetMipsRegMapLo(m_Opcode.rs));
|
||||||
|
m_Assembler.MoveX86regToVariable(((uint8_t *)&m_Reg.m_PROGRAM_COUNTER) + 4, "PROGRAM_COUNTER + 4", m_RegWorkingSet.Is64Bit(m_Opcode.rs) ? m_RegWorkingSet.GetMipsRegMapHi(m_Opcode.rs) : m_RegWorkingSet.Map_TempReg(x86Reg_Unknown, m_Opcode.rs, true, false));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_Assembler.MoveX86regToVariable(&m_Reg.m_PROGRAM_COUNTER, "PROGRAM_COUNTER", m_RegWorkingSet.Map_TempReg(x86Reg_Unknown, m_Opcode.rs, false, false));
|
m_Assembler.MoveX86regToVariable(&m_Reg.m_PROGRAM_COUNTER, "PROGRAM_COUNTER", m_RegWorkingSet.Map_TempReg(x86Reg_Unknown, m_Opcode.rs, false, false));
|
||||||
|
m_Assembler.MoveX86regToVariable(((uint8_t *)&m_Reg.m_PROGRAM_COUNTER) + 4, "PROGRAM_COUNTER + 4", m_RegWorkingSet.Map_TempReg(x86Reg_Unknown, m_Opcode.rs, true, false));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_RegWorkingSet.UnMap_GPR(m_Opcode.rd, false);
|
m_RegWorkingSet.UnMap_GPR(m_Opcode.rd, false);
|
||||||
|
@ -4640,12 +4649,14 @@ void CX86RecompilerOps::SPECIAL_JALR()
|
||||||
if (m_RegWorkingSet.IsMapped(m_Opcode.rs))
|
if (m_RegWorkingSet.IsMapped(m_Opcode.rs))
|
||||||
{
|
{
|
||||||
m_Assembler.MoveX86regToVariable(&g_System->m_JumpToLocation, "System::m_JumpToLocation", m_RegWorkingSet.GetMipsRegMapLo(m_Opcode.rs));
|
m_Assembler.MoveX86regToVariable(&g_System->m_JumpToLocation, "System::m_JumpToLocation", m_RegWorkingSet.GetMipsRegMapLo(m_Opcode.rs));
|
||||||
|
m_Assembler.MoveX86regToVariable(((uint8_t *)&g_System->m_JumpToLocation) + 4, "System::m_JumpToLocation + 4", m_RegWorkingSet.Is64Bit(m_Opcode.rs) ? m_RegWorkingSet.GetMipsRegMapHi(m_Opcode.rs) : m_RegWorkingSet.Map_TempReg(x86Reg_Unknown, m_Opcode.rs, true, false));
|
||||||
m_RegWorkingSet.WriteBackRegisters();
|
m_RegWorkingSet.WriteBackRegisters();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_RegWorkingSet.WriteBackRegisters();
|
m_RegWorkingSet.WriteBackRegisters();
|
||||||
m_Assembler.MoveX86regToVariable(&g_System->m_JumpToLocation, "System::m_JumpToLocation", m_RegWorkingSet.Map_TempReg(x86Reg_Unknown, m_Opcode.rs, false, false));
|
m_Assembler.MoveX86regToVariable(&g_System->m_JumpToLocation, "System::m_JumpToLocation", m_RegWorkingSet.Map_TempReg(x86Reg_Unknown, m_Opcode.rs, false, false));
|
||||||
|
m_Assembler.MoveX86regToVariable(((uint8_t *)&g_System->m_JumpToLocation) + 4, "System::m_JumpToLocation + 4", m_RegWorkingSet.Map_TempReg(x86Reg_Unknown, m_Opcode.rs, true, false));
|
||||||
}
|
}
|
||||||
OverflowDelaySlot(true);
|
OverflowDelaySlot(true);
|
||||||
return;
|
return;
|
||||||
|
|
Loading…
Reference in New Issue