summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Lioncash2015-02-10 08:16:26 -0500
committerGravatar Lioncash2015-02-10 08:16:26 -0500
commita86d5e2752ffc4a89e4f92a9cb6f00aa3f267e17 (patch)
treec252966c0e57267d1207791736b207caf52625df /src
parentMerge pull request #543 from Alegend45/master (diff)
downloadyuzu-a86d5e2752ffc4a89e4f92a9cb6f00aa3f267e17.tar.gz
yuzu-a86d5e2752ffc4a89e4f92a9cb6f00aa3f267e17.tar.xz
yuzu-a86d5e2752ffc4a89e4f92a9cb6f00aa3f267e17.zip
vfp: Normalize accumulator for multiply accumulate instructions
Diffstat (limited to '')
-rw-r--r--src/core/arm/skyeye_common/vfp/vfpdouble.cpp3
-rw-r--r--src/core/arm/skyeye_common/vfp/vfpsingle.cpp3
2 files changed, 6 insertions, 0 deletions
diff --git a/src/core/arm/skyeye_common/vfp/vfpdouble.cpp b/src/core/arm/skyeye_common/vfp/vfpdouble.cpp
index 2c15db12b..9a7088088 100644
--- a/src/core/arm/skyeye_common/vfp/vfpdouble.cpp
+++ b/src/core/arm/skyeye_common/vfp/vfpdouble.cpp
@@ -908,6 +908,9 @@ vfp_double_multiply_accumulate(ARMul_State* state, int dd, int dn, int dm, u32 f
908 vdp.sign = vfp_sign_negate(vdp.sign); 908 vdp.sign = vfp_sign_negate(vdp.sign);
909 909
910 vfp_double_unpack(&vdn, vfp_get_double(state, dd)); 910 vfp_double_unpack(&vdn, vfp_get_double(state, dd));
911 if (vdn.exponent == 0 && vdn.significand != 0)
912 vfp_double_normalise_denormal(&vdn);
913
911 if (negate & NEG_SUBTRACT) 914 if (negate & NEG_SUBTRACT)
912 vdn.sign = vfp_sign_negate(vdn.sign); 915 vdn.sign = vfp_sign_negate(vdn.sign);
913 916
diff --git a/src/core/arm/skyeye_common/vfp/vfpsingle.cpp b/src/core/arm/skyeye_common/vfp/vfpsingle.cpp
index 678b63f51..8b2dfa388 100644
--- a/src/core/arm/skyeye_common/vfp/vfpsingle.cpp
+++ b/src/core/arm/skyeye_common/vfp/vfpsingle.cpp
@@ -941,6 +941,9 @@ vfp_single_multiply_accumulate(ARMul_State* state, int sd, int sn, s32 m, u32 fp
941 v = vfp_get_float(state, sd); 941 v = vfp_get_float(state, sd);
942 pr_debug("VFP: s%u = %08x\n", sd, v); 942 pr_debug("VFP: s%u = %08x\n", sd, v);
943 vfp_single_unpack(&vsn, v); 943 vfp_single_unpack(&vsn, v);
944 if (vsn.exponent == 0 && vsn.significand != 0)
945 vfp_single_normalise_denormal(&vsn);
946
944 if (negate & NEG_SUBTRACT) 947 if (negate & NEG_SUBTRACT)
945 vsn.sign = vfp_sign_negate(vsn.sign); 948 vsn.sign = vfp_sign_negate(vsn.sign);
946 949