4
0
mirror of git://sourceware.org/git/newlib-cygwin.git synced 2025-01-17 12:01:53 +08:00
Jeff Johnston 3cc8a378d1 2007-12-19 Dave Korn <dave.korn@artimi.com>
Jeff Johnston  <jjohnstn@redhhat.com>

        * libc/include/_ansi.h: Add _LONG_LONG definition.
        * libc/include/math.h (llrint, llrintf, rintl, lrintl, llrintl): Add
        prototypes.
        * libc/machine/i386/machine/fastmath.h: Add support for new i386
        fast math versions of rint, lrint, and llrint family functions.
        * libm/machine/i386/Makefile.am: Add new files.
        * libm/machine/i386/Makefile.in: Regenerated.
        * libm/machine/i386/f_llrint.c, libm/machine/i386/f_lrint.c,
        libm/machine/i386/f_rint.c, libm/machine/i386/f_llrintf.c,
        libm/machine/i386/f_lrintf.c, libm/machine/i386/f_rintf.c,
        libm/machine/i386/f_llrintl.c, libm/machine/i386/f_lrintl.c,
        libm/machine/i386/f_rintl.c:  New files with fast math implementations.
2007-12-19 22:20:25 +00:00

75 lines
1.9 KiB
C

/*
* ====================================================
* x87 FP implementation contributed to Newlib by
* Dave Korn, November 2007. This file is placed in the
* public domain. Permission to use, copy, modify, and
* distribute this software is freely granted.
* ====================================================
*/
#ifdef __GNUC__
#if !defined(_SOFT_FLOAT)
#include <math.h>
/*
FUNCTION
<<llrint>>, <<llrintf>>, <<llrintl>>---round and convert to long long integer
INDEX
llrint
INDEX
llrintf
INDEX
llrintl
ANSI_SYNOPSIS
#include <math.h>
long long int llrint(double x);
long long int llrintf(float x);
long long int llrintl(long double x);
TRAD_SYNOPSIS
ANSI-only.
DESCRIPTION
The <<llrint>>, <<llrintf>> and <<llrintl>> functions round <[x]> to the nearest integer value,
according to the current rounding direction. If the rounded value is outside the
range of the return type, the numeric result is unspecified. A range error may
occur if the magnitude of <[x]> is too large.
RETURNS
These functions return the rounded integer value of <[x]>.
<<llrint>>, <<llrintf>> and <<llrintl>> return the result as a long long integer.
PORTABILITY
<<llrint>>, <<llrintf>> and <<llrintl>> are ANSI.
<<llrint>>, <<llrintf>> and <<llrintl>> are only available on i386 platforms when
hardware floating point support is available and when compiling with GCC.
*/
/*
* Fast math version of llrint(x)
* Return x rounded to integral value according to the prevailing
* rounding mode.
* Method:
* Using inline x87 asms.
* Exception:
* Governed by x87 FPCR.
*/
long long int _f_llrint (double x)
{
long long int _result;
asm ("fistpll %0" : "=m" (_result) : "t" (x) : "st");
return _result;
}
/* For now, we only have the fast math version. */
long long int llrint (double x) {
return _f_llrint(x);
}
#endif /* !_SOFT_FLOAT */
#endif /* __GNUC__ */