This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Adapt installed powerpc headers better for soft-float / no-FPRs


It's generally considered desirable to be able to use a single set of
installed headers to compile for all glibc configurations for a given
architecture (thus, the unified x86 headers introduced in 2.16, for
example).

On powerpc, some of the installed headers contain _SOFT_FLOAT
conditionals in support of this - even when in fpu/ sysdeps
directories, so that the headers installed by a hard-float
installation of glibc can be used by a soft-float installation as
well.  However, this is not done consistently: bits/mathdef.h and
fpu_control.h lack such conditionals.  Furthermore, e500
configurations, using a different FPU, define __NO_FPRS__ but not
_SOFT_FLOAT, but most of the same header conditionals are applicable
to e500 as to soft-float.  I hope we can eventually merge in the
separate e500 port (which has been in use since Aldy Hernandez's SPE
add-on for glibc 2.3), with powerpc fpu sysdeps directories rearranged
in a similar way to how the m68k fpu sysdeps directories allow for two
different fpu implementations, but until then it's most appropriate
for the headers to handle __NO_FPRS__ and _SOFT_FLOAT the same (the
function-calling ABI for e500 is the same as for soft-float, so it's
possible to use a soft-float glibc there).

The reason to test both __NO_FPRS__ and _SOFT_FLOAT, rather than just
_SOFT_FLOAT, is that GCC versions before 4.1 didn't define __NO_FPRS__
(4.1 and later define both __NO_FPRS__ and _SOFT_FLOAT for soft-float,
just __NO_FPRS__ for e500 floating point).

This patch duly adds __NO_FPRS__ conditions where _SOFT_FLOAT is
checked, tests both those macros in bits/mathdef.h, and tests both in
fpu_control.h to determine whether to use the generic definitions.  I
intend that a future patch will move bits/fenvinline.h,
bits/mathinline.h and fpu_control.h out of the fpu/ subdirectory so
that the same headers actually get installed for both hard and soft
float.

Tested powerpc-linux-gnu (hard-float and soft-float).

2013-01-14  Joseph Myers  <joseph@codesourcery.com>

	* sysdeps/powerpc/bits/mathdef.h [_SOFT_FLOAT || __NO_FPRS__]
	(FP_FAST_FMA): Do not define.
	[_SOFT_FLOAT || __NO_FPRS__] (FP_FAST_FMAF): Likewise.
	* sysdeps/powerpc/fpu/bits/fenvinline.h [__GNUC__ && !_SOFT_FLOAT
	&& !__NO_MATH_INLINES]: Add [!__NO_FPRS__] condition.
	* sysdeps/powerpc/fpu/bits/mathinline.h [__GNUC__ &&
	!_SOFT_FLOAT]: Likewise.
	* sysdeps/powerpc/fpu/fpu_control.h [_SOFT_FLOAT || __NO_FPRS__]
	[_SOFT_FLOAT || __NO_FPRS__] (_FPU_RESERVED): Define with generic
	value.
	[_SOFT_FLOAT || __NO_FPRS__] (_FPU_DEFAULT): Likewise.
	[_SOFT_FLOAT || __NO_FPRS__] (fpu_control_t): Likewise.
	[_SOFT_FLOAT || __NO_FPRS__] (_FPU_GETCW): Likewise.
	[_SOFT_FLOAT || __NO_FPRS__] (_FPU_SETCW): Likewise.
	[_SOFT_FLOAT || __NO_FPRS__] (__fpu_control): Likewise.
	[!_SOFT_FLOAT && !__NO_FPRS__]: Condition previous contents of
	file.

diff --git a/sysdeps/powerpc/bits/mathdef.h b/sysdeps/powerpc/bits/mathdef.h
index 288cc6c..987e9aa 100644
--- a/sysdeps/powerpc/bits/mathdef.h
+++ b/sysdeps/powerpc/bits/mathdef.h
@@ -37,8 +37,10 @@ typedef double double_t;
 # define FP_ILOGB0	(-2147483647)
 # define FP_ILOGBNAN	(2147483647)
 
+#if !defined _SOFT_FLOAT && !defined __NO_FPRS__
 /* The powerpc has a combined multiply/add instruction.  */
-# define FP_FAST_FMA 1
-# define FP_FAST_FMAF 1
+#  define FP_FAST_FMA 1
+#  define FP_FAST_FMAF 1
+#endif
 
 #endif	/* ISO C99 */
diff --git a/sysdeps/powerpc/fpu/bits/fenvinline.h b/sysdeps/powerpc/fpu/bits/fenvinline.h
index 44b4d44..357ba0b 100644
--- a/sysdeps/powerpc/fpu/bits/fenvinline.h
+++ b/sysdeps/powerpc/fpu/bits/fenvinline.h
@@ -16,7 +16,8 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#if defined __GNUC__ && !defined _SOFT_FLOAT && !defined __NO_MATH_INLINES
+#if defined __GNUC__ && !defined _SOFT_FLOAT && !defined __NO_FPRS__ \
+  && !defined __NO_MATH_INLINES
 
 /* Inline definition for fegetround.  */
 # define fegetround() \
@@ -56,4 +57,4 @@
       : 0)								      \
    : (feclearexcept) (__excepts))
 
