Core: fix up CX86RecompilerOps::COP1_D_ROUND_W

This commit is contained in:
zilmar 2024-03-21 17:28:16 +10:30
parent 772a20f07d
commit 401efae0d9
3 changed files with 26 additions and 6 deletions

View File

@ -8478,6 +8478,7 @@ void CX86RecompilerOps::COP1_D_MOV()
{ {
if (FpuExceptionInRecompiler()) if (FpuExceptionInRecompiler())
{ {
CompileCop1Test();
if (m_RegWorkingSet.RegInStack(m_Opcode.fs, CRegInfo::FPU_Any) || m_RegWorkingSet.RegInStack(m_Opcode.fd, CRegInfo::FPU_Any)) if (m_RegWorkingSet.RegInStack(m_Opcode.fs, CRegInfo::FPU_Any) || m_RegWorkingSet.RegInStack(m_Opcode.fd, CRegInfo::FPU_Any))
{ {
g_Notify->BreakPoint(__FILE__, __LINE__); g_Notify->BreakPoint(__FILE__, __LINE__);
@ -8557,16 +8558,23 @@ void CX86RecompilerOps::COP1_D_FLOOR_L()
void CX86RecompilerOps::COP1_D_ROUND_W() void CX86RecompilerOps::COP1_D_ROUND_W()
{ {
CompileCop1Test(); if (FpuExceptionInRecompiler())
if (m_RegWorkingSet.RegInStack(m_Opcode.fs, CRegInfo::FPU_Double) || m_RegWorkingSet.RegInStack(m_Opcode.fs, CRegInfo::FPU_Qword))
{ {
m_RegWorkingSet.UnMap_FPR(m_Opcode.fs, true); COP1_S_CVT(CRegInfo::RoundNearest, CRegInfo::FPU_Double, CRegInfo::FPU_Dword);
} }
if (m_Opcode.fd != m_Opcode.fs || !m_RegWorkingSet.RegInStack(m_Opcode.fd, CRegInfo::FPU_Double)) else
{ {
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, m_Opcode.fs, CRegInfo::FPU_Double); CompileCop1Test();
if (m_RegWorkingSet.RegInStack(m_Opcode.fs, CRegInfo::FPU_Double) || m_RegWorkingSet.RegInStack(m_Opcode.fs, CRegInfo::FPU_Qword))
{
m_RegWorkingSet.UnMap_FPR(m_Opcode.fs, true);
}
if (m_Opcode.fd != m_Opcode.fs || !m_RegWorkingSet.RegInStack(m_Opcode.fd, CRegInfo::FPU_Double))
{
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, m_Opcode.fs, CRegInfo::FPU_Double);
}
m_RegWorkingSet.ChangeFPURegFormat(m_Opcode.fd, CRegInfo::FPU_Double, CRegInfo::FPU_Dword, CRegInfo::RoundNearest);
} }
m_RegWorkingSet.ChangeFPURegFormat(m_Opcode.fd, CRegInfo::FPU_Double, CRegInfo::FPU_Dword, CRegInfo::RoundNearest);
} }
void CX86RecompilerOps::COP1_D_TRUNC_W() void CX86RecompilerOps::COP1_D_TRUNC_W()

View File

@ -243,6 +243,11 @@ void CX86Ops::Fadd(const asmjit::x86::Mem & Mem)
fadd(Mem); fadd(Mem);
} }
void CX86Ops::Fchs(void)
{
fchs();
}
void CX86Ops::Fdiv(const asmjit::x86::Mem & Mem) void CX86Ops::Fdiv(const asmjit::x86::Mem & Mem)
{ {
fdiv(Mem); fdiv(Mem);
@ -253,6 +258,11 @@ void CX86Ops::Fmul(const asmjit::x86::Mem & Mem)
fmul(Mem); fmul(Mem);
} }
void CX86Ops::Fsqrt(void)
{
fsqrt();
}
void CX86Ops::Fsub(const asmjit::x86::Mem & Mem) void CX86Ops::Fsub(const asmjit::x86::Mem & Mem)
{ {
fsub(Mem); fsub(Mem);

View File

@ -46,8 +46,10 @@ public:
void CompX86regToVariable(const asmjit::x86::Gp & Reg, void * Variable, const char * VariableName); void CompX86regToVariable(const asmjit::x86::Gp & Reg, void * Variable, const char * VariableName);
void Fabs(void); void Fabs(void);
void Fadd(const asmjit::x86::Mem & Mem); void Fadd(const asmjit::x86::Mem & Mem);
void Fchs(void);
void Fdiv(const asmjit::x86::Mem & Mem); void Fdiv(const asmjit::x86::Mem & Mem);
void Fmul(const asmjit::x86::Mem & Mem); void Fmul(const asmjit::x86::Mem & Mem);
void Fsqrt(void);
void Fsub(const asmjit::x86::Mem & Mem); void Fsub(const asmjit::x86::Mem & Mem);
void JaeLabel(const char * LabelName, asmjit::Label & JumpLabel); void JaeLabel(const char * LabelName, asmjit::Label & JumpLabel);
void JaLabel(const char * LabelName, asmjit::Label & JumpLabel); void JaLabel(const char * LabelName, asmjit::Label & JumpLabel);