summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2013-09-18 14:47:49 +0000
committerJoseph Myers <joseph@codesourcery.com>2013-09-18 14:47:49 +0000
commit24d22e65b39765bb9060f5a99974696171be1da9 (patch)
tree86acd7b15785045ed0841bc2ff4982b88356301a
parent2e071de0f7f75564bea9d216096c2e3366d06250 (diff)
downloadglibc-24d22e65b39765bb9060f5a99974696171be1da9.tar.gz
e500 port: fpu_control.h.
-rw-r--r--ChangeLog23
-rw-r--r--sysdeps/powerpc/fpu_control.h39
2 files changed, 61 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 2a8feffc55..19fcc3ca15 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,27 @@
2013-09-18 Joseph Myers <joseph@codesourcery.com>
+ Aldy Hernandez <aldyh@redhat.com>
+
+ * sysdeps/powerpc/fpu_control.h [_SOFT_FLOAT || __NO_FPRS__]:
+ Change condition to [_SOFT_FLOAT].
+ [__NO_FPRS__ && !_SOFT_FLOAT] (_FPU_RC_NEAREST): New macro.
+ [__NO_FPRS__ && !_SOFT_FLOAT] (_FPU_RC_DOWN): Likewise.
+ [__NO_FPRS__ && !_SOFT_FLOAT] (_FPU_RC_UP): Likewise.
+ [__NO_FPRS__ && !_SOFT_FLOAT] (_FPU_RC_ZERO): Likewise.
+ [__NO_FPRS__ && !_SOFT_FLOAT] (_FPU_MASK_ZM): Likewise.
+ [__NO_FPRS__ && !_SOFT_FLOAT] (_FPU_MASK_OM): Likewise.
+ [__NO_FPRS__ && !_SOFT_FLOAT] (_FPU_MASK_UM): Likewise.
+ [__NO_FPRS__ && !_SOFT_FLOAT] (_FPU_MASK_XM): Likewise.
+ [__NO_FPRS__ && !_SOFT_FLOAT] (_FPU_MASK_IM): Likewise.
+ [__NO_FPRS__ && !_SOFT_FLOAT] (_FPU_RESERVED): Likewise.
+ [__NO_FPRS__ && !_SOFT_FLOAT] (_FPU_DEFAULT): Likewise.
+ [__NO_FPRS__ && !_SOFT_FLOAT] (_FPU_IEEE): Likewise.
+ [__NO_FPRS__ && !_SOFT_FLOAT] (fpu_control_t): New typedef.
+ [__NO_FPRS__ && !_SOFT_FLOAT] (_FPU_GETCW): New macro.
+ [__NO_FPRS__ && !_SOFT_FLOAT] (_FPU_SETCW): Likewise.
+ [__NO_FPRS__ && !_SOFT_FLOAT] (__fpu_control): New variable
+ declaration.
+
+2013-09-18 Joseph Myers <joseph@codesourcery.com>
* sysdeps/powerpc/powerpc32/__longjmp-common.S (LOAD_GP): Define
macro conditional on [__SPE__ || (__NO_FPRS__ && !_SOFT_FLOAT)].
diff --git a/sysdeps/powerpc/fpu_control.h b/sysdeps/powerpc/fpu_control.h
index 1a6d395ca8..c61a2e12cc 100644
--- a/sysdeps/powerpc/fpu_control.h
+++ b/sysdeps/powerpc/fpu_control.h
@@ -19,7 +19,7 @@
#ifndef _FPU_CONTROL_H
#define _FPU_CONTROL_H
-#if defined _SOFT_FLOAT || defined __NO_FPRS__
+#ifdef _SOFT_FLOAT
# define _FPU_RESERVED 0xffffffff
# define _FPU_DEFAULT 0x00000000 /* Default value. */
@@ -28,6 +28,43 @@ typedef unsigned int fpu_control_t;
# define _FPU_SETCW(cw) (void) (cw)
extern fpu_control_t __fpu_control;
+#elif defined __NO_FPRS__ /* e500 */
+
+/* rounding control */
+# define _FPU_RC_NEAREST 0x00 /* RECOMMENDED */
+# define _FPU_RC_DOWN 0x03
+# define _FPU_RC_UP 0x02
+# define _FPU_RC_ZERO 0x01
+
+/* masking of interrupts */
+# define _FPU_MASK_ZM 0x10 /* zero divide */
+# define _FPU_MASK_OM 0x40 /* overflow */
+# define _FPU_MASK_UM 0x80 /* underflow */
+# define _FPU_MASK_XM 0x40 /* inexact */
+# define _FPU_MASK_IM 0x20 /* invalid operation */
+
+# define _FPU_RESERVED 0xff3fff7f /* These bits are reserved and not changed. */
+
+/* The fdlibm code requires no interrupts for exceptions. */
+# define _FPU_DEFAULT 0x00000000 /* Default value. */
+
+/* IEEE: same as above, but (some) exceptions;
+ we leave the 'inexact' exception off.
+ */
+# define _FPU_IEEE 0x000003c0
+
+/* Type of the control word. */
+typedef unsigned int fpu_control_t;
+
+/* Macros for accessing the hardware control word. */
+# define _FPU_GETCW(cw) \
+ __asm__ volatile ("mfspefscr %0" : "=r" (cw))
+# define _FPU_SETCW(cw) \
+ __asm__ volatile ("mtspefscr %0" : : "r" (cw))
+
+/* Default control word set at startup. */
+extern fpu_control_t __fpu_control;
+
#else /* PowerPC 6xx floating-point. */
/* rounding control */