1998-12-08 21:12:47 +08:00
|
|
|
#ifndef _MATH_H
|
|
|
|
|
Suppress internal declarations for most of the testsuite.
This patch adds a new build module called 'testsuite'.
IS_IN (testsuite) implies _ISOMAC, as do IS_IN_build and __cplusplus
(which means several ad-hoc tests for __cplusplus can go away).
libc-symbols.h now suppresses almost all of *itself* when _ISOMAC is
defined; in particular, _ISOMAC mode does not get config.h
automatically anymore.
There are still quite a few tests that need to see internal gunk of
one variety or another. For them, we now have 'tests-internal' and
'test-internal-extras'; files in this category will still be compiled
with MODULE_NAME=nonlib, and everything proceeds as it always has.
The bulk of this patch is moving tests from 'tests' to
'tests-internal'. There is also 'tests-static-internal', which has
the same effect on files in 'tests-static', and 'modules-names-tests',
which has the *inverse* effect on files in 'modules-names' (it's
inverted because most of the things in modules-names are *not* tests).
For both of these, the file must appear in *both* the new variable and
the old one.
There is also now a special case for when libc-symbols.h is included
without MODULE_NAME being defined at all. (This happens during the
creation of libc-modules.h, and also when preprocessing Versions
files.) When this happens, IS_IN is set to be always false and
_ISOMAC is *not* defined, which was the status quo, but now it's
explicit.
The remaining changes to C source files in this patch seemed likely to
cause problems in the absence of the main change. They should be
relatively self-explanatory. In a few cases I duplicated a definition
from an internal header rather than move the test to tests-internal;
this was a judgement call each time and I'm happy to change those
however reviewers feel is more appropriate.
* Makerules: New subdir configuration variables 'tests-internal'
and 'test-internal-extras'. Test files in these categories will
still be compiled with MODULE_NAME=nonlib. Test files in the
existing categories (tests, xtests, test-srcs, test-extras) are
now compiled with MODULE_NAME=testsuite.
New subdir configuration variable 'modules-names-tests'. Files
which are in both 'modules-names' and 'modules-names-tests' will
be compiled with MODULE_NAME=testsuite instead of
MODULE_NAME=extramodules.
(gen-as-const-headers): Move to tests-internal.
(do-tests-clean, common-mostlyclean): Support tests-internal.
* Makeconfig (built-modules): Add testsuite.
* Makefile: Change libof-check-installed-headers-c and
libof-check-installed-headers-cxx to 'testsuite'.
* Rules: Likewise. Support tests-internal.
* benchtests/strcoll-inputs/filelist#en_US.UTF-8:
Remove extra-modules.mk.
* config.h.in: Don't check for __OPTIMIZE__ or __FAST_MATH__ here.
* include/libc-symbols.h: Move definitions of _GNU_SOURCE,
PASTE_NAME, PASTE_NAME1, IN_MODULE, IS_IN, and IS_IN_LIB to the
very top of the file and rationalize their order.
If MODULE_NAME is not defined at all, define IS_IN to always be
false, and don't define _ISOMAC.
If any of IS_IN (testsuite), IS_IN_build, or __cplusplus are
true, define _ISOMAC and suppress everything else in this file,
starting with the inclusion of config.h.
Do check for inappropriate definitions of __OPTIMIZE__ and
__FAST_MATH__ here, but only if _ISOMAC is not defined.
Correct some out-of-date commentary.
* include/math.h: If _ISOMAC is defined, undefine NO_LONG_DOUBLE
and _Mlong_double_ before including math.h.
* include/string.h: If _ISOMAC is defined, don't expose
_STRING_ARCH_unaligned. Move a comment to a more appropriate
location.
* include/errno.h, include/stdio.h, include/stdlib.h, include/string.h
* include/time.h, include/unistd.h, include/wchar.h: No need to
check __cplusplus nor use __BEGIN_DECLS/__END_DECLS.
* misc/sys/cdefs.h (__NTHNL): New macro.
* sysdeps/m68k/m680x0/fpu/bits/mathinline.h
(__m81_defun): Use __NTHNL to avoid errors with GCC 6.
* elf/tst-env-setuid-tunables.c: Include config.h with _LIBC
defined, for HAVE_TUNABLES.
* inet/tst-checks-posix.c: No need to define _ISOMAC.
* intl/tst-gettext2.c: Provide own definition of N_.
* math/test-signgam-finite-c99.c: No need to define _ISOMAC.
* math/test-signgam-main.c: No need to define _ISOMAC.
* stdlib/tst-strtod.c: Convert to test-driver. Split locale_test to...
* stdlib/tst-strtod1i.c: ...this new file.
* stdlib/tst-strtod5.c: Convert to test-driver and add copyright notice.
Split tests of __strtod_internal to...
* stdlib/tst-strtod5i.c: ...this new file.
* string/test-string.h: Include stdint.h. Duplicate definition of
inhibit_loop_to_libcall here (from libc-symbols.h).
* string/test-strstr.c: Provide dummy definition of
libc_hidden_builtin_def when including strstr.c.
* sysdeps/ia64/fpu/libm-symbols.h: Suppress entire file in _ISOMAC
mode; no need to test __STRICT_ANSI__ nor __cplusplus as well.
* sysdeps/x86_64/fpu/math-tests-arch.h: Include cpu-features.h.
Don't include init-arch.h.
* sysdeps/x86_64/multiarch/test-multiarch.h: Include cpu-features.h.
Don't include init-arch.h.
* elf/Makefile: Move tst-ptrguard1-static, tst-stackguard1-static,
tst-tls1-static, tst-tls2-static, tst-tls3-static, loadtest,
unload, unload2, circleload1, neededtest, neededtest2,
neededtest3, neededtest4, tst-tls1, tst-tls2, tst-tls3,
tst-tls6, tst-tls7, tst-tls8, tst-dlmopen2, tst-ptrguard1,
tst-stackguard1, tst-_dl_addr_inside_object, and all of the
ifunc tests to tests-internal.
Don't add $(modules-names) to test-extras.
* inet/Makefile: Move tst-inet6_scopeid_pton to tests-internal.
Add tst-deadline to tests-static-internal.
* malloc/Makefile: Move tst-mallocstate and tst-scratch_buffer to
tests-internal.
* misc/Makefile: Move tst-atomic and tst-atomic-long to tests-internal.
* nptl/Makefile: Move tst-typesizes, tst-rwlock19, tst-sem11,
tst-sem12, tst-sem13, tst-barrier5, tst-signal7, tst-tls3,
tst-tls3-malloc, tst-tls5, tst-stackguard1, tst-sem11-static,
tst-sem12-static, and tst-stackguard1-static to tests-internal.
Link tests-internal with libpthread also.
Don't add $(modules-names) to test-extras.
* nss/Makefile: Move tst-field to tests-internal.
* posix/Makefile: Move bug-regex5, bug-regex20, bug-regex33,
tst-rfc3484, tst-rfc3484-2, and tst-rfc3484-3 to tests-internal.
* stdlib/Makefile: Move tst-strtod1i, tst-strtod3, tst-strtod4,
tst-strtod5i, tst-tls-atexit, and tst-tls-atexit-nodelete to
tests-internal.
* sunrpc/Makefile: Move tst-svc_register to tests-internal.
* sysdeps/powerpc/Makefile: Move test-get_hwcap and
test-get_hwcap-static to tests-internal.
* sysdeps/unix/sysv/linux/Makefile: Move tst-setgetname to
tests-internal.
* sysdeps/x86_64/fpu/Makefile: Add all libmvec test modules to
modules-names-tests.
2016-11-21 09:46:30 +08:00
|
|
|
#ifdef _ISOMAC
|
|
|
|
# undef NO_LONG_DOUBLE
|
|
|
|
#endif
|
|
|
|
|
1995-02-18 09:27:10 +08:00
|
|
|
#include <math/math.h>
|
1998-12-08 21:12:47 +08:00
|
|
|
|
2012-02-26 12:18:39 +08:00
|
|
|
#ifndef _ISOMAC
|
1998-12-08 21:12:47 +08:00
|
|
|
/* Now define the internal interfaces. */
|
Fix lgamma setting signgam for ISO C (bug 15421).
The lgamma (and likewise lgammaf, lgammal) function wrongly sets the
signgam variable even when building for strict ISO C conformance
(-std=c99 / -std=c11), although the user may define such a variable
and it's only in the implementation namespace for POSIX with XSI
extensions enabled.
Following discussions starting at
<https://sourceware.org/ml/libc-alpha/2013-04/msg00767.html> and
<https://sourceware.org/ml/libc-alpha/2015-10/msg00844.html>, it seems
that the safest approach for fixing this particular issue is for
signgam to become a weak alias for a newly exported symbol __signgam,
with the library functions only setting __signgam, at which point
static linker magic will preserve the alias for newly linked binaries
that refer to the library's signgam rather than defining their own,
while breaking the alias for programs that define their own signgam,
with new symbol versions for lgamma functions and with compat symbols
for existing binaries that set both signgam and __signgam.
This patch implements that approach for the fix. signgam is made into
a weak alias. The four symbols __signgam, lgamma, lgammaf, lgammal
get new symbol versions at version GLIBC_2.23, with the existing
versions of lgamma, lgammaf and lgammal becoming compat symbols.
When the compat versions are built, gamma, gammaf and gammal are
aliases for the compat versions (i.e. always set signgam); this is OK
as they are not ISO C functions, and avoids adding new symbol versions
for them unnecessarily. When the compat versions are not built
(i.e. for static linking and for future glibc ports), gamma, gammaf
and gammal are aliases for the new versions that set __signgam. The
ldbl-opt versions are updated accordingly.
The lgamma wrappers are adjusted so that the same source files,
included from different files with different definitions of
USE_AS_COMPAT, can build either the new versions or the compat
versions. Similar changes are made to the ia64 versions (untested).
Tests are added that the lgamma functions do not interfere with a user
variable called signgam for ISO C, with various choices for the size
of that variable, whether it is initialized, and for static and
dynamic linking. The conformtest whitelist entry is removed as well.
Tested for x86_64, x86, mips64 and powerpc, including looking at
objdump --dynamic-syms output to make sure the expected sets of
symbols were aliases. Also spot-tested that a binary built with old
glibc works properly (i.e. gets signgam set) when run with new glibc.
[BZ #15421]
* sysdeps/ieee754/s_signgam.c (signgam): Rename to __signgam,
initialize with 0 and define as weak alias of __signgam.
* include/math.h [!_ISOMAC] (__signgam): Declare.
* math/Makefile (libm-calls): Add w_lgamma_compat.
(tests): Add test-signgam-uchar, test-signgam-uchar-init,
test-signgam-uint, test-signgam-uint-init, test-signgam-ullong and
test-signgam-ullong-init.
(tests-static): Add test-signgam-uchar-static,
test-signgam-uchar-init-static, test-signgam-uint-static,
test-signgam-uint-init-static, test-signgam-ullong-static and
test-signgam-ullong-init-static.
(CFLAGS-test-signgam-uchar.c): New variable.
(CFLAGS-test-signgam-uchar-init.c): Likewise.
(CFLAGS-test-signgam-uchar-static.c): Likewise.
(CFLAGS-test-signgam-uchar-init-static.c): Likewise.
(CFLAGS-test-signgam-uint.c): Likewise.
(CFLAGS-test-signgam-uint-init.c): Likewise.
(CFLAGS-test-signgam-uint-static.c): Likewise.
(CFLAGS-test-signgam-uint-init-static.c): Likewise.
(CFLAGS-test-signgam-ullong.c): Likewise.
(CFLAGS-test-signgam-ullong-init.c): Likewise.
(CFLAGS-test-signgam-ullong-static.c): Likewise.
(CFLAGS-test-signgam-ullong-init-static.c): Likewise.
* math/Versions (libm): Add GLIBC_2.23.
* math/lgamma-compat.h: New file.
* math/test-signgam-main.c: Likewise.
* math/test-signgam-uchar-init-static.c: Likewise.
* math/test-signgam-uchar-init.c: Likewise.
* math/test-signgam-uchar-static.c: Likewise.
* math/test-signgam-uchar.c: Likewise.
* math/test-signgam-uint-init-static.c: Likewise.
* math/test-signgam-uint-init.c: Likewise.
* math/test-signgam-uint-static.c: Likewise.
* math/test-signgam-uint.c: Likewise.
* math/test-signgam-ullong-init-static.c: Likewise.
* math/test-signgam-ullong-init.c: Likewise.
* math/test-signgam-ullong-static.c: Likewise.
* math/test-signgam-ullong.c: Likewise.
* math/w_lgamma.c: Rename to w_lgamma_main.c and replace by
wrapper of w_lgamma_main.c.
* math/w_lgamma_compat.c: New file.
* math/w_lgamma_compatf.c: Likewise.
* math/w_lgamma_compatl.c: Likewise.
* math/w_lgamma_main.c: New file. Based on w_lgamma.c. Include
<lgamma-compat.h>. Condition contents on [BUILD_LGAMMA]. Support
defining compatibility symbols.
(__lgamma): Change to LGFUNC (__lgamma). Use CALL_LGAMMA.
* math/w_lgammaf.c: Rename to w_lgammaf_main.c and replace by
wrapper of w_lgammaf_main.c.
* math/w_lgammaf_main.c: New file. Based on w_lgammaf.c. Include
<lgamma-compat.h>. Condition contents on [BUILD_LGAMMA]. Support
defining compatibility symbols.
(__lgammaf): Change to LGFUNC (__lgammaf). Use CALL_LGAMMA.
* math/w_lgammal.c: Rename to w_lgammal_main.c and replace by
wrapper of w_lgammal_main.c.
* math/w_lgammal_main.c: New file. Based on w_lgammal.c. Include
<lgamma-compat.h>. Condition contents on [BUILD_LGAMMA]. Support
defining compatibility symbols.
(__lgammal): Change to LGFUNC (__lgammal). Use CALL_LGAMMA.
* sysdeps/ia64/fpu/lgamma-compat.h: New file.
* sysdeps/ia64/fpu/w_lgamma.c: Move to ....
* sysdeps/ia64/fpu/w_lgamma_main.c: ...here. Include
<lgamma-compat.h>.
(__ieee754_lgamma): Change to LGFUNC (lgamma). Use CALL_LGAMMA.
(__ieee754_gamma): Define as alias.
* sysdeps/ia64/fpu/w_lgammaf.c: Move to ....
* sysdeps/ia64/fpu/w_lgammaf_main.c: ...here. Include
<lgamma-compat.h>.
(__ieee754_lgammaf): Change to LGFUNC (lgammaf). Use CALL_LGAMMA.
(__ieee754_gammaf): Define as alias.
* sysdeps/ia64/fpu/w_lgammal.c: Move to ....
* sysdeps/ia64/fpu/w_lgammal_main.c: ...here. Include
<lgamma-compat.h>.
(__ieee754_lgammal): Change to LGFUNC (lgammal). Use CALL_LGAMMA.
(__ieee754_gammal): Define as alias.
* sysdeps/ieee754/ldbl-opt/w_lgamma.c: Move to ....
* sysdeps/ieee754/ldbl-opt/w_lgamma_compat.c: ...here. Include
<math/w_lgamma_compat.c>.
[LONG_DOUBLE_COMPAT(libm, GLIBC_2_0)] (__lgammal_dbl_compat):
Define as alias of __lgamma_compat and use in defining lgammal.
* sysdeps/ieee754/ldbl-opt/w_lgammal.c: Move to ....
* sysdeps/ieee754/ldbl-opt/w_lgamma_compatl.c: ...here. Include
<math/lgamma-compat.h> and <math/w_lgamma_compatl.c>.
(USE_AS_COMPAT): New macro.
(LGAMMA_OLD_VER): Undefine and redefine.
(lgammal): Do not define here.
(gammal): Only define here if [GAMMA_ALIAS].
* conform/linknamespace.pl (@whitelist): Remove signgam.
* sysdeps/nacl/libm.abilist: Update.
* sysdeps/unix/sysv/linux/aarch64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/alpha/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/arm/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/hppa/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/i386/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/ia64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/microblaze/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/mips/mips32/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/mips/mips64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/nios2/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist:
Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist:
Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist:
Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist:
Likewise.
* sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/sh/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist:
Likewise.
* sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist:
Likewise.
* sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/x86_64/64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist: Likewise.
2015-11-21 06:49:59 +08:00
|
|
|
extern int __signgam;
|
|
|
|
|
2014-11-24 17:33:45 +08:00
|
|
|
# if IS_IN (libc) || IS_IN (libm)
|
Update.
2002-09-09 Jakub Jelinek <jakub@redhat.com>
* include/math.h (__finite_internal, __finitef_internal,
__finitel_internal, __isinf_internal, __isnan_internal): Remove.
(isfinite): Remove.
(__finite, __isinf, __isnan, __finitef, __isinff, __isnanf, __finitel,
__isinfl, __isnanl): Add hidden_proto.
(__fpclassify, __fpclassifyf, __fpclassifyl, __expm1l): Add
libm_hidden_proto.
* math/Makefile (libm-calls): Add s_isinf and s_isnan.
* stdio-common/printf_fp.c (__printf_fp): Remove INTUSE from
__is{inf,nan} calls.
* stdio-common/printf_size.c (printf_size): Likewise.
* sysdeps/generic/printf_fphex.c (__printf_fphex): Likewise.
* sysdeps/generic/s_ldexp.c (__ldexp): Likewise.
* sysdeps/generic/s_ldexpf.c (__ldexpf): Likewise.
* sysdeps/generic/s_ldexpl.c (__ldexpl): Likewise.
* sysdeps/generic/s_expm1l.c (__expm1l): Add libm_hidden_def.
* sysdeps/i386/fpu/s_finite.S (__finite_internal): Remove alias.
(__finite): Add hidden_def.
* sysdeps/i386/fpu/s_finitef.S (__finitef_internal): Remove alias.
(__finitef): Add hidden_def.
* sysdeps/i386/fpu/s_finitel.S (__finitel_internal): Remove alias.
(__finitel): Add hidden_def.
* sysdeps/i386/fpu/s_isinfl.c (__isinfl): Remove INTDEF. Add
hidden_def.
* sysdeps/i386/fpu/s_isnanl.c (__isnanl): Likewise.
* sysdeps/i386/fpu/s_fpclassifyl.c (__fpclassifyl): Add
libm_hidden_def.
* sysdeps/i386/fpu/s_expm1l.S (__expm1l): Likewise.
* sysdeps/ieee754/dbl-64/s_finite.c (__finite): Remove INTDEF. Add
hidden_def.
* sysdeps/ieee754/dbl-64/s_isinf.c (__isinf): Likewise.
(__isinfl): Remove INTDEF.
* sysdeps/ieee754/dbl-64/s_isnan.c (__isnan): Remove INTDEF. Add
hidden_def.
(__isnanl): Remove INTDEF.
* sysdeps/ieee754/dbl-64/s_fpclassify.c (__fpclassify): Add
libm_hidden_def.
* sysdeps/ieee754/dbl-64/e_lgamma_r.c (sin_pi): Use __sin and __cos
instead of sin and cos.
* sysdeps/ieee754/flt-32/s_finitef.c (__finitef): Remove INTDEF.
Add hidden_def.
* sysdeps/ieee754/flt-32/s_isinff.c (__isinff): Likewise.
* sysdeps/ieee754/flt-32/s_isnanf.c (__isnanf): Likewise.
* sysdeps/ieee754/flt-32/s_fpclassifyf.c (__fpclassifyf): Add
libm_hidden_def.
* sysdeps/ieee754/ldbl-128/s_finitel.c (__finitel): Remove INTDEF.
Add hidden_def.
* sysdeps/ieee754/ldbl-128/s_isinfl.c (__isinfl): Likewise.
* sysdeps/ieee754/ldbl-128/s_isnanl.c (__isnanl): Likewise.
* sysdeps/ieee754/ldbl-128/s_fpclassifyl.c (__fpclassifyl): Add
libm_hidden_def.
* sysdeps/ieee754/ldbl-128/s_expm1l.c (__expm1l): Add
libm_hidden_def.
* sysdeps/ieee754/ldbl-96/s_finitel.c (__finitel): Remove INTDEF.
Add hidden_def.
* sysdeps/ieee754/ldbl-96/s_isinfl.c (__isinfl): Likewise.
* sysdeps/ieee754/ldbl-96/s_isnanl.c (__isnanl): Likewise.
* sysdeps/ieee754/ldbl-96/s_fpclassifyl.c (__fpclassifyl): Add
libm_hidden_def.
* sysdeps/ia64/fpu/s_finite.S (__finite_internal, __finitef_internal,
__finitel_internal): Remove aliases.
(__finite, __finitef, __finitel): Add hidden_def.
* sysdeps/ia64/fpu/s_isnan.S (__isnan_internal, __isnanf_internal,
__isnanl_internal): Remove aliases.
(__isnan, __isnanf, __isnanl): Add hidden_def.
* sysdeps/ia64/fpu/s_isinf.S (__isinf_internal, __isinff_internal,
__isinfl_internal): Remove aliases.
(__isinf, __isinff, __isinfl): Add hidden_def.
* sysdeps/ia64/fpu/s_fpclassify.S (__fpclassify, __fpclassifyf,
__fpclassifyl): Add libm_hidden_def.
* sysdeps/ia64/fpu/s_expm1l.S (__expm1l): Likewise.
* sysdeps/m68k/s_isinfl.c (__isinfl): Remove INTDEF. Add hidden_def.
* sysdeps/m68k/fpu/s_isinf.c (INTDEFX): Remove.
(hidden_defx): Define and use.
* sysdeps/m68k/fpu/s_fpclassifyl.c (__fpclassifyl): Add
libm_hidden_def.
* sysdeps/m68k/fpu/s_expm1l.c (__expm1l): Likewise.
* sysdeps/m68k/s_isnanl.c (__isnanl): Add hidden_def.
* sysdeps/powerpc/fpu/s_isnan.c (__isnan, __isnanf, __isnanl):
Remove INTDEF.
(__isnan, __isnanf): Add hidden_def.
* sysdeps/x86_64/fpu/s_finitel.S (__finitel_internal): Remove alias.
(__finitel): Add libm_hidden_def.
* sysdeps/x86_64/fpu/s_expm1l.S (__expm1l): Likewise.
* include/fenv.h (feraiseexcept, fesetenv): Add libm_hidden_proto.
* sysdeps/alpha/fpu/fesetenv.c (fesetenv): Add libm_hidden_ver.
* sysdeps/alpha/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/arm/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/arm/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/generic/fesetenv.c (fesetenv): Likewise.
* sysdeps/generic/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/i386/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/i386/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/m68k/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/m68k/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/mips/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/mips/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/powerpc/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/powerpc/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/sparc/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/sparc/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/hppa/fpu/fesetenv.c (fesetenv): Add libm_hidden_def.
* sysdeps/hppa/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/ia64/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/ia64/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/sh/sh4/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/sh/sh4/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/s390/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/s390/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/x86_64/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/x86_64/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
2002-09-10 09:40:26 +08:00
|
|
|
hidden_proto (__finite)
|
|
|
|
hidden_proto (__isinf)
|
|
|
|
hidden_proto (__isnan)
|
|
|
|
hidden_proto (__finitef)
|
|
|
|
hidden_proto (__isinff)
|
|
|
|
hidden_proto (__isnanf)
|
|
|
|
|
|
|
|
# ifndef __NO_LONG_DOUBLE_MATH
|
|
|
|
hidden_proto (__finitel)
|
|
|
|
hidden_proto (__isinfl)
|
|
|
|
hidden_proto (__isnanl)
|
|
|
|
# endif
|
2017-05-05 04:00:33 +08:00
|
|
|
|
|
|
|
# if __HAVE_DISTINCT_FLOAT128
|
|
|
|
hidden_proto (__finitef128)
|
|
|
|
hidden_proto (__isinff128)
|
|
|
|
hidden_proto (__isnanf128)
|
float128: Add signbit alternative for old compilers
In math/math.h, __MATH_TG will expand signbit to __builtin_signbit*,
e.g.: __builtin_signbitf128, before GCC 6. However, there has never
been a __builtin_signbitf128 in GCC and the type-generic builtin is
only available since GCC 6. For older GCC, this patch defines
__builtin_signbitf128 to __signbitf128, so that the internal function
is used instead of the non-existent builtin.
This patch also changes the implementation of __signbitf128, because
it was reusing the implementation of __signbitl from ldbl-128, which
calls __builtin_signbitl. Using the long double version of the
builtin is not correct on machines where _Float128 is ABI-distinct
from long double (i.e.: ia64, powerpc64le, x86, x86_84). The new
implementation does not rely on builtins when being built with GCC
versions older than 6.0.
The new code does not currently affect powerpc64le builds, because
only GCC 6.2 fulfills the requirements from configure. It might
affect powerpc64le builds if those requirements are backported to
older versions of the compiler. The new code affects x86_64 builds,
since glibc is supposed to build correctly with older versions of GCC.
Tested for powerpc64le and x86_64.
* include/math.h (__signbitf128): Define as hidden.
* sysdeps/ieee754/float128/s_signbitf128.c (__signbitf128):
Reimplement without builtins.
* sysdeps/ia64/bits/floatn.h [!__GNUC_PREREQ (6, 0)]
(__builtin_signbitf128): Define to __signbitf128.
* sysdeps/powerpc/bits/floatn.h: Likewise.
* sysdeps/x86/bits/floatn.h: Likewise.
2017-06-30 02:34:05 +08:00
|
|
|
hidden_proto (__signbitf128)
|
2017-05-05 04:00:33 +08:00
|
|
|
# endif
|
Update.
2002-09-09 Jakub Jelinek <jakub@redhat.com>
* include/math.h (__finite_internal, __finitef_internal,
__finitel_internal, __isinf_internal, __isnan_internal): Remove.
(isfinite): Remove.
(__finite, __isinf, __isnan, __finitef, __isinff, __isnanf, __finitel,
__isinfl, __isnanl): Add hidden_proto.
(__fpclassify, __fpclassifyf, __fpclassifyl, __expm1l): Add
libm_hidden_proto.
* math/Makefile (libm-calls): Add s_isinf and s_isnan.
* stdio-common/printf_fp.c (__printf_fp): Remove INTUSE from
__is{inf,nan} calls.
* stdio-common/printf_size.c (printf_size): Likewise.
* sysdeps/generic/printf_fphex.c (__printf_fphex): Likewise.
* sysdeps/generic/s_ldexp.c (__ldexp): Likewise.
* sysdeps/generic/s_ldexpf.c (__ldexpf): Likewise.
* sysdeps/generic/s_ldexpl.c (__ldexpl): Likewise.
* sysdeps/generic/s_expm1l.c (__expm1l): Add libm_hidden_def.
* sysdeps/i386/fpu/s_finite.S (__finite_internal): Remove alias.
(__finite): Add hidden_def.
* sysdeps/i386/fpu/s_finitef.S (__finitef_internal): Remove alias.
(__finitef): Add hidden_def.
* sysdeps/i386/fpu/s_finitel.S (__finitel_internal): Remove alias.
(__finitel): Add hidden_def.
* sysdeps/i386/fpu/s_isinfl.c (__isinfl): Remove INTDEF. Add
hidden_def.
* sysdeps/i386/fpu/s_isnanl.c (__isnanl): Likewise.
* sysdeps/i386/fpu/s_fpclassifyl.c (__fpclassifyl): Add
libm_hidden_def.
* sysdeps/i386/fpu/s_expm1l.S (__expm1l): Likewise.
* sysdeps/ieee754/dbl-64/s_finite.c (__finite): Remove INTDEF. Add
hidden_def.
* sysdeps/ieee754/dbl-64/s_isinf.c (__isinf): Likewise.
(__isinfl): Remove INTDEF.
* sysdeps/ieee754/dbl-64/s_isnan.c (__isnan): Remove INTDEF. Add
hidden_def.
(__isnanl): Remove INTDEF.
* sysdeps/ieee754/dbl-64/s_fpclassify.c (__fpclassify): Add
libm_hidden_def.
* sysdeps/ieee754/dbl-64/e_lgamma_r.c (sin_pi): Use __sin and __cos
instead of sin and cos.
* sysdeps/ieee754/flt-32/s_finitef.c (__finitef): Remove INTDEF.
Add hidden_def.
* sysdeps/ieee754/flt-32/s_isinff.c (__isinff): Likewise.
* sysdeps/ieee754/flt-32/s_isnanf.c (__isnanf): Likewise.
* sysdeps/ieee754/flt-32/s_fpclassifyf.c (__fpclassifyf): Add
libm_hidden_def.
* sysdeps/ieee754/ldbl-128/s_finitel.c (__finitel): Remove INTDEF.
Add hidden_def.
* sysdeps/ieee754/ldbl-128/s_isinfl.c (__isinfl): Likewise.
* sysdeps/ieee754/ldbl-128/s_isnanl.c (__isnanl): Likewise.
* sysdeps/ieee754/ldbl-128/s_fpclassifyl.c (__fpclassifyl): Add
libm_hidden_def.
* sysdeps/ieee754/ldbl-128/s_expm1l.c (__expm1l): Add
libm_hidden_def.
* sysdeps/ieee754/ldbl-96/s_finitel.c (__finitel): Remove INTDEF.
Add hidden_def.
* sysdeps/ieee754/ldbl-96/s_isinfl.c (__isinfl): Likewise.
* sysdeps/ieee754/ldbl-96/s_isnanl.c (__isnanl): Likewise.
* sysdeps/ieee754/ldbl-96/s_fpclassifyl.c (__fpclassifyl): Add
libm_hidden_def.
* sysdeps/ia64/fpu/s_finite.S (__finite_internal, __finitef_internal,
__finitel_internal): Remove aliases.
(__finite, __finitef, __finitel): Add hidden_def.
* sysdeps/ia64/fpu/s_isnan.S (__isnan_internal, __isnanf_internal,
__isnanl_internal): Remove aliases.
(__isnan, __isnanf, __isnanl): Add hidden_def.
* sysdeps/ia64/fpu/s_isinf.S (__isinf_internal, __isinff_internal,
__isinfl_internal): Remove aliases.
(__isinf, __isinff, __isinfl): Add hidden_def.
* sysdeps/ia64/fpu/s_fpclassify.S (__fpclassify, __fpclassifyf,
__fpclassifyl): Add libm_hidden_def.
* sysdeps/ia64/fpu/s_expm1l.S (__expm1l): Likewise.
* sysdeps/m68k/s_isinfl.c (__isinfl): Remove INTDEF. Add hidden_def.
* sysdeps/m68k/fpu/s_isinf.c (INTDEFX): Remove.
(hidden_defx): Define and use.
* sysdeps/m68k/fpu/s_fpclassifyl.c (__fpclassifyl): Add
libm_hidden_def.
* sysdeps/m68k/fpu/s_expm1l.c (__expm1l): Likewise.
* sysdeps/m68k/s_isnanl.c (__isnanl): Add hidden_def.
* sysdeps/powerpc/fpu/s_isnan.c (__isnan, __isnanf, __isnanl):
Remove INTDEF.
(__isnan, __isnanf): Add hidden_def.
* sysdeps/x86_64/fpu/s_finitel.S (__finitel_internal): Remove alias.
(__finitel): Add libm_hidden_def.
* sysdeps/x86_64/fpu/s_expm1l.S (__expm1l): Likewise.
* include/fenv.h (feraiseexcept, fesetenv): Add libm_hidden_proto.
* sysdeps/alpha/fpu/fesetenv.c (fesetenv): Add libm_hidden_ver.
* sysdeps/alpha/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/arm/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/arm/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/generic/fesetenv.c (fesetenv): Likewise.
* sysdeps/generic/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/i386/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/i386/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/m68k/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/m68k/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/mips/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/mips/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/powerpc/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/powerpc/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/sparc/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/sparc/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/hppa/fpu/fesetenv.c (fesetenv): Add libm_hidden_def.
* sysdeps/hppa/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/ia64/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/ia64/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/sh/sh4/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/sh/sh4/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/s390/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/s390/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/x86_64/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/x86_64/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
2002-09-10 09:40:26 +08:00
|
|
|
# endif
|
2002-04-19 16:00:18 +08:00
|
|
|
|
Update.
2002-09-09 Jakub Jelinek <jakub@redhat.com>
* include/math.h (__finite_internal, __finitef_internal,
__finitel_internal, __isinf_internal, __isnan_internal): Remove.
(isfinite): Remove.
(__finite, __isinf, __isnan, __finitef, __isinff, __isnanf, __finitel,
__isinfl, __isnanl): Add hidden_proto.
(__fpclassify, __fpclassifyf, __fpclassifyl, __expm1l): Add
libm_hidden_proto.
* math/Makefile (libm-calls): Add s_isinf and s_isnan.
* stdio-common/printf_fp.c (__printf_fp): Remove INTUSE from
__is{inf,nan} calls.
* stdio-common/printf_size.c (printf_size): Likewise.
* sysdeps/generic/printf_fphex.c (__printf_fphex): Likewise.
* sysdeps/generic/s_ldexp.c (__ldexp): Likewise.
* sysdeps/generic/s_ldexpf.c (__ldexpf): Likewise.
* sysdeps/generic/s_ldexpl.c (__ldexpl): Likewise.
* sysdeps/generic/s_expm1l.c (__expm1l): Add libm_hidden_def.
* sysdeps/i386/fpu/s_finite.S (__finite_internal): Remove alias.
(__finite): Add hidden_def.
* sysdeps/i386/fpu/s_finitef.S (__finitef_internal): Remove alias.
(__finitef): Add hidden_def.
* sysdeps/i386/fpu/s_finitel.S (__finitel_internal): Remove alias.
(__finitel): Add hidden_def.
* sysdeps/i386/fpu/s_isinfl.c (__isinfl): Remove INTDEF. Add
hidden_def.
* sysdeps/i386/fpu/s_isnanl.c (__isnanl): Likewise.
* sysdeps/i386/fpu/s_fpclassifyl.c (__fpclassifyl): Add
libm_hidden_def.
* sysdeps/i386/fpu/s_expm1l.S (__expm1l): Likewise.
* sysdeps/ieee754/dbl-64/s_finite.c (__finite): Remove INTDEF. Add
hidden_def.
* sysdeps/ieee754/dbl-64/s_isinf.c (__isinf): Likewise.
(__isinfl): Remove INTDEF.
* sysdeps/ieee754/dbl-64/s_isnan.c (__isnan): Remove INTDEF. Add
hidden_def.
(__isnanl): Remove INTDEF.
* sysdeps/ieee754/dbl-64/s_fpclassify.c (__fpclassify): Add
libm_hidden_def.
* sysdeps/ieee754/dbl-64/e_lgamma_r.c (sin_pi): Use __sin and __cos
instead of sin and cos.
* sysdeps/ieee754/flt-32/s_finitef.c (__finitef): Remove INTDEF.
Add hidden_def.
* sysdeps/ieee754/flt-32/s_isinff.c (__isinff): Likewise.
* sysdeps/ieee754/flt-32/s_isnanf.c (__isnanf): Likewise.
* sysdeps/ieee754/flt-32/s_fpclassifyf.c (__fpclassifyf): Add
libm_hidden_def.
* sysdeps/ieee754/ldbl-128/s_finitel.c (__finitel): Remove INTDEF.
Add hidden_def.
* sysdeps/ieee754/ldbl-128/s_isinfl.c (__isinfl): Likewise.
* sysdeps/ieee754/ldbl-128/s_isnanl.c (__isnanl): Likewise.
* sysdeps/ieee754/ldbl-128/s_fpclassifyl.c (__fpclassifyl): Add
libm_hidden_def.
* sysdeps/ieee754/ldbl-128/s_expm1l.c (__expm1l): Add
libm_hidden_def.
* sysdeps/ieee754/ldbl-96/s_finitel.c (__finitel): Remove INTDEF.
Add hidden_def.
* sysdeps/ieee754/ldbl-96/s_isinfl.c (__isinfl): Likewise.
* sysdeps/ieee754/ldbl-96/s_isnanl.c (__isnanl): Likewise.
* sysdeps/ieee754/ldbl-96/s_fpclassifyl.c (__fpclassifyl): Add
libm_hidden_def.
* sysdeps/ia64/fpu/s_finite.S (__finite_internal, __finitef_internal,
__finitel_internal): Remove aliases.
(__finite, __finitef, __finitel): Add hidden_def.
* sysdeps/ia64/fpu/s_isnan.S (__isnan_internal, __isnanf_internal,
__isnanl_internal): Remove aliases.
(__isnan, __isnanf, __isnanl): Add hidden_def.
* sysdeps/ia64/fpu/s_isinf.S (__isinf_internal, __isinff_internal,
__isinfl_internal): Remove aliases.
(__isinf, __isinff, __isinfl): Add hidden_def.
* sysdeps/ia64/fpu/s_fpclassify.S (__fpclassify, __fpclassifyf,
__fpclassifyl): Add libm_hidden_def.
* sysdeps/ia64/fpu/s_expm1l.S (__expm1l): Likewise.
* sysdeps/m68k/s_isinfl.c (__isinfl): Remove INTDEF. Add hidden_def.
* sysdeps/m68k/fpu/s_isinf.c (INTDEFX): Remove.
(hidden_defx): Define and use.
* sysdeps/m68k/fpu/s_fpclassifyl.c (__fpclassifyl): Add
libm_hidden_def.
* sysdeps/m68k/fpu/s_expm1l.c (__expm1l): Likewise.
* sysdeps/m68k/s_isnanl.c (__isnanl): Add hidden_def.
* sysdeps/powerpc/fpu/s_isnan.c (__isnan, __isnanf, __isnanl):
Remove INTDEF.
(__isnan, __isnanf): Add hidden_def.
* sysdeps/x86_64/fpu/s_finitel.S (__finitel_internal): Remove alias.
(__finitel): Add libm_hidden_def.
* sysdeps/x86_64/fpu/s_expm1l.S (__expm1l): Likewise.
* include/fenv.h (feraiseexcept, fesetenv): Add libm_hidden_proto.
* sysdeps/alpha/fpu/fesetenv.c (fesetenv): Add libm_hidden_ver.
* sysdeps/alpha/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/arm/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/arm/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/generic/fesetenv.c (fesetenv): Likewise.
* sysdeps/generic/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/i386/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/i386/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/m68k/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/m68k/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/mips/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/mips/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/powerpc/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/powerpc/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/sparc/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/sparc/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/hppa/fpu/fesetenv.c (fesetenv): Add libm_hidden_def.
* sysdeps/hppa/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/ia64/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/ia64/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/sh/sh4/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/sh/sh4/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/s390/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/s390/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/x86_64/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/x86_64/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
2002-09-10 09:40:26 +08:00
|
|
|
libm_hidden_proto (__fpclassify)
|
|
|
|
libm_hidden_proto (__fpclassifyf)
|
2013-04-02 19:51:02 +08:00
|
|
|
libm_hidden_proto (__issignaling)
|
|
|
|
libm_hidden_proto (__issignalingf)
|
2009-10-20 12:23:15 +08:00
|
|
|
libm_hidden_proto (__exp)
|
|
|
|
libm_hidden_proto (__expf)
|
2017-09-15 06:28:53 +08:00
|
|
|
libm_hidden_proto (__roundeven)
|
2002-04-15 01:55:43 +08:00
|
|
|
|
Update.
2002-09-09 Jakub Jelinek <jakub@redhat.com>
* include/math.h (__finite_internal, __finitef_internal,
__finitel_internal, __isinf_internal, __isnan_internal): Remove.
(isfinite): Remove.
(__finite, __isinf, __isnan, __finitef, __isinff, __isnanf, __finitel,
__isinfl, __isnanl): Add hidden_proto.
(__fpclassify, __fpclassifyf, __fpclassifyl, __expm1l): Add
libm_hidden_proto.
* math/Makefile (libm-calls): Add s_isinf and s_isnan.
* stdio-common/printf_fp.c (__printf_fp): Remove INTUSE from
__is{inf,nan} calls.
* stdio-common/printf_size.c (printf_size): Likewise.
* sysdeps/generic/printf_fphex.c (__printf_fphex): Likewise.
* sysdeps/generic/s_ldexp.c (__ldexp): Likewise.
* sysdeps/generic/s_ldexpf.c (__ldexpf): Likewise.
* sysdeps/generic/s_ldexpl.c (__ldexpl): Likewise.
* sysdeps/generic/s_expm1l.c (__expm1l): Add libm_hidden_def.
* sysdeps/i386/fpu/s_finite.S (__finite_internal): Remove alias.
(__finite): Add hidden_def.
* sysdeps/i386/fpu/s_finitef.S (__finitef_internal): Remove alias.
(__finitef): Add hidden_def.
* sysdeps/i386/fpu/s_finitel.S (__finitel_internal): Remove alias.
(__finitel): Add hidden_def.
* sysdeps/i386/fpu/s_isinfl.c (__isinfl): Remove INTDEF. Add
hidden_def.
* sysdeps/i386/fpu/s_isnanl.c (__isnanl): Likewise.
* sysdeps/i386/fpu/s_fpclassifyl.c (__fpclassifyl): Add
libm_hidden_def.
* sysdeps/i386/fpu/s_expm1l.S (__expm1l): Likewise.
* sysdeps/ieee754/dbl-64/s_finite.c (__finite): Remove INTDEF. Add
hidden_def.
* sysdeps/ieee754/dbl-64/s_isinf.c (__isinf): Likewise.
(__isinfl): Remove INTDEF.
* sysdeps/ieee754/dbl-64/s_isnan.c (__isnan): Remove INTDEF. Add
hidden_def.
(__isnanl): Remove INTDEF.
* sysdeps/ieee754/dbl-64/s_fpclassify.c (__fpclassify): Add
libm_hidden_def.
* sysdeps/ieee754/dbl-64/e_lgamma_r.c (sin_pi): Use __sin and __cos
instead of sin and cos.
* sysdeps/ieee754/flt-32/s_finitef.c (__finitef): Remove INTDEF.
Add hidden_def.
* sysdeps/ieee754/flt-32/s_isinff.c (__isinff): Likewise.
* sysdeps/ieee754/flt-32/s_isnanf.c (__isnanf): Likewise.
* sysdeps/ieee754/flt-32/s_fpclassifyf.c (__fpclassifyf): Add
libm_hidden_def.
* sysdeps/ieee754/ldbl-128/s_finitel.c (__finitel): Remove INTDEF.
Add hidden_def.
* sysdeps/ieee754/ldbl-128/s_isinfl.c (__isinfl): Likewise.
* sysdeps/ieee754/ldbl-128/s_isnanl.c (__isnanl): Likewise.
* sysdeps/ieee754/ldbl-128/s_fpclassifyl.c (__fpclassifyl): Add
libm_hidden_def.
* sysdeps/ieee754/ldbl-128/s_expm1l.c (__expm1l): Add
libm_hidden_def.
* sysdeps/ieee754/ldbl-96/s_finitel.c (__finitel): Remove INTDEF.
Add hidden_def.
* sysdeps/ieee754/ldbl-96/s_isinfl.c (__isinfl): Likewise.
* sysdeps/ieee754/ldbl-96/s_isnanl.c (__isnanl): Likewise.
* sysdeps/ieee754/ldbl-96/s_fpclassifyl.c (__fpclassifyl): Add
libm_hidden_def.
* sysdeps/ia64/fpu/s_finite.S (__finite_internal, __finitef_internal,
__finitel_internal): Remove aliases.
(__finite, __finitef, __finitel): Add hidden_def.
* sysdeps/ia64/fpu/s_isnan.S (__isnan_internal, __isnanf_internal,
__isnanl_internal): Remove aliases.
(__isnan, __isnanf, __isnanl): Add hidden_def.
* sysdeps/ia64/fpu/s_isinf.S (__isinf_internal, __isinff_internal,
__isinfl_internal): Remove aliases.
(__isinf, __isinff, __isinfl): Add hidden_def.
* sysdeps/ia64/fpu/s_fpclassify.S (__fpclassify, __fpclassifyf,
__fpclassifyl): Add libm_hidden_def.
* sysdeps/ia64/fpu/s_expm1l.S (__expm1l): Likewise.
* sysdeps/m68k/s_isinfl.c (__isinfl): Remove INTDEF. Add hidden_def.
* sysdeps/m68k/fpu/s_isinf.c (INTDEFX): Remove.
(hidden_defx): Define and use.
* sysdeps/m68k/fpu/s_fpclassifyl.c (__fpclassifyl): Add
libm_hidden_def.
* sysdeps/m68k/fpu/s_expm1l.c (__expm1l): Likewise.
* sysdeps/m68k/s_isnanl.c (__isnanl): Add hidden_def.
* sysdeps/powerpc/fpu/s_isnan.c (__isnan, __isnanf, __isnanl):
Remove INTDEF.
(__isnan, __isnanf): Add hidden_def.
* sysdeps/x86_64/fpu/s_finitel.S (__finitel_internal): Remove alias.
(__finitel): Add libm_hidden_def.
* sysdeps/x86_64/fpu/s_expm1l.S (__expm1l): Likewise.
* include/fenv.h (feraiseexcept, fesetenv): Add libm_hidden_proto.
* sysdeps/alpha/fpu/fesetenv.c (fesetenv): Add libm_hidden_ver.
* sysdeps/alpha/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/arm/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/arm/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/generic/fesetenv.c (fesetenv): Likewise.
* sysdeps/generic/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/i386/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/i386/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/m68k/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/m68k/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/mips/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/mips/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/powerpc/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/powerpc/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/sparc/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/sparc/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/hppa/fpu/fesetenv.c (fesetenv): Add libm_hidden_def.
* sysdeps/hppa/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/ia64/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/ia64/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/sh/sh4/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/sh/sh4/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/s390/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/s390/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/x86_64/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/x86_64/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
2002-09-10 09:40:26 +08:00
|
|
|
# ifndef __NO_LONG_DOUBLE_MATH
|
|
|
|
libm_hidden_proto (__fpclassifyl)
|
2013-04-02 19:51:02 +08:00
|
|
|
libm_hidden_proto (__issignalingl)
|
2009-10-20 12:23:15 +08:00
|
|
|
libm_hidden_proto (__expl)
|
Update.
2002-09-09 Jakub Jelinek <jakub@redhat.com>
* include/math.h (__finite_internal, __finitef_internal,
__finitel_internal, __isinf_internal, __isnan_internal): Remove.
(isfinite): Remove.
(__finite, __isinf, __isnan, __finitef, __isinff, __isnanf, __finitel,
__isinfl, __isnanl): Add hidden_proto.
(__fpclassify, __fpclassifyf, __fpclassifyl, __expm1l): Add
libm_hidden_proto.
* math/Makefile (libm-calls): Add s_isinf and s_isnan.
* stdio-common/printf_fp.c (__printf_fp): Remove INTUSE from
__is{inf,nan} calls.
* stdio-common/printf_size.c (printf_size): Likewise.
* sysdeps/generic/printf_fphex.c (__printf_fphex): Likewise.
* sysdeps/generic/s_ldexp.c (__ldexp): Likewise.
* sysdeps/generic/s_ldexpf.c (__ldexpf): Likewise.
* sysdeps/generic/s_ldexpl.c (__ldexpl): Likewise.
* sysdeps/generic/s_expm1l.c (__expm1l): Add libm_hidden_def.
* sysdeps/i386/fpu/s_finite.S (__finite_internal): Remove alias.
(__finite): Add hidden_def.
* sysdeps/i386/fpu/s_finitef.S (__finitef_internal): Remove alias.
(__finitef): Add hidden_def.
* sysdeps/i386/fpu/s_finitel.S (__finitel_internal): Remove alias.
(__finitel): Add hidden_def.
* sysdeps/i386/fpu/s_isinfl.c (__isinfl): Remove INTDEF. Add
hidden_def.
* sysdeps/i386/fpu/s_isnanl.c (__isnanl): Likewise.
* sysdeps/i386/fpu/s_fpclassifyl.c (__fpclassifyl): Add
libm_hidden_def.
* sysdeps/i386/fpu/s_expm1l.S (__expm1l): Likewise.
* sysdeps/ieee754/dbl-64/s_finite.c (__finite): Remove INTDEF. Add
hidden_def.
* sysdeps/ieee754/dbl-64/s_isinf.c (__isinf): Likewise.
(__isinfl): Remove INTDEF.
* sysdeps/ieee754/dbl-64/s_isnan.c (__isnan): Remove INTDEF. Add
hidden_def.
(__isnanl): Remove INTDEF.
* sysdeps/ieee754/dbl-64/s_fpclassify.c (__fpclassify): Add
libm_hidden_def.
* sysdeps/ieee754/dbl-64/e_lgamma_r.c (sin_pi): Use __sin and __cos
instead of sin and cos.
* sysdeps/ieee754/flt-32/s_finitef.c (__finitef): Remove INTDEF.
Add hidden_def.
* sysdeps/ieee754/flt-32/s_isinff.c (__isinff): Likewise.
* sysdeps/ieee754/flt-32/s_isnanf.c (__isnanf): Likewise.
* sysdeps/ieee754/flt-32/s_fpclassifyf.c (__fpclassifyf): Add
libm_hidden_def.
* sysdeps/ieee754/ldbl-128/s_finitel.c (__finitel): Remove INTDEF.
Add hidden_def.
* sysdeps/ieee754/ldbl-128/s_isinfl.c (__isinfl): Likewise.
* sysdeps/ieee754/ldbl-128/s_isnanl.c (__isnanl): Likewise.
* sysdeps/ieee754/ldbl-128/s_fpclassifyl.c (__fpclassifyl): Add
libm_hidden_def.
* sysdeps/ieee754/ldbl-128/s_expm1l.c (__expm1l): Add
libm_hidden_def.
* sysdeps/ieee754/ldbl-96/s_finitel.c (__finitel): Remove INTDEF.
Add hidden_def.
* sysdeps/ieee754/ldbl-96/s_isinfl.c (__isinfl): Likewise.
* sysdeps/ieee754/ldbl-96/s_isnanl.c (__isnanl): Likewise.
* sysdeps/ieee754/ldbl-96/s_fpclassifyl.c (__fpclassifyl): Add
libm_hidden_def.
* sysdeps/ia64/fpu/s_finite.S (__finite_internal, __finitef_internal,
__finitel_internal): Remove aliases.
(__finite, __finitef, __finitel): Add hidden_def.
* sysdeps/ia64/fpu/s_isnan.S (__isnan_internal, __isnanf_internal,
__isnanl_internal): Remove aliases.
(__isnan, __isnanf, __isnanl): Add hidden_def.
* sysdeps/ia64/fpu/s_isinf.S (__isinf_internal, __isinff_internal,
__isinfl_internal): Remove aliases.
(__isinf, __isinff, __isinfl): Add hidden_def.
* sysdeps/ia64/fpu/s_fpclassify.S (__fpclassify, __fpclassifyf,
__fpclassifyl): Add libm_hidden_def.
* sysdeps/ia64/fpu/s_expm1l.S (__expm1l): Likewise.
* sysdeps/m68k/s_isinfl.c (__isinfl): Remove INTDEF. Add hidden_def.
* sysdeps/m68k/fpu/s_isinf.c (INTDEFX): Remove.
(hidden_defx): Define and use.
* sysdeps/m68k/fpu/s_fpclassifyl.c (__fpclassifyl): Add
libm_hidden_def.
* sysdeps/m68k/fpu/s_expm1l.c (__expm1l): Likewise.
* sysdeps/m68k/s_isnanl.c (__isnanl): Add hidden_def.
* sysdeps/powerpc/fpu/s_isnan.c (__isnan, __isnanf, __isnanl):
Remove INTDEF.
(__isnan, __isnanf): Add hidden_def.
* sysdeps/x86_64/fpu/s_finitel.S (__finitel_internal): Remove alias.
(__finitel): Add libm_hidden_def.
* sysdeps/x86_64/fpu/s_expm1l.S (__expm1l): Likewise.
* include/fenv.h (feraiseexcept, fesetenv): Add libm_hidden_proto.
* sysdeps/alpha/fpu/fesetenv.c (fesetenv): Add libm_hidden_ver.
* sysdeps/alpha/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/arm/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/arm/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/generic/fesetenv.c (fesetenv): Likewise.
* sysdeps/generic/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/i386/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/i386/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/m68k/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/m68k/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/mips/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/mips/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/powerpc/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/powerpc/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/sparc/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/sparc/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/hppa/fpu/fesetenv.c (fesetenv): Add libm_hidden_def.
* sysdeps/hppa/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/ia64/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/ia64/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/sh/sh4/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/sh/sh4/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/s390/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/s390/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
* sysdeps/x86_64/fpu/fesetenv.c (fesetenv): Likewise.
* sysdeps/x86_64/fpu/fraiseexcpt.c (feraiseexcept): Likewise.
2002-09-10 09:40:26 +08:00
|
|
|
libm_hidden_proto (__expm1l)
|
Update.
* sysdeps/mach/hurd/chown.c: Use INTDEF for __chown.
* sysdeps/unix/sysv/aix/chown.c: Likewise.
* sysdeps/unix/grantpt.c: Use INTUSE for __chown calls.
* sysdeps/unix/sysv/linux/m68k/chown.c: Likewise.
* sysdeps/unix/sysv/linux/powerpc/chown.c: Likewise.
* sysdeps/unix/sysv/linux/i386/chown.c: Use INTDEF2 to define
__chown_internal.
* sysdeps/unix/sysv/linux/s390/s390-32//chown.c: Likewise.
* intl/dcngettext.c [_LIBC]: Use INTUSE for __dcngettext.
* intl/dngettext.c [_LIBC] (DCNGETTEXT): Use INTUSE.
* intl/ngettext.c: Likewise.
* include/sys/socket.h: Declare __connect_internal and define
__connect macro if not NOT_IN_libc.
* sysdeps/mach/hurd/connect.c: Use INTDEF for __connect.
* sysdeps/unix/sysv/aix/connect.c: Likewise.
* sysdeps/unix/sysv/linux/connect.S: Add __connect_internal alias.
* include/unistd.h: Declare __close_internal and define __close macro
if not NOT_IN_libc.
* libio/libioP.h (JUMO0, JUMP1, JUMP2, JUMP3, WJUMP0, WJUMP1, WJUMP2,
WJUMP3): Add extra parenthesis to avoid expanding element names with
macors like __close.
* sysdeps/unix/syscalls.list: Add __close_internal alias.
* include/unistd.h: Declare __dup2_internal and define __dup2 macro
if not NOT_IN_libc.
* sysdeps/mach/hurd/dup2.c: Use INTDEF for __dup2.
* sysdeps/posix/dup2.c: Use INTDEF for __dup2.
* sysdeps/unix/syscalls.list: Add __dup2_internal alias.
* include/unistd.h: Declare __fork_internal and define __fork macro
if not NOT_IN_libc.
* sysdeps/mach/hurd/fork.c: Use INTDEF for __fork.
* sysdeps/unix/sysv/aix/fork.c: Likewise.
* sysdeps/unix/sysv/linux/syscalls.list: Add __fork_internal alias.
* include/stdio_ext.h: Declare __fsetlocking_internal and define
__fsetlocking macro to use it if not NOT_IN_libc.
* libio/__fsetlocking.c: Use INTDEF for __fsetlocking.
* libio/__fbufsize.c: Correct copyright.
* libio/__flbf.c: Likewise.
* libio/__fpending.c: Likewise.
* libio/__fpurge.c: Likewise.
* libio/__freadable.c: Likewise.
* libio/__freading.c: Likewise.
* libio/__fsetlocking.c: Likewise.
* libio/__fwritable.c: Likewise.
* libio/__fwriting.c: Likewise.
* include/stdio.h: Declare __asprintf_internal and define __asprintf
macro to use it if not NOT_IN_libc.
* stdio-common/asprintf.c: Use INTDEF for __asprintf.
* include/mntent.h: Declare __setmntent_internal,
__getmntent_r_internal, __endmntent_internal. Define __setmntent,
__getmntent_r, and __endmntent macros to use these functions if not
NOT_IN_libc.
* misc/mntent_r.c: Use INTDEF for __setmntent, __getmntent_r, and
__endmntent.
* include/math.h: Declare __finite_internal, __finitef_internal, and
__finitel_internal. Redefine isfinite macro if in libc or libm using
these functions.
* sysdeps/generic/s_ldexp.c: Use INTUSE for __finite calls.
* sysdeps/generic/s_ldexpf.c: Use INTUSE for __finitef calls.
* sysdeps/generic/s_ldexpl.c: Use INTUSE for __finitel calls.
* sysdeps/i386/fpu/s_finite.S: Define _internal alias.
* sysdeps/i386/fpu/s_finitef.S: Likewise.
* sysdeps/i386/fpu/s_finitel.S: Likewise.
* sysdeps/ieee754/dbl-64/s_finite.c: Likewise.
* sysdeps/ieee754/flt-32/s_finitef.c: Likewise.
* sysdeps/ieee754/ldbl-128/s_finitel.c: Likewise.
* sysdeps/ieee754/ldbl-96/s_finitel.c: Likewise.
* include/fcntl.h: Declare __fcntl_internal. Define __fcntl macro
to use this function if not NOT_IN_libc.
* libio/iofdopen.c (_IO_fcntl): Use INTUSE.
* sysdeps/generic/fcntl.c: Use INTDEF for __fcntl.
* sysdeps/mach/hurd/fcntl.c: Likewise.
* sysdeps/unix/sysv/aix/fcntl.c: Likewise.
* sysdeps/unix/sysv/linux/i386/fcntl.c: Likewise.
* include/argz.h: Declare __argz_count_internal and
__argz_stringify_internal.
* intl/l10nflist.c [_LIBC]: Use INTUSE for __argz_count and
__argz_stringify.
* string/argz-count.c: Use INTDEF for __argz_count.
* string/argz-stringify.c: Use INTDEF for __argz_stringify.
* include/stdlib.h: Declare __cxa_atexit_internal and define
__cxa_atexit macro if not NOT_IN_libc.
* stdlib/cxa_atexit.c: Use INTDEF for __cxa_atexit.
* dlfcn/Makefile: Define NOT_IN_libc when compiling modcxaatexit.c.
* assert/assert.c: Use INTDEF for __assert_fail.
* assert/__assert.c: Use INTUSE for call to __assert_fail.
* include/assert.h: Declare __assert_fail_internal.
2002-04-10 04:36:24 +08:00
|
|
|
# endif
|
|
|
|
|
2017-05-05 04:00:33 +08:00
|
|
|
# if __HAVE_DISTINCT_FLOAT128
|
|
|
|
libm_hidden_proto (__fpclassifyf128)
|
|
|
|
libm_hidden_proto (__issignalingf128)
|
|
|
|
libm_hidden_proto (__expf128)
|
|
|
|
libm_hidden_proto (__expm1f128)
|
|
|
|
# endif
|
|
|
|
|
2019-11-21 23:39:48 +08:00
|
|
|
#include <stdint.h>
|
|
|
|
#include <nan-high-order-bit.h>
|
|
|
|
|
|
|
|
/* A union which permits us to convert between a float and a 32 bit
|
|
|
|
int. */
|
|
|
|
|
|
|
|
typedef union
|
|
|
|
{
|
|
|
|
float value;
|
|
|
|
uint32_t word;
|
|
|
|
} ieee_float_shape_type;
|
|
|
|
|
|
|
|
/* Get a 32 bit int from a float. */
|
|
|
|
#ifndef GET_FLOAT_WORD
|
|
|
|
# define GET_FLOAT_WORD(i,d) \
|
|
|
|
do { \
|
|
|
|
ieee_float_shape_type gf_u; \
|
|
|
|
gf_u.value = (d); \
|
|
|
|
(i) = gf_u.word; \
|
|
|
|
} while (0)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* Set a float from a 32 bit int. */
|
|
|
|
#ifndef SET_FLOAT_WORD
|
|
|
|
# define SET_FLOAT_WORD(d,i) \
|
|
|
|
do { \
|
|
|
|
ieee_float_shape_type sf_u; \
|
|
|
|
sf_u.word = (i); \
|
|
|
|
(d) = sf_u.value; \
|
|
|
|
} while (0)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
extern inline int
|
|
|
|
__issignalingf (float x)
|
|
|
|
{
|
|
|
|
uint32_t xi;
|
|
|
|
GET_FLOAT_WORD (xi, x);
|
|
|
|
#if HIGH_ORDER_BIT_IS_SET_FOR_SNAN
|
|
|
|
/* We only have to care about the high-order bit of x's significand, because
|
|
|
|
having it set (sNaN) already makes the significand different from that
|
|
|
|
used to designate infinity. */
|
|
|
|
return (xi & 0x7fc00000) == 0x7fc00000;
|
|
|
|
#else
|
|
|
|
/* To keep the following comparison simple, toggle the quiet/signaling bit,
|
|
|
|
so that it is set for sNaNs. This is inverse to IEEE 754-2008 (as well as
|
|
|
|
common practice for IEEE 754-1985). */
|
|
|
|
xi ^= 0x00400000;
|
|
|
|
/* We have to compare for greater (instead of greater or equal), because x's
|
|
|
|
significand being all-zero designates infinity not NaN. */
|
|
|
|
return (xi & 0x7fffffff) > 0x7fc00000;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2018-09-05 19:53:35 +08:00
|
|
|
# if __HAVE_DISTINCT_FLOAT128
|
|
|
|
|
|
|
|
/* __builtin_isinf_sign is broken in GCC < 7 for float128. */
|
|
|
|
# if ! __GNUC_PREREQ (7, 0)
|
|
|
|
# include <ieee754_float128.h>
|
|
|
|
extern inline int
|
|
|
|
__isinff128 (_Float128 x)
|
|
|
|
{
|
|
|
|
int64_t hx, lx;
|
|
|
|
GET_FLOAT128_WORDS64 (hx, lx, x);
|
|
|
|
lx |= (hx & 0x7fffffffffffffffLL) ^ 0x7fff000000000000LL;
|
|
|
|
lx |= -lx;
|
|
|
|
return ~(lx >> 63) & (hx >> 62);
|
|
|
|
}
|
|
|
|
# endif
|
|
|
|
|
|
|
|
extern inline _Float128
|
|
|
|
fabsf128 (_Float128 x)
|
|
|
|
{
|
|
|
|
return __builtin_fabsf128 (x);
|
|
|
|
}
|
|
|
|
# endif
|
|
|
|
|
2018-03-16 01:57:03 +08:00
|
|
|
# if !(defined __FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ > 0)
|
|
|
|
# ifndef NO_MATH_REDIRECT
|
Use floor functions not __floor functions in glibc libm.
Similar to the changes that were made to call sqrt functions directly
in glibc, instead of __ieee754_sqrt variants, so that the compiler
could inline them automatically without needing special inline
definitions in lots of math_private.h headers, this patch makes libm
code call floor functions directly instead of __floor variants,
removing the inlines / macros for x86_64 (SSE4.1) and powerpc
(POWER5).
The redirection used to ensure that __ieee754_sqrt does still get
called when the compiler doesn't inline a built-in function expansion
is refactored so it can be applied to other functions; the refactoring
is arranged so it's not limited to unary functions either (it would be
reasonable to use this mechanism for copysign - removing the inline in
math_private_calls.h but also eliminating unnecessary local PLT entry
use in the cases (powerpc soft-float and e500v1, for IBM long double)
where copysign calls don't get inlined).
The point of this change is that more architectures can get floor
calls inlined where they weren't previously (AArch64, for example),
without needing special inline definitions in their math_private.h,
and existing such definitions in math_private.h headers can be
removed.
Note that it's possible that in some cases an inline may be used where
an IFUNC call was previously used - this is the case on x86_64, for
example. I think the direct calls to floor are still appropriate; if
there's any significant performance cost from inline SSE2 floor
instead of an IFUNC call ending up with SSE4.1 floor, that indicates
that either the function should be doing something else that's faster
than using floor at all, or it should itself have IFUNC variants, or
that the compiler choice of inlining for generic tuning should change
to allow for the possibility that, by not inlining, an SSE4.1 IFUNC
might be called at runtime - but not that glibc should avoid calling
floor internally. (After all, all the same considerations would apply
to any user program calling floor, where it might either be inlined or
left as an out-of-line call allowing for a possible IFUNC.)
Tested for x86_64, and with build-many-glibcs.py.
* include/math.h [!_ISOMAC && !(__FINITE_MATH_ONLY__ &&
__FINITE_MATH_ONLY__ > 0) && !NO_MATH_REDIRECT] (MATH_REDIRECT):
New macro.
[!_ISOMAC && !(__FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ > 0)
&& !NO_MATH_REDIRECT] (MATH_REDIRECT_LDBL): Likewise.
[!_ISOMAC && !(__FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ > 0)
&& !NO_MATH_REDIRECT] (MATH_REDIRECT_F128): Likewise.
[!_ISOMAC && !(__FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ > 0)
&& !NO_MATH_REDIRECT] (MATH_REDIRECT_UNARY_ARGS): Likewise.
[!_ISOMAC && !(__FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ > 0)
&& !NO_MATH_REDIRECT] (sqrt): Redirect using MATH_REDIRECT.
[!_ISOMAC && !(__FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ > 0)
&& !NO_MATH_REDIRECT] (floor): Likewise.
* sysdeps/aarch64/fpu/s_floor.c: Define NO_MATH_REDIRECT before
header inclusion.
* sysdeps/aarch64/fpu/s_floorf.c: Likewise.
* sysdeps/ieee754/dbl-64/s_floor.c: Likewise.
* sysdeps/ieee754/dbl-64/wordsize-64/s_floor.c: Likewise.
* sysdeps/ieee754/float128/s_floorf128.c: Likewise.
* sysdeps/ieee754/flt-32/s_floorf.c: Likewise.
* sysdeps/ieee754/ldbl-128/s_floorl.c: Likewise.
* sysdeps/ieee754/ldbl-128ibm/s_floorl.c: Likewise.
* sysdeps/m68k/m680x0/fpu/s_floor_template.c: Likewise.
* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_floor.c: Likewise.
* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_floorf.c: Likewise.
* sysdeps/powerpc/powerpc64/fpu/multiarch/s_floor.c: Likewise.
* sysdeps/powerpc/powerpc64/fpu/multiarch/s_floorf.c: Likewise.
* sysdeps/riscv/rv64/rvd/s_floor.c: Likewise.
* sysdeps/riscv/rvf/s_floorf.c: Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_floor.c: Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_floorf.c: Likewise.
* sysdeps/x86_64/fpu/multiarch/s_floor.c: Likewise.
* sysdeps/x86_64/fpu/multiarch/s_floorf.c: Likewise.
* sysdeps/powerpc/fpu/math_private.h [_ARCH_PWR5X] (__floor):
Remove macro.
[_ARCH_PWR5X] (__floorf): Likewise.
* sysdeps/x86_64/fpu/math_private.h [__SSE4_1__] (__floor): Remove
inline function.
[__SSE4_1__] (__floorf): Likewise.
* math/w_lgamma_main.c (LGFUNC (__lgamma)): Use floor functions
instead of __floor variants.
* math/w_lgamma_r_compat.c (__lgamma_r): Likewise.
* math/w_lgammaf_main.c (LGFUNC (__lgammaf)): Likewise.
* math/w_lgammaf_r_compat.c (__lgammaf_r): Likewise.
* math/w_lgammal_main.c (LGFUNC (__lgammal)): Likewise.
* math/w_lgammal_r_compat.c (__lgammal_r): Likewise.
* math/w_tgamma_compat.c (__tgamma): Likewise.
* math/w_tgamma_template.c (M_DECL_FUNC (__tgamma)): Likewise.
* math/w_tgammaf_compat.c (__tgammaf): Likewise.
* math/w_tgammal_compat.c (__tgammal): Likewise.
* sysdeps/ieee754/dbl-64/e_lgamma_r.c (sin_pi): Likewise.
* sysdeps/ieee754/dbl-64/k_rem_pio2.c (__kernel_rem_pio2):
Likewise.
* sysdeps/ieee754/dbl-64/lgamma_neg.c (__lgamma_neg): Likewise.
* sysdeps/ieee754/flt-32/e_lgammaf_r.c (sin_pif): Likewise.
* sysdeps/ieee754/flt-32/lgamma_negf.c (__lgamma_negf): Likewise.
* sysdeps/ieee754/ldbl-128/e_lgammal_r.c (__ieee754_lgammal_r):
Likewise.
* sysdeps/ieee754/ldbl-128/e_powl.c (__ieee754_powl): Likewise.
* sysdeps/ieee754/ldbl-128/lgamma_negl.c (__lgamma_negl):
Likewise.
* sysdeps/ieee754/ldbl-128/s_expm1l.c (__expm1l): Likewise.
* sysdeps/ieee754/ldbl-128ibm/e_lgammal_r.c (__ieee754_lgammal_r):
Likewise.
* sysdeps/ieee754/ldbl-128ibm/e_powl.c (__ieee754_powl): Likewise.
* sysdeps/ieee754/ldbl-128ibm/lgamma_negl.c (__lgamma_negl):
Likewise.
* sysdeps/ieee754/ldbl-128ibm/s_expm1l.c (__expm1l): Likewise.
* sysdeps/ieee754/ldbl-128ibm/s_truncl.c (__truncl): Likewise.
* sysdeps/ieee754/ldbl-96/e_lgammal_r.c (sin_pi): Likewise.
* sysdeps/ieee754/ldbl-96/lgamma_negl.c (__lgamma_negl): Likewise.
* sysdeps/powerpc/power5+/fpu/s_modf.c (__modf): Likewise.
* sysdeps/powerpc/power5+/fpu/s_modff.c (__modff): Likewise.
2018-09-14 21:09:01 +08:00
|
|
|
/* Declare some functions for use within GLIBC. Compilers typically
|
|
|
|
inline those functions as a single instruction. Use an asm to
|
|
|
|
avoid use of PLTs if it doesn't. */
|
|
|
|
# define MATH_REDIRECT(FUNC, PREFIX, ARGS) \
|
|
|
|
float (FUNC ## f) (ARGS (float)) asm (PREFIX #FUNC "f"); \
|
|
|
|
double (FUNC) (ARGS (double)) asm (PREFIX #FUNC ); \
|
|
|
|
MATH_REDIRECT_LDBL (FUNC, PREFIX, ARGS) \
|
|
|
|
MATH_REDIRECT_F128 (FUNC, PREFIX, ARGS)
|
|
|
|
# ifdef __NO_LONG_DOUBLE_MATH
|
|
|
|
# define MATH_REDIRECT_LDBL(FUNC, PREFIX, ARGS)
|
|
|
|
# else
|
|
|
|
# define MATH_REDIRECT_LDBL(FUNC, PREFIX, ARGS) \
|
|
|
|
long double (FUNC ## l) (ARGS (long double)) asm (PREFIX #FUNC "l");
|
2018-03-16 01:57:03 +08:00
|
|
|
# endif
|
Use floor functions not __floor functions in glibc libm.
Similar to the changes that were made to call sqrt functions directly
in glibc, instead of __ieee754_sqrt variants, so that the compiler
could inline them automatically without needing special inline
definitions in lots of math_private.h headers, this patch makes libm
code call floor functions directly instead of __floor variants,
removing the inlines / macros for x86_64 (SSE4.1) and powerpc
(POWER5).
The redirection used to ensure that __ieee754_sqrt does still get
called when the compiler doesn't inline a built-in function expansion
is refactored so it can be applied to other functions; the refactoring
is arranged so it's not limited to unary functions either (it would be
reasonable to use this mechanism for copysign - removing the inline in
math_private_calls.h but also eliminating unnecessary local PLT entry
use in the cases (powerpc soft-float and e500v1, for IBM long double)
where copysign calls don't get inlined).
The point of this change is that more architectures can get floor
calls inlined where they weren't previously (AArch64, for example),
without needing special inline definitions in their math_private.h,
and existing such definitions in math_private.h headers can be
removed.
Note that it's possible that in some cases an inline may be used where
an IFUNC call was previously used - this is the case on x86_64, for
example. I think the direct calls to floor are still appropriate; if
there's any significant performance cost from inline SSE2 floor
instead of an IFUNC call ending up with SSE4.1 floor, that indicates
that either the function should be doing something else that's faster
than using floor at all, or it should itself have IFUNC variants, or
that the compiler choice of inlining for generic tuning should change
to allow for the possibility that, by not inlining, an SSE4.1 IFUNC
might be called at runtime - but not that glibc should avoid calling
floor internally. (After all, all the same considerations would apply
to any user program calling floor, where it might either be inlined or
left as an out-of-line call allowing for a possible IFUNC.)
Tested for x86_64, and with build-many-glibcs.py.
* include/math.h [!_ISOMAC && !(__FINITE_MATH_ONLY__ &&
__FINITE_MATH_ONLY__ > 0) && !NO_MATH_REDIRECT] (MATH_REDIRECT):
New macro.
[!_ISOMAC && !(__FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ > 0)
&& !NO_MATH_REDIRECT] (MATH_REDIRECT_LDBL): Likewise.
[!_ISOMAC && !(__FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ > 0)
&& !NO_MATH_REDIRECT] (MATH_REDIRECT_F128): Likewise.
[!_ISOMAC && !(__FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ > 0)
&& !NO_MATH_REDIRECT] (MATH_REDIRECT_UNARY_ARGS): Likewise.
[!_ISOMAC && !(__FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ > 0)
&& !NO_MATH_REDIRECT] (sqrt): Redirect using MATH_REDIRECT.
[!_ISOMAC && !(__FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ > 0)
&& !NO_MATH_REDIRECT] (floor): Likewise.
* sysdeps/aarch64/fpu/s_floor.c: Define NO_MATH_REDIRECT before
header inclusion.
* sysdeps/aarch64/fpu/s_floorf.c: Likewise.
* sysdeps/ieee754/dbl-64/s_floor.c: Likewise.
* sysdeps/ieee754/dbl-64/wordsize-64/s_floor.c: Likewise.
* sysdeps/ieee754/float128/s_floorf128.c: Likewise.
* sysdeps/ieee754/flt-32/s_floorf.c: Likewise.
* sysdeps/ieee754/ldbl-128/s_floorl.c: Likewise.
* sysdeps/ieee754/ldbl-128ibm/s_floorl.c: Likewise.
* sysdeps/m68k/m680x0/fpu/s_floor_template.c: Likewise.
* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_floor.c: Likewise.
* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_floorf.c: Likewise.
* sysdeps/powerpc/powerpc64/fpu/multiarch/s_floor.c: Likewise.
* sysdeps/powerpc/powerpc64/fpu/multiarch/s_floorf.c: Likewise.
* sysdeps/riscv/rv64/rvd/s_floor.c: Likewise.
* sysdeps/riscv/rvf/s_floorf.c: Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_floor.c: Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_floorf.c: Likewise.
* sysdeps/x86_64/fpu/multiarch/s_floor.c: Likewise.
* sysdeps/x86_64/fpu/multiarch/s_floorf.c: Likewise.
* sysdeps/powerpc/fpu/math_private.h [_ARCH_PWR5X] (__floor):
Remove macro.
[_ARCH_PWR5X] (__floorf): Likewise.
* sysdeps/x86_64/fpu/math_private.h [__SSE4_1__] (__floor): Remove
inline function.
[__SSE4_1__] (__floorf): Likewise.
* math/w_lgamma_main.c (LGFUNC (__lgamma)): Use floor functions
instead of __floor variants.
* math/w_lgamma_r_compat.c (__lgamma_r): Likewise.
* math/w_lgammaf_main.c (LGFUNC (__lgammaf)): Likewise.
* math/w_lgammaf_r_compat.c (__lgammaf_r): Likewise.
* math/w_lgammal_main.c (LGFUNC (__lgammal)): Likewise.
* math/w_lgammal_r_compat.c (__lgammal_r): Likewise.
* math/w_tgamma_compat.c (__tgamma): Likewise.
* math/w_tgamma_template.c (M_DECL_FUNC (__tgamma)): Likewise.
* math/w_tgammaf_compat.c (__tgammaf): Likewise.
* math/w_tgammal_compat.c (__tgammal): Likewise.
* sysdeps/ieee754/dbl-64/e_lgamma_r.c (sin_pi): Likewise.
* sysdeps/ieee754/dbl-64/k_rem_pio2.c (__kernel_rem_pio2):
Likewise.
* sysdeps/ieee754/dbl-64/lgamma_neg.c (__lgamma_neg): Likewise.
* sysdeps/ieee754/flt-32/e_lgammaf_r.c (sin_pif): Likewise.
* sysdeps/ieee754/flt-32/lgamma_negf.c (__lgamma_negf): Likewise.
* sysdeps/ieee754/ldbl-128/e_lgammal_r.c (__ieee754_lgammal_r):
Likewise.
* sysdeps/ieee754/ldbl-128/e_powl.c (__ieee754_powl): Likewise.
* sysdeps/ieee754/ldbl-128/lgamma_negl.c (__lgamma_negl):
Likewise.
* sysdeps/ieee754/ldbl-128/s_expm1l.c (__expm1l): Likewise.
* sysdeps/ieee754/ldbl-128ibm/e_lgammal_r.c (__ieee754_lgammal_r):
Likewise.
* sysdeps/ieee754/ldbl-128ibm/e_powl.c (__ieee754_powl): Likewise.
* sysdeps/ieee754/ldbl-128ibm/lgamma_negl.c (__lgamma_negl):
Likewise.
* sysdeps/ieee754/ldbl-128ibm/s_expm1l.c (__expm1l): Likewise.
* sysdeps/ieee754/ldbl-128ibm/s_truncl.c (__truncl): Likewise.
* sysdeps/ieee754/ldbl-96/e_lgammal_r.c (sin_pi): Likewise.
* sysdeps/ieee754/ldbl-96/lgamma_negl.c (__lgamma_negl): Likewise.
* sysdeps/powerpc/power5+/fpu/s_modf.c (__modf): Likewise.
* sysdeps/powerpc/power5+/fpu/s_modff.c (__modff): Likewise.
2018-09-14 21:09:01 +08:00
|
|
|
# if __HAVE_DISTINCT_FLOAT128
|
|
|
|
# define MATH_REDIRECT_F128(FUNC, PREFIX, ARGS) \
|
|
|
|
_Float128 (FUNC ## f128) (ARGS (_Float128)) asm (PREFIX #FUNC "f128");
|
|
|
|
# else
|
|
|
|
# define MATH_REDIRECT_F128(FUNC, PREFIX, ARGS)
|
2018-03-16 01:57:03 +08:00
|
|
|
# endif
|
Use floor functions not __floor functions in glibc libm.
Similar to the changes that were made to call sqrt functions directly
in glibc, instead of __ieee754_sqrt variants, so that the compiler
could inline them automatically without needing special inline
definitions in lots of math_private.h headers, this patch makes libm
code call floor functions directly instead of __floor variants,
removing the inlines / macros for x86_64 (SSE4.1) and powerpc
(POWER5).
The redirection used to ensure that __ieee754_sqrt does still get
called when the compiler doesn't inline a built-in function expansion
is refactored so it can be applied to other functions; the refactoring
is arranged so it's not limited to unary functions either (it would be
reasonable to use this mechanism for copysign - removing the inline in
math_private_calls.h but also eliminating unnecessary local PLT entry
use in the cases (powerpc soft-float and e500v1, for IBM long double)
where copysign calls don't get inlined).
The point of this change is that more architectures can get floor
calls inlined where they weren't previously (AArch64, for example),
without needing special inline definitions in their math_private.h,
and existing such definitions in math_private.h headers can be
removed.
Note that it's possible that in some cases an inline may be used where
an IFUNC call was previously used - this is the case on x86_64, for
example. I think the direct calls to floor are still appropriate; if
there's any significant performance cost from inline SSE2 floor
instead of an IFUNC call ending up with SSE4.1 floor, that indicates
that either the function should be doing something else that's faster
than using floor at all, or it should itself have IFUNC variants, or
that the compiler choice of inlining for generic tuning should change
to allow for the possibility that, by not inlining, an SSE4.1 IFUNC
might be called at runtime - but not that glibc should avoid calling
floor internally. (After all, all the same considerations would apply
to any user program calling floor, where it might either be inlined or
left as an out-of-line call allowing for a possible IFUNC.)
Tested for x86_64, and with build-many-glibcs.py.
* include/math.h [!_ISOMAC && !(__FINITE_MATH_ONLY__ &&
__FINITE_MATH_ONLY__ > 0) && !NO_MATH_REDIRECT] (MATH_REDIRECT):
New macro.
[!_ISOMAC && !(__FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ > 0)
&& !NO_MATH_REDIRECT] (MATH_REDIRECT_LDBL): Likewise.
[!_ISOMAC && !(__FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ > 0)
&& !NO_MATH_REDIRECT] (MATH_REDIRECT_F128): Likewise.
[!_ISOMAC && !(__FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ > 0)
&& !NO_MATH_REDIRECT] (MATH_REDIRECT_UNARY_ARGS): Likewise.
[!_ISOMAC && !(__FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ > 0)
&& !NO_MATH_REDIRECT] (sqrt): Redirect using MATH_REDIRECT.
[!_ISOMAC && !(__FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ > 0)
&& !NO_MATH_REDIRECT] (floor): Likewise.
* sysdeps/aarch64/fpu/s_floor.c: Define NO_MATH_REDIRECT before
header inclusion.
* sysdeps/aarch64/fpu/s_floorf.c: Likewise.
* sysdeps/ieee754/dbl-64/s_floor.c: Likewise.
* sysdeps/ieee754/dbl-64/wordsize-64/s_floor.c: Likewise.
* sysdeps/ieee754/float128/s_floorf128.c: Likewise.
* sysdeps/ieee754/flt-32/s_floorf.c: Likewise.
* sysdeps/ieee754/ldbl-128/s_floorl.c: Likewise.
* sysdeps/ieee754/ldbl-128ibm/s_floorl.c: Likewise.
* sysdeps/m68k/m680x0/fpu/s_floor_template.c: Likewise.
* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_floor.c: Likewise.
* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_floorf.c: Likewise.
* sysdeps/powerpc/powerpc64/fpu/multiarch/s_floor.c: Likewise.
* sysdeps/powerpc/powerpc64/fpu/multiarch/s_floorf.c: Likewise.
* sysdeps/riscv/rv64/rvd/s_floor.c: Likewise.
* sysdeps/riscv/rvf/s_floorf.c: Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_floor.c: Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_floorf.c: Likewise.
* sysdeps/x86_64/fpu/multiarch/s_floor.c: Likewise.
* sysdeps/x86_64/fpu/multiarch/s_floorf.c: Likewise.
* sysdeps/powerpc/fpu/math_private.h [_ARCH_PWR5X] (__floor):
Remove macro.
[_ARCH_PWR5X] (__floorf): Likewise.
* sysdeps/x86_64/fpu/math_private.h [__SSE4_1__] (__floor): Remove
inline function.
[__SSE4_1__] (__floorf): Likewise.
* math/w_lgamma_main.c (LGFUNC (__lgamma)): Use floor functions
instead of __floor variants.
* math/w_lgamma_r_compat.c (__lgamma_r): Likewise.
* math/w_lgammaf_main.c (LGFUNC (__lgammaf)): Likewise.
* math/w_lgammaf_r_compat.c (__lgammaf_r): Likewise.
* math/w_lgammal_main.c (LGFUNC (__lgammal)): Likewise.
* math/w_lgammal_r_compat.c (__lgammal_r): Likewise.
* math/w_tgamma_compat.c (__tgamma): Likewise.
* math/w_tgamma_template.c (M_DECL_FUNC (__tgamma)): Likewise.
* math/w_tgammaf_compat.c (__tgammaf): Likewise.
* math/w_tgammal_compat.c (__tgammal): Likewise.
* sysdeps/ieee754/dbl-64/e_lgamma_r.c (sin_pi): Likewise.
* sysdeps/ieee754/dbl-64/k_rem_pio2.c (__kernel_rem_pio2):
Likewise.
* sysdeps/ieee754/dbl-64/lgamma_neg.c (__lgamma_neg): Likewise.
* sysdeps/ieee754/flt-32/e_lgammaf_r.c (sin_pif): Likewise.
* sysdeps/ieee754/flt-32/lgamma_negf.c (__lgamma_negf): Likewise.
* sysdeps/ieee754/ldbl-128/e_lgammal_r.c (__ieee754_lgammal_r):
Likewise.
* sysdeps/ieee754/ldbl-128/e_powl.c (__ieee754_powl): Likewise.
* sysdeps/ieee754/ldbl-128/lgamma_negl.c (__lgamma_negl):
Likewise.
* sysdeps/ieee754/ldbl-128/s_expm1l.c (__expm1l): Likewise.
* sysdeps/ieee754/ldbl-128ibm/e_lgammal_r.c (__ieee754_lgammal_r):
Likewise.
* sysdeps/ieee754/ldbl-128ibm/e_powl.c (__ieee754_powl): Likewise.
* sysdeps/ieee754/ldbl-128ibm/lgamma_negl.c (__lgamma_negl):
Likewise.
* sysdeps/ieee754/ldbl-128ibm/s_expm1l.c (__expm1l): Likewise.
* sysdeps/ieee754/ldbl-128ibm/s_truncl.c (__truncl): Likewise.
* sysdeps/ieee754/ldbl-96/e_lgammal_r.c (sin_pi): Likewise.
* sysdeps/ieee754/ldbl-96/lgamma_negl.c (__lgamma_negl): Likewise.
* sysdeps/powerpc/power5+/fpu/s_modf.c (__modf): Likewise.
* sysdeps/powerpc/power5+/fpu/s_modff.c (__modff): Likewise.
2018-09-14 21:09:01 +08:00
|
|
|
# define MATH_REDIRECT_UNARY_ARGS(TYPE) TYPE
|
2018-09-28 04:04:48 +08:00
|
|
|
# define MATH_REDIRECT_BINARY_ARGS(TYPE) TYPE, TYPE
|
Use floor functions not __floor functions in glibc libm.
Similar to the changes that were made to call sqrt functions directly
in glibc, instead of __ieee754_sqrt variants, so that the compiler
could inline them automatically without needing special inline
definitions in lots of math_private.h headers, this patch makes libm
code call floor functions directly instead of __floor variants,
removing the inlines / macros for x86_64 (SSE4.1) and powerpc
(POWER5).
The redirection used to ensure that __ieee754_sqrt does still get
called when the compiler doesn't inline a built-in function expansion
is refactored so it can be applied to other functions; the refactoring
is arranged so it's not limited to unary functions either (it would be
reasonable to use this mechanism for copysign - removing the inline in
math_private_calls.h but also eliminating unnecessary local PLT entry
use in the cases (powerpc soft-float and e500v1, for IBM long double)
where copysign calls don't get inlined).
The point of this change is that more architectures can get floor
calls inlined where they weren't previously (AArch64, for example),
without needing special inline definitions in their math_private.h,
and existing such definitions in math_private.h headers can be
removed.
Note that it's possible that in some cases an inline may be used where
an IFUNC call was previously used - this is the case on x86_64, for
example. I think the direct calls to floor are still appropriate; if
there's any significant performance cost from inline SSE2 floor
instead of an IFUNC call ending up with SSE4.1 floor, that indicates
that either the function should be doing something else that's faster
than using floor at all, or it should itself have IFUNC variants, or
that the compiler choice of inlining for generic tuning should change
to allow for the possibility that, by not inlining, an SSE4.1 IFUNC
might be called at runtime - but not that glibc should avoid calling
floor internally. (After all, all the same considerations would apply
to any user program calling floor, where it might either be inlined or
left as an out-of-line call allowing for a possible IFUNC.)
Tested for x86_64, and with build-many-glibcs.py.
* include/math.h [!_ISOMAC && !(__FINITE_MATH_ONLY__ &&
__FINITE_MATH_ONLY__ > 0) && !NO_MATH_REDIRECT] (MATH_REDIRECT):
New macro.
[!_ISOMAC && !(__FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ > 0)
&& !NO_MATH_REDIRECT] (MATH_REDIRECT_LDBL): Likewise.
[!_ISOMAC && !(__FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ > 0)
&& !NO_MATH_REDIRECT] (MATH_REDIRECT_F128): Likewise.
[!_ISOMAC && !(__FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ > 0)
&& !NO_MATH_REDIRECT] (MATH_REDIRECT_UNARY_ARGS): Likewise.
[!_ISOMAC && !(__FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ > 0)
&& !NO_MATH_REDIRECT] (sqrt): Redirect using MATH_REDIRECT.
[!_ISOMAC && !(__FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ > 0)
&& !NO_MATH_REDIRECT] (floor): Likewise.
* sysdeps/aarch64/fpu/s_floor.c: Define NO_MATH_REDIRECT before
header inclusion.
* sysdeps/aarch64/fpu/s_floorf.c: Likewise.
* sysdeps/ieee754/dbl-64/s_floor.c: Likewise.
* sysdeps/ieee754/dbl-64/wordsize-64/s_floor.c: Likewise.
* sysdeps/ieee754/float128/s_floorf128.c: Likewise.
* sysdeps/ieee754/flt-32/s_floorf.c: Likewise.
* sysdeps/ieee754/ldbl-128/s_floorl.c: Likewise.
* sysdeps/ieee754/ldbl-128ibm/s_floorl.c: Likewise.
* sysdeps/m68k/m680x0/fpu/s_floor_template.c: Likewise.
* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_floor.c: Likewise.
* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_floorf.c: Likewise.
* sysdeps/powerpc/powerpc64/fpu/multiarch/s_floor.c: Likewise.
* sysdeps/powerpc/powerpc64/fpu/multiarch/s_floorf.c: Likewise.
* sysdeps/riscv/rv64/rvd/s_floor.c: Likewise.
* sysdeps/riscv/rvf/s_floorf.c: Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_floor.c: Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_floorf.c: Likewise.
* sysdeps/x86_64/fpu/multiarch/s_floor.c: Likewise.
* sysdeps/x86_64/fpu/multiarch/s_floorf.c: Likewise.
* sysdeps/powerpc/fpu/math_private.h [_ARCH_PWR5X] (__floor):
Remove macro.
[_ARCH_PWR5X] (__floorf): Likewise.
* sysdeps/x86_64/fpu/math_private.h [__SSE4_1__] (__floor): Remove
inline function.
[__SSE4_1__] (__floorf): Likewise.
* math/w_lgamma_main.c (LGFUNC (__lgamma)): Use floor functions
instead of __floor variants.
* math/w_lgamma_r_compat.c (__lgamma_r): Likewise.
* math/w_lgammaf_main.c (LGFUNC (__lgammaf)): Likewise.
* math/w_lgammaf_r_compat.c (__lgammaf_r): Likewise.
* math/w_lgammal_main.c (LGFUNC (__lgammal)): Likewise.
* math/w_lgammal_r_compat.c (__lgammal_r): Likewise.
* math/w_tgamma_compat.c (__tgamma): Likewise.
* math/w_tgamma_template.c (M_DECL_FUNC (__tgamma)): Likewise.
* math/w_tgammaf_compat.c (__tgammaf): Likewise.
* math/w_tgammal_compat.c (__tgammal): Likewise.
* sysdeps/ieee754/dbl-64/e_lgamma_r.c (sin_pi): Likewise.
* sysdeps/ieee754/dbl-64/k_rem_pio2.c (__kernel_rem_pio2):
Likewise.
* sysdeps/ieee754/dbl-64/lgamma_neg.c (__lgamma_neg): Likewise.
* sysdeps/ieee754/flt-32/e_lgammaf_r.c (sin_pif): Likewise.
* sysdeps/ieee754/flt-32/lgamma_negf.c (__lgamma_negf): Likewise.
* sysdeps/ieee754/ldbl-128/e_lgammal_r.c (__ieee754_lgammal_r):
Likewise.
* sysdeps/ieee754/ldbl-128/e_powl.c (__ieee754_powl): Likewise.
* sysdeps/ieee754/ldbl-128/lgamma_negl.c (__lgamma_negl):
Likewise.
* sysdeps/ieee754/ldbl-128/s_expm1l.c (__expm1l): Likewise.
* sysdeps/ieee754/ldbl-128ibm/e_lgammal_r.c (__ieee754_lgammal_r):
Likewise.
* sysdeps/ieee754/ldbl-128ibm/e_powl.c (__ieee754_powl): Likewise.
* sysdeps/ieee754/ldbl-128ibm/lgamma_negl.c (__lgamma_negl):
Likewise.
* sysdeps/ieee754/ldbl-128ibm/s_expm1l.c (__expm1l): Likewise.
* sysdeps/ieee754/ldbl-128ibm/s_truncl.c (__truncl): Likewise.
* sysdeps/ieee754/ldbl-96/e_lgammal_r.c (sin_pi): Likewise.
* sysdeps/ieee754/ldbl-96/lgamma_negl.c (__lgamma_negl): Likewise.
* sysdeps/powerpc/power5+/fpu/s_modf.c (__modf): Likewise.
* sysdeps/powerpc/power5+/fpu/s_modff.c (__modff): Likewise.
2018-09-14 21:09:01 +08:00
|
|
|
MATH_REDIRECT (sqrt, "__ieee754_", MATH_REDIRECT_UNARY_ARGS)
|
2018-09-18 04:42:06 +08:00
|
|
|
MATH_REDIRECT (ceil, "__", MATH_REDIRECT_UNARY_ARGS)
|
Use floor functions not __floor functions in glibc libm.
Similar to the changes that were made to call sqrt functions directly
in glibc, instead of __ieee754_sqrt variants, so that the compiler
could inline them automatically without needing special inline
definitions in lots of math_private.h headers, this patch makes libm
code call floor functions directly instead of __floor variants,
removing the inlines / macros for x86_64 (SSE4.1) and powerpc
(POWER5).
The redirection used to ensure that __ieee754_sqrt does still get
called when the compiler doesn't inline a built-in function expansion
is refactored so it can be applied to other functions; the refactoring
is arranged so it's not limited to unary functions either (it would be
reasonable to use this mechanism for copysign - removing the inline in
math_private_calls.h but also eliminating unnecessary local PLT entry
use in the cases (powerpc soft-float and e500v1, for IBM long double)
where copysign calls don't get inlined).
The point of this change is that more architectures can get floor
calls inlined where they weren't previously (AArch64, for example),
without needing special inline definitions in their math_private.h,
and existing such definitions in math_private.h headers can be
removed.
Note that it's possible that in some cases an inline may be used where
an IFUNC call was previously used - this is the case on x86_64, for
example. I think the direct calls to floor are still appropriate; if
there's any significant performance cost from inline SSE2 floor
instead of an IFUNC call ending up with SSE4.1 floor, that indicates
that either the function should be doing something else that's faster
than using floor at all, or it should itself have IFUNC variants, or
that the compiler choice of inlining for generic tuning should change
to allow for the possibility that, by not inlining, an SSE4.1 IFUNC
might be called at runtime - but not that glibc should avoid calling
floor internally. (After all, all the same considerations would apply
to any user program calling floor, where it might either be inlined or
left as an out-of-line call allowing for a possible IFUNC.)
Tested for x86_64, and with build-many-glibcs.py.
* include/math.h [!_ISOMAC && !(__FINITE_MATH_ONLY__ &&
__FINITE_MATH_ONLY__ > 0) && !NO_MATH_REDIRECT] (MATH_REDIRECT):
New macro.
[!_ISOMAC && !(__FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ > 0)
&& !NO_MATH_REDIRECT] (MATH_REDIRECT_LDBL): Likewise.
[!_ISOMAC && !(__FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ > 0)
&& !NO_MATH_REDIRECT] (MATH_REDIRECT_F128): Likewise.
[!_ISOMAC && !(__FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ > 0)
&& !NO_MATH_REDIRECT] (MATH_REDIRECT_UNARY_ARGS): Likewise.
[!_ISOMAC && !(__FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ > 0)
&& !NO_MATH_REDIRECT] (sqrt): Redirect using MATH_REDIRECT.
[!_ISOMAC && !(__FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ > 0)
&& !NO_MATH_REDIRECT] (floor): Likewise.
* sysdeps/aarch64/fpu/s_floor.c: Define NO_MATH_REDIRECT before
header inclusion.
* sysdeps/aarch64/fpu/s_floorf.c: Likewise.
* sysdeps/ieee754/dbl-64/s_floor.c: Likewise.
* sysdeps/ieee754/dbl-64/wordsize-64/s_floor.c: Likewise.
* sysdeps/ieee754/float128/s_floorf128.c: Likewise.
* sysdeps/ieee754/flt-32/s_floorf.c: Likewise.
* sysdeps/ieee754/ldbl-128/s_floorl.c: Likewise.
* sysdeps/ieee754/ldbl-128ibm/s_floorl.c: Likewise.
* sysdeps/m68k/m680x0/fpu/s_floor_template.c: Likewise.
* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_floor.c: Likewise.
* sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_floorf.c: Likewise.
* sysdeps/powerpc/powerpc64/fpu/multiarch/s_floor.c: Likewise.
* sysdeps/powerpc/powerpc64/fpu/multiarch/s_floorf.c: Likewise.
* sysdeps/riscv/rv64/rvd/s_floor.c: Likewise.
* sysdeps/riscv/rvf/s_floorf.c: Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_floor.c: Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_floorf.c: Likewise.
* sysdeps/x86_64/fpu/multiarch/s_floor.c: Likewise.
* sysdeps/x86_64/fpu/multiarch/s_floorf.c: Likewise.
* sysdeps/powerpc/fpu/math_private.h [_ARCH_PWR5X] (__floor):
Remove macro.
[_ARCH_PWR5X] (__floorf): Likewise.
* sysdeps/x86_64/fpu/math_private.h [__SSE4_1__] (__floor): Remove
inline function.
[__SSE4_1__] (__floorf): Likewise.
* math/w_lgamma_main.c (LGFUNC (__lgamma)): Use floor functions
instead of __floor variants.
* math/w_lgamma_r_compat.c (__lgamma_r): Likewise.
* math/w_lgammaf_main.c (LGFUNC (__lgammaf)): Likewise.
* math/w_lgammaf_r_compat.c (__lgammaf_r): Likewise.
* math/w_lgammal_main.c (LGFUNC (__lgammal)): Likewise.
* math/w_lgammal_r_compat.c (__lgammal_r): Likewise.
* math/w_tgamma_compat.c (__tgamma): Likewise.
* math/w_tgamma_template.c (M_DECL_FUNC (__tgamma)): Likewise.
* math/w_tgammaf_compat.c (__tgammaf): Likewise.
* math/w_tgammal_compat.c (__tgammal): Likewise.
* sysdeps/ieee754/dbl-64/e_lgamma_r.c (sin_pi): Likewise.
* sysdeps/ieee754/dbl-64/k_rem_pio2.c (__kernel_rem_pio2):
Likewise.
* sysdeps/ieee754/dbl-64/lgamma_neg.c (__lgamma_neg): Likewise.
* sysdeps/ieee754/flt-32/e_lgammaf_r.c (sin_pif): Likewise.
* sysdeps/ieee754/flt-32/lgamma_negf.c (__lgamma_negf): Likewise.
* sysdeps/ieee754/ldbl-128/e_lgammal_r.c (__ieee754_lgammal_r):
Likewise.
* sysdeps/ieee754/ldbl-128/e_powl.c (__ieee754_powl): Likewise.
* sysdeps/ieee754/ldbl-128/lgamma_negl.c (__lgamma_negl):
Likewise.
* sysdeps/ieee754/ldbl-128/s_expm1l.c (__expm1l): Likewise.
* sysdeps/ieee754/ldbl-128ibm/e_lgammal_r.c (__ieee754_lgammal_r):
Likewise.
* sysdeps/ieee754/ldbl-128ibm/e_powl.c (__ieee754_powl): Likewise.
* sysdeps/ieee754/ldbl-128ibm/lgamma_negl.c (__lgamma_negl):
Likewise.
* sysdeps/ieee754/ldbl-128ibm/s_expm1l.c (__expm1l): Likewise.
* sysdeps/ieee754/ldbl-128ibm/s_truncl.c (__truncl): Likewise.
* sysdeps/ieee754/ldbl-96/e_lgammal_r.c (sin_pi): Likewise.
* sysdeps/ieee754/ldbl-96/lgamma_negl.c (__lgamma_negl): Likewise.
* sysdeps/powerpc/power5+/fpu/s_modf.c (__modf): Likewise.
* sysdeps/powerpc/power5+/fpu/s_modff.c (__modff): Likewise.
2018-09-14 21:09:01 +08:00
|
|
|
MATH_REDIRECT (floor, "__", MATH_REDIRECT_UNARY_ARGS)
|
2018-09-14 21:10:39 +08:00
|
|
|
MATH_REDIRECT (rint, "__", MATH_REDIRECT_UNARY_ARGS)
|
2018-09-21 05:11:10 +08:00
|
|
|
MATH_REDIRECT (trunc, "__", MATH_REDIRECT_UNARY_ARGS)
|
2018-09-27 20:35:23 +08:00
|
|
|
MATH_REDIRECT (round, "__", MATH_REDIRECT_UNARY_ARGS)
|
2018-09-28 04:04:48 +08:00
|
|
|
MATH_REDIRECT (copysign, "__", MATH_REDIRECT_BINARY_ARGS)
|
2018-03-16 01:57:03 +08:00
|
|
|
# endif
|
|
|
|
# endif
|
|
|
|
|
1998-12-08 21:12:47 +08:00
|
|
|
#endif
|
2012-02-26 12:18:39 +08:00
|
|
|
#endif
|