From 97ec1f533b73e5e55fdd277f00eb2f78dd067463 Mon Sep 17 00:00:00 2001 From: zilmar Date: Thu, 7 Mar 2024 20:52:24 +1030 Subject: [PATCH] Core: Make sure precision is set to 53bit --- .../N64System/Recompiler/x86/x86RegInfo.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Source/Project64-core/N64System/Recompiler/x86/x86RegInfo.cpp b/Source/Project64-core/N64System/Recompiler/x86/x86RegInfo.cpp index 7aa83659b..a99d3789b 100644 --- a/Source/Project64-core/N64System/Recompiler/x86/x86RegInfo.cpp +++ b/Source/Project64-core/N64System/Recompiler/x86/x86RegInfo.cpp @@ -287,22 +287,24 @@ void CX86RegInfo::FixRoundModel(FPU_ROUND RoundMethod) m_Assembler.fpuStoreControl(&m_fpuControl, "m_fpuControl"); asmjit::x86::Gp reg = Map_TempReg(x86Reg_Unknown, -1, false, false); m_Assembler.MoveVariableToX86reg(reg, &m_fpuControl, "m_fpuControl"); - m_Assembler.and_(reg, 0xF3FF); + m_Assembler.and_(reg, 0xF0FF); + uint16_t Precision = 0x200; if (RoundMethod == RoundDefault) { asmjit::x86::Gp RoundReg = Map_TempReg(x86Reg_Unknown, -1, false, false); m_Assembler.OrVariableToX86Reg(reg, &CX86RecompilerOps::m_RoundingModeValue, "m_RoundingModeValue"); + m_Assembler.or_(reg, Precision); SetX86Protected(GetIndexFromX86Reg(RoundReg), false); } else { switch (RoundMethod) { - case RoundTruncate: m_Assembler.or_(reg, 0x0C00); break; - case RoundNearest: m_Assembler.or_(reg, 0x0000); break; - case RoundDown: m_Assembler.or_(reg, 0x0400); break; - case RoundUp: m_Assembler.or_(reg, 0x0800); break; + case RoundTruncate: m_Assembler.or_(reg, 0x0C00 | Precision); break; + case RoundNearest: m_Assembler.or_(reg, 0x0000 | Precision); break; + case RoundDown: m_Assembler.or_(reg, 0x0400 | Precision); break; + case RoundUp: m_Assembler.or_(reg, 0x0800 | Precision); break; default: g_Notify->DisplayError("Unknown rounding model"); }