1570af302Sopenharmony_ci#include <limits.h>
2570af302Sopenharmony_ci#include <fenv.h>
3570af302Sopenharmony_ci#include "libm.h"
4570af302Sopenharmony_ci
5570af302Sopenharmony_ci
6570af302Sopenharmony_ci#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
7570af302Sopenharmony_cilong lrintl(long double x)
8570af302Sopenharmony_ci{
9570af302Sopenharmony_ci	return lrint(x);
10570af302Sopenharmony_ci}
11570af302Sopenharmony_ci#elif defined(FE_INEXACT)
12570af302Sopenharmony_ci/*
13570af302Sopenharmony_cisee comments in lrint.c
14570af302Sopenharmony_ci
15570af302Sopenharmony_ciNote that if LONG_MAX == 0x7fffffffffffffff && LDBL_MANT_DIG == 64
16570af302Sopenharmony_cithen x == 2**63 - 0.5 is the only input that overflows and
17570af302Sopenharmony_ciraises inexact (with tonearest or upward rounding mode)
18570af302Sopenharmony_ci*/
19570af302Sopenharmony_cilong lrintl(long double x)
20570af302Sopenharmony_ci{
21570af302Sopenharmony_ci	#pragma STDC FENV_ACCESS ON
22570af302Sopenharmony_ci	int e;
23570af302Sopenharmony_ci
24570af302Sopenharmony_ci	e = fetestexcept(FE_INEXACT);
25570af302Sopenharmony_ci	x = rintl(x);
26570af302Sopenharmony_ci	if (!e && (x > LONG_MAX || x < LONG_MIN))
27570af302Sopenharmony_ci		feclearexcept(FE_INEXACT);
28570af302Sopenharmony_ci	/* conversion */
29570af302Sopenharmony_ci	return x;
30570af302Sopenharmony_ci}
31570af302Sopenharmony_ci#else
32570af302Sopenharmony_cilong lrintl(long double x)
33570af302Sopenharmony_ci{
34570af302Sopenharmony_ci	return rintl(x);
35570af302Sopenharmony_ci}
36570af302Sopenharmony_ci#endif
37