1 /* s_ceilf.c -- float version of s_ceil.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
__ceilf(float x)22 __ceilf (float x)
23 {
24 #if USE_CEILF_BUILTIN
25 return __builtin_ceilf (x);
26 #else
27 /* Use generic implementation. */
28 int32_t i0, j0;
29 uint32_t i;
30
31 GET_FLOAT_WORD (i0, x);
32 j0 = ((i0 >> 23) & 0xff) - 0x7f;
33 if (j0 < 23)
34 {
35 if (j0 < 0)
36 {
37 /* return 0 * sign (x) if |x| < 1 */
38 if (i0 < 0)
39 i0 = 0x80000000;
40 else if (i0 != 0)
41 i0 = 0x3f800000;
42 }
43 else
44 {
45 i = (0x007fffff) >> j0;
46 if ((i0 & i) == 0)
47 return x; /* x is integral */
48 if (i0 > 0)
49 i0 += (0x00800000) >> j0;
50 i0 &= (~i);
51 }
52 }
53 else
54 {
55 if (__glibc_unlikely (j0 == 0x80))
56 return x + x; /* inf or NaN */
57 else
58 return x; /* x is integral */
59 }
60 SET_FLOAT_WORD (x, i0);
61 return x;
62 #endif /* ! USE_CEILF_BUILTIN */
63 }
64 #ifndef __ceilf
65 libm_alias_float (__ceil, ceil)
66 #endif
67