mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-28 00:21:52 +03:00
Refactor float_t, double_t information into bits/flt-eval-method.h.
At present, definitions of float_t and double_t are split among many bits/mathdef.h headers. For all but three architectures, these types are float and double. Furthermore, if you assume __FLT_EVAL_METHOD__ to be defined, that provides a more generic way of determining the correct values of these typedefs. Defining these typedefs more generally based on __FLT_EVAL_METHOD__ was previously proposed by Paul Eggert in <https://sourceware.org/ml/libc-alpha/2012-02/msg00002.html>. This patch refactors things in the way I proposed in <https://sourceware.org/ml/libc-alpha/2016-11/msg00745.html>. A new header bits/flt-eval-method.h defines a single macro, __GLIBC_FLT_EVAL_METHOD, which is then used by math.h to define float_t and double_t. The default is based on __FLT_EVAL_METHOD__ (although actually a default to 0 would have the same effect for current ports, because ports where values other than 0 or 16 are possible all have their own headers). To avoid changing the existing semantics in any case, including for compilers not defining __FLT_EVAL_METHOD__, architecture-specific files are then added for m68k, s390, x86 which replicate the existing semantics. At least with __FLT_EVAL_METHOD__ values possible with GCC, there should be no change to the choices of float_t and double_t for any supported configuration. Architecture maintainer notes: * m68k: sysdeps/m68k/m680x0/bits/flt-eval-method.h always defines __GLIBC_FLT_EVAL_METHOD to 2 to replicate the existing logic. But actually GCC defines __FLT_EVAL_METHOD__ to 0 if TARGET_68040. It might make sense to make the header prefer to base things on __FLT_EVAL_METHOD__ if defined, like the x86 version, and so make the choices of these types more accurate (with a NEWS entry as for the other changes to these types on particular architectures). * s390: sysdeps/s390/bits/flt-eval-method.h always defines __GLIBC_FLT_EVAL_METHOD to 1 to replicate the existing logic. As previously discussed, it might make sense in coordination with GCC to eliminate the historic mistake, avoid excess precision in the -fexcess-precision=standard case and make the typedefs match (with a NEWS entry, again). Tested for x86-64 and x86. Also did compilation-only testing with build-many-glibcs.py. * bits/flt-eval-method.h: New file. * sysdeps/m68k/m680x0/bits/flt-eval-method.h: Likewise. * sysdeps/s390/bits/flt-eval-method.h: Likewise. * sysdeps/x86/bits/flt-eval-method.h: Likewise. * math/Makefile (headers): Add bits/flt-eval-method.h. * math/math.h: Include <bits/flt-eval-method.h>. [__USE_ISOC99] (float_t): Define based on __GLIBC_FLT_EVAL_METHOD. [__USE_ISOC99] (double_t): Likewise. * bits/mathdef.h (float_t): Remove. (double_t): Likewise. * sysdeps/aarch64/bits/mathdef.h (float_t): Likewise. (double_t): Likewise. * sysdeps/alpha/bits/mathdef.h (float_t): Likewise. (double_t): Likewise. * sysdeps/arm/bits/mathdef.h (float_t): Likewise. (double_t): Likewise. * sysdeps/hppa/fpu/bits/mathdef.h (float_t): Likewise. (double_t): Likewise. * sysdeps/ia64/bits/mathdef.h (float_t): Likewise. (double_t): Likewise. * sysdeps/m68k/m680x0/bits/mathdef.h (float_t): Likewise. (double_t): Likewise. * sysdeps/mips/bits/mathdef.h (float_t): Likewise. (double_t): Likewise. * sysdeps/powerpc/bits/mathdef.h (float_t): Likewise. (double_t): Likewise. * sysdeps/s390/bits/mathdef.h (float_t): Likewise. (double_t): Likewise. * sysdeps/sh/sh4/bits/mathdef.h (float_t): Likewise. (double_t): Likewise. * sysdeps/sparc/bits/mathdef.h (float_t): Likewise. (double_t): Likewise. * sysdeps/tile/bits/mathdef.h (float_t): Likewise. (double_t): Likewise. * sysdeps/x86/bits/mathdef.h (float_t): Likewise. (double_t): Likewise.
This commit is contained in:
42
math/math.h
42
math/math.h
@ -54,13 +54,51 @@ __BEGIN_DECLS
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Get the architecture specific values describing the floating-point
|
||||
evaluation. The following symbols will get defined:
|
||||
/* Get __GLIBC_FLT_EVAL_METHOD. */
|
||||
#include <bits/flt-eval-method.h>
|
||||
|
||||
#ifdef __USE_ISOC99
|
||||
/* Define the following typedefs.
|
||||
|
||||
float_t floating-point type at least as wide as `float' used
|
||||
to evaluate `float' expressions
|
||||
double_t floating-point type at least as wide as `double' used
|
||||
to evaluate `double' expressions
|
||||
*/
|
||||
# if __GLIBC_FLT_EVAL_METHOD == 0 || __GLIBC_FLT_EVAL_METHOD == 16
|
||||
typedef float float_t;
|
||||
typedef double double_t;
|
||||
# elif __GLIBC_FLT_EVAL_METHOD == 1
|
||||
typedef double float_t;
|
||||
typedef double double_t;
|
||||
# elif __GLIBC_FLT_EVAL_METHOD == 2
|
||||
typedef long double float_t;
|
||||
typedef long double double_t;
|
||||
# elif __GLIBC_FLT_EVAL_METHOD == 32
|
||||
typedef _Float32 float_t;
|
||||
typedef double double_t;
|
||||
# elif __GLIBC_FLT_EVAL_METHOD == 33
|
||||
typedef _Float32x float_t;
|
||||
typedef _Float32x double_t;
|
||||
# elif __GLIBC_FLT_EVAL_METHOD == 64
|
||||
typedef _Float64 float_t;
|
||||
typedef _Float64 double_t;
|
||||
# elif __GLIBC_FLT_EVAL_METHOD == 65
|
||||
typedef _Float64x float_t;
|
||||
typedef _Float64x double_t;
|
||||
# elif __GLIBC_FLT_EVAL_METHOD == 128
|
||||
typedef _Float128 float_t;
|
||||
typedef _Float128 double_t;
|
||||
# elif __GLIBC_FLT_EVAL_METHOD == 129
|
||||
typedef _Float128x float_t;
|
||||
typedef _Float128x double_t;
|
||||
# else
|
||||
# error "Unknown __GLIBC_FLT_EVAL_METHOD"
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Get the architecture specific values describing the floating-point
|
||||
evaluation. The following symbols will get defined:
|
||||
|
||||
FP_FAST_FMA
|
||||
FP_FAST_FMAF
|
||||
|
Reference in New Issue
Block a user