diff options
author | Gabriel F. T. Gomes <gabrielftg@linux.ibm.com> | 2019-07-11 11:48:08 -0300 |
---|---|---|
committer | Gabriel F. T. Gomes <gabrielftg@linux.ibm.com> | 2019-12-23 16:30:24 -0300 |
commit | e18a305777adf60c2378ac864a350319269a29fa (patch) | |
tree | bfcc2067d12d938016ef7545faa52bcb24310400 /misc/efgcvt-dbl-macros.h | |
parent | 57e687c6d459edba77efe360014d4adec97d1a5c (diff) | |
download | glibc-e18a305777adf60c2378ac864a350319269a29fa.tar.gz glibc-e18a305777adf60c2378ac864a350319269a29fa.tar.xz glibc-e18a305777adf60c2378ac864a350319269a29fa.zip |
Refactor *cvt functions implementation (1/2)
This patch refactors the *cvt functions implementation in a way that makes it easier to re-use them for implementing the IEEE long double on powerpc64le. By splitting the implementation per se in one file (efgcvt-template.c) and the alias definitions in others (e.g. efgcvt.c), the new code makes it easier to define new function names, such as __qecvtieee128. Tested that installed stripped binaries for all build-many-glibcs targets remain identical before and after this patch. Also tested for powerpc64le and x86_64. Reviewed-by: Paul E. Murphy <murphyp@linux.ibm.com>
Diffstat (limited to 'misc/efgcvt-dbl-macros.h')
-rw-r--r-- | misc/efgcvt-dbl-macros.h | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/misc/efgcvt-dbl-macros.h b/misc/efgcvt-dbl-macros.h new file mode 100644 index 0000000000..17e01e77e3 --- /dev/null +++ b/misc/efgcvt-dbl-macros.h @@ -0,0 +1,52 @@ +/* Macros for the implementation of *cvt functions, double version. + Copyright (C) 1995-2019 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 + <https://www.gnu.org/licenses/>. */ + +#include <float.h> + +#define FLOAT_TYPE double +#define FUNC_PREFIX +#define FLOAT_FMT_FLAG +#define FLOAT_NAME_EXT +#define FLOAT_MIN_10_EXP DBL_MIN_10_EXP +/* Actually we have to write (DBL_DIG + log10 (DBL_MAX_10_EXP)) but we + don't have log10 available in the preprocessor. */ +#define MAXDIG (NDIGIT_MAX + 3) +#define FCVT_MAXDIG (DBL_MAX_10_EXP + MAXDIG) +#if DBL_MANT_DIG == 53 +# define NDIGIT_MAX 17 +#elif DBL_MANT_DIG == 24 +# define NDIGIT_MAX 9 +#elif DBL_MANT_DIG == 56 +# define NDIGIT_MAX 18 +#else +/* See IEEE 854 5.6, table 2 for this formula. Unfortunately we need a + compile time constant here, so we cannot use it. */ +# error "NDIGIT_MAX must be precomputed" +# define NDIGIT_MAX (lrint (ceil (M_LN2 / M_LN10 * DBL_MANT_DIG + 1.0))) +#endif +#if DBL_MIN_10_EXP == -37 +# define FLOAT_MIN_10_NORM 1.0e-37 +#elif DBL_MIN_10_EXP == -307 +# define FLOAT_MIN_10_NORM 1.0e-307 +#elif DBL_MIN_10_EXP == -4931 +# define FLOAT_MIN_10_NORM 1.0e-4931 +#else +/* libc can't depend on libm. */ +# error "FLOAT_MIN_10_NORM must be precomputed" +# define FLOAT_MIN_10_NORM exp10 (DBL_MIN_10_EXP) +#endif |