Core: Get COP1_D_ADD, COP1_D_SUB, COP1_D_DIV, COP1_D_ABS, COP1_D_SQRT
This commit is contained in:
parent
97ec1f533b
commit
98b1bddc64
|
@ -8297,6 +8297,31 @@ void CX86RecompilerOps::COP1_D_ADD()
|
||||||
uint32_t Reg1 = m_Opcode.ft == m_Opcode.fd ? m_Opcode.ft : m_Opcode.fs;
|
uint32_t Reg1 = m_Opcode.ft == m_Opcode.fd ? m_Opcode.ft : m_Opcode.fs;
|
||||||
uint32_t Reg2 = m_Opcode.ft == m_Opcode.fd ? m_Opcode.fs : m_Opcode.ft;
|
uint32_t Reg2 = m_Opcode.ft == m_Opcode.fd ? m_Opcode.fs : m_Opcode.ft;
|
||||||
|
|
||||||
|
if (FpuExceptionInRecompiler())
|
||||||
|
{
|
||||||
|
CompileInitFpuOperation(CRegInfo::RoundDefault);
|
||||||
|
if (m_RegWorkingSet.RegInStack(m_Opcode.fs, CRegInfo::FPU_Any) ||
|
||||||
|
m_RegWorkingSet.RegInStack(m_Opcode.ft, CRegInfo::FPU_Any) ||
|
||||||
|
m_RegWorkingSet.RegInStack(m_Opcode.fd, CRegInfo::FPU_Any))
|
||||||
|
{
|
||||||
|
g_Notify->BreakPoint(__FILE__, __LINE__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
asmjit::x86::Gp TempReg = m_RegWorkingSet.FPRValuePointer(Reg1, CRegInfo::FPU_Double);
|
||||||
|
CompileCheckFPUInput(TempReg, FpuOpSize_64bit);
|
||||||
|
m_RegWorkingSet.SetX86Protected(GetIndexFromX86Reg(TempReg), false);
|
||||||
|
TempReg = m_RegWorkingSet.FPRValuePointer(Reg2, CRegInfo::FPU_Double);
|
||||||
|
CompileCheckFPUInput(TempReg, FpuOpSize_64bit);
|
||||||
|
m_RegWorkingSet.PrepareFPTopToBe(m_Opcode.fd, Reg1, CRegInfo::FPU_Double);
|
||||||
|
m_Assembler.fadd(asmjit::x86::qword_ptr(TempReg));
|
||||||
|
m_RegWorkingSet.SetX86Protected(GetIndexFromX86Reg(TempReg), false);
|
||||||
|
m_Assembler.mov(TempReg, (uint64_t)&m_TempValue64);
|
||||||
|
m_Assembler.fpuStoreQwordFromX86Reg(m_RegWorkingSet.StackTopPos(), TempReg, false);
|
||||||
|
CompileCheckFPUResult64(TempReg);
|
||||||
|
m_RegWorkingSet.SetFPTopAs(m_Opcode.fd);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
CompileCop1Test();
|
CompileCop1Test();
|
||||||
|
|
||||||
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, Reg1, CRegInfo::FPU_Double);
|
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, Reg1, CRegInfo::FPU_Double);
|
||||||
|
@ -8312,6 +8337,7 @@ void CX86RecompilerOps::COP1_D_ADD()
|
||||||
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, m_Opcode.fd, CRegInfo::FPU_Double);
|
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, m_Opcode.fd, CRegInfo::FPU_Double);
|
||||||
m_Assembler.fadd(asmjit::x86::qword_ptr(TempReg));
|
m_Assembler.fadd(asmjit::x86::qword_ptr(TempReg));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CX86RecompilerOps::COP1_D_SUB()
|
void CX86RecompilerOps::COP1_D_SUB()
|
||||||
|
@ -8319,6 +8345,31 @@ void CX86RecompilerOps::COP1_D_SUB()
|
||||||
uint32_t Reg1 = m_Opcode.ft == m_Opcode.fd ? m_Opcode.ft : m_Opcode.fs;
|
uint32_t Reg1 = m_Opcode.ft == m_Opcode.fd ? m_Opcode.ft : m_Opcode.fs;
|
||||||
uint32_t Reg2 = m_Opcode.ft == m_Opcode.fd ? m_Opcode.fs : m_Opcode.ft;
|
uint32_t Reg2 = m_Opcode.ft == m_Opcode.fd ? m_Opcode.fs : m_Opcode.ft;
|
||||||
|
|
||||||
|
if (FpuExceptionInRecompiler())
|
||||||
|
{
|
||||||
|
CompileInitFpuOperation(CRegInfo::RoundDefault);
|
||||||
|
if (m_RegWorkingSet.RegInStack(m_Opcode.fs, CRegInfo::FPU_Any) ||
|
||||||
|
m_RegWorkingSet.RegInStack(m_Opcode.ft, CRegInfo::FPU_Any) ||
|
||||||
|
m_RegWorkingSet.RegInStack(m_Opcode.fd, CRegInfo::FPU_Any))
|
||||||
|
{
|
||||||
|
g_Notify->BreakPoint(__FILE__, __LINE__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
asmjit::x86::Gp TempReg = m_RegWorkingSet.FPRValuePointer(Reg1, CRegInfo::FPU_Double);
|
||||||
|
CompileCheckFPUInput(TempReg, FpuOpSize_64bit);
|
||||||
|
m_RegWorkingSet.SetX86Protected(GetIndexFromX86Reg(TempReg), false);
|
||||||
|
TempReg = m_RegWorkingSet.FPRValuePointer(Reg2, CRegInfo::FPU_Double);
|
||||||
|
CompileCheckFPUInput(TempReg, FpuOpSize_64bit);
|
||||||
|
m_RegWorkingSet.PrepareFPTopToBe(m_Opcode.fd, Reg1, CRegInfo::FPU_Double);
|
||||||
|
m_Assembler.fsub(asmjit::x86::qword_ptr(TempReg));
|
||||||
|
m_RegWorkingSet.SetX86Protected(GetIndexFromX86Reg(TempReg), false);
|
||||||
|
m_Assembler.mov(TempReg, (uint64_t)&m_TempValue64);
|
||||||
|
m_Assembler.fpuStoreQwordFromX86Reg(m_RegWorkingSet.StackTopPos(), TempReg, false);
|
||||||
|
CompileCheckFPUResult64(TempReg);
|
||||||
|
m_RegWorkingSet.SetFPTopAs(m_Opcode.fd);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
CompileCop1Test();
|
CompileCop1Test();
|
||||||
|
|
||||||
if (m_Opcode.fd == m_Opcode.ft)
|
if (m_Opcode.fd == m_Opcode.ft)
|
||||||
|
@ -8346,6 +8397,7 @@ void CX86RecompilerOps::COP1_D_SUB()
|
||||||
m_Assembler.fsub(asmjit::x86::qword_ptr(TempReg));
|
m_Assembler.fsub(asmjit::x86::qword_ptr(TempReg));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CX86RecompilerOps::COP1_D_MUL()
|
void CX86RecompilerOps::COP1_D_MUL()
|
||||||
|
@ -8402,6 +8454,31 @@ void CX86RecompilerOps::COP1_D_DIV()
|
||||||
uint32_t Reg1 = m_Opcode.ft == m_Opcode.fd ? m_Opcode.ft : m_Opcode.fs;
|
uint32_t Reg1 = m_Opcode.ft == m_Opcode.fd ? m_Opcode.ft : m_Opcode.fs;
|
||||||
uint32_t Reg2 = m_Opcode.ft == m_Opcode.fd ? m_Opcode.fs : m_Opcode.ft;
|
uint32_t Reg2 = m_Opcode.ft == m_Opcode.fd ? m_Opcode.fs : m_Opcode.ft;
|
||||||
|
|
||||||
|
if (FpuExceptionInRecompiler())
|
||||||
|
{
|
||||||
|
CompileInitFpuOperation(CRegInfo::RoundDefault);
|
||||||
|
if (m_RegWorkingSet.RegInStack(m_Opcode.fs, CRegInfo::FPU_Any) ||
|
||||||
|
m_RegWorkingSet.RegInStack(m_Opcode.ft, CRegInfo::FPU_Any) ||
|
||||||
|
m_RegWorkingSet.RegInStack(m_Opcode.fd, CRegInfo::FPU_Any))
|
||||||
|
{
|
||||||
|
g_Notify->BreakPoint(__FILE__, __LINE__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
asmjit::x86::Gp TempReg = m_RegWorkingSet.FPRValuePointer(Reg1, CRegInfo::FPU_Double);
|
||||||
|
CompileCheckFPUInput(TempReg, FpuOpSize_64bit);
|
||||||
|
m_RegWorkingSet.SetX86Protected(GetIndexFromX86Reg(TempReg), false);
|
||||||
|
TempReg = m_RegWorkingSet.FPRValuePointer(Reg2, CRegInfo::FPU_Double);
|
||||||
|
CompileCheckFPUInput(TempReg, FpuOpSize_64bit);
|
||||||
|
m_RegWorkingSet.PrepareFPTopToBe(m_Opcode.fd, Reg1, CRegInfo::FPU_Double);
|
||||||
|
m_Assembler.fdiv(asmjit::x86::qword_ptr(TempReg));
|
||||||
|
m_RegWorkingSet.SetX86Protected(GetIndexFromX86Reg(TempReg), false);
|
||||||
|
m_Assembler.mov(TempReg, (uint64_t)&m_TempValue64);
|
||||||
|
m_Assembler.fpuStoreQwordFromX86Reg(m_RegWorkingSet.StackTopPos(), TempReg, false);
|
||||||
|
CompileCheckFPUResult64(TempReg);
|
||||||
|
m_RegWorkingSet.SetFPTopAs(m_Opcode.fd);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
CompileCop1Test();
|
CompileCop1Test();
|
||||||
|
|
||||||
if (m_Opcode.fd == m_Opcode.ft)
|
if (m_Opcode.fd == m_Opcode.ft)
|
||||||
|
@ -8428,13 +8505,35 @@ void CX86RecompilerOps::COP1_D_DIV()
|
||||||
m_Assembler.fdiv(asmjit::x86::qword_ptr(TempReg));
|
m_Assembler.fdiv(asmjit::x86::qword_ptr(TempReg));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CX86RecompilerOps::COP1_D_ABS()
|
void CX86RecompilerOps::COP1_D_ABS()
|
||||||
{
|
{
|
||||||
|
if (FpuExceptionInRecompiler())
|
||||||
|
{
|
||||||
|
CompileInitFpuOperation(CRegInfo::RoundDefault);
|
||||||
|
if (m_RegWorkingSet.RegInStack(m_Opcode.fs, CRegInfo::FPU_Any) ||
|
||||||
|
m_RegWorkingSet.RegInStack(m_Opcode.fd, CRegInfo::FPU_Any))
|
||||||
|
{
|
||||||
|
g_Notify->BreakPoint(__FILE__, __LINE__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
asmjit::x86::Gp TempReg = m_RegWorkingSet.FPRValuePointer(m_Opcode.fs, CRegInfo::FPU_Double);
|
||||||
|
CompileCheckFPUInput(TempReg, FpuOpSize_64bit);
|
||||||
|
m_RegWorkingSet.PrepareFPTopToBe(m_Opcode.fd, m_Opcode.fs, CRegInfo::FPU_Double);
|
||||||
|
m_Assembler.fabs();
|
||||||
|
m_Assembler.mov(TempReg, (uint64_t)&m_TempValue64);
|
||||||
|
m_Assembler.fpuStoreQwordFromX86Reg(m_RegWorkingSet.StackTopPos(), TempReg, false);
|
||||||
|
CompileCheckFPUResult64(TempReg);
|
||||||
|
m_RegWorkingSet.SetFPTopAs(m_Opcode.fd);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
CompileCop1Test();
|
CompileCop1Test();
|
||||||
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, m_Opcode.fs, CRegInfo::FPU_Double);
|
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, m_Opcode.fs, CRegInfo::FPU_Double);
|
||||||
m_Assembler.fabs();
|
m_Assembler.fabs();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CX86RecompilerOps::COP1_D_NEG()
|
void CX86RecompilerOps::COP1_D_NEG()
|
||||||
|
@ -8446,9 +8545,30 @@ void CX86RecompilerOps::COP1_D_NEG()
|
||||||
|
|
||||||
void CX86RecompilerOps::COP1_D_SQRT()
|
void CX86RecompilerOps::COP1_D_SQRT()
|
||||||
{
|
{
|
||||||
|
if (FpuExceptionInRecompiler())
|
||||||
|
{
|
||||||
|
CompileInitFpuOperation(CRegInfo::RoundDefault);
|
||||||
|
if (m_RegWorkingSet.RegInStack(m_Opcode.fs, CRegInfo::FPU_Any) ||
|
||||||
|
m_RegWorkingSet.RegInStack(m_Opcode.fd, CRegInfo::FPU_Any))
|
||||||
|
{
|
||||||
|
g_Notify->BreakPoint(__FILE__, __LINE__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
asmjit::x86::Gp TempReg = m_RegWorkingSet.FPRValuePointer(m_Opcode.fs, CRegInfo::FPU_Double);
|
||||||
|
CompileCheckFPUInput(TempReg, FpuOpSize_64bit);
|
||||||
|
m_RegWorkingSet.PrepareFPTopToBe(m_Opcode.fd, m_Opcode.fs, CRegInfo::FPU_Double);
|
||||||
|
m_Assembler.fsqrt();
|
||||||
|
m_Assembler.mov(TempReg, (uint64_t)&m_TempValue64);
|
||||||
|
m_Assembler.fpuStoreQwordFromX86Reg(m_RegWorkingSet.StackTopPos(), TempReg, false);
|
||||||
|
CompileCheckFPUResult64(TempReg);
|
||||||
|
m_RegWorkingSet.SetFPTopAs(m_Opcode.fd);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
CompileCop1Test();
|
CompileCop1Test();
|
||||||
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, m_Opcode.fs, CRegInfo::FPU_Double);
|
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, m_Opcode.fs, CRegInfo::FPU_Double);
|
||||||
m_Assembler.fsqrt();
|
m_Assembler.fsqrt();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CX86RecompilerOps::COP1_D_MOV()
|
void CX86RecompilerOps::COP1_D_MOV()
|
||||||
|
|
Loading…
Reference in New Issue