diff options
author | Ulrich Drepper <drepper@redhat.com> | 1997-03-04 05:53:28 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1997-03-04 05:53:28 +0000 |
commit | 377a515b4ce100dc119db09a7bc1d7628136993a (patch) | |
tree | 92bcdcc43bde79c11ac56b74f05ad4a4dcf3dd96 /sysdeps/m68k/fpu/__math.h | |
parent | (__need_error_t): New macro, before including <errno.h>. [!__const] (__cons... (diff) | |
download | glibc-377a515b4ce100dc119db09a7bc1d7628136993a.tar.gz glibc-377a515b4ce100dc119db09a7bc1d7628136993a.tar.bz2 glibc-377a515b4ce100dc119db09a7bc1d7628136993a.zip |
update from main archive 970304cvs/libc-970307cvs/libc-970306cvs/libc-970305cvs/libc-970304
1997-03-04 04:31 Ulrich Drepper <drepper@cygnus.com>
* Makerules: Add rules to handle versioning.
* config.h.in (DO_VERSIONING): New macro.
* config.make.in (versioning): New variable.
* configure.in: Add checks for .symver directive in gas and
--version-script option to ld. Define DO_VERSIONING and
versioning if appropriate.
* math/Makefile (routines): Add s_signbit, s_fpclassify, s_fmax,
s_fmin, and s_fdim.
* math/math.h: Define ISO C 9X constants, macros and functions.
* math/mathcalls.h: Likewise.
* sysdeps/libm-ieee754/s_fdim.c: New file.
* sysdeps/libm-ieee754/s_fdimf.c: New file.
* sysdeps/libm-ieee754/s_fdiml.c: New file.
* sysdeps/libm-ieee754/s_fmax.c: New file.
* sysdeps/libm-ieee754/s_fmaxf.c: New file.
* sysdeps/libm-ieee754/s_fmaxl.c: New file.
* sysdeps/libm-ieee754/s_fmin.c: New file.
* sysdeps/libm-ieee754/s_fminf.c: New file.
* sysdeps/libm-ieee754/s_fminl.c: New file.
* sysdeps/libm-ieee754/s_fpclassify.c: New file.
* sysdeps/libm-ieee754/s_fpclassifyf.c: New file.
* sysdeps/libm-ieee754/s_fpclassifyl.c: New file.
* sysdeps/libm-ieee754/s_signbit.c: New file.
* sysdeps/libm-ieee754/s_signbitf.c: New file.
* sysdeps/libm-ieee754/s_signbitl.c: New file.
* stdio-common/printf_fphex.c: Correct printing of decimal point
character.
Simplify conversion of mantissa to string.
* stdio-common/vfscanf.c: Handle %A format.
Optimize termination of floating-point scanning.
* stdio-common/tstscanf.c (main): Add new test to scanf to test
scanning float values with given width.
* stdlib/strtod.c: Add handling of floating-point numbers in
hexadecimal notation.
* stdlib/stdlib.h: Use __USE_ISOC9X feature macro for new long long
functions.
Pretty print #if directives.
* string/string.h: Pretty print #if directives.
* sysdeps/ieee754/dbl2mpn.c: Update copyright.
* sysdeps/ieee754/ldbl2mpn.c: Likewise.
* sysdeps/ieee754/mpn2dbl.c: Likewise.
* sysdeps/ieee754/mpn2flt.c: Likewise.
* sysdeps/ieee754/mpn2ldbl.c: Likewise.
* sysdeps/unix/sysv/linux/poll.c: Implement poll function by
falling back to select-based implementation if syscall isn't
available.
* sysdeps/unix/sysv/linux/syscalls.list: Add s_poll.
* time/leapseconds: Update from tzdata1997b.
* time/zic.c: Update from tzcode1997b.
1997-03-01 15:08 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* time/Makefile $(tzfiles:%=$(objpfx)z.%): Remove unneeded
depedencies between installed $(tzlinks) and $(tzbases) files.
1997-03-01 14:27 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* math/math.h: Make compatible with traditional preprocessor;
requires carefull placement of whitespace in macro arguments.
Use __CONCAT instead of ##.
Declare long double functions only if __STDC__ or __GNUC__.
* math/mathcall.h: Avoid whitespace before argument of macro call
that is used as function name.
* sysdeps/m68k/fpu/__math.h: Use __CONCAT instead of ##.
(__m81_u, __m81_inline): Depend on __LIBC_M81_MATH_INLINES instead
of __NO_M81_MATH_INLINES.
[!__LIBC_M81_MATH_INLINES]: Don't define internal functions
starting with __ieee754.
[!__NO_MATH_INLINES && __OPTIMIZE__]: Define user visible
functions as inlines.
(__m81_defun): Put __attribute__ between return type and function
name.
* math/math.h: Include <__math.h> also if __LIBC_M81_MATH_INLINES
is defined.
* sysdeps/m68k/fpu/e_acos.c: Define __LIBC_M81_MATH_INLINES
instead of __NO_M81_MATH_INLINES.
* sysdeps/m68k/fpu/e_fmod.c: Likewise.
* sysdeps/m68k/fpu/k_cos.c: Likewise.
* sysdeps/m68k/fpu/k_sin.c: Likewise.
* sysdeps/m68k/fpu/k_tan.c: Likewise.
* sysdeps/m68k/fpu/s_atan.c: Likewise. De-ANSI-declify.
* sysdeps/m68k/fpu/s_frexp.c: Likewise.
* sysdeps/m68k/fpu/s_ilogb.c: Likewise.
* sysdeps/m68k/fpu/s_isinf.c: Likewise.
* sysdeps/m68k/fpu/s_modf.c: Likewise.
* sysdeps/m68k/fpu/s_scalbn.c: Likewise.
1997-02-27 21:51 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* Makefile (tests): Cope with $PATH not including the current
directory.
1997-02-27 18:04 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* sysdeps/unix/Makefile ($(common-objpfx)mk-local_lim): Use
$(common-objdir-compile).
($(common-objpfx)make-ioctls): Likewise.
(mk-local_lim-CFLAGS): Set this instead of local_lim-CFLAGS.
($(common-objpfx)sys/param.h): Use $(make-target-directory).
($(addprefix $(common-objpfx),$(sys/param.h-includes))):
Likewise.
($(common-objpfx)sys/syscall.h): Likewise.
($(common-objpfx)local_lim.h): Let make deal with command
failure.
($(common-objpfx)param.h.dep): Use temporary file and update
target atomically.
($(common-objpfx)errnos): Avoid the Useless Use of cat Award.
(include $(common-objpfx)param.h.dep): Ignore error.
* sysdeps/posix/Makefile ($(common-objpfx)mk-stdiolim): Use
$(common-objdir-compile).
(mk-stdiolim-CFLAGS): Renamed from cded-objdir-includes, use
$(shell pwd) instead of $$cwd.
* sysdeps/generic/Makefile ($(common-objpfx)det_endian): Use
$(common-objdir-compile).
($(objpfx)make_siglist): Use $(native-compile).
(make_siglist-CFLAGS): New variable.
* Makerules (ALL_BUILD_CFLAGS): Renamed from BUILD_CFLAGS, leaving
the old name for the user to pass additional flags to the host
compiler. Fix reference to config header.
(native-compile, common-objdir-compile): Rewritten to make more
generally usable.
* sysdeps/unix/sysv/sysv4/solaris2/Makefile: Set ALL_BUILD_CFLAGS
instead of BUILD_CFLAGS.
* sysvips/sys/ipc.h: Warn if needed feature select macro are not
defined.
1997-02-27 17:11 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* sunrpc/Makefile ($(objpfx)rpc-proto.d, $(objpfx)rpc-proto.c):
New rules to generate dependencies for the RPC service objects.
1997-02-27 16:26 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* argp/argp-parse.c (parser_finalize): Always set *END_INDEX if
supplied.
1997-02-28 03:27 Ulrich Drepper <drepper@cygnus.com>
* stdlib/strtod.c (STRTOF): Make sure return value is large enough
so that clearing second word is necessary.
* sysdeps/unix/sysv/linux/netinet/in_systm.h: Don't use kernel
header since it is wrong for 64 bit systems.
Patch by a sun <asun@zoology.washington.edu>.
1997-02-27 10:34:11 Richard Henderson <rth@tamu.edu>
* sysdeps/unix/sysv/linux/alpha/brk.S: Support both the Linux/i386
and OSF/1 style brk syscalls. We may want to change Linux/Alpha
for the benefit of running foreign binaries.
1997-03-01 20:21 Miles Bader <miles@gnu.ai.mit.edu>
1997-02-25 19:42 Miles Bader <miles@gnu.ai.mit.edu>
Diffstat (limited to 'sysdeps/m68k/fpu/__math.h')
-rw-r--r-- | sysdeps/m68k/fpu/__math.h | 336 |
1 files changed, 220 insertions, 116 deletions
diff --git a/sysdeps/m68k/fpu/__math.h b/sysdeps/m68k/fpu/__math.h index 0e3e2a3d8c..1a29a56d92 100644 --- a/sysdeps/m68k/fpu/__math.h +++ b/sysdeps/m68k/fpu/__math.h @@ -1,26 +1,27 @@ -/* Copyright (C) 1991, 92, 93, 94, 96 Free Software Foundation, Inc. -This file is part of the GNU C Library. +/* Definitions of inline math functions implemented by the m68881/2. + Copyright (C) 1991, 92, 93, 94, 96, 97 Free Software Foundation, Inc. + This file is part of the GNU C Library. -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 675 Mass Ave, -Cambridge, MA 02139, USA. */ + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #ifdef __GNUC__ #include <sys/cdefs.h> -#ifdef __NO_M81_MATH_INLINES +#ifdef __LIBC_M81_MATH_INLINES /* This is used when defining the functions themselves. Define them with __ names, and with `static inline' instead of `extern inline' so the bodies will always be used, never an external function call. */ @@ -34,36 +35,35 @@ Cambridge, MA 02139, USA. */ /* Define a const math function. */ #define __m81_defun(rettype, func, args) \ - __m81_inline rettype \ - __m81_u(func) args __attribute__((__const__)); \ - __m81_inline rettype \ + __m81_inline rettype __attribute__((__const__)) \ __m81_u(func) args /* Define the three variants of a math function that has a direct implementation in the m68k fpu. FUNC is the name for C (which will be suffixed with f and l for the float and long double version, resp). OP is the name of the fpu operation (without leading f). */ -#define __inline_mathop(func, op) \ - __m81_defun (double, func, (double __mathop_x)) \ - { \ - double __result; \ - __asm("f" __STRING(op) "%.x %1, %0" : "=f" (__result) : "f" (__mathop_x));\ - return __result; \ - } \ - __m81_defun (float, func##f, (float __mathop_x)) \ - { \ - float __result; \ - __asm("f" __STRING(op) "%.x %1, %0" : "=f" (__result) : "f" (__mathop_x));\ - return __result; \ - } \ - __m81_defun (long double, func##l, (long double __mathop_x)) \ + +#ifdef __USE_MISC +#define __inline_mathop(func, op) \ + __inline_mathop1(double, func, op) \ + __inline_mathop1(float, __CONCAT(func,f), op) \ + __inline_mathop1(long double, __CONCAT(func,l), op) +#else +#define __inline_mathop(func, op) \ + __inline_mathop1(double, func, op) +#endif + +#define __inline_mathop1(float_type,func, op) \ + __m81_defun (float_type, func, (float_type __mathop_x)) \ { \ - long double __result; \ + float_type __result; \ __asm("f" __STRING(op) "%.x %1, %0" : "=f" (__result) : "f" (__mathop_x));\ return __result; \ } +#ifdef __LIBC_M81_MATH_INLINES /* ieee style elementary functions */ +/* These are internal to the implementation of libm. */ __inline_mathop(__ieee754_acos, acos) __inline_mathop(__ieee754_asin, asin) __inline_mathop(__ieee754_cosh, cosh) @@ -73,6 +73,7 @@ __inline_mathop(__ieee754_log10, log10) __inline_mathop(__ieee754_log, logn) __inline_mathop(__ieee754_sqrt, sqrt) __inline_mathop(__ieee754_atanh, atanh) +#endif __inline_mathop(__atan, atan) __inline_mathop(__cos, cos) @@ -88,31 +89,56 @@ __inline_mathop(__log1p, lognp1) __inline_mathop(__logb, log2) __inline_mathop(__significand, getman) +#if !defined __NO_MATH_INLINES && defined __OPTIMIZE__ + +__inline_mathop(atan, atan) +__inline_mathop(cos, cos) +__inline_mathop(sin, sin) +__inline_mathop(tan, tan) +__inline_mathop(tanh, tanh) +__inline_mathop(fabs, abs) +__inline_mathop(sqrt, sqrt) + +#if defined(__USE_MISC) || defined(__USE_XOPEN_EXTENDED) +__inline_mathop(rint, int) +__inline_mathop(expm1, etoxm1) +__inline_mathop(log1p, lognp1) +__inline_mathop(logb, log2) +#endif + +#ifdef __USE_MISC +__inline_mathop(significand, getman) +#endif + +#endif /* !__NO_MATH_INLINES && __OPTIMIZE__ */ + /* This macro contains the definition for the rest of the inline functions, using __FLOAT_TYPE as the domain type and __S as the suffix for the function names. */ -#define __inline_functions(__float_type, __s) \ -__m81_defun (__float_type, \ - __ieee754_remainder##__s, (__float_type __x, __float_type __y)) \ +#ifdef __LIBC_M81_MATH_INLINES +/* Internally used functions. */ +#define __internal_inline_functions(float_type, s) \ +__m81_defun (float_type, __CONCAT(__ieee754_remainder,s), \ + (float_type __x, float_type __y)) \ { \ - __float_type __result; \ + float_type __result; \ __asm("frem%.x %1, %0" : "=f" (__result) : "f" (__y), "0" (__x)); \ return __result; \ } \ \ -__m81_defun (__float_type, \ - __ieee754_fmod##__s, (__float_type __x, __float_type __y)) \ +__m81_defun (float_type, __CONCAT(__ieee754_fmod,s), \ + (float_type __x, float_type __y)) \ { \ - __float_type __result; \ + float_type __result; \ __asm("fmod%.x %1, %0" : "=f" (__result) : "f" (__y), "0" (__x)); \ return __result; \ } \ \ -__m81_defun (__float_type, \ - __ieee754_atan2##__s, (__float_type __y, __float_type __x)) \ +__m81_defun (float_type, __CONCAT(__ieee754_atan2,s), \ + (float_type __y, float_type __x)) \ { \ - __float_type __pi, __pi_2; \ + float_type __pi, __pi_2; \ \ __asm ("fmovecr%.x %#0, %0" : "=f" (__pi)); \ __asm ("fscale%.w %#-1, %0" : "=f" (__pi_2) : "0" (__pi)); \ @@ -121,16 +147,16 @@ __m81_defun (__float_type, \ if (__y > 0) \ { \ if (__x > __y) \ - return __m81_u(__atan##__s) (__y / __x); \ + return __m81_u(__CONCAT(__atan,s)) (__y / __x); \ else \ - return __pi_2 - __m81_u(__atan##__s) (__x / __y); \ + return __pi_2 - __m81_u(__CONCAT(__atan,s)) (__x / __y); \ } \ else \ { \ if (__x > -__y) \ - return __m81_u(__atan##__s) (__y / __x); \ + return __m81_u(__CONCAT(__atan,s)) (__y / __x); \ else \ - return -__pi_2 - __m81_u(__atan##__s) (__x / __y); \ + return -__pi_2 - __m81_u(__CONCAT(__atan,s)) (__x / __y); \ } \ } \ else \ @@ -138,58 +164,24 @@ __m81_defun (__float_type, \ if (__y > 0) \ { \ if (-__x < __y) \ - return __pi + __m81_u(__atan##__s) (__y / __x); \ + return __pi + __m81_u(__CONCAT(__atan,s)) (__y / __x); \ else \ - return __pi_2 - __m81_u(__atan##__s) (__x / __y); \ + return __pi_2 - __m81_u(__CONCAT(__atan,s)) (__x / __y); \ } \ else \ { \ if (-__x > -__y) \ - return -__pi + __m81_u(__atan##__s) (__y / __x); \ + return -__pi + __m81_u(__CONCAT(__atan,s)) (__y / __x); \ else \ - return -__pi_2 - __m81_u(__atan##__s) (__x / __y); \ + return -__pi_2 - __m81_u(__CONCAT(__atan,s)) (__x / __y); \ } \ } \ } \ \ -__m81_inline __float_type \ -__m81_u(__frexp##__s)(__float_type __value, int *__expptr) \ -{ \ - __float_type __mantissa, __exponent; \ - int __iexponent; \ - if (__value == 0.0) \ - { \ - *__expptr = 0; \ - return __value; \ - } \ - __asm("fgetexp%.x %1, %0" : "=f" (__exponent) : "f" (__value)); \ - __iexponent = (int) __exponent + 1; \ - *__expptr = __iexponent; \ - __asm("fscale%.l %2, %0" : "=f" (__mantissa) \ - : "0" (__value), "dmi" (-__iexponent)); \ - return __mantissa; \ -} \ - \ -__m81_defun (__float_type, __floor##__s, (__float_type __x)) \ -{ \ - __float_type __result; \ - unsigned long int __ctrl_reg; \ - __asm __volatile__ ("fmove%.l %!, %0" : "=dm" (__ctrl_reg)); \ - /* Set rounding towards negative infinity. */ \ - __asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */ \ - : "dmi" ((__ctrl_reg & ~0x10) | 0x20)); \ - /* Convert X to an integer, using -Inf rounding. */ \ - __asm __volatile__ ("fint%.x %1, %0" : "=f" (__result) : "f" (__x)); \ - /* Restore the previous rounding mode. */ \ - __asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */ \ - : "dmi" (__ctrl_reg)); \ - return __result; \ -} \ - \ -__m81_defun (__float_type, \ - __ieee754_pow##__s, (__float_type __x, __float_type __y)) \ +__m81_defun (float_type, __CONCAT(__ieee754_pow,s), \ + (float_type __x, float_type __y)) \ { \ - __float_type __result; \ + float_type __result; \ if (__x == 0.0) \ { \ if (__y <= 0.0) \ @@ -209,12 +201,12 @@ __m81_defun (__float_type, \ __asm("ftwotox%.x %1, %0" : "=f" (__result) : "f" (__y)); \ else if (__x < 0.0) \ { \ - __float_type __temp = __m81_u (__rint##__s) (__y); \ + float_type __temp = __m81_u (__CONCAT(__rint,s)) (__y); \ if (__y == __temp) \ { \ int __i = (int) __y; \ - __result = (__m81_u(__ieee754_exp##__s) \ - (__y * __m81_u(__ieee754_log##__s) (-__x))); \ + __result = (__m81_u(__CONCAT(__ieee754_exp,s)) \ + (__y * __m81_u(__CONCAT(__ieee754_log,s)) (-__x))); \ if (__i & 1) \ __result = -__result; \ } \ @@ -222,14 +214,66 @@ __m81_defun (__float_type, \ __result = 0.0 / 0.0; \ } \ else \ - __result = (__m81_u(__ieee754_exp##__s) \ - (__y * __m81_u(__ieee754_log##__s) (__x))); \ + __result = (__m81_u(__CONCAT(__ieee754_exp,s)) \ + (__y * __m81_u(__CONCAT(__ieee754_log,s)) (__x))); \ return __result; \ } \ \ -__m81_defun (__float_type, __ceil##__s, (__float_type __x)) \ +__m81_defun (float_type, __CONCAT(__ieee754_scalb,s), \ + (float_type __x, float_type __n)) \ { \ - __float_type __result; \ + float_type __result; \ + __asm ("fscale%.x %1, %0" : "=f" (__result) : "f" (__n), "0" (__x)); \ + return __result; \ +} + +__internal_inline_functions (double,) +__internal_inline_functions (float,f) +__internal_inline_functions (long double,l) +#undef __internal_inline_functions + +#endif /* __LIBC_M81_MATH_INLINES */ + +/* The rest of the functions are available to the user. */ + +#define __inline_functions(float_type, s) \ +__m81_inline float_type \ +__m81_u(__CONCAT(__frexp,s))(float_type __value, int *__expptr) \ +{ \ + float_type __mantissa, __exponent; \ + int __iexponent; \ + if (__value == 0.0) \ + { \ + *__expptr = 0; \ + return __value; \ + } \ + __asm("fgetexp%.x %1, %0" : "=f" (__exponent) : "f" (__value)); \ + __iexponent = (int) __exponent + 1; \ + *__expptr = __iexponent; \ + __asm("fscale%.l %2, %0" : "=f" (__mantissa) \ + : "0" (__value), "dmi" (-__iexponent)); \ + return __mantissa; \ +} \ + \ +__m81_defun (float_type, __CONCAT(__floor,s), (float_type __x)) \ +{ \ + float_type __result; \ + unsigned long int __ctrl_reg; \ + __asm __volatile__ ("fmove%.l %!, %0" : "=dm" (__ctrl_reg)); \ + /* Set rounding towards negative infinity. */ \ + __asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */ \ + : "dmi" ((__ctrl_reg & ~0x10) | 0x20)); \ + /* Convert X to an integer, using -Inf rounding. */ \ + __asm __volatile__ ("fint%.x %1, %0" : "=f" (__result) : "f" (__x)); \ + /* Restore the previous rounding mode. */ \ + __asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */ \ + : "dmi" (__ctrl_reg)); \ + return __result; \ +} \ + \ +__m81_defun (float_type, __CONCAT(__ceil,s), (float_type __x)) \ +{ \ + float_type __result; \ unsigned long int __ctrl_reg; \ __asm __volatile__ ("fmove%.l %!, %0" : "=dm" (__ctrl_reg)); \ /* Set rounding towards positive infinity. */ \ @@ -243,16 +287,16 @@ __m81_defun (__float_type, __ceil##__s, (__float_type __x)) \ return __result; \ } \ \ -__m81_inline __float_type \ -__m81_u(__modf##__s)(__float_type __value, __float_type *__iptr) \ +__m81_inline float_type \ +__m81_u(__CONCAT(__modf,s))(float_type __value, float_type *__iptr) \ { \ - __float_type __modf_int; \ + float_type __modf_int; \ __asm ("fintrz%.x %1, %0" : "=f" (__modf_int) : "f" (__value)); \ *__iptr = __modf_int; \ return __value - __modf_int; \ } \ \ -__m81_defun (int, __isinf##__s, (__float_type __value)) \ +__m81_defun (int, __CONCAT(__isinf,s), (float_type __value)) \ { \ /* There is no branch-condition for infinity, \ so we must extract and examine the condition codes manually. */ \ @@ -262,7 +306,7 @@ __m81_defun (int, __isinf##__s, (__float_type __value)) \ return (__fpsr & (2 << 24)) ? (__fpsr & (8 << 24) ? -1 : 1) : 0; \ } \ \ -__m81_defun (int, __isnan##__s, (__float_type __value)) \ +__m81_defun (int, __CONCAT(__isnan,s), (float_type __value)) \ { \ char __result; \ __asm("ftst%.x %1\n" \ @@ -270,7 +314,7 @@ __m81_defun (int, __isnan##__s, (__float_type __value)) \ return __result; \ } \ \ -__m81_defun (int, __finite##__s, (__float_type __value)) \ +__m81_defun (int, __CONCAT(__finite,s), (float_type __value)) \ { \ /* There is no branch-condition for infinity, so we must extract and \ examine the condition codes manually. */ \ @@ -280,34 +324,94 @@ __m81_defun (int, __finite##__s, (__float_type __value)) \ return (__fpsr & (3 << 24)) == 0; \ } \ \ -__m81_defun (int, __ilogb##__s, (__float_type __x)) \ +__m81_defun (int, __CONCAT(__ilogb,s), (float_type __x)) \ { \ - __float_type __result; \ + float_type __result; \ if (__x == 0.0) \ return 0x80000001; \ __asm("fgetexp%.x %1, %0" : "=f" (__result) : "f" (__x)); \ return (int) __result; \ } \ \ -__m81_defun (__float_type, \ - __ieee754_scalb##__s, (__float_type __x, __float_type __n)) \ +__m81_defun (float_type, __CONCAT(__scalbn,s), (float_type __x, int __n)) \ { \ - __float_type __result; \ - __asm ("fscale%.x %1, %0" : "=f" (__result) : "f" (__n), "0" (__x)); \ - return __result; \ -} \ - \ -__m81_defun (__float_type, __scalbn##__s, (__float_type __x, int __n)) \ -{ \ - __float_type __result; \ + float_type __result; \ __asm ("fscale%.l %1, %0" : "=f" (__result) : "dmi" (__n), "0" (__x)); \ return __result; \ } /* This defines the three variants of the inline functions. */ -__inline_functions (double, ) -__inline_functions (float, f) -__inline_functions (long double, l) +__inline_functions (double,) +__inline_functions (float,f) +__inline_functions (long double,l) #undef __inline_functions +#if !defined __NO_MATH_INLINES && defined __OPTIMIZE__ + +/* Define inline versions of the user visible functions. */ + +#define __inline_forward_c(rettype, name, args1, args2) \ +extern __inline rettype __attribute__((__const__)) \ +name args1 \ +{ \ + return __CONCAT(__,name) args2; \ +} + +#define __inline_forward(rettype, name, args1, args2) \ +extern __inline rettype name args1 \ +{ \ + return __CONCAT(__,name) args2; \ +} + +__inline_forward(double,frexp, (double __value, int *__expptr), + (__value, __expptr)) +__inline_forward_c(double,floor, (double __x), (__x)) +__inline_forward_c(double,ceil, (double __x), (__x)) +__inline_forward(double,modf, (double __value, double *__iptr), + (__value, __iptr)) +#ifdef __USE_MISC +__inline_forward_c(int,isinf, (double __value), (__value)) +__inline_forward_c(int,finite, (double __value), (__value)) +__inline_forward_c(double,scalbn, (double __x, int __n), (__x, __n)) +#endif +#if defined __USE_MISC || defined __USE_XOPEN +__inline_forward_c(int,isnan, (double __value), (__value)) +__inline_forward_c(int,ilogb, (double __value), (__value)) +#endif + +#ifdef __USE_MISC + +__inline_forward(float,frexpf, (float __value, int *__expptr), + (__value, __expptr)) +__inline_forward_c(float,floorf, (float __x), (__x)) +__inline_forward_c(float,ceilf, (float __x), (__x)) +__inline_forward(float,modff, (float __value, float *__iptr), + (__value, __iptr)) +__inline_forward_c(int,isinff, (float __value), (__value)) +__inline_forward_c(int,finitef, (float __value), (__value)) +__inline_forward_c(float,scalbnf, (float __x, int __n), (__x, __n)) +__inline_forward_c(int,isnanf, (float __value), (__value)) +__inline_forward_c(int,ilogbf, (float __value), (__value)) + +__inline_forward(long double,frexpl, (long double __value, int *__expptr), + (__value, __expptr)) +__inline_forward_c(long double,floorl, (long double __x), (__x)) +__inline_forward_c(long double,ceill, (long double __x), (__x)) +__inline_forward(long double,modfl, + (long double __value, long double *__iptr), + (__value, __iptr)) +__inline_forward_c(int,isinfl, (long double __value), (__value)) +__inline_forward_c(int,finitel, (long double __value), (__value)) +__inline_forward_c(long double,scalbnl, (long double __x, int __n), + (__x, __n)) +__inline_forward_c(int,isnanl, (long double __value), (__value)) +__inline_forward_c(int,ilogbl, (long double __value), (__value)) + +#endif /* __USE_MISC */ + +#undef __inline_forward +#undef __inline_forward_c + +#endif /* !__NO_MATH_INLINES && __OPTIMIZE__ */ + #endif /* GCC. */ |