1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-08-08 17:42:12 +03:00

float128: Add public _Float128 declarations to libm.

This introduces the machine-dependent bits/floatn.h to control
the inclusion of _Float128 ABI.

	* bits/floatn.h: New file.
	* bits/huge_val_flt128.h: Likewise.

	* bits/libm-simd-decl-stubs.h (__DECL_SIMD_cosf128): New macro.
	(__DECL_SIMD_sinf128): Likewise.
	(__DECL_SIMD_sincosf128): Likewise.
	(__DECL_SIMD_logf128): Likewise.
	(__DECL_SIMD_expf128): Likewise.
	(__DECL_SIMD_powf128): Likewise.

	* math/Makefile (headers): Install bits/floatn.h and
	bits/huge_val_flt128.h.

	* math/bits/cmathcalls.h (_Mdouble_complex_): Only define if not
	defined.

	* math/bits/mathcalls.h (pow10, isinf, finite, drem, significand)
	(isnan, gamma, nexttoward, scalb): Only define if not
	__MATH_DECLARING_FLOATN.
	(nextdown, nextup, llogb, roundeven, fromfp, ufromfp, fromfpx)
	(ufromfpx, fmaxmag, fminmag, totalorder, totalordermag)
	(canonicalize, getpayload, setpayload, setpayloadsig): Declare for
	_FloatN even if	__STDC_WANT_IEC_60559_BFP_EXT__ is not defined.

	* math/complex.h: Include bits/libc-header-start.h and bits/floatn.h.
	Include bits/cmathcalls.h to get the declarations of _Float128
	versions of complex functions.
	[__HAVE_FLOAT128 && __GLIBC_USE (IEC_60559_TYPES_EXT)] (CMPLXF128):
	Define macro.

	* math/math.h: Include bits/floatn.h and bits/huge_val_flt128.h.
	Include bits/mathcalls-helper-functions.h and bits/mathcalls.h to
	get the declarations of _Float128 versions of math functions.
	(__MATH_DECLARING_FLOATN): New macro to control declaration of
	_FloatN types.
	[__GNUC_PREREQ (6,0)] (signbit): Since GCC 6.0, __builtin_signbit
	is type-generic, so use it without __MATH_TG.
	[__HAVE_DISTINCT_FLOAT128] (isinf): This builtin is broken for
	_Float128 type on GCC < 7.0.  Explicitly call __isinff128 for
	_Float128 type and GCC < 7.0, otherwise use the builtin.
	[__HAVE_FLOAT128 && defined __USE_GNU] (M_Ef128, M_LOG2Ef128)
	(M_LOG10Ef128, M_LN2f128, M_LN10f128, M_PIf128, M_PI_2f128)
	(M_PI_4f128, M_1_PIf128, M_2_PIf128, M_SQRT2f128, M_SQRT1_2f128):
	New _GNU_SOURCE enabled macros.
This commit is contained in:
Paul E. Murphy
2016-07-20 11:53:36 -05:00
committed by Gabriel F. T. Gomes
parent e1d6e08dd6
commit fcee5905d3
9 changed files with 230 additions and 18 deletions

View File

