JitArm64: Avoid double rounding in fctiwzx

FCVT doesn't necessarily round to zero, so the result
might be inaccurate if we use it. To ensure correct
rounding, we use FCVTS from double FPR to 32-bit GPR.
Unfortunately, FCVTS can't do double FPR to single FPR.
This commit is contained in:
JosJuice 2020-08-07 22:44:04 +02:00
parent 5ec65a20d6
commit 8b4f16a310
1 changed files with 6 additions and 2 deletions

View File

@ -339,8 +339,12 @@ void JitArm64::fctiwzx(UGeckoInstruction inst)
} }
else else
{ {
m_float_emit.FCVT(32, 64, EncodeRegToDouble(VD), EncodeRegToDouble(VB)); ARM64Reg V1 = gpr.GetReg();
m_float_emit.FCVTS(EncodeRegToSingle(VD), EncodeRegToSingle(VD), ROUND_Z);
m_float_emit.FCVTS(V1, EncodeRegToDouble(VB), ROUND_Z);
m_float_emit.FMOV(EncodeRegToSingle(VD), V1);
gpr.Unlock(V1);
} }
m_float_emit.ORR(EncodeRegToDouble(VD), EncodeRegToDouble(VD), EncodeRegToDouble(V0)); m_float_emit.ORR(EncodeRegToDouble(VD), EncodeRegToDouble(VD), EncodeRegToDouble(V0));
fpr.Unlock(V0); fpr.Unlock(V0);