1 /* s_rintf.c -- float version of s_rint.c.
2  */
3 
4 /*
5  * ====================================================
6  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
7  *
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  * ====================================================
13  */
14 
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>
20 
21 float
__rintf(float x)22 __rintf (float x)
23 {
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 */
32   };
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)
39     {
40       if(j0 < 0)
41 	{
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;
47 	}
48     }
49   else
50     {
51       if (j0 == 0x80)
52 	return x + x;		/* inf or NaN  */
53       else
54 	return x;		/* x is integral  */
55     }
56   w = TWO23[sx] + x;
57   return w - TWO23[sx];
58 #endif /* ! USE_RINTF_BUILTIN  */
59 }
60 #ifndef __rintf
61 libm_alias_float (__rint, rint)
62 #endif
63