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]

e500 port: fpu_control.h


This patch (based on the old e500 port, and descending from the old
spe add-on) adds e500 support to the powerpc fpu_control.h.  Tested
with a build for e500.

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.

diff --git a/sysdeps/powerpc/fpu_control.h b/sysdeps/powerpc/fpu_control.h
index 1a6d395..c61a2e1 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 */

-- 
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]