blob: 15ab6a57545bd2922dcb29fe7422c69c94cc98cb [file] [log] [blame]
Viet-Trung Luu96b05c12016-01-11 11:26:36 -08001#include <limits.h>
2#include <fenv.h>
3#include "libm.h"
4
Viet-Trung Luu96b05c12016-01-11 11:26:36 -08005#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
George Kulakowski17e3b042016-02-18 15:59:50 -08006long long llrintl(long double x) {
7 return llrint(x);
Viet-Trung Luu96b05c12016-01-11 11:26:36 -08008}
9#elif defined(FE_INEXACT)
10/*
11see comments in lrint.c
12
13Note that if LLONG_MAX == 0x7fffffffffffffff && LDBL_MANT_DIG == 64
14then x == 2**63 - 0.5 is the only input that overflows and
15raises inexact (with tonearest or upward rounding mode)
16*/
George Kulakowski17e3b042016-02-18 15:59:50 -080017long long llrintl(long double x) {
18 PRAGMA_STDC_FENV_ACCESS_ON
19 int e;
Viet-Trung Luu96b05c12016-01-11 11:26:36 -080020
George Kulakowski17e3b042016-02-18 15:59:50 -080021 e = fetestexcept(FE_INEXACT);
22 x = rintl(x);
23 if (!e && (x > LLONG_MAX || x < LLONG_MIN))
24 feclearexcept(FE_INEXACT);
25 /* conversion */
26 return x;
Viet-Trung Luu96b05c12016-01-11 11:26:36 -080027}
28#else
George Kulakowski17e3b042016-02-18 15:59:50 -080029long long llrintl(long double x) {
30 return rintl(x);
Viet-Trung Luu96b05c12016-01-11 11:26:36 -080031}
32#endif