diff options
author | Joseph Myers <joseph@codesourcery.com> | 2013-01-17 02:08:51 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2013-01-17 02:08:51 +0000 |
commit | 59981e9b0df84aa91c52d21c54a7ed158a356aaa (patch) | |
tree | f49bb0bfd1bdaef1f26763b91ecf5760d28d4db4 /sysdeps/powerpc | |
parent | cfa8054fbb6212e64d54a3d4926972a6a20e3498 (diff) | |
download | glibc-59981e9b0df84aa91c52d21c54a7ed158a356aaa.tar.gz glibc-59981e9b0df84aa91c52d21c54a7ed158a356aaa.tar.xz glibc-59981e9b0df84aa91c52d21c54a7ed158a356aaa.zip |
Adapt installed powerpc headers better for soft-float / no-FPRs.
Diffstat (limited to 'sysdeps/powerpc')
-rw-r--r-- | sysdeps/powerpc/bits/mathdef.h | 6 | ||||
-rw-r--r-- | sysdeps/powerpc/fpu/bits/fenvinline.h | 5 | ||||
-rw-r--r-- | sysdeps/powerpc/fpu/bits/mathinline.h | 4 | ||||
-rw-r--r-- | sysdeps/powerpc/fpu/fpu_control.h | 43 |
4 files changed, 37 insertions, 21 deletions
diff --git a/sysdeps/powerpc/bits/mathdef.h b/sysdeps/powerpc/bits/mathdef.h index 288cc6c1d7..b3c21fee6e 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 44b4d44f4c..0720795d54 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 b0b1a96150..140fff08ef 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 09342fbe39..159543beed 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 */ |