alpha: fix rint on sNaN input

The alpha version of rint wrongly return sNaN for sNaN input. Fix that
by checking for NaN and by returning the input value added with itself
in that case.

Changelog:
	* sysdeps/alpha/fpu/s_rint.c (__rint): Add argument with itself
	when it is a NaN.
	* sysdeps/alpha/fpu/s_rintf.c (__rintf): Likewise.
This commit is contained in:
Aurelien Jarno 2016-08-02 09:18:59 +02:00
parent 65cc568cf5
commit cb7f9d63b9
3 changed files with 9 additions and 0 deletions

View File

@ -8,6 +8,9 @@
when it is a NaN. when it is a NaN.
[_IEEE_FP_INEXACT] Remove. [_IEEE_FP_INEXACT] Remove.
* sysdeps/alpha/fpu/s_floorf.c (__floorf): Likewise. * sysdeps/alpha/fpu/s_floorf.c (__floorf): Likewise.
* sysdeps/alpha/fpu/s_rint.c (__rint): Add argument with itself
when it is a NaN.
* sysdeps/alpha/fpu/s_rintf.c (__rintf): Likewise.
2016-08-01 Carlos O'Donell <carlos@redhat.com> 2016-08-01 Carlos O'Donell <carlos@redhat.com>

View File

@ -23,6 +23,9 @@
double double
__rint (double x) __rint (double x)
{ {
if (isnan (x))
return x + x;
if (isless (fabs (x), 9007199254740992.0)) /* 1 << DBL_MANT_DIG */ if (isless (fabs (x), 9007199254740992.0)) /* 1 << DBL_MANT_DIG */
{ {
double tmp1, new_x; double tmp1, new_x;

View File

@ -22,6 +22,9 @@
float float
__rintf (float x) __rintf (float x)
{ {
if (isnanf (x))
return x + x;
if (isless (fabsf (x), 16777216.0f)) /* 1 << FLT_MANT_DIG */ if (isless (fabsf (x), 16777216.0f)) /* 1 << FLT_MANT_DIG */
{ {
/* Note that Alpha S_Floating is stored in registers in a /* Note that Alpha S_Floating is stored in registers in a