softfloat: fix floatx80 remainder pseudo-denormal check for zero
The floatx80 remainder implementation ignores the high bit of the significand when checking whether an operand (numerator) with zero exponent is zero. This means it mishandles a pseudo-denormal representation of 0x1p-16382L by treating it as zero. Fix this by checking the whole significand instead. Signed-off-by: Joseph Myers <joseph@codesourcery.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <alpine.DEB.2.21.2006081655180.23637@digraph.polyomino.org.uk> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
6b8b0136ab
commit
499a2f7b55
@ -5741,7 +5741,7 @@ floatx80 floatx80_modrem(floatx80 a, floatx80 b, bool mod,
|
|||||||
normalizeFloatx80Subnormal( bSig, &bExp, &bSig );
|
normalizeFloatx80Subnormal( bSig, &bExp, &bSig );
|
||||||
}
|
}
|
||||||
if ( aExp == 0 ) {
|
if ( aExp == 0 ) {
|
||||||
if ( (uint64_t) ( aSig0<<1 ) == 0 ) return a;
|
if ( aSig0 == 0 ) return a;
|
||||||
normalizeFloatx80Subnormal( aSig0, &aExp, &aSig0 );
|
normalizeFloatx80Subnormal( aSig0, &aExp, &aSig0 );
|
||||||
}
|
}
|
||||||
bSig |= UINT64_C(0x8000000000000000);
|
bSig |= UINT64_C(0x8000000000000000);
|
||||||
|
Loading…
Reference in New Issue
Block a user