Core: Fix up BGEZALL in recompiler

This commit is contained in:
zilmar 2022-12-26 17:19:32 +10:30
parent 2c6d3429b7
commit 0cc7ede816
3 changed files with 42 additions and 7 deletions

View File

@ -581,6 +581,7 @@ bool CCodeBlock::AnalyzeInstruction(uint32_t PC, uint32_t & TargetPC, uint32_t &
break;
case R4300i_REGIMM_BLTZL:
case R4300i_REGIMM_BGEZL:
case R4300i_REGIMM_BGEZALL:
TargetPC = PC + ((int16_t)Command.offset << 2) + 4;
if (TargetPC == PC)
{

View File

@ -483,14 +483,15 @@ bool CCodeSection::GenerateNativeCode(uint32_t Test)
case R4300i_REGIMM_BGEZ: m_RecompilerOps->Compile_Branch(RecompilerBranchCompare_BGEZ, false); break;
case R4300i_REGIMM_BLTZL: m_RecompilerOps->Compile_BranchLikely(RecompilerBranchCompare_BLTZ, false); break;
case R4300i_REGIMM_BGEZL: m_RecompilerOps->Compile_BranchLikely(RecompilerBranchCompare_BGEZ, false); break;
case R4300i_REGIMM_BLTZAL: m_RecompilerOps->Compile_Branch(RecompilerBranchCompare_BLTZ, true); break;
case R4300i_REGIMM_BGEZAL: m_RecompilerOps->Compile_Branch(RecompilerBranchCompare_BGEZ, true); break;
case R4300i_REGIMM_TEQI: m_RecompilerOps->Compile_TrapCompare(RecompilerTrapCompare_TEQI); break;
case R4300i_REGIMM_TNEI: m_RecompilerOps->Compile_TrapCompare(RecompilerTrapCompare_TNEI); break;
case R4300i_REGIMM_TGEI: m_RecompilerOps->Compile_TrapCompare(RecompilerTrapCompare_TGEI); break;
case R4300i_REGIMM_TGEIU: m_RecompilerOps->Compile_TrapCompare(RecompilerTrapCompare_TGEIU); break;
case R4300i_REGIMM_TLTI: m_RecompilerOps->Compile_TrapCompare(RecompilerTrapCompare_TLTI); break;
case R4300i_REGIMM_TLTIU: m_RecompilerOps->Compile_TrapCompare(RecompilerTrapCompare_TLTIU); break;
case R4300i_REGIMM_TEQI: m_RecompilerOps->Compile_TrapCompare(RecompilerTrapCompare_TEQI); break;
case R4300i_REGIMM_TNEI: m_RecompilerOps->Compile_TrapCompare(RecompilerTrapCompare_TNEI); break;
case R4300i_REGIMM_BLTZAL: m_RecompilerOps->Compile_Branch(RecompilerBranchCompare_BLTZ, true); break;
case R4300i_REGIMM_BGEZAL: m_RecompilerOps->Compile_Branch(RecompilerBranchCompare_BGEZ, true); break;
case R4300i_REGIMM_BGEZALL: m_RecompilerOps->Compile_BranchLikely(RecompilerBranchCompare_BGEZ, true); break;
default:
m_RecompilerOps->UnknownOpcode();
break;

View File

@ -862,17 +862,36 @@ void CX86RecompilerOps::Compile_BranchLikely(RecompilerBranchCompare CompareType
m_Section->m_Cont.LinkLocation = asmjit::Label();
m_Section->m_Cont.LinkLocation2 = asmjit::Label();
if (Link)
{
R4300iInstruction Instruction(m_CompilePC, m_Opcode.Value);
uint32_t ReadReg1, ReadReg2;
Instruction.ReadsGPR(ReadReg1, ReadReg2);
if (ReadReg1 != 31 && ReadReg2 != 31)
{
UnMap_GPR(31, false);
m_RegWorkingSet.SetMipsRegLo(31, m_CompilePC + 8);
m_RegWorkingSet.SetMipsRegState(31, CRegInfo::STATE_CONST_32_SIGN);
}
else
{
m_Section->m_Cont.LinkAddress = m_CompilePC + 8;
m_Section->m_Jump.LinkAddress = m_CompilePC + 8;
}
}
Compile_BranchCompare(CompareType);
ResetX86Protection();
m_Section->m_Cont.RegSet = m_RegWorkingSet;
m_Section->m_Cont.RegSet.SetBlockCycleCount(m_Section->m_Cont.RegSet.GetBlockCycleCount() + g_System->CountPerOp());
if (m_Section->m_Cont.LinkAddress != (uint32_t)-1)
{
m_Section->m_Cont.RegSet.UnMap_GPR(31, false);
m_Section->m_Cont.RegSet.SetMipsRegLo(31, m_Section->m_Cont.LinkAddress);
m_Section->m_Cont.RegSet.SetMipsRegState(31, CRegInfo::STATE_CONST_32_SIGN);
m_Section->m_Cont.LinkAddress = (uint32_t)-1;
}
if ((m_CompilePC & 0xFFC) == 0xFFC)
{
if (m_Section->m_Cont.FallThrough)
@ -910,6 +929,13 @@ void CX86RecompilerOps::Compile_BranchLikely(RecompilerBranchCompare CompareType
{
m_Section->m_Jump.RegSet = m_RegWorkingSet;
m_Section->m_Jump.RegSet.SetBlockCycleCount(m_Section->m_Jump.RegSet.GetBlockCycleCount() + g_System->CountPerOp());
if (m_Section->m_Jump.LinkAddress != (uint32_t)-1)
{
m_Section->m_Jump.RegSet.UnMap_GPR(31, false);
m_Section->m_Jump.RegSet.SetMipsRegLo(31, m_Section->m_Jump.LinkAddress);
m_Section->m_Jump.RegSet.SetMipsRegState(31, CRegInfo::STATE_CONST_32_SIGN);
m_Section->m_Jump.LinkAddress = (uint32_t)-1;
}
m_Section->GenerateSectionLinkage();
m_PipelineStage = PIPELINE_STAGE_END_BLOCK;
}
@ -931,6 +957,13 @@ void CX86RecompilerOps::Compile_BranchLikely(RecompilerBranchCompare CompareType
ResetX86Protection();
m_Section->m_Jump.RegSet = m_RegWorkingSet;
m_Section->m_Jump.RegSet.SetBlockCycleCount(m_Section->m_Jump.RegSet.GetBlockCycleCount());
if (m_Section->m_Jump.LinkAddress != (uint32_t)-1)
{
m_Section->m_Jump.RegSet.UnMap_GPR(31, false);
m_Section->m_Jump.RegSet.SetMipsRegLo(31, m_Section->m_Jump.LinkAddress);
m_Section->m_Jump.RegSet.SetMipsRegState(31, CRegInfo::STATE_CONST_32_SIGN);
m_Section->m_Jump.LinkAddress = (uint32_t)-1;
}
m_Section->GenerateSectionLinkage();
m_PipelineStage = PIPELINE_STAGE_END_BLOCK;
}