-#endif /* __GNUC__ && !_SOFT_FLOAT */
+#endif /* __GNUC__ && !_SOFT_FLOAT && !__NO_FPRS__ */
diff --git a/sysdeps/powerpc/fpu/bits/mathinline.h b/sysdeps/powerpc/fpu/bits/mathinline.h
index b0b1a96..140fff0 100644
--- a/sysdeps/powerpc/fpu/bits/mathinline.h
+++ b/sysdeps/powerpc/fpu/bits/mathinline.h
@@ -26,7 +26,7 @@
 # define __MATH_INLINE __extern_inline
 #endif  /* __cplusplus */
 
-#if defined __GNUC__ && !defined _SOFT_FLOAT
+#if defined __GNUC__ && !defined _SOFT_FLOAT && !defined __NO_FPRS__
 
 #ifdef __USE_ISOC99
 # if !__GNUC_PREREQ (2,97)
@@ -127,4 +127,4 @@ __NTH (fdimf (float __x, float __y))
 
 #endif /* __USE_ISOC99 */
 #endif /* !__NO_MATH_INLINES && __OPTIMIZE__ */
-#endif /* __GNUC__ && !_SOFT_FLOAT */
+#endif /* __GNUC__ && !_SOFT_FLOAT && !__NO_FPRS__ */
diff --git a/sysdeps/powerpc/fpu/fpu_control.h b/sysdeps/powerpc/fpu/fpu_control.h
index 09342fb..159543b 100644
--- a/sysdeps/powerpc/fpu/fpu_control.h
+++ b/sysdeps/powerpc/fpu/fpu_control.h
@@ -19,42 +19,53 @@
 #ifndef _FPU_CONTROL_H
 #define _FPU_CONTROL_H
 
+#if defined _SOFT_FLOAT || defined __NO_FPRS__
+
+# define _FPU_RESERVED 0xffffffff
+# define _FPU_DEFAULT  0x00000000 /* Default value.  */
+typedef unsigned int fpu_control_t;
+# define _FPU_GETCW(cw) (cw) = 0
+# define _FPU_SETCW(cw) (void) (cw)
+extern fpu_control_t __fpu_control;
+
+#else /* PowerPC 6xx floating-point.  */
+
 /* rounding control */
-#define _FPU_RC_NEAREST 0x00   /* RECOMMENDED */
-#define _FPU_RC_DOWN    0x03
-#define _FPU_RC_UP      0x02
-#define _FPU_RC_ZERO    0x01
+# define _FPU_RC_NEAREST 0x00   /* RECOMMENDED */
+# define _FPU_RC_DOWN    0x03
+# define _FPU_RC_UP      0x02
+# define _FPU_RC_ZERO    0x01
 
-#define _FPU_MASK_NI  0x04 /* non-ieee mode */
+# define _FPU_MASK_NI  0x04 /* non-ieee mode */
 
 /* masking of interrupts */
-#define _FPU_MASK_ZM  0x10 /* zero divide */
-#define _FPU_MASK_OM  0x40 /* overflow */
-#define _FPU_MASK_UM  0x20 /* underflow */
-#define _FPU_MASK_XM  0x08 /* inexact */
-#define _FPU_MASK_IM  0x80 /* invalid operation */
+# define _FPU_MASK_ZM  0x10 /* zero divide */
+# define _FPU_MASK_OM  0x40 /* overflow */
+# define _FPU_MASK_UM  0x20 /* underflow */
+# define _FPU_MASK_XM  0x08 /* inexact */
+# define _FPU_MASK_IM  0x80 /* invalid operation */
 
-#define _FPU_RESERVED 0xffffff00 /* These bits are reserved are not changed. */
+# define _FPU_RESERVED 0xffffff00 /* These bits are reserved are not changed. */
 
 /* The fdlibm code requires no interrupts for exceptions.  */
-#define _FPU_DEFAULT  0x00000000 /* Default value.  */
+# define _FPU_DEFAULT  0x00000000 /* Default value.  */
 
 /* IEEE:  same as above, but (some) exceptions;
    we leave the 'inexact' exception off.
  */
-#define _FPU_IEEE     0x000000f0
+# define _FPU_IEEE     0x000000f0
 
 /* Type of the control word.  */
 typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__SI__)));
 
 /* Macros for accessing the hardware control word.  */
-#define _FPU_GETCW(__cw) ( { \
+# define _FPU_GETCW(__cw) ( { \
   union { double d; fpu_control_t cw[2]; } \
     tmp __attribute__ ((__aligned__(8))); \
   __asm__ ("mffs 0; stfd%U0 0,%0" : "=m" (tmp.d) : : "fr0"); \
   (__cw)=tmp.cw[1]; \
   tmp.cw[1]; } )
-#define _FPU_SETCW(__cw) { \
+# define _FPU_SETCW(__cw) { \
   union { double d; fpu_control_t cw[2]; } \
     tmp __attribute__ ((__aligned__(8))); \
   tmp.cw[0] = 0xFFF80000; /* More-or-less arbitrary; this is a QNaN. */ \
@@ -65,4 +76,6 @@ typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__SI__)));
 /* Default control word set at startup.  */
 extern fpu_control_t __fpu_control;
 
+#endif /* PowerPC 6xx floating-point.  */
+
 #endif /* _FPU_CONTROL_H */

-- 
Joseph S. Myers
joseph@codesourcery.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]