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