@@ -1,3 +1,51 @@
2017-05-14 Paul E. Murphy <murphyp@linux.vnet.ibm.com>
Gabriel F. T. Gomes <gftg@linux.vnet.ibm.com>
* bits/floatn.h: New file.
* bits/huge_val_flt128.h: Likewise.
* bits/libm-simd-decl-stubs.h (__DECL_SIMD_cosf128): New macro.
(__DECL_SIMD_sinf128): Likewise.
(__DECL_SIMD_sincosf128): Likewise.
(__DECL_SIMD_logf128): Likewise.
(__DECL_SIMD_expf128): Likewise.
(__DECL_SIMD_powf128): Likewise.
* math/Makefile (headers): Install bits/floatn.h and
bits/huge_val_flt128.h.
* math/bits/cmathcalls.h (_Mdouble_complex_): Only define if not
defined.
* math/bits/mathcalls.h (pow10, isinf, finite, drem, significand)
(isnan, gamma, nexttoward, scalb): Only define if not
__MATH_DECLARING_FLOATN.
(nextdown, nextup, llogb, roundeven, fromfp, ufromfp, fromfpx)
(ufromfpx, fmaxmag, fminmag, totalorder, totalordermag)
(canonicalize, getpayload, setpayload, setpayloadsig): Declare for
_FloatN even if __STDC_WANT_IEC_60559_BFP_EXT__ is not defined.
* math/complex.h: Include bits/libc-header-start.h and bits/floatn.h.
Include bits/cmathcalls.h to get the declarations of _Float128
versions of complex functions.
[__HAVE_FLOAT128 && __GLIBC_USE (IEC_60559_TYPES_EXT)] (CMPLXF128):
Define macro.
* math/math.h: Include bits/floatn.h and bits/huge_val_flt128.h.
Include bits/mathcalls-helper-functions.h and bits/mathcalls.h to
get the declarations of _Float128 versions of math functions.
(__MATH_DECLARING_FLOATN): New macro to control declaration of
_FloatN types.
[__GNUC_PREREQ (6,0)] (signbit): Since GCC 6.0, __builtin_signbit
is type-generic, so use it without __MATH_TG.
[__HAVE_DISTINCT_FLOAT128] (isinf): This builtin is broken for
_Float128 type on GCC < 7.0. Explicitly call __isinff128 for
_Float128 type and GCC < 7.0, otherwise use the builtin.
[__HAVE_FLOAT128 && defined __USE_GNU] (M_Ef128, M_LOG2Ef128)
(M_LOG10Ef128, M_LN2f128, M_LN10f128, M_PIf128, M_PI_2f128)
(M_PI_4f128, M_1_PIf128, M_2_PIf128, M_SQRT2f128, M_SQRT1_2f128):
New _GNU_SOURCE enabled macros.
2017-05-12 Joseph Myers <joseph@codesourcery.com> 2017-05-12 Joseph Myers <joseph@codesourcery.com>
* sysdeps/sparc/sparc32/fpu/s_signbit.S (signbit): Remove alias. * sysdeps/sparc/sparc32/fpu/s_signbit.S (signbit): Remove alias.

35
bits/floatn.h Normal file
View File

@@ -0,0 +1,35 @@
/* Macros to control TS 18661-3 glibc features.
Copyright (C) 2017 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
/* Defined to 1 if the current compiler invocation provides a
floating-point type with the IEEE 754 binary128 format, and this glibc
includes corresponding *f128 interfaces for it. */
#define __HAVE_FLOAT128 0
/* Defined to 1 if __HAVE_FLOAT128 is 1 and the type is ABI-distinct
from the default float, double and long double types in this glibc. */
#define __HAVE_DISTINCT_FLOAT128 0
/* Defined to concatenate the literal suffix to be used with _Float128
types, if __HAVE_FLOAT128 is 1.
E.g.: #define __f128(x) x##f128. */
#undef __f128
/* Defined to a complex binary128 type if __HAVE_FLOAT128 is 1.
E.g.: #define __CFLOAT128 _Complex _Float128. */
#undef __CFLOAT128

23
bits/huge_val_flt128.h Normal file
View File

