alpha: fix floor on sNaN input
The alpha version of floor wrongly return sNaN for sNaN input. Fix that by checking for NaN and by returning the input value added with itself in that case. Finally remove the code to handle inexact exception, floor should never generate such an exception. Changelog: * sysdeps/alpha/fpu/s_floor.c (__floor): Add argument with itself when it is a NaN. [_IEEE_FP_INEXACT] Remove. * sysdeps/alpha/fpu/s_floorf.c (__floorf): Likewise.
This commit is contained in:
parent
062e53c195
commit
65cc568cf5
|
@ -4,6 +4,10 @@
|
|||
when it is a NaN.
|
||||
[_IEEE_FP_INEXACT] Remove.
|
||||
* sysdeps/alpha/fpu/s_ceilf.c (__ceilf): Likewise.
|
||||
* sysdeps/alpha/fpu/s_floor.c (__floor): Add argument with itself
|
||||
when it is a NaN.
|
||||
[_IEEE_FP_INEXACT] Remove.
|
||||
* sysdeps/alpha/fpu/s_floorf.c (__floorf): Likewise.
|
||||
|
||||
2016-08-01 Carlos O'Donell <carlos@redhat.com>
|
||||
|
||||
|
|
|
@ -27,16 +27,15 @@
|
|||
double
|
||||
__floor (double x)
|
||||
{
|
||||
if (isnan (x))
|
||||
return x + x;
|
||||
|
||||
if (isless (fabs (x), 9007199254740992.0)) /* 1 << DBL_MANT_DIG */
|
||||
{
|
||||
double tmp1, new_x;
|
||||
|
||||
__asm (
|
||||
#ifdef _IEEE_FP_INEXACT
|
||||
"cvttq/svim %2,%1\n\t"
|
||||
#else
|
||||
"cvttq/svm %2,%1\n\t"
|
||||
#endif
|
||||
"cvtqt/m %1,%0\n\t"
|
||||
: "=f"(new_x), "=&f"(tmp1)
|
||||
: "f"(x));
|
||||
|
|
|
@ -26,6 +26,9 @@
|
|||
float
|
||||
__floorf (float x)
|
||||
{
|
||||
if (isnanf (x))
|
||||
return x + x;
|
||||
|
||||
if (isless (fabsf (x), 16777216.0f)) /* 1 << FLT_MANT_DIG */
|
||||
{
|
||||
/* Note that Alpha S_Floating is stored in registers in a
|
||||
|
@ -36,11 +39,7 @@ __floorf (float x)
|
|||
float tmp1, tmp2, new_x;
|
||||
|
||||
__asm ("cvtst/s %3,%2\n\t"
|
||||
#ifdef _IEEE_FP_INEXACT
|
||||
"cvttq/svim %2,%1\n\t"
|
||||
#else
|
||||
"cvttq/svm %2,%1\n\t"
|
||||
#endif
|
||||
"cvtqt/m %1,%0\n\t"
|
||||
: "=f"(new_x), "=&f"(tmp1), "=&f"(tmp2)
|
||||
: "f"(x));
|
||||
|
|
Loading…
Reference in New Issue