Joseph Myers <jos...@codesourcery.com> writes:

> The softfloat function addFloatx80Sigs, used for addition of values
> with the same sign and subtraction of values with opposite sign, fails
> to handle the case where the two values both have biased exponent zero
> and there is a carry resulting from adding the significands, which can
> occur if one or both values are pseudo-denormals (biased exponent
> zero, explicit integer bit 1).  Add a check for that case, so making
> the results match those seen on x86 hardware for pseudo-denormals.

Hmm running the super detailed test:

  fp-test -s -l 2 -r all  extF80_add extF80_sub

I don't see any difference between before and after the patch. This
makes me wonder if we are (or rather TestFloat) is missing something in
it's test case.

>
> Signed-off-by: Joseph Myers <jos...@codesourcery.com>
> ---
>  fpu/softfloat.c | 6 ++++++
>  1 file changed, 6 insertions(+)
>
> diff --git a/fpu/softfloat.c b/fpu/softfloat.c
> index ac116c70b8..6094d267b5 100644
> --- a/fpu/softfloat.c
> +++ b/fpu/softfloat.c
> @@ -5866,6 +5866,12 @@ static floatx80 addFloatx80Sigs(floatx80 a, floatx80 
> b, flag zSign,
>          zSig1 = 0;
>          zSig0 = aSig + bSig;
>          if ( aExp == 0 ) {
> +            if ((aSig | bSig) & UINT64_C(0x8000000000000000) && zSig0 < 
> aSig) {
> +                /* At least one of the values is a pseudo-denormal,
> +                 * and there is a carry out of the result.  */
> +                zExp = 1;
> +                goto shiftRight1;
> +            }
>              if (zSig0 == 0) {
>                  return packFloatx80(zSign, 0, 0);
>              }
> -- 
> 2.17.1


-- 
Alex Bennée

Reply via email to