提交 9ecaf5cc 编写于 作者: J Joseph Myers 提交者: Richard Henderson

softfloat: fix floatx80 pseudo-denormal round to integer

The softfloat function floatx80_round_to_int incorrectly handles the
case of a pseudo-denormal where only the high bit of the significand
is set, ignoring that bit (treating the number as an exact zero)
rather than treating the number as an alternative representation of
+/- 2^-16382 (which may round to +/- 1 depending on the rounding mode)
as hardware does.  Fix this check (simplifying the code in the
process).
Signed-off-by: NJoseph Myers <joseph@codesourcery.com>
Message-Id: <alpine.DEB.2.21.2005042339420.22972@digraph.polyomino.org.uk>
Signed-off-by: NRichard Henderson <richard.henderson@linaro.org>
上级 be53fa78
......@@ -5741,7 +5741,7 @@ floatx80 floatx80_round_to_int(floatx80 a, float_status *status)
}
if ( aExp < 0x3FFF ) {
if ( ( aExp == 0 )
&& ( (uint64_t) ( extractFloatx80Frac( a )<<1 ) == 0 ) ) {
&& ( (uint64_t) ( extractFloatx80Frac( a ) ) == 0 ) ) {
return a;
}
status->float_exception_flags |= float_flag_inexact;
......
......@@ -14,6 +14,7 @@ volatile long double ld_res;
int main(void)
{
short cw;
int ret = 0;
ld_res = ld_pseudo_m16382.ld + ld_pseudo_m16382.ld;
if (ld_res != 0x1p-16381L) {
......@@ -24,5 +25,14 @@ int main(void)
printf("FAIL: pseudo-denormal compare\n");
ret = 1;
}
/* Set round-upward. */
__asm__ volatile ("fnstcw %0" : "=m" (cw));
cw = (cw & ~0xc00) | 0x800;
__asm__ volatile ("fldcw %0" : : "m" (cw));
__asm__ ("frndint" : "=t" (ld_res) : "0" (ld_pseudo_m16382.ld));
if (ld_res != 1.0L) {
printf("FAIL: pseudo-denormal round-to-integer\n");
ret = 1;
}
return ret;
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册