about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2014-12-31 19:16:34 +0000
committerJoseph Myers <joseph@codesourcery.com>2014-12-31 19:16:34 +0000
commit4a3d39994e07105fb1bd20ed71d166f6ebb21974 (patch)
treee39cb5059aafd8477eed6597770ac7b3681dd4ca
parent195f3afcbed4986beaecd5c28fdbe27ee0a402e0 (diff)
downloadglibc-4a3d39994e07105fb1bd20ed71d166f6ebb21974.tar.gz
glibc-4a3d39994e07105fb1bd20ed71d166f6ebb21974.tar.xz
glibc-4a3d39994e07105fb1bd20ed71d166f6ebb21974.zip
Clean up powerpc fegetround / __fegetround inlines.
The natural fix for some linknamespace test failures, where C90 libm
functions call C99 <fenv.h> functions, is to make fe* into weak
aliases for __fe* and call __fe* from within libm as needed.

To do this, the __fe* names need to be available for that purpose -
that is, they must not be used for something other than aliases of
fe*.  On powerpc, however, __fegetround is an inline function in
fenv_libc.h, with no corresponding fegetround inline function;
fegetround has an equivalent macro expansion in bits/fenvinline.h, but
that is disabled if __NO_MATH_INLINES (which is defined for building
libm).

I see no need for that disabling; it's not even clear that
__NO_MATH_INLINES should affect <fenv.h>, and the results of
fegetround are completely defined so there is no semantic effect of
that disabling at all outside glibc.  The x86 inline feraiseexcept is
conditioned on __USE_EXTERN_INLINES not __NO_MATH_INLINES (but that's
an inline function rather than a macro).

This patch removes the __NO_MATH_INLINES conditional on that
fegetround macro, so resulting in it being expanded inline inside
glibc.  In turn, this means that direct calls to __fegetround from C99
functions in ldbl-128ibm can be changed to calls to fegetround, so
that nofpu fenv_libc.h files don't need to define __fegetround at all
and, by changing ldbl-128ibm files to use <fenv.h> not <fenv_libc.h>,
non-e500 nofpu no longer needs an fenv_libc.h file.

The other macros in fenvinline.h are left conditional on
__NO_MATH_INLINES, although since the only case where this should make
a difference is one involving undefined behavior (if the argument to
the function is not a valid exception macro).

The out-of-line definition for fegetround uses __fegetround (the
inline function removed by this patch).  So this continues to work,
the fenvinline.h header is made to define __fegetround, and then to
define fegetround to call __fegetround.

Tested for powerpc32 (hard float) that installed stripped shared
libraries are unchanged by this patch; also tested that powerpc-nofpu
build still works.  (This patch does not itself fix any bugs; it
simply cleans things up in preparation for separate bug fixes.)

	* sysdeps/powerpc/bits/fenvinline.h (fegetround): Rename macro to
	__fegetround and redefine to call __fegetround.  Remove condition
	on [!__NO_MATH_INLINES].
	* sysdeps/powerpc/fpu/fenv_libc.h (__fegetround): Remove inline
	function.
	* sysdeps/powerpc/nofpu/fenv_libc.h: Remove file.
	* sysdeps/powerpc/powerpc32/e500/nofpu/fenv_libc.h (__fegetround):
	Remove macro.
	* sysdeps/ieee754/ldbl-128ibm/s_llrintl.c: Include <fenv.h>
	instead of <fenv_libc.h>.
	(__llrintl): Call fegetround instead of __fegetround.
	* sysdeps/ieee754/ldbl-128ibm/s_llroundl.c: Include <fenv.h>
	instead of <fenv_libc.h>.
	* sysdeps/ieee754/ldbl-128ibm/s_lrintl.c: Likewise.
	(__lrintl): Call fegetround instead of __fegetround.
	* sysdeps/ieee754/ldbl-128ibm/s_lroundl.c: Include <fenv.h>
	instead of <fenv_libc.h>.
	* sysdeps/ieee754/ldbl-128ibm/s_rintl.c: Likewise.
	(__rintl): Call fegetround instead of __fegetround.
