unistd: Improve fortify with clang
[glibc.git] / sysdeps / ieee754 / flt-32 / s_rintf.c
blobfe5258ae61d78c33feeb8ac32b55b0ea3084fbf7
1 /* s_rintf.c -- float version of s_rint.c.
2 */
4 /*
5 * ====================================================
6 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
8 * Developed at SunPro, a Sun Microsystems, Inc. business.
9 * Permission to use, copy, modify, and distribute this
10 * software is freely granted, provided that this notice
11 * is preserved.
12 * ====================================================
15 #define NO_MATH_REDIRECT
16 #include <math.h>
17 #include <math_private.h>
18 #include <libm-alias-float.h>
19 #include <math-use-builtins.h>
21 float
22 __rintf (float x)
24 #if USE_RINTF_BUILTIN
25 return __builtin_rintf (x);
26 #else
27 /* Use generic implementation. */
28 static const float
29 TWO23[2] = {
30 8.3886080000e+06, /* 0x4b000000 */
31 -8.3886080000e+06, /* 0xcb000000 */
33 int32_t i0, j0, sx;
34 float w, t;
35 GET_FLOAT_WORD (i0, x);
36 sx = (i0 >> 31) & 1;
37 j0 = ((i0 >> 23) & 0xff) - 0x7f;
38 if (j0 < 23)
40 if(j0 < 0)
42 w = TWO23[sx] + x;
43 t = w - TWO23[sx];
44 GET_FLOAT_WORD (i0, t);
45 SET_FLOAT_WORD (t, (i0 & 0x7fffffff) | (sx << 31));
46 return t;
49 else
51 if (j0 == 0x80)
52 return x + x; /* inf or NaN */
53 else
54 return x; /* x is integral */
56 w = TWO23[sx] + x;
57 return w - TWO23[sx];
58 #endif /* ! USE_RINTF_BUILTIN */
60 #ifndef __rintf
61 libm_alias_float (__rint, rint)
62 #endif