-ffast-math and mathinlines.h
Andreas Jaeger
aj@oss.sgi.com
Wed Apr 12 14:13:00 GMT 2000
<bits/mathinlines.h> on ix86 contains a number of inline functions
which are either inaccurate or don't set errno. gcc has a special
flag for this case, it's called -ffast-math. The documentation is:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@item -ffast-math
This option allows GCC to violate some ANSI or IEEE rules and/or
specifications in the interest of optimizing code for speed. For
example, it allows the compiler to assume arguments to the @code{sqrt}
function are non-negative numbers and that no floating-point values
are NaNs.
This option should never be turned on by any @samp{-O} option since
it can result in incorrect output for programs which depend on
an exact implementation of IEEE or ANSI rules/specifications for
math functions.
@item -fno-math-errno
Do not set ERRNO after calling math functions that are executed
with a single instruction, e.g., sqrt. A program that relies on
IEEE exceptions for math error handling may want to use this flag
for speed while maintaining IEEE arithmetic compatibility.
The default is @samp{-fmath-errno}. The @samp{-ffast-math} option
sets @samp{-fno-math-errno}.
@end table
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
gcc defines __FAST_MATH__ if -ffast-math is set. IMO we should add a
check in <bits/mathinline.h> and only enable the inline instructions
if __FAST_MATH__ is set.
Here's a patch for glibc 2.2 - the patch shouldn't go into glibc 2.1
since we're changing the behaviour. I'm not sure it the patch is
correct with regard of my change of __LIBC_INTERNAL_MATH_INLINES
I don't know what kind of inline functions other architectures use -
if those are violating IEEE/ISO C, we should use __FAST_MATH__ there
also.
Andreas
2000-04-12 Andreas Jaeger <aj@suse.de>
* sysdeps/i386/fpu/bits/mathinline.h: Define inline functions only
if -ffast-math is given.
============================================================
Index: sysdeps/i386/fpu/bits/mathinline.h
--- sysdeps/i386/fpu/bits/mathinline.h 2000/03/29 03:45:53 1.38
+++ sysdeps/i386/fpu/bits/mathinline.h 2000/04/12 21:06:18
@@ -141,7 +141,7 @@
#if __GNUC_PREREQ (2, 8)
#if ((!defined __NO_MATH_INLINES || defined __LIBC_INTERNAL_MATH_INLINES) \
- && defined __OPTIMIZE__)
+ && defined __OPTIMIZE__ && defined __FAST_MATH__)
/* A macro to define float, double, and long double versions of various
math functions for the ix87 FPU. FUNC is the function name (which will
@@ -275,7 +275,7 @@
#endif
-#if !defined __NO_MATH_INLINES && defined __OPTIMIZE__
+#if !defined __NO_MATH_INLINES && defined __OPTIMIZE__ && defined __FAST_MATH__
/* Miscellaneous functions */
__inline_mathcode (__sgn, __x, \
@@ -711,11 +711,11 @@
#undef __atan2_code
#undef __sincos_code
-#endif /* __NO_MATH_INLINES */
+#endif /* __NO_MATH_INLINES && __OPTIMIZE && __FAST_MATH__ */
/* This code is used internally in the GNU libc. */
-#ifdef __LIBC_INTERNAL_MATH_INLINES
+#if defined __LIBC_INTERNAL_MATH_INLINES && defined __FAST_MATH__
__inline_mathop (__ieee754_sqrt, "fsqrt")
__inline_mathcode2 (__ieee754_atan2, __y, __x,
register long double __value;
--
Andreas Jaeger
SuSE Labs aj@suse.de
private aj@arthur.rhein-neckar.de
currently: aj@oss.sgi.com
More information about the Libc-hacker
mailing list