@@ -0,0 +1,23 @@
/* Default `HUGE_VAL_F128' constant.
Copyright (C) 2017 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#ifndef _MATH_H
# error "Never use <bits/huge_val_flt128.h> directly; include <math.h> instead."
#endif
#define HUGE_VAL_F128 (__builtin_huge_valf128 ())

View File

@@ -36,24 +36,30 @@
#define __DECL_SIMD_cos #define __DECL_SIMD_cos
#define __DECL_SIMD_cosf #define __DECL_SIMD_cosf
#define __DECL_SIMD_cosl #define __DECL_SIMD_cosl
#define __DECL_SIMD_cosf128
#define __DECL_SIMD_sin #define __DECL_SIMD_sin
#define __DECL_SIMD_sinf #define __DECL_SIMD_sinf
#define __DECL_SIMD_sinl #define __DECL_SIMD_sinl
#define __DECL_SIMD_sinf128
#define __DECL_SIMD_sincos #define __DECL_SIMD_sincos
#define __DECL_SIMD_sincosf #define __DECL_SIMD_sincosf
#define __DECL_SIMD_sincosl #define __DECL_SIMD_sincosl
#define __DECL_SIMD_sincosf128
#define __DECL_SIMD_log #define __DECL_SIMD_log
#define __DECL_SIMD_logf #define __DECL_SIMD_logf
#define __DECL_SIMD_logl #define __DECL_SIMD_logl
#define __DECL_SIMD_logf128
#define __DECL_SIMD_exp #define __DECL_SIMD_exp
#define __DECL_SIMD_expf #define __DECL_SIMD_expf
#define __DECL_SIMD_expl #define __DECL_SIMD_expl
#define __DECL_SIMD_expf128
#define __DECL_SIMD_pow #define __DECL_SIMD_pow
#define __DECL_SIMD_powf #define __DECL_SIMD_powf
#define __DECL_SIMD_powl #define __DECL_SIMD_powl
#define __DECL_SIMD_powf128
#endif #endif

View File

@@ -29,7 +29,8 @@ headers := math.h bits/mathcalls.h bits/mathinline.h bits/huge_val.h \
bits/math-finite.h bits/math-vector.h \ bits/math-finite.h bits/math-vector.h \
bits/libm-simd-decl-stubs.h bits/iscanonical.h \ bits/libm-simd-decl-stubs.h bits/iscanonical.h \
bits/flt-eval-method.h bits/fp-fast.h bits/fp-logb.h \ bits/flt-eval-method.h bits/fp-fast.h bits/fp-logb.h \
bits/long-double.h bits/mathcalls-helper-functions.h bits/long-double.h bits/mathcalls-helper-functions.h \
bits/floatn.h bits/huge_val_flt128.h
# FPU support code. # FPU support code.
aux := setfpucw fpu_control aux := setfpucw fpu_control

View File

@@ -44,7 +44,9 @@
#error "Never use <bits/cmathcalls.h> directly; include <complex.h> instead." #error "Never use <bits/cmathcalls.h> directly; include <complex.h> instead."
#endif #endif
#ifndef _Mdouble_complex_
# define _Mdouble_complex_ _Mdouble_ _Complex # define _Mdouble_complex_ _Mdouble_ _Complex
#endif
/* Trigonometric functions. */ /* Trigonometric functions. */

View File

