[v4,1/3] Cleanup __ieee754_sqrt(f/l)
Commit Message
This patch series cleans up the many uses of __ieee754_sqrt(f/l) in GLIBC.
The goal is to enable GCC to do the inlining, and if this fails call the
__ieee754_sqrt function. This is done by internally declaring sqrt with asm
redirects. The compat symbols and sqrt wrappers need to disable the redirect.
The redirect is also disabled if there are already redirects defined when
using -ffinite-math-only.
All math functions (but not math tests, non-library code and libnldbl) are
built with -fno-math-errno which means GCC will typically inline sqrt as a
single instruction. This means targets are no longer forced to add a special
inline for sqrt.
Regress tested on AArch64 ad x64 and a subset of buildmanyglibc.
ChangeLog:
2018-03-15 Wilco Dijkstra <wdijkstr@arm.com>
* include/math.h (sqrt): Declare with asm redirect.
(sqrtf): Likewise.
(sqrtl): Likewise.
(sqrtf128): Likewise.
* Makeconfig: Add -fno-math-errno for libc/libm, but build testsuite,
nonlib and libnldbl with -fmath-errno.
* math/w_sqrt_compat.c: Define NO_MATH_REDIRECT.
* math/w_sqrt_template.c: Likewise.
* math/w_sqrtf_compat.c: Likewise.
* math/w_sqrtl_compat.c: Likewise.
* sysdeps/generic/math-type-macros-float128.h: Remove math.h and complex.h.
* sysdeps/i386/fpu/w_sqrt.c: Likewise.
* sysdeps/i386/fpu/w_sqrt_compat.c: Likewise.
--
Comments
On Thu, 15 Mar 2018, Wilco Dijkstra wrote:
> 2018-03-15 Wilco Dijkstra <wdijkstr@arm.com>
>
> * include/math.h (sqrt): Declare with asm redirect.
> (sqrtf): Likewise.
> (sqrtl): Likewise.
> (sqrtf128): Likewise.
> * Makeconfig: Add -fno-math-errno for libc/libm, but build testsuite,
> nonlib and libnldbl with -fmath-errno.
> * math/w_sqrt_compat.c: Define NO_MATH_REDIRECT.
> * math/w_sqrt_template.c: Likewise.
> * math/w_sqrtf_compat.c: Likewise.
> * math/w_sqrtl_compat.c: Likewise.
> * sysdeps/generic/math-type-macros-float128.h: Remove math.h and complex.h.
> * sysdeps/i386/fpu/w_sqrt.c: Likewise.
> * sysdeps/i386/fpu/w_sqrt_compat.c: Likewise.
The sysdeps/generic/math-type-macros-float128.h entry should come at the
end, otherwise the "Likewise" for the subsequent two files is incorrect,
since it's not math.h and complex.h includes being removed from them, it's
NO_MATH_REDIRECT defines being added.
> +# if !(defined __FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ > 0)
> +# ifndef NO_MATH_REDIRECT
> +/* Declare sqrt for use within GLIBC. Sqrt will typically inline into a
sqrt not Sqrt at the start of a sentence (see the GNU Coding Standards:
"If a lower-case identifier comes at the beginning of a sentence, don't
capitalize it! Changing the spelling makes it a different identifier.
If you don't like starting a sentence with a lower case letter, write the
sentence differently (e.g., ``The identifier lower-case is @dots{}'').").
This patch is OK with those changes.
@@ -831,6 +831,9 @@ endif
# disable any optimization that assume default rounding mode.
+math-flags = -frounding-math
+# Build libc/libm using -fno-math-errno, but run testsuite with -fmath-errno.
++extra-math-flags = $(if $(filter libnldbl nonlib testsuite,$(in-module)),-fmath-errno,-fno-math-errno)
+
# We might want to compile with some stack-protection flag.
ifneq ($(stack-protector),)
+stack-protector=$(stack-protector)
@@ -966,6 +969,7 @@ endif
override CFLAGS = -std=gnu11 -fgnu89-inline $(config-extra-cflags) \
$(filter-out %frame-pointer,$(+cflags)) $(+gccwarn-c) \
+ $(+extra-math-flags) \
$(sysdep-CFLAGS) $(CFLAGS-$(suffix $@)) $(CFLAGS-$(<F)) \
$(CFLAGS-$(@F)) $(tls-model) \
$(foreach lib,$(libof-$(basename $(@F))) \
@@ -54,5 +54,20 @@ libm_hidden_proto (__expf128)
libm_hidden_proto (__expm1f128)
# endif
+# if !(defined __FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ > 0)
+# ifndef NO_MATH_REDIRECT
+/* Declare sqrt for use within GLIBC. Sqrt will typically inline into a
+ single instruction. Use an asm to avoid use of PLTs if it doesn't. */
+float (sqrtf) (float) asm ("__ieee754_sqrtf");
+double (sqrt) (double) asm ("__ieee754_sqrt");
+# ifndef __NO_LONG_DOUBLE_MATH
+long double (sqrtl) (long double) asm ("__ieee754_sqrtl");
+# endif
+# if __HAVE_DISTINCT_FLOAT128 > 0
+_Float128 (sqrtf128) (_Float128) asm ("__ieee754_sqrtf128");
+# endif
+# endif
+# endif
+
#endif
#endif
@@ -16,6 +16,7 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
+#define NO_MATH_REDIRECT
#include <math.h>
#include <math_private.h>
#include <math-svid-compat.h>
@@ -21,6 +21,7 @@
for each floating-point type. */
#if __USE_WRAPPER_TEMPLATE
+# define NO_MATH_REDIRECT
# include <errno.h>
# include <fenv.h>
# include <math.h>
@@ -16,6 +16,7 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
+#define NO_MATH_REDIRECT
#include <math.h>
#include <math_private.h>
#include <math-svid-compat.h>
@@ -16,6 +16,7 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
+#define NO_MATH_REDIRECT
#include <math.h>
#include <math_private.h>
#include <math-svid-compat.h>
@@ -19,9 +19,6 @@
#ifndef _MATH_TYPE_MACROS_FLOAT128
#define _MATH_TYPE_MACROS_FLOAT128
-#include <math.h>
-#include <complex.h>
-
#define M_LIT(c) __f128 (c)
#define M_PFX FLT128
#define M_SUF(c) c ## f128
@@ -1,5 +1,6 @@
/* The inline __ieee754_sqrt is not correctly rounding; it's OK for
most internal uses in glibc, but not for sqrt itself. */
+#define NO_MATH_REDIRECT
#define __ieee754_sqrt __avoid_ieee754_sqrt
#include <math.h>
#include <math_private.h>
@@ -1,5 +1,6 @@
/* The inline __ieee754_sqrt is not correctly rounding; it's OK for
most internal uses in glibc, but not for sqrt itself. */
+#define NO_MATH_REDIRECT
#define __ieee754_sqrt __avoid_ieee754_sqrt
#include <math.h>
#include <math_private.h>