1 /* s_nearbyintl.c -- long double version of s_nearbyint.c.
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
12 * ====================================================
17 * Return x rounded to integral value according to the prevailing
20 * Using floating addition.
22 * Inexact flag raised if x not equal to rintl(x).
27 #include <math-barriers.h>
28 #include <math_private.h>
29 #include <libm-alias-ldouble.h>
30 #include <math-use-builtins.h>
33 __nearbyintl (_Float128 x
)
35 #if USE_NEARBYINTL_BUILTIN
36 return __builtin_nearbyintl (x
);
38 /* Use generic implementation. */
39 static const _Float128
41 L(5.19229685853482762853049632922009600E+33), /* 0x406F000000000000, 0 */
42 L(-5.19229685853482762853049632922009600E+33) /* 0xC06F000000000000, 0 */
46 uint64_t i1
__attribute__ ((unused
));
48 GET_LDOUBLE_WORDS64 (i0
, i1
, x
);
49 sx
= (((uint64_t) i0
) >> 63);
50 j0
= ((i0
>> 48) & 0x7fff) - 0x3fff;
56 w
= TWO112
[sx
] + math_opt_barrier (x
);
60 GET_LDOUBLE_MSW64 (i0
, t
);
61 SET_LDOUBLE_MSW64 (t
, (i0
& 0x7fffffffffffffffLL
) | (sx
<< 63));
68 return x
+ x
; /* inf or NaN */
70 return x
; /* x is integral */
73 w
= TWO112
[sx
] + math_opt_barrier (x
);
78 #endif /* ! USE_NEARBYINTL_BUILTIN */
80 libm_alias_ldouble (__nearbyint
, nearbyint
)