summaryrefslogtreecommitdiff
path: root/arch/arm/vfp/vfpsingle.c
diff options
context:
space:
mode:
authorJay Foad <jay.foad@gmail.com>2014-04-14 15:23:15 (GMT)
committerRussell King <rmk+kernel@arm.linux.org.uk>2014-04-14 22:28:24 (GMT)
commit244b478386260a8a9150b501bc97644e2e07f8d3 (patch)
treef7127bc02f4722ab1b47b16920ee402bae68b965 /arch/arm/vfp/vfpsingle.c
parentc39e1ef77c76729f34cdcb09bbb3a5096d91a740 (diff)
downloadlinux-244b478386260a8a9150b501bc97644e2e07f8d3.tar.xz
ARM: 8026/1: Fix emulation of multiply accumulate instructions
The emulation for single and double precision multiply accumulate instructions correctly normalised any denormal values in the operand registers, but failed to normalise the destination (accumulator) register. This fixes https://bugzilla.kernel.org/show_bug.cgi?id=70501 Signed-off-by: Jay Foad <jay.foad@gmail.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/vfp/vfpsingle.c')
-rw-r--r--arch/arm/vfp/vfpsingle.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/arch/arm/vfp/vfpsingle.c b/arch/arm/vfp/vfpsingle.c
index b252631..4f96c16 100644
--- a/arch/arm/vfp/vfpsingle.c
+++ b/arch/arm/vfp/vfpsingle.c
@@ -915,6 +915,8 @@ vfp_single_multiply_accumulate(int sd, int sn, s32 m, u32 fpscr, u32 negate, cha
v = vfp_get_float(sd);
pr_debug("VFP: s%u = %08x\n", sd, v);
vfp_single_unpack(&vsn, v);
+ if (vsn.exponent == 0 && vsn.significand)
+ vfp_single_normalise_denormal(&vsn);
if (negate & NEG_SUBTRACT)
vsn.sign = vfp_sign_negate(vsn.sign);