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>
This commit is contained in:
parent
c39e1ef77c
commit
244b478386
|
@ -866,6 +866,8 @@ vfp_double_multiply_accumulate(int dd, int dn, int dm, u32 fpscr, u32 negate, ch
|
||||||
vdp.sign = vfp_sign_negate(vdp.sign);
|
vdp.sign = vfp_sign_negate(vdp.sign);
|
||||||
|
|
||||||
vfp_double_unpack(&vdn, vfp_get_double(dd));
|
vfp_double_unpack(&vdn, vfp_get_double(dd));
|
||||||
|
if (vdn.exponent == 0 && vdn.significand)
|
||||||
|
vfp_double_normalise_denormal(&vdn);
|
||||||
if (negate & NEG_SUBTRACT)
|
if (negate & NEG_SUBTRACT)
|
||||||
vdn.sign = vfp_sign_negate(vdn.sign);
|
vdn.sign = vfp_sign_negate(vdn.sign);
|
||||||
|
|
||||||
|
|
|
@ -915,6 +915,8 @@ vfp_single_multiply_accumulate(int sd, int sn, s32 m, u32 fpscr, u32 negate, cha
|
||||||
v = vfp_get_float(sd);
|
v = vfp_get_float(sd);
|
||||||
pr_debug("VFP: s%u = %08x\n", sd, v);
|
pr_debug("VFP: s%u = %08x\n", sd, v);
|
||||||
vfp_single_unpack(&vsn, v);
|
vfp_single_unpack(&vsn, v);
|
||||||
|
if (vsn.exponent == 0 && vsn.significand)
|
||||||
|
vfp_single_normalise_denormal(&vsn);
|
||||||
if (negate & NEG_SUBTRACT)
|
if (negate & NEG_SUBTRACT)
|
||||||
vsn.sign = vfp_sign_negate(vsn.sign);
|
vsn.sign = vfp_sign_negate(vsn.sign);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue