aboutsummaryrefslogtreecommitdiff
path: root/fpu/softfloat.c
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2020-05-04 23:38:44 +0000
committerRichard Henderson <richard.henderson@linaro.org>2020-05-15 11:04:50 -0700
commit41602807766e253ccb6fb761f3ff12767f786e2c (patch)
tree45d0d63bc499fbe670848855eb250d3979da3ae9 /fpu/softfloat.c
parent7537c2b4a363237534c96d089a02b0712b49d890 (diff)
downloadqemu-41602807766e253ccb6fb761f3ff12767f786e2c.zip
qemu-41602807766e253ccb6fb761f3ff12767f786e2c.tar.gz
qemu-41602807766e253ccb6fb761f3ff12767f786e2c.tar.bz2
softfloat: fix floatx80 pseudo-denormal addition / subtraction
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. Signed-off-by: Joseph Myers <joseph@codesourcery.com> Message-Id: <alpine.DEB.2.21.2005042337570.22972@digraph.polyomino.org.uk> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Diffstat (limited to 'fpu/softfloat.c')
-rw-r--r--fpu/softfloat.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/fpu/softfloat.c b/fpu/softfloat.c
index ac116c7..6094d26 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);
}