diff options
Diffstat (limited to 'newlib/libm')
-rw-r--r-- | newlib/libm/ld/s_fmal.c | 14 | ||||
-rw-r--r-- | newlib/libm/ld/s_lrint.c | 2 | ||||
-rw-r--r-- | newlib/libm/ld/s_lround.c | 2 |
3 files changed, 16 insertions, 2 deletions
diff --git a/newlib/libm/ld/s_fmal.c b/newlib/libm/ld/s_fmal.c index a379346c1..281dd685b 100644 --- a/newlib/libm/ld/s_fmal.c +++ b/newlib/libm/ld/s_fmal.c @@ -199,27 +199,37 @@ fmal(long double x, long double y, long double z) * modes other than FE_TONEAREST are painful. */ if (spread < -LDBL_MANT_DIG) { +#ifdef FE_INEXACT feraiseexcept(FE_INEXACT); +#endif +#ifdef FE_UNDERFLOW if (!isnormal(z)) feraiseexcept(FE_UNDERFLOW); +#endif switch (oround) { - case FE_TONEAREST: + default: /* FE_TONEAREST */ return (z); +#ifdef FE_TOWARDZERO case FE_TOWARDZERO: if (x > 0.0 ^ y < 0.0 ^ z < 0.0) return (z); else return (nextafterl(z, 0)); +#endif +#ifdef FE_DOWNWARD case FE_DOWNWARD: if (x > 0.0 ^ y < 0.0) return (z); else return (nextafterl(z, -INFINITY)); - default: /* FE_UPWARD */ +#endif +#ifdef FE_UPWARD + case FE_UPWARD: if (x > 0.0 ^ y < 0.0) return (nextafterl(z, INFINITY)); else return (z); +#endif } } if (spread <= LDBL_MANT_DIG * 2) diff --git a/newlib/libm/ld/s_lrint.c b/newlib/libm/ld/s_lrint.c index ad9b978fa..dde3cc434 100644 --- a/newlib/libm/ld/s_lrint.c +++ b/newlib/libm/ld/s_lrint.c @@ -53,8 +53,10 @@ fn(type x) feholdexcept(&env); d = (dtype)roundit(x); +#if defined(FE_INVALID) && defined(FE_INEXACT) if (fetestexcept(FE_INVALID)) feclearexcept(FE_INEXACT); +#endif feupdateenv(&env); return (d); } diff --git a/newlib/libm/ld/s_lround.c b/newlib/libm/ld/s_lround.c index f67f9fbeb..fefafa877 100644 --- a/newlib/libm/ld/s_lround.c +++ b/newlib/libm/ld/s_lround.c @@ -64,7 +64,9 @@ fn(type x) x = roundit(x); return ((dtype)x); } else { +#ifdef FE_INVALID feraiseexcept(FE_INVALID); +#endif return (DTYPE_MAX); } } |