-rw-r--r--ChangeLog22
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/s_llrintl.c4
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/s_llroundl.c2
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/s_lrintl.c4
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/s_lroundl.c2
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/s_rintl.c4
-rw-r--r--sysdeps/powerpc/bits/fenvinline.h13
-rw-r--r--sysdeps/powerpc/fpu/fenv_libc.h9
-rw-r--r--sysdeps/powerpc/nofpu/fenv_libc.h31
-rw-r--r--sysdeps/powerpc/powerpc32/e500/nofpu/fenv_libc.h3
10 files changed, 38 insertions, 56 deletions
diff --git a/ChangeLog b/ChangeLog
index 4597880d4e..3de34438ff 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,25 @@
+2014-12-31  Joseph Myers  <joseph@codesourcery.com>
+
+	* sysdeps/powerpc/bits/fenvinline.h (fegetround): Rename macro to
+	__fegetround and redefine to call __fegetround.  Remove condition
+	on [!__NO_MATH_INLINES].
+	* sysdeps/powerpc/fpu/fenv_libc.h (__fegetround): Remove inline
+	function.
+	* sysdeps/powerpc/nofpu/fenv_libc.h: Remove file.
+	* sysdeps/powerpc/powerpc32/e500/nofpu/fenv_libc.h (__fegetround):
+	Remove macro.
+	* sysdeps/ieee754/ldbl-128ibm/s_llrintl.c: Include <fenv.h>
+	instead of <fenv_libc.h>.
+	(__llrintl): Call fegetround instead of __fegetround.
+	* sysdeps/ieee754/ldbl-128ibm/s_llroundl.c: Include <fenv.h>
+	instead of <fenv_libc.h>.
+	* sysdeps/ieee754/ldbl-128ibm/s_lrintl.c: Likewise.
+	(__lrintl): Call fegetround instead of __fegetround.
+	* sysdeps/ieee754/ldbl-128ibm/s_lroundl.c: Include <fenv.h>
+	instead of <fenv_libc.h>.
+	* sysdeps/ieee754/ldbl-128ibm/s_rintl.c: Likewise.
+	(__rintl): Call fegetround instead of __fegetround.
+
 2014-12-31  Siddhesh Poyarekar  <siddhesh@redhat.com>
 
 	* scripts/gen-posix-conf-vars.awk: Don't use multi-dimensional
diff --git a/sysdeps/ieee754/ldbl-128ibm/s_llrintl.c b/sysdeps/ieee754/ldbl-128ibm/s_llrintl.c
index 86996bff3d..3d9dee1cec 100644
--- a/sysdeps/ieee754/ldbl-128ibm/s_llrintl.c
+++ b/sysdeps/ieee754/ldbl-128ibm/s_llrintl.c
@@ -18,7 +18,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <math.h>
-#include <fenv_libc.h>
+#include <fenv.h>
 #include <math_ldbl_opt.h>
 #include <float.h>
 #include <ieee754.h>
@@ -43,7 +43,7 @@ __llrintl (long double x)
 #endif
     )
     {
-      save_round = __fegetround ();
+      save_round = fegetround ();
 
       if (__glibc_unlikely ((xh == -(double) (-__LONG_LONG_MAX__ - 1))))
 	{
diff --git a/sysdeps/ieee754/ldbl-128ibm/s_llroundl.c b/sysdeps/ieee754/ldbl-128ibm/s_llroundl.c
index dd84074cf7..98e4253060 100644
--- a/sysdeps/ieee754/ldbl-128ibm/s_llroundl.c
+++ b/sysdeps/ieee754/ldbl-128ibm/s_llroundl.c
@@ -18,7 +18,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <math.h>
-#include <fenv_libc.h>
+#include <fenv.h>
 #include <math_ldbl_opt.h>
 #include <float.h>
 #include <ieee754.h>
diff --git a/sysdeps/ieee754/ldbl-128ibm/s_lrintl.c b/sysdeps/ieee754/ldbl-128ibm/s_lrintl.c
index 2b47c52a06..895a066d84 100644
--- a/sysdeps/ieee754/ldbl-128ibm/s_lrintl.c
+++ b/sysdeps/ieee754/ldbl-128ibm/s_lrintl.c
@@ -18,7 +18,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <math.h>
-#include <fenv_libc.h>
+#include <fenv.h>
 #include <math_ldbl_opt.h>
 #include <float.h>
 #include <ieee754.h>
@@ -49,7 +49,7 @@ __lrintl (long double x)
 #endif
     )
     {
-      save_round = __fegetround ();
+      save_round = fegetround ();
 
 #if __LONG_MAX__ == 2147483647
       long long llhi = (long long) xh;
diff --git a/sysdeps/ieee754/ldbl-128ibm/s_lroundl.c b/sysdeps/ieee754/ldbl-128ibm/s_lroundl.c
index 27b72e2ad1..6c3a3140c9 100644
--- a/sysdeps/ieee754/ldbl-128ibm/s_lroundl.c
+++ b/sysdeps/ieee754/ldbl-128ibm/s_lroundl.c
@@ -18,7 +18,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <math.h>
-#include <fenv_libc.h>
+#include <fenv.h>
 #include <math_ldbl_opt.h>
 #include <float.h>
 #include <ieee754.h>
diff --git a/sysdeps/ieee754/ldbl-128ibm/s_rintl.c b/sysdeps/ieee754/ldbl-128ibm/s_rintl.c
index 20b75dd214..f39e6fd356 100644
--- a/sysdeps/ieee754/ldbl-128ibm/s_rintl.c
+++ b/sysdeps/ieee754/ldbl-128ibm/s_rintl.c
@@ -21,7 +21,7 @@
    when it's coded in C.  */
 
 #include <math.h>
-#include <fenv_libc.h>
+#include <fenv.h>
 #include <math_ldbl_opt.h>
 #include <float.h>
 #include <ieee754.h>
@@ -40,7 +40,7 @@ __rintl (long double x)
 					     __builtin_inf ()), 1))
     {
       double orig_xh;
-      int save_round = __fegetround ();
+      int save_round = fegetround ();
 
       /* Long double arithmetic, including the canonicalisation below,
 	 only works in round-to-nearest mode.  */
diff --git a/sysdeps/powerpc/bits/fenvinline.h b/sysdeps/powerpc/bits/fenvinline.h
index 00336f3b0d..e914928eaa 100644
--- a/sysdeps/powerpc/bits/fenvinline.h
+++ b/sysdeps/powerpc/bits/fenvinline.h
@@ -16,23 +16,24 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#if (defined __GNUC__ && !defined _SOFT_FLOAT && !defined __NO_FPRS__	\
-     && !defined __NO_MATH_INLINES)
+#if defined __GNUC__ && !defined _SOFT_FLOAT && !defined __NO_FPRS__
 
 /* Inline definition for fegetround.  */
