Core: Update Round.w.s, trunc.w.s, ceil.w.s, floor.w.s to work with exceptions in the recompiler
This commit is contained in:
parent
ad1a2a2d9a
commit
2014237ed6
|
@ -8006,42 +8006,70 @@ void CX86RecompilerOps::COP1_S_FLOOR_L()
|
||||||
|
|
||||||
void CX86RecompilerOps::COP1_S_ROUND_W()
|
void CX86RecompilerOps::COP1_S_ROUND_W()
|
||||||
{
|
{
|
||||||
CompileCop1Test();
|
if (FpuExceptionInRecompiler())
|
||||||
if (m_Opcode.fd != m_Opcode.fs || !m_RegWorkingSet.RegInStack(m_Opcode.fd, CRegInfo::FPU_Float))
|
|
||||||
{
|
{
|
||||||
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, m_Opcode.fs, CRegInfo::FPU_Float);
|
COP1_S_CVT(CRegInfo::RoundNearest, CRegInfo::FPU_FloatLow, CRegInfo::FPU_Dword);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CompileCop1Test();
|
||||||
|
if (m_Opcode.fd != m_Opcode.fs || !m_RegWorkingSet.RegInStack(m_Opcode.fd, CRegInfo::FPU_Float))
|
||||||
|
{
|
||||||
|
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, m_Opcode.fs, CRegInfo::FPU_Float);
|
||||||
|
}
|
||||||
|
m_RegWorkingSet.ChangeFPURegFormat(m_Opcode.fd, CRegInfo::FPU_Float, CRegInfo::FPU_Dword, CRegInfo::RoundNearest);
|
||||||
}
|
}
|
||||||
m_RegWorkingSet.ChangeFPURegFormat(m_Opcode.fd, CRegInfo::FPU_Float, CRegInfo::FPU_Dword, CRegInfo::RoundNearest);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CX86RecompilerOps::COP1_S_TRUNC_W()
|
void CX86RecompilerOps::COP1_S_TRUNC_W()
|
||||||
{
|
{
|
||||||
CompileCop1Test();
|
if (FpuExceptionInRecompiler())
|
||||||
if (m_Opcode.fd != m_Opcode.fs || !m_RegWorkingSet.RegInStack(m_Opcode.fd, CRegInfo::FPU_Float))
|
|
||||||
{
|
{
|
||||||
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, m_Opcode.fs, CRegInfo::FPU_Float);
|
COP1_S_CVT(CRegInfo::RoundTruncate, CRegInfo::FPU_FloatLow, CRegInfo::FPU_Dword);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CompileCop1Test();
|
||||||
|
if (m_Opcode.fd != m_Opcode.fs || !m_RegWorkingSet.RegInStack(m_Opcode.fd, CRegInfo::FPU_Float))
|
||||||
|
{
|
||||||
|
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, m_Opcode.fs, CRegInfo::FPU_Float);
|
||||||
|
}
|
||||||
|
m_RegWorkingSet.ChangeFPURegFormat(m_Opcode.fd, CRegInfo::FPU_Float, CRegInfo::FPU_Dword, CRegInfo::RoundTruncate);
|
||||||
}
|
}
|
||||||
m_RegWorkingSet.ChangeFPURegFormat(m_Opcode.fd, CRegInfo::FPU_Float, CRegInfo::FPU_Dword, CRegInfo::RoundTruncate);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CX86RecompilerOps::COP1_S_CEIL_W()
|
void CX86RecompilerOps::COP1_S_CEIL_W()
|
||||||
{
|
{
|
||||||
CompileCop1Test();
|
if (FpuExceptionInRecompiler())
|
||||||
if (m_Opcode.fd != m_Opcode.fs || !m_RegWorkingSet.RegInStack(m_Opcode.fd, CRegInfo::FPU_Float))
|
|
||||||
{
|
{
|
||||||
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, m_Opcode.fs, CRegInfo::FPU_Float);
|
COP1_S_CVT(CRegInfo::RoundUp, CRegInfo::FPU_FloatLow, CRegInfo::FPU_Dword);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CompileCop1Test();
|
||||||
|
if (m_Opcode.fd != m_Opcode.fs || !m_RegWorkingSet.RegInStack(m_Opcode.fd, CRegInfo::FPU_Float))
|
||||||
|
{
|
||||||
|
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, m_Opcode.fs, CRegInfo::FPU_Float);
|
||||||
|
}
|
||||||
|
m_RegWorkingSet.ChangeFPURegFormat(m_Opcode.fd, CRegInfo::FPU_Float, CRegInfo::FPU_Dword, CRegInfo::RoundUp);
|
||||||
}
|
}
|
||||||
m_RegWorkingSet.ChangeFPURegFormat(m_Opcode.fd, CRegInfo::FPU_Float, CRegInfo::FPU_Dword, CRegInfo::RoundUp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CX86RecompilerOps::COP1_S_FLOOR_W()
|
void CX86RecompilerOps::COP1_S_FLOOR_W()
|
||||||
{
|
{
|
||||||
CompileCop1Test();
|
if (FpuExceptionInRecompiler())
|
||||||
if (m_Opcode.fd != m_Opcode.fs || !m_RegWorkingSet.RegInStack(m_Opcode.fd, CRegInfo::FPU_Float))
|
|
||||||
{
|
{
|
||||||
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, m_Opcode.fs, CRegInfo::FPU_Float);
|
COP1_S_CVT(CRegInfo::RoundDown, CRegInfo::FPU_FloatLow, CRegInfo::FPU_Dword);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CompileCop1Test();
|
||||||
|
if (m_Opcode.fd != m_Opcode.fs || !m_RegWorkingSet.RegInStack(m_Opcode.fd, CRegInfo::FPU_Float))
|
||||||
|
{
|
||||||
|
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, m_Opcode.fs, CRegInfo::FPU_Float);
|
||||||
|
}
|
||||||
|
m_RegWorkingSet.ChangeFPURegFormat(m_Opcode.fd, CRegInfo::FPU_Float, CRegInfo::FPU_Dword, CRegInfo::RoundDown);
|
||||||
}
|
}
|
||||||
m_RegWorkingSet.ChangeFPURegFormat(m_Opcode.fd, CRegInfo::FPU_Float, CRegInfo::FPU_Dword, CRegInfo::RoundDown);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CX86RecompilerOps::COP1_S_CVT_D()
|
void CX86RecompilerOps::COP1_S_CVT_D()
|
||||||
|
|
Loading…
Reference in New Issue