From dd581741d680e270741e3d305a4a7c82717641a3 Mon Sep 17 00:00:00 2001 From: LegendOfDragoon Date: Sun, 22 May 2016 23:47:02 -0700 Subject: [PATCH] Implement COP1_D_ROUND_L in cpu recompiler --- .../N64System/Recompiler/CodeSection.cpp | 1 + .../N64System/Recompiler/RecompilerOps.cpp | 16 ++++++++++++++++ .../N64System/Recompiler/RecompilerOps.h | 1 + 3 files changed, 18 insertions(+) diff --git a/Source/Project64-core/N64System/Recompiler/CodeSection.cpp b/Source/Project64-core/N64System/Recompiler/CodeSection.cpp index ea9fb0888..f98aef1c2 100644 --- a/Source/Project64-core/N64System/Recompiler/CodeSection.cpp +++ b/Source/Project64-core/N64System/Recompiler/CodeSection.cpp @@ -1327,6 +1327,7 @@ bool CCodeSection::GenerateX86Code(uint32_t Test) case R4300i_COP1_FUNCT_NEG: COP1_D_NEG(); break; case R4300i_COP1_FUNCT_SQRT: COP1_D_SQRT(); break; case R4300i_COP1_FUNCT_MOV: COP1_D_MOV(); break; + case R4300i_COP1_FUNCT_ROUND_L: COP1_D_ROUND_L(); break; case R4300i_COP1_FUNCT_TRUNC_L: COP1_D_TRUNC_L(); break; //added by Witten case R4300i_COP1_FUNCT_CEIL_L: COP1_D_CEIL_L(); break; //added by Witten case R4300i_COP1_FUNCT_FLOOR_L: COP1_D_FLOOR_L(); break; //added by Witten diff --git a/Source/Project64-core/N64System/Recompiler/RecompilerOps.cpp b/Source/Project64-core/N64System/Recompiler/RecompilerOps.cpp index 0fe25f0bd..d697e157d 100644 --- a/Source/Project64-core/N64System/Recompiler/RecompilerOps.cpp +++ b/Source/Project64-core/N64System/Recompiler/RecompilerOps.cpp @@ -6308,6 +6308,22 @@ void CRecompilerOps::COP1_D_MOV() Load_FPR_ToTop(m_Opcode.fd, m_Opcode.fs, CRegInfo::FPU_Double); } +void CRecompilerOps::COP1_D_ROUND_L() +{ + CPU_Message(" %X %s", m_CompilePC, R4300iOpcodeName(m_Opcode.Hex, m_CompilePC)); + + m_Section->CompileCop1Test(); + if (RegInStack(m_Opcode.fs, CRegInfo::FPU_Double) || RegInStack(m_Opcode.fs, CRegInfo::FPU_Qword)) + { + UnMap_FPR(m_Opcode.fs, true); + } + if (m_Opcode.fd != m_Opcode.fs || !RegInStack(m_Opcode.fd, CRegInfo::FPU_Double)) + { + Load_FPR_ToTop(m_Opcode.fd, m_Opcode.fs, CRegInfo::FPU_Double); + } + ChangeFPURegFormat(m_Opcode.fd, CRegInfo::FPU_Double, CRegInfo::FPU_Qword, CRegInfo::RoundNearest); +} + void CRecompilerOps::COP1_D_TRUNC_L() //added by Witten { CPU_Message(" %X %s", m_CompilePC, R4300iOpcodeName(m_Opcode.Hex, m_CompilePC)); diff --git a/Source/Project64-core/N64System/Recompiler/RecompilerOps.h b/Source/Project64-core/N64System/Recompiler/RecompilerOps.h index 983f85eb7..281829bba 100644 --- a/Source/Project64-core/N64System/Recompiler/RecompilerOps.h +++ b/Source/Project64-core/N64System/Recompiler/RecompilerOps.h @@ -182,6 +182,7 @@ protected: static void COP1_D_NEG (); static void COP1_D_SQRT (); static void COP1_D_MOV (); + static void COP1_D_ROUND_L (); static void COP1_D_TRUNC_L (); //added by Witten static void COP1_D_CEIL_L (); //added by Witten static void COP1_D_FLOOR_L (); //added by Witten