aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/ieee754/dbl-64
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/ieee754/dbl-64')
-rw-r--r--sysdeps/ieee754/dbl-64/s_llrint.c15
-rw-r--r--sysdeps/ieee754/dbl-64/s_llround.c15
-rw-r--r--sysdeps/ieee754/dbl-64/s_lrint.c6
-rw-r--r--sysdeps/ieee754/dbl-64/s_lround.c15
4 files changed, 45 insertions, 6 deletions
diff --git a/sysdeps/ieee754/dbl-64/s_llrint.c b/sysdeps/ieee754/dbl-64/s_llrint.c
index 048331e9a7..1673527ba4 100644
--- a/sysdeps/ieee754/dbl-64/s_llrint.c
+++ b/sysdeps/ieee754/dbl-64/s_llrint.c
@@ -18,9 +18,12 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
+#include <fenv.h>
+#include <limits.h>
#include <math.h>
#include <math_private.h>
+#include <fix-fp-int-convert-overflow.h>
static const double two52[2] =
{
@@ -77,8 +80,16 @@ __llrint (double x)
}
else
{
- /* The number is too large. It is left implementation defined
- what happens. */
+#ifdef FE_INVALID
+ /* The number is too large. Unless it rounds to LLONG_MIN,
+ FE_INVALID must be raised and the return value is
+ unspecified. */
+ if (FIX_DBL_LLONG_CONVERT_OVERFLOW && x != (double) LLONG_MIN)
+ {
+ feraiseexcept (FE_INVALID);
+ return sx == 0 ? LLONG_MAX : LLONG_MIN;
+ }
+#endif
return (long long int) x;
}
diff --git a/sysdeps/ieee754/dbl-64/s_llround.c b/sysdeps/ieee754/dbl-64/s_llround.c
index c8b3c190b5..77ad3c3e89 100644
--- a/sysdeps/ieee754/dbl-64/s_llround.c
+++ b/sysdeps/ieee754/dbl-64/s_llround.c
@@ -17,9 +17,12 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
+#include <fenv.h>
+#include <limits.h>
#include <math.h>
#include <math_private.h>
+#include <fix-fp-int-convert-overflow.h>
long long int
@@ -65,8 +68,16 @@ __llround (double x)
}
else
{
- /* The number is too large. It is left implementation defined
- what happens. */
+#ifdef FE_INVALID
+ /* The number is too large. Unless it rounds to LLONG_MIN,
+ FE_INVALID must be raised and the return value is
+ unspecified. */
+ if (FIX_DBL_LLONG_CONVERT_OVERFLOW && x != (double) LLONG_MIN)
+ {
+ feraiseexcept (FE_INVALID);
+ return sign == 1 ? LLONG_MAX : LLONG_MIN;
+ }
+#endif
return (long long int) x;
}
diff --git a/sysdeps/ieee754/dbl-64/s_lrint.c b/sysdeps/ieee754/dbl-64/s_lrint.c
index d004594bc2..3fdb05ecf7 100644
--- a/sysdeps/ieee754/dbl-64/s_lrint.c
+++ b/sysdeps/ieee754/dbl-64/s_lrint.c
@@ -23,6 +23,7 @@
#include <math.h>
#include <math_private.h>
+#include <fix-fp-int-convert-overflow.h>
static const double two52[2] =
{
@@ -107,6 +108,11 @@ __lrint (double x)
feraiseexcept (t == LONG_MIN ? FE_INEXACT : FE_INVALID);
return LONG_MIN;
}
+ else if (FIX_DBL_LONG_CONVERT_OVERFLOW && x != (double) LONG_MIN)
+ {
+ feraiseexcept (FE_INVALID);
+ return sx == 0 ? LONG_MAX : LONG_MIN;
+ }
#endif
return (long int) x;
}
diff --git a/sysdeps/ieee754/dbl-64/s_lround.c b/sysdeps/ieee754/dbl-64/s_lround.c
index 91b17b0de9..699eafb010 100644
--- a/sysdeps/ieee754/dbl-64/s_lround.c
+++ b/sysdeps/ieee754/dbl-64/s_lround.c
@@ -22,6 +22,7 @@
#include <math.h>
#include <math_private.h>
+#include <fix-fp-int-convert-overflow.h>
long int
@@ -80,8 +81,18 @@ __lround (double x)
FE_INVALID must be raised and the return value is
unspecified. */
#ifdef FE_INVALID
- if (sizeof (long int) == 4
- && x <= (double) LONG_MIN - 0.5)
+ if (FIX_DBL_LONG_CONVERT_OVERFLOW
+ && !(sign == -1
+ && (sizeof (long int) == 4
+ ? x > (double) LONG_MIN - 0.5
+ : x >= (double) LONG_MIN)))
+ {
+ feraiseexcept (FE_INVALID);
+ return sign == 1 ? LONG_MAX : LONG_MIN;
+ }
+ else if (!FIX_DBL_LONG_CONVERT_OVERFLOW
+ && sizeof (long int) == 4
+ && x <= (double) LONG_MIN - 0.5)
{
/* If truncation produces LONG_MIN, the cast will not raise
the exception, but may raise "inexact". */