From 59981e9b0df84aa91c52d21c54a7ed158a356aaa Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Thu, 17 Jan 2013 02:08:51 +0000 Subject: [PATCH] Adapt installed powerpc headers better for soft-float / no-FPRs. --- ChangeLog | 20 ++++++++++++++++ sysdeps/powerpc/bits/mathdef.h | 6 +++-- sysdeps/powerpc/fpu/bits/fenvinline.h | 5 ++-- sysdeps/powerpc/fpu/bits/mathinline.h | 4 ++-- sysdeps/powerpc/fpu/fpu_control.h | 43 +++++++++++++++++++++++------------ 5 files changed, 57 insertions(+), 21 deletions(-) diff --git a/ChangeLog b/ChangeLog index 248e8df..56fa319 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,23 @@ +2013-01-17 Joseph Myers + + * 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. + 2013-01-16 Andreas Schwab [BZ #14327] diff --git a/sysdeps/powerpc/bits/mathdef.h b/sysdeps/powerpc/bits/mathdef.h index 288cc6c..b3c21fe 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..0720795 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 . */ -#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 */ -- 2.7.4