]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - sysdeps/ieee754/flt-32/s_lrintf.c
Update copyright dates with scripts/update-copyrights.
[thirdparty/glibc.git] / sysdeps / ieee754 / flt-32 / s_lrintf.c
index 9f3d5f084dbe8be02131b4052db5faef7993a19b..03c1cedb8af4b6f975b4adafa321dbd88f2a736a 100644 (file)
@@ -1,6 +1,6 @@
 /* Round argument to nearest integral value according to current rounding
    direction.
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2019 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
 
    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-narrow-eval.h>
 #include <math_private.h>
+#include <libm-alias-float.h>
+#include <fix-fp-int-convert-overflow.h>
 
 static const float two23[2] =
 {
@@ -33,8 +38,8 @@ long int
 __lrintf (float x)
 {
   int32_t j0;
-  u_int32_t i0;
-  volatile float w;
+  uint32_t i0;
+  float w;
   float t;
   long int result;
   int sx;
@@ -52,7 +57,7 @@ __lrintf (float x)
        result = (long int) i0 << (j0 - 23);
       else
        {
-         w = two23[sx] + x;
+         w = math_narrow_eval (two23[sx] + x);
          t = w - two23[sx];
          GET_FLOAT_WORD (i0, t);
          j0 = ((i0 >> 23) & 0xff) - 0x7f;
@@ -64,12 +69,20 @@ __lrintf (float 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 LONG_MIN,
+        FE_INVALID must be raised and the return value is
+        unspecified.  */
+      if (FIX_FLT_LONG_CONVERT_OVERFLOW && x != (float) LONG_MIN)
+       {
+         feraiseexcept (FE_INVALID);
+         return sx == 0 ? LONG_MAX : LONG_MIN;
+       }
+#endif
       return (long int) x;
     }
 
   return sx ? -result : result;
 }
 
-weak_alias (__lrintf, lrintf)
+libm_alias_float (__lrint, lrint)