提交 b662495d 编写于 作者: J Joseph Myers 提交者: Paolo Bonzini

softfloat: do not return pseudo-denormal from floatx80 remainder

The floatx80 remainder implementation sometimes returns the numerator
unchanged when the denominator is sufficiently larger than the
numerator.  But if the value to be returned unchanged is a
pseudo-denormal, that is incorrect.  Fix it to normalize the numerator
in that case.
Signed-off-by: NJoseph Myers <joseph@codesourcery.com>
Reviewed-by: NRichard Henderson <richard.henderson@linaro.org>
Message-Id: <alpine.DEB.2.21.2006081655520.23637@digraph.polyomino.org.uk>
Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
上级 499a2f7b
......@@ -5706,7 +5706,7 @@ floatx80 floatx80_modrem(floatx80 a, floatx80 b, bool mod,
float_status *status)
{
bool aSign, zSign;
int32_t aExp, bExp, expDiff;
int32_t aExp, bExp, expDiff, aExpOrig;
uint64_t aSig0, aSig1, bSig;
uint64_t q, term0, term1, alternateASig0, alternateASig1;
......@@ -5715,7 +5715,7 @@ floatx80 floatx80_modrem(floatx80 a, floatx80 b, bool mod,
return floatx80_default_nan(status);
}
aSig0 = extractFloatx80Frac( a );
aExp = extractFloatx80Exp( a );
aExpOrig = aExp = extractFloatx80Exp( a );
aSign = extractFloatx80Sign( a );
bSig = extractFloatx80Frac( b );
bExp = extractFloatx80Exp( b );
......@@ -5730,6 +5730,13 @@ floatx80 floatx80_modrem(floatx80 a, floatx80 b, bool mod,
if ((uint64_t)(bSig << 1)) {
return propagateFloatx80NaN(a, b, status);
}
if (aExp == 0 && aSig0 >> 63) {
/*
* Pseudo-denormal argument must be returned in normalized
* form.
*/
return packFloatx80(aSign, 1, aSig0);
}
return a;
}
if ( bExp == 0 ) {
......@@ -5749,7 +5756,16 @@ floatx80 floatx80_modrem(floatx80 a, floatx80 b, bool mod,
expDiff = aExp - bExp;
aSig1 = 0;
if ( expDiff < 0 ) {
if ( mod || expDiff < -1 ) return a;
if ( mod || expDiff < -1 ) {
if (aExp == 1 && aExpOrig == 0) {
/*
* Pseudo-denormal argument must be returned in
* normalized form.
*/
return packFloatx80(aSign, aExp, aSig0);
}
return a;
}
shift128Right( aSig0, 0, 1, &aSig0, &aSig1 );
expDiff = 0;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册