@@ -115,8 +115,10 @@ __MATHCALL (exp10,, (_Mdouble_ __x));
#endif #endif
#ifdef __USE_GNU #ifdef __USE_GNU
/* Another name occasionally used. */ /* Another name occasionally used. */
# if !__MATH_DECLARING_FLOATN
__MATHCALL (pow10,, (_Mdouble_ __x)); __MATHCALL (pow10,, (_Mdouble_ __x));
# endif # endif
#endif
#if defined __USE_XOPEN_EXTENDED || defined __USE_ISOC99 #if defined __USE_XOPEN_EXTENDED || defined __USE_ISOC99
/* Return exp(X) - 1. */ /* Return exp(X) - 1. */
@@ -172,14 +174,16 @@ __MATHCALLX (floor,, (_Mdouble_ __x), (__const__));
__MATHCALL (fmod,, (_Mdouble_ __x, _Mdouble_ __y)); __MATHCALL (fmod,, (_Mdouble_ __x, _Mdouble_ __y));
#ifdef __USE_MISC #ifdef __USE_MISC
# if (!defined __cplusplus \ # if ((!defined __cplusplus \
|| __cplusplus < 201103L /* isinf conflicts with C++11. */ \ || __cplusplus < 201103L /* isinf conflicts with C++11. */ \
|| __MATH_DECLARING_DOUBLE == 0) /* isinff or isinfl don't. */ || __MATH_DECLARING_DOUBLE == 0)) /* isinff or isinfl don't. */ \
&& !__MATH_DECLARING_FLOATN
/* Return 0 if VALUE is finite or NaN, +1 if it /* Return 0 if VALUE is finite or NaN, +1 if it
is +Infinity, -1 if it is -Infinity. */ is +Infinity, -1 if it is -Infinity. */
__MATHDECL_1 (int,isinf,, (_Mdouble_ __value)) __attribute__ ((__const__)); __MATHDECL_1 (int,isinf,, (_Mdouble_ __value)) __attribute__ ((__const__));
# endif # endif
# if !__MATH_DECLARING_FLOATN
/* Return nonzero if VALUE is finite and not NaN. */ /* Return nonzero if VALUE is finite and not NaN. */
__MATHDECL_1 (int,finite,, (_Mdouble_ __value)) __attribute__ ((__const__)); __MATHDECL_1 (int,finite,, (_Mdouble_ __value)) __attribute__ ((__const__));
@@ -189,6 +193,8 @@ __MATHCALL (drem,, (_Mdouble_ __x, _Mdouble_ __y));
/* Return the fractional part of X after dividing out `ilogb (X)'. */ /* Return the fractional part of X after dividing out `ilogb (X)'. */
__MATHCALL (significand,, (_Mdouble_ __x)); __MATHCALL (significand,, (_Mdouble_ __x));
# endif
#endif /* Use misc. */ #endif /* Use misc. */
#ifdef __USE_ISOC99 #ifdef __USE_ISOC99
@@ -203,9 +209,10 @@ __MATHCALLX (nan,, (const char *__tagb), (__const__));
#if defined __USE_MISC || (defined __USE_XOPEN && !defined __USE_XOPEN2K) #if defined __USE_MISC || (defined __USE_XOPEN && !defined __USE_XOPEN2K)
# if (!defined __cplusplus \ # if ((!defined __cplusplus \
|| __cplusplus < 201103L /* isnan conflicts with C++11. */ \ || __cplusplus < 201103L /* isnan conflicts with C++11. */ \
|| __MATH_DECLARING_DOUBLE == 0) /* isnanf or isnanl don't. */ || __MATH_DECLARING_DOUBLE == 0)) /* isnanf or isnanl don't. */ \
&& !__MATH_DECLARING_FLOATN
/* Return nonzero if VALUE is not a number. */ /* Return nonzero if VALUE is not a number. */
__MATHDECL_1 (int,isnan,, (_Mdouble_ __value)) __attribute__ ((__const__)); __MATHDECL_1 (int,isnan,, (_Mdouble_ __value)) __attribute__ ((__const__));
# endif # endif
@@ -235,9 +242,11 @@ __MATHCALL (tgamma,, (_Mdouble_));
#endif #endif
#if defined __USE_MISC || (defined __USE_XOPEN && !defined __USE_XOPEN2K) #if defined __USE_MISC || (defined __USE_XOPEN && !defined __USE_XOPEN2K)
# if !__MATH_DECLARING_FLOATN
/* Obsolete alias for `lgamma'. */ /* Obsolete alias for `lgamma'. */
__MATHCALL (gamma,, (_Mdouble_)); __MATHCALL (gamma,, (_Mdouble_));
# endif # endif
#endif
#ifdef __USE_MISC #ifdef __USE_MISC
/* Reentrant version of lgamma. This function uses the global variable /* Reentrant version of lgamma. This function uses the global variable
@@ -254,11 +263,11 @@ __MATHCALL (rint,, (_Mdouble_ __x));
/* Return X + epsilon if X < Y, X - epsilon if X > Y. */ /* Return X + epsilon if X < Y, X - epsilon if X > Y. */
__MATHCALLX (nextafter,, (_Mdouble_ __x, _Mdouble_ __y), (__const__)); __MATHCALLX (nextafter,, (_Mdouble_ __x, _Mdouble_ __y), (__const__));
# if defined __USE_ISOC99 && !defined __LDBL_COMPAT # if defined __USE_ISOC99 && !defined __LDBL_COMPAT && !__MATH_DECLARING_FLOATN
__MATHCALLX (nexttoward,, (_Mdouble_ __x, long double __y), (__const__)); __MATHCALLX (nexttoward,, (_Mdouble_ __x, long double __y), (__const__));
# endif # endif
#if __GLIBC_USE (IEC_60559_BFP_EXT) # if __GLIBC_USE (IEC_60559_BFP_EXT) || __MATH_DECLARING_FLOATN
/* Return X - epsilon. */ /* Return X - epsilon. */
__MATHCALL (nextdown,, (_Mdouble_ __x)); __MATHCALL (nextdown,, (_Mdouble_ __x));
/* Return X + epsilon. */ /* Return X + epsilon. */
@@ -277,7 +286,7 @@ __MATHCALL (scalbn,, (_Mdouble_ __x, int __n));
__MATHDECL (int,ilogb,, (_Mdouble_ __x)); __MATHDECL (int,ilogb,, (_Mdouble_ __x));
#endif #endif
#if __GLIBC_USE (IEC_60559_BFP_EXT) #if __GLIBC_USE (IEC_60559_BFP_EXT) || __MATH_DECLARING_FLOATN
/* Like ilogb, but returning long int. */ /* Like ilogb, but returning long int. */
__MATHDECL (long int, llogb,, (_Mdouble_ __x)); __MATHDECL (long int, llogb,, (_Mdouble_ __x));
#endif #endif
@@ -332,7 +341,7 @@ __MATHCALLX (fmin,, (_Mdouble_ __x, _Mdouble_ __y), (__const__));
__MATHCALL (fma,, (_Mdouble_ __x, _Mdouble_ __y, _Mdouble_ __z)); __MATHCALL (fma,, (_Mdouble_ __x, _Mdouble_ __y, _Mdouble_ __z));
#endif /* Use ISO C99. */ #endif /* Use ISO C99. */
#if __GLIBC_USE (IEC_60559_BFP_EXT) #if __GLIBC_USE (IEC_60559_BFP_EXT) || __MATH_DECLARING_FLOATN
/* Round X to nearest integer value, rounding halfway cases to even. */ /* Round X to nearest integer value, rounding halfway cases to even. */
__MATHCALLX (roundeven,, (_Mdouble_ __x), (__const__)); __MATHCALLX (roundeven,, (_Mdouble_ __x), (__const__));
@@ -385,9 +394,10 @@ __MATHDECL_1 (int, setpayload,, (_Mdouble_ *__x, _Mdouble_ __payload));
__MATHDECL_1 (int, setpayloadsig,, (_Mdouble_ *__x, _Mdouble_ __payload)); __MATHDECL_1 (int, setpayloadsig,, (_Mdouble_ *__x, _Mdouble_ __payload));
#endif #endif
#if defined __USE_MISC || (defined __USE_XOPEN_EXTENDED \ #if (defined __USE_MISC || (defined __USE_XOPEN_EXTENDED \
&& __MATH_DECLARING_DOUBLE \ && __MATH_DECLARING_DOUBLE \
&& !defined __USE_XOPEN2K8) && !defined __USE_XOPEN2K8)) \
&& !__MATH_DECLARING_FLOATN
/* Return X times (2 to the Nth power). */ /* Return X times (2 to the Nth power). */
__MATHCALL (scalb,, (_Mdouble_ __x, _Mdouble_ __n)); __MATHCALL (scalb,, (_Mdouble_ __x, _Mdouble_ __n));
#endif #endif

