about summary refs log tree commit diff
path: root/bits
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2016-11-29 01:45:00 +0000
committerJoseph Myers <joseph@codesourcery.com>2016-11-29 01:45:00 +0000
commitf11e220d2dde732121da05df25f6aeda0c52e3c9 (patch)
treec535b44b41db86f5e620ce61579fa4b580fa47a9 /bits
parente5277ba25dc0665f192ebc3f9649a00098dbdc9e (diff)
downloadglibc-f11e220d2dde732121da05df25f6aeda0c52e3c9.tar.gz
glibc-f11e220d2dde732121da05df25f6aeda0c52e3c9.tar.xz
glibc-f11e220d2dde732121da05df25f6aeda0c52e3c9.zip
Refactor FP_FAST_* into bits/fp-fast.h.
Continuing the refactoring of bits/mathdef.h, this patch moves the
FP_FAST_* definitions into a new bits/fp-fast.h header.  Currently
this is only for FP_FAST_FMA*, but in future it would be the
appropriate place for the FP_FAST_* macros from TS 18661-1 as well.

The generic bits/mathdef.h header defines these macros based on
whether the compiler defines __FP_FAST_*.  Most architecture-specific
headers, however, fail to do so, meaning that if the architecture (or
some particular processors) does in fact have fused operations, and
GCC knows to use them inline, the FP_FAST_* macros will still not be
defined.

By refactoring, this patch causes the generic version (based on
__FP_FAST_*) to be used in more cases, and so the macro definitions to
be more accurate.  Architectures that already defined some or all of
these macros other than based on the predefines have their own
versions of fp-fast.h, which are arranged so they define FP_FAST_* if
either the architecture-specific conditions are true or __FP_FAST_*
are defined.

After this refactoring, various bits/mathdef.h headers for
architectures with long double = double are semantically identical to
the generic version.  The patch removes those headers that are
redundant.  (In fact two of the four removed were already redundant
before this patch because they did use __FP_FAST_*.)

Tested for x86_64 and x86, and compilation-only with
build-many-glibcs.py.

	* bits/fp-fast.h: New file.
	* sysdeps/aarch64/bits/fp-fast.h: Likewise.
	* sysdeps/powerpc/bits/fp-fast.h: Likewise.
	* math/Makefile (headers): Add bits/fp-fast.h.
	* math/math.h: Include <bits/fp-fast.h>.
	* bits/mathdef.h (FP_FAST_FMA): Remove.
	(FP_FAST_FMAF): Likewise.
	(FP_FAST_FMAL): Likewise.
	* sysdeps/aarch64/bits/mathdef.h (FP_FAST_FMA): Likewise.
	(FP_FAST_FMAF): Likewise.
	* sysdeps/powerpc/bits/mathdef.h (FP_FAST_FMA): Likewise.
	(FP_FAST_FMAF): Likewise.
	* sysdeps/x86/bits/mathdef.h (FP_FAST_FMA): Likewise.
	(FP_FAST_FMAF): Likewise.
	(FP_FAST_FMAL): Likewise.
	* sysdeps/arm/bits/mathdef.h: Remove file.
	* sysdeps/hppa/fpu/bits/mathdef.h: Likewise.
	* sysdeps/sh/sh4/bits/mathdef.h: Likewise.
	* sysdeps/tile/bits/mathdef.h: Likewise.
Diffstat (limited to 'bits')
-rw-r--r--bits/fp-fast.h39
-rw-r--r--bits/mathdef.h14
2 files changed, 39 insertions, 14 deletions
diff --git a/bits/fp-fast.h b/bits/fp-fast.h
new file mode 100644
index 0000000000..8598710c1a
--- /dev/null
+++ b/bits/fp-fast.h
@@ -0,0 +1,39 @@
+/* Define FP_FAST_* macros.
+   Copyright (C) 2016 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/fp-fast.h> directly; include <math.h> instead."
+#endif
+
+#ifdef __USE_ISOC99
+
+/* The GCC 4.6 compiler will define __FP_FAST_FMA{,F,L} if the fma{,f,l}
+   builtins are supported.  */
+# ifdef __FP_FAST_FMA
+#  define FP_FAST_FMA 1
+# endif
+
+# ifdef __FP_FAST_FMAF
+#  define FP_FAST_FMAF 1
+# endif
+
+# ifdef __FP_FAST_FMAL
+#  define FP_FAST_FMAL 1
+# endif
+
+#endif
diff --git a/bits/mathdef.h b/bits/mathdef.h
index 6dedc51c83..050204ab66 100644
--- a/bits/mathdef.h
+++ b/bits/mathdef.h
@@ -26,20 +26,6 @@
 # define FP_ILOGB0	(-2147483647)
 # define FP_ILOGBNAN	2147483647
 
-/* The GCC 4.6 compiler will define __FP_FAST_FMA{,F,L} if the fma{,f,l}
-   builtins are supported.  */
-#ifdef __FP_FAST_FMA
-# define FP_FAST_FMA 1
-#endif
-
-#ifdef __FP_FAST_FMAF
-# define FP_FAST_FMAF 1
-#endif
-
-#ifdef __FP_FAST_FMAL
-# define FP_FAST_FMAL 1
-#endif
-
 #endif	/* ISO C99 */
 
 #ifndef __NO_LONG_DOUBLE_MATH