-# define fegetround() \
+# define __fegetround() \
   (__extension__  ({ int __fegetround_result;				      \
 		     __asm__ __volatile__				      \
 		       ("mcrfs 7,7 ; mfcr %0"				      \
 			: "=r"(__fegetround_result) : : "cr7");		      \
 		     __fegetround_result & 3; }))
+# define fegetround() __fegetround ()
 
+# ifndef __NO_MATH_INLINES
 /* The weird 'i#*X' constraints on the following suppress a gcc
    warning when __excepts is not a constant.  Otherwise, they mean the
    same as just plain 'i'.  */
 
 /* Inline definition for feraiseexcept.  */
-# define feraiseexcept(__excepts) \
+#  define feraiseexcept(__excepts) \
   ((__builtin_constant_p (__excepts)					      \
     && ((__excepts) & ((__excepts)-1)) == 0				      \
     && (__excepts) != FE_INVALID)					      \
@@ -45,7 +46,7 @@
    : (feraiseexcept) (__excepts))
 
 /* Inline definition for feclearexcept.  */
-# define feclearexcept(__excepts) \
+#  define feclearexcept(__excepts) \
   ((__builtin_constant_p (__excepts)					      \
     && ((__excepts) & ((__excepts)-1)) == 0				      \
     && (__excepts) != FE_INVALID)					      \
@@ -57,4 +58,6 @@
       : 0)								      \
    : (feclearexcept) (__excepts))
 
+# endif /* !__NO_MATH_INLINES.  */
+
 #endif /* __GNUC__ && !_SOFT_FLOAT && !__NO_FPRS__ */
diff --git a/sysdeps/powerpc/fpu/fenv_libc.h b/sysdeps/powerpc/fpu/fenv_libc.h
index c1df5ce091..125745e04b 100644
--- a/sysdeps/powerpc/fpu/fenv_libc.h
+++ b/sysdeps/powerpc/fpu/fenv_libc.h
@@ -76,15 +76,6 @@ typedef union
 
 
 static inline int
-__fegetround (void)
-{
-  int result;
-  asm volatile ("mcrfs 7,7\n\t"
-		"mfcr  %0" : "=r"(result) : : "cr7");
-  return result & 3;
-}
-
-static inline int
 __fesetround (int round)
 {
   if ((unsigned int) round < 2)
diff --git a/sysdeps/powerpc/nofpu/fenv_libc.h b/sysdeps/powerpc/nofpu/fenv_libc.h
deleted file mode 100644
index dce1524e3f..0000000000
--- a/sysdeps/powerpc/nofpu/fenv_libc.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/* Internal libc stuff for floating point environment routines.
-   Copyright (C) 2007-2014 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 _FENV_LIBC_H
-#define _FENV_LIBC_H	1
-
-/* fenv_libc.h is used in libm implementations of ldbl-128ibm.  So we
-   need this version in the soft-fp to at minimum include fenv.h to
-   get the fegetround definition.  */
-
-#include <fenv.h>
-
-/* ldbl-128ibm code uses __fegetround.  */
-#define __fegetround()	fegetround ()
-
-#endif /* fenv_libc.h */
diff --git a/sysdeps/powerpc/powerpc32/e500/nofpu/fenv_libc.h b/sysdeps/powerpc/powerpc32/e500/nofpu/fenv_libc.h
index d8225e7064..07eb675fe1 100644
--- a/sysdeps/powerpc/powerpc32/e500/nofpu/fenv_libc.h
+++ b/sysdeps/powerpc/powerpc32/e500/nofpu/fenv_libc.h
@@ -21,9 +21,6 @@
 
 #include <fenv.h>
 
-/* ldbl-128ibm code uses __fegetround.  */
-#define __fegetround()	fegetround ()
-
 int __feraiseexcept_spe (int);
 libm_hidden_proto (__feraiseexcept_spe)