View File

@@ -22,11 +22,15 @@
#ifndef _COMPLEX_H #ifndef _COMPLEX_H
#define _COMPLEX_H 1 #define _COMPLEX_H 1
#include <features.h> #define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION
#include <bits/libc-header-start.h>
/* Get general and ISO C99 specific information. */ /* Get general and ISO C99 specific information. */
#include <bits/mathdef.h> #include <bits/mathdef.h>
/* Gather machine-dependent _FloatN type support. */
#include <bits/floatn.h>
__BEGIN_DECLS __BEGIN_DECLS
/* We might need to add support for more compilers here. But since ISO /* We might need to add support for more compilers here. But since ISO
@@ -55,6 +59,10 @@ __BEGIN_DECLS
# define CMPLXL(x, y) __builtin_complex ((long double) (x), (long double) (y)) # define CMPLXL(x, y) __builtin_complex ((long double) (x), (long double) (y))
#endif #endif
#if __HAVE_FLOAT128 && __GLIBC_USE (IEC_60559_TYPES_EXT)
# define CMPLXF128(x, y) __builtin_complex ((_Float128) (x), (_Float128) (y))
#endif
/* The file <bits/cmathcalls.h> contains the prototypes for all the /* The file <bits/cmathcalls.h> contains the prototypes for all the
actual math functions. These macros are used for those prototypes, actual math functions. These macros are used for those prototypes,
so we can easily declare each function as both `name' and `__name', so we can easily declare each function as both `name' and `__name',
@@ -84,6 +92,24 @@ __BEGIN_DECLS
#undef _Mdouble_ #undef _Mdouble_
#undef __MATH_PRECNAME #undef __MATH_PRECNAME
#if (__HAVE_DISTINCT_FLOAT128 || (__HAVE_FLOAT128 && !defined _LIBC)) \
&& __GLIBC_USE (IEC_60559_TYPES_EXT)
# ifndef _Mfloat128_
# define _Mfloat128_ _Float128
# endif
/* GCC < 7 requires extra convincing to expose a complex float128 type. */
# ifdef __CFLOAT128
# undef _Mdouble_complex_
# define _Mdouble_complex_ __CFLOAT128
# endif
# define _Mdouble_ _Mfloat128_
# define __MATH_PRECNAME(name) name##f128
# include <bits/cmathcalls.h>
# undef _Mdouble_
# undef __MATH_PRECNAME
# undef _Mdouble_complex_
#endif
/* And the long double versions. It is non-critical to define them /* And the long double versions. It is non-critical to define them
here unconditionally since `long double' is required in ISO C99. */ here unconditionally since `long double' is required in ISO C99. */
#if !(defined __NO_LONG_DOUBLE_MATH && defined _LIBC) \ #if !(defined __NO_LONG_DOUBLE_MATH && defined _LIBC) \

View File

@@ -34,9 +34,17 @@ __BEGIN_DECLS
/* Get machine-dependent vector math functions declarations. */ /* Get machine-dependent vector math functions declarations. */
#include <bits/math-vector.h> #include <bits/math-vector.h>
/* Gather machine dependent type support. */
#include <bits/floatn.h>
/* Get machine-dependent HUGE_VAL value (returned on overflow). /* Get machine-dependent HUGE_VAL value (returned on overflow).
On all IEEE754 machines, this is +Infinity. */ On all IEEE754 machines, this is +Infinity. */
#include <bits/huge_val.h> #include <bits/huge_val.h>
#if __HAVE_FLOAT128 && __GLIBC_USE (IEC_60559_TYPES_EXT)
# include <bits/huge_val_flt128.h>
#endif
#ifdef __USE_ISOC99 #ifdef __USE_ISOC99
# include <bits/huge_valf.h> # include <bits/huge_valf.h>
# include <bits/huge_vall.h> # include <bits/huge_vall.h>
@@ -208,11 +216,13 @@ enum
#define _Mdouble_ double #define _Mdouble_ double
#define __MATH_PRECNAME(name,r) __CONCAT(name,r) #define __MATH_PRECNAME(name,r) __CONCAT(name,r)
#define __MATH_DECLARING_DOUBLE 1 #define __MATH_DECLARING_DOUBLE 1
#define __MATH_DECLARING_FLOATN 0
#include <bits/mathcalls-helper-functions.h> #include <bits/mathcalls-helper-functions.h>
#include <bits/mathcalls.h> #include <bits/mathcalls.h>
#undef _Mdouble_ #undef _Mdouble_
#undef __MATH_PRECNAME #undef __MATH_PRECNAME
#undef __MATH_DECLARING_DOUBLE #undef __MATH_DECLARING_DOUBLE
#undef __MATH_DECLARING_FLOATN
#ifdef __USE_ISOC99 #ifdef __USE_ISOC99
@@ -226,11 +236,13 @@ enum
# define _Mdouble_ _Mfloat_ # define _Mdouble_ _Mfloat_
# define __MATH_PRECNAME(name,r) name##f##r # define __MATH_PRECNAME(name,r) name##f##r
# define __MATH_DECLARING_DOUBLE 0 # define __MATH_DECLARING_DOUBLE 0
# define __MATH_DECLARING_FLOATN 0
# include <bits/mathcalls-helper-functions.h> # include <bits/mathcalls-helper-functions.h>
# include <bits/mathcalls.h> # include <bits/mathcalls.h>
# undef _Mdouble_ # undef _Mdouble_
# undef __MATH_PRECNAME # undef __MATH_PRECNAME
# undef __MATH_DECLARING_DOUBLE # undef __MATH_DECLARING_DOUBLE
# undef __MATH_DECLARING_FLOATN
# if !(defined __NO_LONG_DOUBLE_MATH && defined _LIBC) \ # if !(defined __NO_LONG_DOUBLE_MATH && defined _LIBC) \
|| defined __LDBL_COMPAT \ || defined __LDBL_COMPAT \
@@ -269,16 +281,42 @@ extern long double __REDIRECT_NTH (nexttowardl,
# define _Mdouble_ _Mlong_double_ # define _Mdouble_ _Mlong_double_
# define __MATH_PRECNAME(name,r) name##l##r # define __MATH_PRECNAME(name,r) name##l##r
# define __MATH_DECLARING_DOUBLE 0 # define __MATH_DECLARING_DOUBLE 0
# define __MATH_DECLARING_FLOATN 0
# define __MATH_DECLARE_LDOUBLE 1 # define __MATH_DECLARE_LDOUBLE 1
# include <bits/mathcalls-helper-functions.h> # include <bits/mathcalls-helper-functions.h>
# include <bits/mathcalls.h> # include <bits/mathcalls.h>
# undef _Mdouble_ # undef _Mdouble_
# undef __MATH_PRECNAME # undef __MATH_PRECNAME
# undef __MATH_DECLARING_DOUBLE # undef __MATH_DECLARING_DOUBLE
# undef __MATH_DECLARING_FLOATN
# endif /* !(__NO_LONG_DOUBLE_MATH && _LIBC) || __LDBL_COMPAT */ # endif /* !(__NO_LONG_DOUBLE_MATH && _LIBC) || __LDBL_COMPAT */
#endif /* Use ISO C99. */ #endif /* Use ISO C99. */
/* Include the file of declarations again, this time using `_Float128'
instead of `double' and appending f128 to each function name. */
#if __HAVE_DISTINCT_FLOAT128 || (__HAVE_FLOAT128 && !defined _LIBC)
# ifndef _Mfloat128_
# define _Mfloat128_ _Float128
# endif
# define _Mdouble_ _Mfloat128_
# define __MATH_PRECNAME(name,r) name##f128##r
# define __MATH_DECLARING_DOUBLE 0
# define __MATH_DECLARING_FLOATN 1
# if __HAVE_DISTINCT_FLOAT128
# include <bits/mathcalls-helper-functions.h>
# endif
# if __GLIBC_USE (IEC_60559_TYPES_EXT)
# include <bits/mathcalls.h>
# endif
# undef _Mdouble_
# undef __MATH_PRECNAME
# undef __MATH_DECLARING_DOUBLE
# undef __MATH_DECLARING_FLOATN
#endif /* __HAVE_DISTINCT_FLOAT128. */
#undef __MATHDECL_1 #undef __MATHDECL_1
#undef __MATHDECL #undef __MATHDECL
#undef __MATHCALL #undef __MATHCALL
@@ -348,7 +386,9 @@ enum
# endif # endif
/* Return nonzero value if sign of X is negative. */ /* Return nonzero value if sign of X is negative. */
# if __GNUC_PREREQ (4,0) # if __GNUC_PREREQ (6,0)
# define signbit(x) __builtin_signbit (x)
# elif __GNUC_PREREQ (4,0)
# define signbit(x) __MATH_TG ((x), __builtin_signbit, (x)) # define signbit(x) __MATH_TG ((x), __builtin_signbit, (x))
# else # else
# define signbit(x) __MATH_TG ((x), __signbit, (x)) # define signbit(x) __MATH_TG ((x), __signbit, (x))
@@ -377,7 +417,13 @@ enum
# endif # endif
/* Return nonzero value if X is positive or negative infinity. */ /* Return nonzero value if X is positive or negative infinity. */
# if __GNUC_PREREQ (4,4) && !defined __SUPPORT_SNAN__ # if __HAVE_DISTINCT_FLOAT128 && !__GNUC_PREREQ (7,0) \
&& !defined __SUPPORT_SNAN__
/* __builtin_isinf_sign is broken for float128 only before GCC 7.0. */
# define isinf(x) \
(__builtin_types_compatible_p (__typeof (x), _Float128) \
? __isinff128 (x) : __builtin_isinf_sign (x))
# elif __GNUC_PREREQ (4,4) && !defined __SUPPORT_SNAN__
# define isinf(x) __builtin_isinf_sign (x) # define isinf(x) __builtin_isinf_sign (x)
# else # else
# define isinf(x) __MATH_TG ((x), __isinf, (x)) # define isinf(x) __MATH_TG ((x), __isinf, (x))
@@ -529,6 +575,21 @@ extern int matherr (struct exception *__exc);
# define M_SQRT1_2l 0.707106781186547524400844362104849039L /* 1/sqrt(2) */ # define M_SQRT1_2l 0.707106781186547524400844362104849039L /* 1/sqrt(2) */
#endif #endif
#if __HAVE_FLOAT128 && defined __USE_GNU
# define M_Ef128 __f128 (2.718281828459045235360287471352662498) /* e */
# define M_LOG2Ef128 __f128 (1.442695040888963407359924681001892137) /* log_2 e */
# define M_LOG10Ef128 __f128 (0.434294481903251827651128918916605082) /* log_10 e */
# define M_LN2f128 __f128 (0.693147180559945309417232121458176568) /* log_e 2 */
# define M_LN10f128 __f128 (2.302585092994045684017991454684364208) /* log_e 10 */
# define M_PIf128 __f128 (3.141592653589793238462643383279502884) /* pi */
# define M_PI_2f128 __f128 (1.570796326794896619231321691639751442) /* pi/2 */
# define M_PI_4f128 __f128 (0.785398163397448309615660845819875721) /* pi/4 */
# define M_1_PIf128 __f128 (0.318309886183790671537767526745028724) /* 1/pi */
# define M_2_PIf128 __f128 (0.636619772367581343075535053490057448) /* 2/pi */
# define M_2_SQRTPIf128 __f128 (1.128379167095512573896158903121545172) /* 2/sqrt(pi) */
# define M_SQRT2f128 __f128 (1.414213562373095048801688724209698079) /* sqrt(2) */
# define M_SQRT1_2f128 __f128 (0.707106781186547524400844362104849039) /* 1/sqrt(2) */
#endif
/* When compiling in strict ISO C compatible mode we must not use the /* When compiling in strict ISO C compatible mode we must not use the
inline functions since they, among other things, do not set the inline functions since they, among other things, do not set the