From 2ed03c10e03bbd0f513d157c577f1c75ae9ede5b Mon Sep 17 00:00:00 2001 From: Normmatt Date: Tue, 16 Dec 2014 05:53:19 -0500 Subject: [PATCH 1/2] armemu: Fix FSUBS bug where NaN shouldn't be negated --- src/core/arm/skyeye_common/vfp/vfpsingle.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/core/arm/skyeye_common/vfp/vfpsingle.cpp b/src/core/arm/skyeye_common/vfp/vfpsingle.cpp index 8719004976..f5410fd9ab 100644 --- a/src/core/arm/skyeye_common/vfp/vfpsingle.cpp +++ b/src/core/arm/skyeye_common/vfp/vfpsingle.cpp @@ -1148,7 +1148,10 @@ static u32 vfp_single_fsub(ARMul_State* state, int sd, int sn, s32 m, u32 fpscr) /* * Subtraction is addition with one sign inverted. */ - return vfp_single_fadd(state, sd, sn, vfp_single_packed_negate(m), fpscr); + if (m != 0x7FC00000) // Only negate if m isn't NaN. + m = vfp_single_packed_negate(m); + + return vfp_single_fadd(state, sd, sn, m, fpscr); } /* From 9c127f4a01fee95632336d53269cdf1c64ea37a3 Mon Sep 17 00:00:00 2001 From: Normmatt Date: Tue, 16 Dec 2014 05:56:01 -0500 Subject: [PATCH 2/2] armemu: Fix FTOUI NaN sign. --- src/core/arm/skyeye_common/vfp/vfpsingle.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/arm/skyeye_common/vfp/vfpsingle.cpp b/src/core/arm/skyeye_common/vfp/vfpsingle.cpp index f5410fd9ab..6c33d8b782 100644 --- a/src/core/arm/skyeye_common/vfp/vfpsingle.cpp +++ b/src/core/arm/skyeye_common/vfp/vfpsingle.cpp @@ -614,7 +614,7 @@ static u32 vfp_single_ftoui(ARMul_State* state, int sd, int unused, s32 m, u32 f exceptions |= FPSCR_IDC; if (tm & VFP_NAN) - vsm.sign = 0; + vsm.sign = 1; if (vsm.exponent >= 127 + 32) { d = vsm.sign ? 0 : 0xffffffff;