Add llogb, llogbf, llogbl

System Internals / glibc - Joseph Myers [codesourcery.com] - 1 December 2016 19:42 UTC

TS 18661-1 defines llogb functions that are like ilogb except that they return long int instead of int. Corresponding FP_LLOGB* macros are defined, whose values are required to have the obvious correspondence to those of the FP_ILOGB* macros.

This patch implements these functions and macros for glibc. llogb uses the type-generic infrastructure, with an implementation similar to the wrapper for ilogb but with additional conversion from FP_ILOGB* to FP_LLOGB*; this approach avoids needing to modify or duplicate any of the architecture-specific ilogb implementations. Tests are also based on those for ilogb.

Ideally the llogb functions would alias the ilogb ones when long is 32-bit, but such aliasing requires the associated header declarations of the different-type alias to be hidden, typically by defining macros before including the header (see e.g. how sysdeps/ieee754/dbl-64/wordsize-64/s_llround.c defines lround to __hidden_lround before including ). The infrastructure for type-generic function implementations does not support defining such macros at present (since C code can't define a macro whose name is determined by other macros). So this patch leaves them as separate functions (similar to e.g. scalbln and scalbn being separate in such a case as well), but with the remapping of FP_ILOGB* to FP_LLOGB* conditioned out in the case where it would be the identity map.

Tested for x86_64, x86, mips64 and powerpc.

- math/bits/mathcalls.h [__GLIBC_USE (IEC_60559_BFP_EXT)] (llogb): New declaration.
- math/tgmath.h [__GLIBC_USE (IEC_60559_BFP_EXT)] (llogb): New macro.
- math/math.h [__GLIBC_USE (IEC_60559_BFP_EXT)] (__FP_LONG_MAX): New macro. [__GLIBC_USE (IEC_60559_BFP_EXT)] (FP_LLOGB0): Likewise. [__GLIBC_USE (IEC_60559_BFP_EXT)] (FP_LLOGBNAN): Likewise.
- math/Versions (llogb): New libm symbol at version GLIBC_2.25. (llogbf): Likewise. (llogbl): Likewise.
- math/Makefile (gen-libm-calls): Add w_llogbF. (tests): Add test-fp-llogb-constants.
- math/w_llogb_template.c: New file. Based on math/w_ilogb_template.c.
- math/libm-test.inc (llogb_test_data): New array. (llogb_test): New function. (main): Call llogb_test.
- math/test-fp-llogb-constants.c: New file. Based on math/test-fp-ilogb-constants.c.
- math/test-tgmath-ret.c (llogb): New CHECK_RET_CONST call. (do_test): Call check_return_llogb.
- math/test-tgmath.c (NCALLS): Increase to 126. (F(compile_test)): Call llogb. (F(llogb)): New function.
- manual/math.texi (Exponents and Logarithms): Document llogb, llogbf, llogbl, FP_LLOGB0 and FP_LLOGBNAN.
- manual/libm-err-tab.pl (@all_functions): Add llogb.
- sysdeps/ieee754/ldbl-opt/nldbl-llogb.c: New file.
- sysdeps/ieee754/ldbl-opt/w_llogbl.c: Likewise.
- sysdeps/ieee754/ldbl-opt/Makefile (libnldbl-calls): Add llogb. (CFLAGS-nldbl-llogb.c): New variable.
- 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.

55a38f8 Add llogb, llogbf, llogbl.
ChangeLog | 68 ++++++++++++++++++++
NEWS | 3 +
manual/libm-err-tab.pl | 2 +-
manual/math.texi | 31 ++++++++-
math/Makefile | 4 +-
math/Versions | 1 +
math/bits/mathcalls.h | 5 ++
math/libm-test.inc | 45 ++++++++++++-
math/math.h | 21 +++++-
math/test-fp-llogb-constants.c | 48 ++++++++++++++
math/test-tgmath-ret.c | 2 +
math/test-tgmath.c | 12 +++-
math/tgmath.h | 3 +
math/w_llogb_template.c | 46 +++++++++++++
sysdeps/ieee754/ldbl-opt/Makefile | 3 +-
sysdeps/ieee754/ldbl-opt/nldbl-llogb.c | 26 ++++++++
sysdeps/ieee754/ldbl-opt/w_llogbl.c | 5 ++
sysdeps/nacl/libm.abilist | 3 +
sysdeps/unix/sysv/linux/aarch64/libm.abilist | 3 +
sysdeps/unix/sysv/linux/alpha/libm.abilist | 3 +
sysdeps/unix/sysv/linux/arm/libm.abilist | 3 +
sysdeps/unix/sysv/linux/hppa/libm.abilist | 3 +
sysdeps/unix/sysv/linux/i386/libm.abilist | 3 +
sysdeps/unix/sysv/linux/ia64/libm.abilist | 3 +
sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist | 3 +
sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist | 3 +
sysdeps/unix/sysv/linux/microblaze/libm.abilist | 3 +
sysdeps/unix/sysv/linux/mips/mips32/libm.abilist | 3 +
sysdeps/unix/sysv/linux/mips/mips64/libm.abilist | 3 +
sysdeps/unix/sysv/linux/nios2/libm.abilist | 3 +
.../sysv/linux/powerpc/powerpc32/fpu/libm.abilist | 3 +
.../linux/powerpc/powerpc32/nofpu/libm.abilist | 3 +
.../sysv/linux/powerpc/powerpc64/libm-le.abilist | 3 +
.../unix/sysv/linux/powerpc/powerpc64/libm.abilist | 3 +
sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist | 3 +
sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist | 3 +
sysdeps/unix/sysv/linux/sh/libm.abilist | 3 +
sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist | 3 +
sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist | 3 +
.../sysv/linux/tile/tilegx/tilegx32/libm.abilist | 3 +
.../sysv/linux/tile/tilegx/tilegx64/libm.abilist | 3 +
sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist | 3 +
sysdeps/unix/sysv/linux/x86_64/64/libm.abilist | 3 +
sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist | 3 +
44 files changed, 398 insertions(+), 8 deletions(-)

Upstream: sourceware.org


  • Share