summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libc/ChangeLog.eglibc19
-rw-r--r--libc/misc/tst-efgcvt.c2
-rw-r--r--libc/sysdeps/powerpc/bits/fenv.h64
-rw-r--r--libc/sysdeps/powerpc/fpu/bits/fenvinline.h4
-rw-r--r--libc/sysdeps/powerpc/fpu/bits/mathinline.h4
-rw-r--r--libc/sysdeps/powerpc/fpu/fpu_control.h55
-rw-r--r--libc/sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext-common.S5
-rw-r--r--libc/sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext-common.S4
-rw-r--r--libc/sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext-common.S8
-rw-r--r--ports/ChangeLog.eglibc7
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/Makefile5
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/Versions8
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/__longjmp-common.S103
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/__longjmp.S39
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/atosfix16.c28
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/atosfix32.c28
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/atosfix64.c28
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/atoufix16.c28
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/atoufix32.c28
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/atoufix64.c28
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/e_sqrt.c1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/e_sqrtf.c1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/fclrexcpt.c47
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/fe_nomask.c32
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/fedisblxcpt.c60
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/feenablxcpt.c60
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/fegetenv.c46
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/fegetexcept.c31
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/fegetround.c31
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/feholdexcpt.c45
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/fenv_const.c27
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/fenv_libc.h77
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/fesetenv.c46
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/fesetround.c37
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/feupdateenv.c57
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/fgetexcptflg.c47
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/fprrest.c1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/fprsave.c1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/fraiseexcpt.c29
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/fsetexcptflg.c54
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/ftestexcept.c32
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/math_ldbl.h1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/math_private.h1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/s_ceil.c1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/s_ceilf.c1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/s_copysign.c1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/s_copysignf.c1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/s_copysignl.c1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fabs.c1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fabsf.S29
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fabsl.c1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fdim.c1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fdimf.c1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/s_floor.c1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/s_floorf.c1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fmax.c1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fmaxf.c1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fmin.c1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fminf.c1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/s_isnan.c1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/s_isnanf.c1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/s_llrint.c1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/s_llrintf.c1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/s_llround.c1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/s_llroundf.c1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/s_lrint.c1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/s_lrintf.S29
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/s_lround.c1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/s_lroundf.c1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/s_rint.c1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/s_rintf.c1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/s_round.c1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/s_roundf.c1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/s_trunc.c1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/s_truncf.c1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/setjmp-common.S108
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/setjmp.S44
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/strtofix.c692
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/strtosfix16.c28
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/strtosfix32.c28
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/strtosfix64.c28
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/strtoufix16.c28
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/strtoufix32.c28
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/strtoufix64.c28
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/t_sqrt.c1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/w_sqrt.c1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/fpu/w_sqrtf.c1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/soft-fp/Makefile4
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/soft-fp/Subdirs1
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/soft-fp/Versions19
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/soft-fp/fraiseexcept-soft.c25
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/soft-fp/sfp-machine.h60
-rw-r--r--ports/sysdeps/powerpc/powerpc32/e500/spe-raise.c68
-rw-r--r--ports/sysdeps/powerpc/preconfigure20
-rw-r--r--ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/Implies1
-rw-r--r--ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/getcontext-extra.S58
-rw-r--r--ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/getcontext.S60
-rw-r--r--ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/setcontext-extra.S90
-rw-r--r--ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/setcontext.S60
-rw-r--r--ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/swapcontext.S60
-rw-r--r--ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/single/Implies1
101 files changed, 2882 insertions, 7 deletions
diff --git a/libc/ChangeLog.eglibc b/libc/ChangeLog.eglibc
index b2e00a581..277fbea48 100644
--- a/libc/ChangeLog.eglibc
+++ b/libc/ChangeLog.eglibc
@@ -1,3 +1,22 @@
+2006-12-07 Joseph Myers <joseph@codesourcery.com>
+
+ * misc/tst-efgcvt.c (ecvt_tests): Disable subnormal test for E500
+ double.
+ * sysdeps/powerpc/bits/fenv.h: Include E500 definitions. Based on
+ SPE add-on by Aldy Hernandez.
+ * sysdeps/powerpc/fpu/bits/fenvinline.h: Change _SOFT_FLOAT to
+ __NO_FPRS__.
+ * sysdeps/powerpc/fpu/bits/mathinline.h: Likewise.
+ * sysdeps/powerpc/fpu/fpu_control.h: Include soft-float and E500
+ definitions. Based on SPE add-on by Aldy Hernandez.
+ * sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext-common.S:
+ If __CONTEXT_EXTRA defined, include <getcontext-extra.S>.
+ * sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext-common.S:
+ If __CONTEXT_EXTRA defined, include <setcontext-extra.S>.
+ * sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext-common.S:
+ If __CONTEXT_EXTRA defined, include <getcontext-extra.S> and
+ <setcontext-extra.S>.
+
2006-11-13 Joseph S. Myers <joseph@codesourcery.com>
* sysdeps/alpha/bits/mathdef.h (float_t): Always define as float.
diff --git a/libc/misc/tst-efgcvt.c b/libc/misc/tst-efgcvt.c
index 30ab0f17a..632015aed 100644
--- a/libc/misc/tst-efgcvt.c
+++ b/libc/misc/tst-efgcvt.c
@@ -60,7 +60,7 @@ static testcase ecvt_tests[] =
{ 123.01, -4, 3, "" },
{ 126.71, -4, 3, "" },
{ 0.0, 4, 1, "0000" },
-#if DBL_MANT_DIG == 53
+#if DBL_MANT_DIG == 53 && !(defined __powerpc__ && defined __NO_FPRS__ && !defined _SOFT_FLOAT && !defined _SOFT_DOUBLE)
{ 0x1p-1074, 3, -323, "494" },
{ -0x1p-1074, 3, -323, "494" },
#endif
diff --git a/libc/sysdeps/powerpc/bits/fenv.h b/libc/sysdeps/powerpc/bits/fenv.h
index 8509b4b0c..60d1a0d36 100644
--- a/libc/sysdeps/powerpc/bits/fenv.h
+++ b/libc/sysdeps/powerpc/bits/fenv.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc.
+/* Copyright (C) 1997, 1998, 1999, 2004, 2006 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -20,6 +20,66 @@
# error "Never use <bits/fenv.h> directly; include <fenv.h> instead."
#endif
+#if defined __NO_FPRS__ && !defined _SOFT_FLOAT /* E500 */
+
+/* Define bits representing the exception. We use the bit positions of
+ the appropriate bits in the SPEFSCR... */
+enum
+ {
+ FE_INEXACT = 1 << (63 - 42),
+#define FE_INEXACT FE_INEXACT
+ FE_INVALID = 1 << (63 - 43),
+#define FE_INVALID FE_INVALID
+ FE_DIVBYZERO = 1 << (63 - 44),
+#define FE_DIVBYZERO FE_DIVBYZERO
+ FE_UNDERFLOW = 1 << (63 - 45),
+#define FE_UNDERFLOW FE_UNDERFLOW
+ FE_OVERFLOW = 1 << (63 - 46)
+#define FE_OVERFLOW FE_OVERFLOW
+ };
+
+#define FE_ALL_EXCEPT \
+ (FE_INEXACT | FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID)
+
+/* The E500 support all of the four defined rounding modes. We use
+ the bit pattern in the SPEFSCR as the values for the appropriate
+ macros. */
+enum
+ {
+ FE_TONEAREST = 0,
+#define FE_TONEAREST FE_TONEAREST
+ FE_TOWARDZERO = 1,
+#define FE_TOWARDZERO FE_TOWARDZERO
+ FE_UPWARD = 2,
+#define FE_UPWARD FE_UPWARD
+ FE_DOWNWARD = 3
+#define FE_DOWNWARD FE_DOWNWARD
+ };
+
+/* Type representing exception flags. */
+typedef unsigned int fexcept_t;
+
+typedef double fenv_t;
+
+/* If the default argument is used we use this value. */
+extern const fenv_t __fe_dfl_env;
+#define FE_DFL_ENV (&__fe_dfl_env)
+
+#ifdef __USE_GNU
+/* Floating-point environment where all exceptions are enabled. Note that
+ this is not sufficient to give you SIGFPE. */
+extern const fenv_t __fe_enabled_env;
+# define FE_ENABLED_ENV (&__fe_enabled_env)
+
+/* Floating-point environment with all exceptions enabled. Note that
+ just evaluating this value will set the processor into 'FPU
+ exceptions imprecise recoverable' mode, which may cause a significant
+ performance penalty (but have no other visible effect). */
+extern const fenv_t *__fe_nomask_env (void);
+# define FE_NOMASK_ENV (__fe_nomask_env ())
+#endif
+
+#else /* PowerPC 6xx floating-point. */
/* Define bits representing the exception. We use the bit positions of
the appropriate bits in the FPSCR... */
@@ -143,3 +203,5 @@ extern const fenv_t __fe_nonieee_env;
extern const fenv_t *__fe_nomask_env (void);
# define FE_NOMASK_ENV (__fe_nomask_env ())
#endif
+
+#endif
diff --git a/libc/sysdeps/powerpc/fpu/bits/fenvinline.h b/libc/sysdeps/powerpc/fpu/bits/fenvinline.h
index f7700a49e..7e632933e 100644
--- a/libc/sysdeps/powerpc/fpu/bits/fenvinline.h
+++ b/libc/sysdeps/powerpc/fpu/bits/fenvinline.h
@@ -18,7 +18,7 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
-#if defined __GNUC__ && !defined _SOFT_FLOAT && !defined __NO_MATH_INLINES
+#if defined __GNUC__ && !defined __NO_FPRS__ && !defined __NO_MATH_INLINES
/* Inline definition for fegetround. */
# define fegetround() \
@@ -58,4 +58,4 @@
: 0) \
: (feclearexcept) (__excepts))
-#endif /* __GNUC__ && !_SOFT_FLOAT */
+#endif /* __GNUC__ && !__NO_FPRS__ */
diff --git a/libc/sysdeps/powerpc/fpu/bits/mathinline.h b/libc/sysdeps/powerpc/fpu/bits/mathinline.h
index 04478309d..ddc296d0d 100644
--- a/libc/sysdeps/powerpc/fpu/bits/mathinline.h
+++ b/libc/sysdeps/powerpc/fpu/bits/mathinline.h
@@ -28,7 +28,7 @@
# define __MATH_INLINE extern __inline
#endif /* __cplusplus */
-#if defined __GNUC__ && !defined _SOFT_FLOAT
+#if defined __GNUC__ && !defined __NO_FPRS__
#ifdef __USE_ISOC99
# if !__GNUC_PREREQ (2,97)
@@ -121,4 +121,4 @@ __NTH (fdimf (float __x, float __y))
#endif /* __USE_ISOC99 */
#endif /* !__NO_MATH_INLINES && __OPTIMIZE__ */
-#endif /* __GNUC__ && !_SOFT_FLOAT */
+#endif /* __GNUC__ && !__NO_FPRS__ */
diff --git a/libc/sysdeps/powerpc/fpu/fpu_control.h b/libc/sysdeps/powerpc/fpu/fpu_control.h
index 1b2ba87c9..2e420bfa6 100644
--- a/libc/sysdeps/powerpc/fpu/fpu_control.h
+++ b/libc/sysdeps/powerpc/fpu/fpu_control.h
@@ -1,5 +1,5 @@
/* FPU control word definitions. PowerPC version.
- Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1997, 1998, 2004, 2006 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -20,6 +20,57 @@
#ifndef _FPU_CONTROL_H
#define _FPU_CONTROL_H
+#ifdef _SOFT_FLOAT
+
+#define _FPU_RESERVED 0xffffffff
+#define _FPU_DEFAULT 0x00000000 /* Default value. */
+typedef unsigned int fpu_control_t;
+#define _FPU_GETCW(cw) 0
+#define _FPU_SETCW(cw) do { } while (0)
+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 are 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) ({ \
+ unsigned int env; \
+ asm volatile ("mfspefscr %0" : "=r" (env)); \
+ (__cw) = env; })
+#define _FPU_SETCW(__cw) ({ \
+ unsigned int env = __cw; \
+ asm volatile ("mtspefscr %0" : : "r" (env)); })
+
+/* Default control word set at startup. */
+extern fpu_control_t __fpu_control;
+
+#else /* PowerPC 6xx floating-point. */
+
/* rounding control */
#define _FPU_RC_NEAREST 0x00 /* RECOMMENDED */
#define _FPU_RC_DOWN 0x03
@@ -66,4 +117,6 @@ typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__SI__)));
/* Default control word set at startup. */
extern fpu_control_t __fpu_control;
+#endif
+
#endif /* _FPU_CONTROL_H */
diff --git a/libc/sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext-common.S b/libc/sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext-common.S
index c28c34664..bad479998 100644
--- a/libc/sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext-common.S
+++ b/libc/sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext-common.S
@@ -267,6 +267,11 @@ ENTRY(__CONTEXT_FUNC_NAME)
2: /* L(no_vec): */
# endif
#endif
+
+#ifdef __CONTEXT_EXTRA
+#include <getcontext-extra.S>
+#endif
+
/* We need to set up parms and call sigprocmask which will clobber
volatile registers. So before the call we need to retrieve the
original ucontext ptr (parm1) from stack and store the UC_REGS_PTR
diff --git a/libc/sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext-common.S b/libc/sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext-common.S
index 40a7a24f1..c98a4190d 100644
--- a/libc/sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext-common.S
+++ b/libc/sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext-common.S
@@ -233,6 +233,10 @@ ENTRY(__CONTEXT_FUNC_NAME)
lfd fp31,_UC_FREGS+(31*8)(r31)
#endif /* __CONTEXT_ENABLE_FPRS */
+#ifdef __CONTEXT_EXTRA
+#include <setcontext-extra.S>
+#endif
+
/* Restore LR and CCR, and set CTR to the NIP value */
lwz r3,_UC_GREGS+(PT_LNK*4)(r31)
lwz r4,_UC_GREGS+(PT_NIP*4)(r31)
diff --git a/libc/sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext-common.S b/libc/sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext-common.S
index 0c7b945ed..d5e1f2c7d 100644
--- a/libc/sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext-common.S
+++ b/libc/sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext-common.S
@@ -270,6 +270,10 @@ ENTRY(__CONTEXT_FUNC_NAME)
# endif /* __CONTEXT_ENABLE_VRS */
#endif /* __CONTEXT_ENABLE_FPRS */
+#ifdef __CONTEXT_EXTRA
+#include <getcontext-extra.S>
+#endif
+
/* Restore ucontext (parm1) from stack. */
lwz r12,_FRAME_PARM_SAVE1(r1)
li r4,0
@@ -459,6 +463,10 @@ ENTRY(__CONTEXT_FUNC_NAME)
lfd fp31,_UC_FREGS+(31*8)(r31)
#endif /* __CONTEXT_ENABLE_FPRS */
+#ifdef __CONTEXT_EXTRA
+#include <setcontext-extra.S>
+#endif
+
/* Restore LR and CCR, and set CTR to the NIP value */
lwz r3,_UC_GREGS+(PT_LNK*4)(r31)
lwz r4,_UC_GREGS+(PT_NIP*4)(r31)
diff --git a/ports/ChangeLog.eglibc b/ports/ChangeLog.eglibc
index d408c7182..66869997c 100644
--- a/ports/ChangeLog.eglibc
+++ b/ports/ChangeLog.eglibc
@@ -1,3 +1,10 @@
+2006-12-07 Joseph Myers <joseph@codesourcery.com>
+
+ Add PowerPC E500 port, based on SPE add-on by Aldy Hernandez.
+ * sysdeps/powerpc/preconfigure: New.
+ * sysdeps/powerpc/powerpc32/e500: New.
+ * sysdeps/unix/sysv/linux/powerpc/powerpc32/e500: New.
+
2006-11-14 Joseph Myers <joseph@codesourcery.com>
* sysdeps/powerpc/nofpu/libm-test-ulps: Add more ULPs.
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/Makefile b/ports/sysdeps/powerpc/powerpc32/e500/fpu/Makefile
new file mode 100644
index 000000000..80422f202
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/Makefile
@@ -0,0 +1,5 @@
+ifeq ($(subdir),stdlib)
+spepim_routines = atosfix16 atosfix32 atosfix64 atoufix16 atoufix32 atoufix64 \
+ strtosfix16 strtosfix32 strtosfix64 strtoufix16 strtoufix32 strtoufix64
+sysdep_routines += $(spepim_routines)
+endif
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/Versions b/ports/sysdeps/powerpc/powerpc32/e500/fpu/Versions
new file mode 100644
index 000000000..bd45e1dab
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/Versions
@@ -0,0 +1,8 @@
+libc {
+ GLIBC_2.3.3 {
+ atosfix16; atosfix32; atosfix64;
+ atoufix16; atoufix32; atoufix64;
+ strtosfix16; strtosfix32; strtosfix64;
+ strtoufix16; strtoufix32; strtoufix64;
+ }
+}
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/__longjmp-common.S b/ports/sysdeps/powerpc/powerpc32/e500/fpu/__longjmp-common.S
new file mode 100644
index 000000000..fd786765e
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/__longjmp-common.S
@@ -0,0 +1,103 @@
+/* longjmp for PowerPC E500.
+ Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+ Contributed by Aldy Hernandez <aldyh@redhat.com>.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <sysdep.h>
+#define _ASM
+#define _SETJMP_H
+#ifdef __NO_VMX__
+# include <novmxsetjmp.h>
+#else
+# include <jmpbuf-offsets.h>
+#endif
+#include <bp-sym.h>
+#include <bp-asm.h>
+
+ENTRY (BP_SYM (__longjmp))
+ CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE)
+
+#ifdef PTR_DEMANGLE
+ lwz r24,(JB_GPR1*4)(r3)
+#else
+ lwz r1,(JB_GPR1*4)(r3)
+#endif
+ lwz r0,(JB_LR*4)(r3)
+ /*lfd fp14,((JB_FPRS+0*2)*4)(r3)*/
+ evldd r14,((JB_FPRS+0*2)*4)(r3)
+ lwz r14,((JB_GPRS+0)*4)(r3)
+ /*lfd fp15,((JB_FPRS+1*2)*4)(r3)*/
+ evldd r15,((JB_FPRS+1*2)*4)(r3)
+ lwz r15,((JB_GPRS+1)*4)(r3)
+ /*lfd fp16,((JB_FPRS+2*2)*4)(r3)*/
+ evldd r16,((JB_FPRS+2*2)*4)(r3)
+ lwz r16,((JB_GPRS+2)*4)(r3)
+ /*lfd fp17,((JB_FPRS+3*2)*4)(r3)*/
+ evldd r17,((JB_FPRS+3*2)*4)(r3)
+ lwz r17,((JB_GPRS+3)*4)(r3)
+ /*lfd fp18,((JB_FPRS+4*2)*4)(r3)*/
+ evldd r18,((JB_FPRS+4*2)*4)(r3)
+ lwz r18,((JB_GPRS+4)*4)(r3)
+ /*lfd fp19,((JB_FPRS+5*2)*4)(r3)*/
+ evldd r19,((JB_FPRS+5*2)*4)(r3)
+ lwz r19,((JB_GPRS+5)*4)(r3)
+ /*lfd fp20,((JB_FPRS+6*2)*4)(r3)*/
+ evldd r20,((JB_FPRS+6*2)*4)(r3)
+ lwz r20,((JB_GPRS+6)*4)(r3)
+#ifdef PTR_DEMANGLE
+ PTR_DEMANGLE3 (r1, r24, r25)
+ PTR_DEMANGLE2 (r0, r25)
+#endif
+ mtlr r0
+ /*lfd fp21,((JB_FPRS+7*2)*4)(r3)*/
+ evldd r21,((JB_FPRS+7*2)*4)(r3)
+ lwz r21,((JB_GPRS+7)*4)(r3)
+ /*lfd fp22,((JB_FPRS+8*2)*4)(r3)*/
+ evldd r22,((JB_FPRS+8*2)*4)(r3)
+ lwz r22,((JB_GPRS+8)*4)(r3)
+ lwz r0,(JB_CR*4)(r3)
+ /*lfd fp23,((JB_FPRS+9*2)*4)(r3)*/
+ evldd r23,((JB_FPRS+9*2)*4)(r3)
+ lwz r23,((JB_GPRS+9)*4)(r3)
+ /*lfd fp24,((JB_FPRS+10*2)*4)(r3)*/
+ evldd r24,((JB_FPRS+10*2)*4)(r3)
+ lwz r24,((JB_GPRS+10)*4)(r3)
+ /*lfd fp25,((JB_FPRS+11*2)*4)(r3)*/
+ evldd r25,((JB_FPRS+11*2)*4)(r3)
+ lwz r25,((JB_GPRS+11)*4)(r3)
+ mtcrf 0xFF,r0
+ /*lfd fp26,((JB_FPRS+12*2)*4)(r3)*/
+ evldd r26,((JB_FPRS+12*2)*4)(r3)
+ lwz r26,((JB_GPRS+12)*4)(r3)
+ /*lfd fp27,((JB_FPRS+13*2)*4)(r3)*/
+ evldd r27,((JB_FPRS+13*2)*4)(r3)
+ lwz r27,((JB_GPRS+13)*4)(r3)
+ /*lfd fp28,((JB_FPRS+14*2)*4)(r3)*/
+ evldd r28,((JB_FPRS+14*2)*4)(r3)
+ lwz r28,((JB_GPRS+14)*4)(r3)
+ /*lfd fp29,((JB_FPRS+15*2)*4)(r3)*/
+ evldd r29,((JB_FPRS+15*2)*4)(r3)
+ lwz r29,((JB_GPRS+15)*4)(r3)
+ /*lfd fp30,((JB_FPRS+16*2)*4)(r3)*/
+ evldd r30,((JB_FPRS+16*2)*4)(r3)
+ lwz r30,((JB_GPRS+16)*4)(r3)
+ /*lfd fp31,((JB_FPRS+17*2)*4)(r3)*/
+ evldd r31,((JB_FPRS+17*2)*4)(r3)
+ lwz r31,((JB_GPRS+17)*4)(r3)
+ mr r3,r4
+ blr
+END (BP_SYM (__longjmp))
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/__longjmp.S b/ports/sysdeps/powerpc/powerpc32/e500/fpu/__longjmp.S
new file mode 100644
index 000000000..5a050f1e7
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/__longjmp.S
@@ -0,0 +1,39 @@
+/* AltiVec/VMX (new) version of __longjmp for PowerPC.
+ Copyright (C) 1995-1997,1999,2000,2003,2004 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <libc-symbols.h>
+#include <shlib-compat.h>
+
+#if defined NOT_IN_libc
+/* Build a non-versioned object for rtld-*. */
+# include "__longjmp-common.S"
+
+#else /* !NOT_IN_libc */
+strong_alias (__vmx__longjmp, __longjmp);
+# define __longjmp __vmx__longjmp
+# include "__longjmp-common.S"
+
+# if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4)
+# define __NO_VMX__
+# undef JB_SIZE
+# undef __longjmp
+# define __longjmp __novmx__longjmp
+# include "__longjmp-common.S"
+# endif
+#endif /* !NOT_IN_libc */
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/atosfix16.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/atosfix16.c
new file mode 100644
index 000000000..41af5a346
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/atosfix16.c
@@ -0,0 +1,28 @@
+/* Convert string to 16-bit signed fixed point.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Joseph Myers <joseph@codesourcery.com>, 2006.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <stddef.h>
+#include <spe.h>
+
+int16_t
+atosfix16 (const char *str)
+{
+ return strtosfix16 (str, NULL);
+}
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/atosfix32.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/atosfix32.c
new file mode 100644
index 000000000..ec8fc939c
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/atosfix32.c
@@ -0,0 +1,28 @@
+/* Convert string to 32-bit signed fixed point.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Joseph Myers <joseph@codesourcery.com>, 2006.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <stddef.h>
+#include <spe.h>
+
+int32_t
+atosfix32 (const char *str)
+{
+ return strtosfix32 (str, NULL);
+}
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/atosfix64.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/atosfix64.c
new file mode 100644
index 000000000..194200175
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/atosfix64.c
@@ -0,0 +1,28 @@
+/* Convert string to 64-bit signed fixed point.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Joseph Myers <joseph@codesourcery.com>, 2006.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <stddef.h>
+#include <spe.h>
+
+int64_t
+atosfix64 (const char *str)
+{
+ return strtosfix64 (str, NULL);
+}
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/atoufix16.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/atoufix16.c
new file mode 100644
index 000000000..1770d480b
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/atoufix16.c
@@ -0,0 +1,28 @@
+/* Convert string to 16-bit unsigned fixed point.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Joseph Myers <joseph@codesourcery.com>, 2006.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <stddef.h>
+#include <spe.h>
+
+uint16_t
+atoufix16 (const char *str)
+{
+ return strtoufix16 (str, NULL);
+}
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/atoufix32.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/atoufix32.c
new file mode 100644
index 000000000..90541873d
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/atoufix32.c
@@ -0,0 +1,28 @@
+/* Convert string to 32-bit unsigned fixed point.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Joseph Myers <joseph@codesourcery.com>, 2006.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <stddef.h>
+#include <spe.h>
+
+uint32_t
+atoufix32 (const char *str)
+{
+ return strtoufix32 (str, NULL);
+}
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/atoufix64.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/atoufix64.c
new file mode 100644
index 000000000..24c83a644
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/atoufix64.c
@@ -0,0 +1,28 @@
+/* Convert string to 64-bit unsigned fixed point.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Joseph Myers <joseph@codesourcery.com>, 2006.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <stddef.h>
+#include <spe.h>
+
+uint64_t
+atoufix64 (const char *str)
+{
+ return strtoufix64 (str, NULL);
+}
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/e_sqrt.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/e_sqrt.c
new file mode 100644
index 000000000..bdbeff477
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/e_sqrt.c
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/dbl-64/e_sqrt.c>
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/e_sqrtf.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/e_sqrtf.c
new file mode 100644
index 000000000..8b2f552e1
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/e_sqrtf.c
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/flt-32/e_sqrtf.c>
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/fclrexcpt.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/fclrexcpt.c
new file mode 100644
index 000000000..685e66c82
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/fclrexcpt.c
@@ -0,0 +1,47 @@
+/* Clear given exceptions in current floating-point environment.
+ Copyright (C) 2004 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <fenv_libc.h>
+
+#undef feclearexcept
+int
+__feclearexcept (int excepts)
+{
+ unsigned int fpescr;
+
+ /* Get the current state. */
+ fpescr = fegetenv_register ();
+
+ /* Clear the relevant bits. */
+ fpescr &= ~(excepts & FE_ALL_EXCEPT);
+
+ /* Put the new state in effect. */
+ fesetenv_register (fpescr);
+
+ /* Success. */
+ return 0;
+}
+
+#include <shlib-compat.h>
+#if SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_2)
+strong_alias (__feclearexcept, __old_feclearexcept)
+compat_symbol (libm, __old_feclearexcept, feclearexcept, GLIBC_2_1);
+#endif
+
+versioned_symbol (libm, __feclearexcept, feclearexcept, GLIBC_2_2);
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/fe_nomask.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/fe_nomask.c
new file mode 100644
index 000000000..ba45d8570
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/fe_nomask.c
@@ -0,0 +1,32 @@
+/* Procedure definition for FE_NOMASK_ENV.
+ Copyright (C) 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <fenv.h>
+#include <errno.h>
+
+/* This is presently a stub, until it's decided how the kernels should
+ support this. */
+
+const fenv_t *
+__fe_nomask_env(void)
+{
+ __set_errno (ENOSYS);
+ return FE_ENABLED_ENV;
+}
+stub_warning (__fe_nomask_env)
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/fedisblxcpt.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/fedisblxcpt.c
new file mode 100644
index 000000000..072a39d3a
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/fedisblxcpt.c
@@ -0,0 +1,60 @@
+/* Disable floating-point exceptions.
+ Copyright (C) 2004 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Aldy Hernandez <aldyh@redhat.com>, 2004.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <fenv_libc.h>
+#include <sysdep.h>
+#include <sys/prctl.h>
+
+int
+fedisableexcept (int excepts)
+{
+ unsigned int result = 0, pflags, r;
+ INTERNAL_SYSCALL_DECL (err);
+
+ INTERNAL_SYSCALL (prctl, err, 2, PR_GET_FPEXC, &pflags);
+
+ /* Save old enable bits. */
+ if (pflags & PR_FP_EXC_OVF)
+ result |= FE_OVERFLOW;
+ if (pflags & PR_FP_EXC_UND)
+ result |= FE_UNDERFLOW;
+ if (pflags & PR_FP_EXC_INV)
+ result |= FE_INVALID;
+ if (pflags & PR_FP_EXC_DIV)
+ result |= FE_DIVBYZERO;
+ if (pflags & PR_FP_EXC_RES)
+ result |= FE_INEXACT;
+
+ if (excepts & FE_INEXACT)
+ pflags &= ~PR_FP_EXC_RES;
+ if (excepts & FE_DIVBYZERO)
+ pflags &= ~PR_FP_EXC_DIV;
+ if (excepts & FE_UNDERFLOW)
+ pflags &= ~PR_FP_EXC_UND;
+ if (excepts & FE_OVERFLOW)
+ pflags &= ~PR_FP_EXC_OVF;
+ if (excepts & FE_INVALID)
+ pflags &= ~PR_FP_EXC_INV;
+ r = INTERNAL_SYSCALL (prctl, err, 2, PR_SET_FPEXC, pflags);
+ if (INTERNAL_SYSCALL_ERROR_P (r, err))
+ return -1;
+
+ return result;
+}
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/feenablxcpt.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/feenablxcpt.c
new file mode 100644
index 000000000..4a36a2717
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/feenablxcpt.c
@@ -0,0 +1,60 @@
+/* Enable floating-point exceptions.
+ Copyright (C) 2004 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Aldy Hernandez <aldyh@redhat.com>, 2004.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <fenv_libc.h>
+#include <sysdep.h>
+#include <sys/prctl.h>
+
+int
+feenableexcept (int excepts)
+{
+ unsigned int result = 0, pflags, r;
+ INTERNAL_SYSCALL_DECL (err);
+
+ INTERNAL_SYSCALL (prctl, err, 2, PR_GET_FPEXC, &pflags);
+
+ /* Save old enable bits. */
+ if (pflags & PR_FP_EXC_OVF)
+ result |= FE_OVERFLOW;
+ if (pflags & PR_FP_EXC_UND)
+ result |= FE_UNDERFLOW;
+ if (pflags & PR_FP_EXC_INV)
+ result |= FE_INVALID;
+ if (pflags & PR_FP_EXC_DIV)
+ result |= FE_DIVBYZERO;
+ if (pflags & PR_FP_EXC_RES)
+ result |= FE_INEXACT;
+
+ if (excepts & FE_INEXACT)
+ pflags |= PR_FP_EXC_RES;
+ if (excepts & FE_DIVBYZERO)
+ pflags |= PR_FP_EXC_DIV;
+ if (excepts & FE_UNDERFLOW)
+ pflags |= PR_FP_EXC_UND;
+ if (excepts & FE_OVERFLOW)
+ pflags |= PR_FP_EXC_OVF;
+ if (excepts & FE_INVALID)
+ pflags |= PR_FP_EXC_INV;
+ r = INTERNAL_SYSCALL (prctl, err, 2, PR_SET_FPEXC, pflags);
+ if (INTERNAL_SYSCALL_ERROR_P (r, err))
+ return -1;
+
+ return result;
+}
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/fegetenv.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/fegetenv.c
new file mode 100644
index 000000000..2ab9f519e
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/fegetenv.c
@@ -0,0 +1,46 @@
+/* Store current floating-point environment.
+ Copyright (C) 2004 Free Software Foundation, Inc.
+ Contributed by Aldy Hernandez <aldyh@redhat.com>, 2004
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <fenv_libc.h>
+#include <bp-sym.h>
+#include <sysdep.h>
+#include <sys/prctl.h>
+
+int
+__fegetenv (fenv_t *envp)
+{
+ fenv_union_t u;
+ INTERNAL_SYSCALL_DECL (err);
+
+ INTERNAL_SYSCALL (prctl, err, 2, PR_GET_FPEXC, &u.l[0]);
+ u.l[1] = fegetenv_register ();
+ *envp = u.fenv;
+
+ /* Success. */
+ return 0;
+}
+
+#include <shlib-compat.h>
+#if SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_2)
+strong_alias (__fegetenv, __old_fegetenv)
+compat_symbol (libm, BP_SYM (__old_fegetenv), BP_SYM (fegetenv), GLIBC_2_1);
+#endif
+
+versioned_symbol (libm, BP_SYM (__fegetenv), BP_SYM (fegetenv), GLIBC_2_2);
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/fegetexcept.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/fegetexcept.c
new file mode 100644
index 000000000..bfd44815a
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/fegetexcept.c
@@ -0,0 +1,31 @@
+/* Get floating-point exceptions.
+ Copyright (C) 2004 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Aldy Hernandez <aldyh@redhat.com>, 2004.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <fenv_libc.h>
+
+int
+fegetexcept (void)
+{
+ unsigned long fpescr;
+
+ fpescr = fegetenv_register ();
+
+ return fpescr & FE_ALL_EXCEPT;
+}
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/fegetround.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/fegetround.c
new file mode 100644
index 000000000..4bb18ce94
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/fegetround.c
@@ -0,0 +1,31 @@
+/* Return current rounding direction.
+ Copyright (C) 2004 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Aldy Hernandez <aldyh@redhat.com>, 2004.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <fenv_libc.h>
+
+#undef fegetround
+int
+fegetround (void)
+{
+ unsigned long fpescr;
+
+ fpescr = fegetenv_register ();
+ return fpescr & 3;
+}
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/feholdexcpt.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/feholdexcpt.c
new file mode 100644
index 000000000..04cc0308a
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/feholdexcpt.c
@@ -0,0 +1,45 @@
+/* Store current floating-point environment and clear exceptions.
+ Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Aldy Hernandez <aldyh@redhat.com>, 2004.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <fenv_libc.h>
+#include <sysdep.h>
+#include <sys/prctl.h>
+
+int
+feholdexcept (fenv_t *envp)
+{
+ fenv_union_t u;
+ INTERNAL_SYSCALL_DECL (err);
+
+
+ /* Get the current state. */
+ INTERNAL_SYSCALL (prctl, err, 2, PR_GET_FPEXC, &u.l[0]);
+ u.l[1] = fegetenv_register ();
+ *envp = u.fenv;
+
+ /* Clear everything except for the rounding mode. */
+ u.l[1] &= 3;
+
+ /* Put the new state in effect. */
+ fesetenv_register (u.l[1]);
+
+ return 0;
+}
+libm_hidden_def (feholdexcept)
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/fenv_const.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/fenv_const.c
new file mode 100644
index 000000000..073fc9277
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/fenv_const.c
@@ -0,0 +1,27 @@
+/* Constants for fenv_bits.h.
+ Copyright (C) 2004 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Aldy Hernandez <aldyh@redhat.com>, 2004.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+/* If the default argument is used we use this value. */
+const unsigned long long __fe_dfl_env __attribute__ ((aligned (8))) =
+0x0ULL;
+
+/* Floating-point environment where none of the exceptions are masked. */
+const unsigned long long __fe_enabled_env __attribute__ ((aligned (8))) =
+0xF00000000ULL;
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/fenv_libc.h b/ports/sysdeps/powerpc/powerpc32/e500/fpu/fenv_libc.h
new file mode 100644
index 000000000..cd003eab7
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/fenv_libc.h
@@ -0,0 +1,77 @@
+/* Internal libc stuff for floating point environment routines.
+ Copyright (C) 2004 Free Software Foundation, Inc.
+ Contributed by Aldy Hernandez <aldyh@redhat.com>, 2004
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#ifndef _FENV_LIBC_H
+#define _FENV_LIBC_H 1
+
+#include <fenv.h>
+
+extern int __feraiseexcept_internal (int __excepts);
+
+/* Equivalent to fegetenv, but returns a fenv_t instead of taking a
+ pointer. */
+#define fegetenv_register() \
+ ({ unsigned fscr; asm volatile ("mfspefscr %0" : "=r" (fscr)); fscr; })
+
+/* Equivalent to fesetenv, but takes a fenv_t instead of a pointer. */
+#define fesetenv_register(fscr) \
+ ({ asm volatile ("mtspefscr %0" : : "r" (fscr)); })
+
+typedef union
+{
+ fenv_t fenv;
+ unsigned int l[2];
+} fenv_union_t;
+
+/* Definitions of all the SPEFSCR bit numbers. */
+enum {
+ SPEFSCR_SOVH = 0x80000000,
+ SPEFSCR_OVH = 0x40000000,
+ SPEFSCR_FGH = 0x20000000,
+ SPEFSCR_FXH = 0x10000000,
+ SPEFSCR_FINVH = 0x08000000,
+ SPEFSCR_FDBZH = 0x04000000,
+ SPEFSCR_FUNFH = 0x02000000,
+ SPEFSCR_FOVFH = 0x01000000,
+ /* 2 unused bits. */
+ SPEFSCR_FINXS = 0x00200000,
+ SPEFSCR_FINVS = 0x00100000,
+ SPEFSCR_FDBZS = 0x00080000,
+ SPEFSCR_FUNFS = 0x00040000,
+ SPEFSCR_FOVFS = 0x00020000,
+ SPEFSCR_MODE = 0x00010000,
+ SPEFSCR_SOV = 0x00008000,
+ SPEFSCR_OV = 0x00004000,
+ SPEFSCR_FG = 0x00002000,
+ SPEFSCR_FX = 0x00001000,
+ SPEFSCR_FINV = 0x00000800,
+ SPEFSCR_FDBZ = 0x00000400,
+ SPEFSCR_FUNF = 0x00000200,
+ SPEFSCR_FOVF = 0x00000100,
+ /* 1 unused bit. */
+ SPEFSCR_FINXE = 0x00000040,
+ SPEFSCR_FINVE = 0x00000020,
+ SPEFSCR_FDBZE = 0x00000010,
+ SPEFSCR_FUNFE = 0x00000008,
+ SPEFSCR_FOVFE = 0x00000004,
+ SPEFSCR_FRMC = 0x00000003
+};
+
+#endif /* fenv_libc.h */
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/fesetenv.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/fesetenv.c
new file mode 100644
index 000000000..5ecf4c450
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/fesetenv.c
@@ -0,0 +1,46 @@
+/* Install given floating-point environment.
+ Copyright (C) 1997,99,2000,01,02 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <fenv_libc.h>
+#include <bp-sym.h>
+#include <sysdep.h>
+#include <sys/prctl.h>
+
+int
+__fesetenv (const fenv_t *envp)
+{
+ fenv_union_t u;
+ INTERNAL_SYSCALL_DECL (err);
+
+ u.fenv = *envp;
+ INTERNAL_SYSCALL (prctl, err, 2, PR_SET_FPEXC, &u.l[0]);
+ fesetenv_register (u.l[1]);
+
+ /* Success. */
+ return 0;
+}
+
+#include <shlib-compat.h>
+#if SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_2)
+strong_alias (__fesetenv, __old_fesetenv)
+compat_symbol (libm, BP_SYM (__old_fesetenv), BP_SYM (fesetenv), GLIBC_2_1);
+#endif
+
+libm_hidden_ver (__fesetenv, fesetenv)
+versioned_symbol (libm, BP_SYM (__fesetenv), BP_SYM (fesetenv), GLIBC_2_2);
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/fesetround.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/fesetround.c
new file mode 100644
index 000000000..b25d8b366
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/fesetround.c
@@ -0,0 +1,37 @@
+/* Set current rounding direction.
+ Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Aldy Hernandez <aldyh@redhat.com>, 2004.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <fenv_libc.h>
+
+int
+fesetround (int round)
+{
+ unsigned long fpescr;
+
+ if ((unsigned int) round > 3)
+ return 1;
+
+ fpescr = fegetenv_register ();
+ fpescr = (fpescr & ~SPEFSCR_FRMC) | (round & 3);
+ fesetenv_register (fpescr);
+
+ return 0;
+}
+libm_hidden_def (fesetround)
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/feupdateenv.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/feupdateenv.c
new file mode 100644
index 000000000..db19f19fd
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/feupdateenv.c
@@ -0,0 +1,57 @@
+/* Install given floating-point environment and raise exceptions.
+ Copyright (C) 2004 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Aldy Hernandez <aldyh@redhat.com>, 2004.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <fenv_libc.h>
+#include <bp-sym.h>
+#include <sysdep.h>
+#include <sys/prctl.h>
+
+int
+__feupdateenv (const fenv_t *envp)
+{
+ unsigned long fpescr, old, new, pflags;
+ fenv_union_t u;
+ INTERNAL_SYSCALL_DECL (err);
+
+ /* Save the currently set exceptions. */
+ u.fenv = *envp;
+ new = u.l[1];
+ old = fegetenv_register ();
+ new |= (old & FE_ALL_EXCEPT);
+
+ INTERNAL_SYSCALL (prctl, err, 2, PR_GET_FPEXC, &pflags);
+ pflags |= u.l[0];
+ INTERNAL_SYSCALL (prctl, err, 2, PR_SET_FPEXC, pflags);
+
+ /* Enable and raise (if appropriate) exceptions set in `new'. */
+ fesetenv_register (new);
+ feraiseexcept (new & FE_ALL_EXCEPT);
+
+ /* Success. */
+ return 0;
+}
+
+#include <shlib-compat.h>
+#if SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_2)
+strong_alias (__feupdateenv, __old_feupdateenv)
+compat_symbol (libm, BP_SYM (__old_feupdateenv), BP_SYM (feupdateenv), GLIBC_2_1);
+#endif
+
+versioned_symbol (libm, BP_SYM (__feupdateenv), BP_SYM (feupdateenv), GLIBC_2_2);
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/fgetexcptflg.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/fgetexcptflg.c
new file mode 100644
index 000000000..93459f81e
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/fgetexcptflg.c
@@ -0,0 +1,47 @@
+/* Store current representation for exceptions.
+ Copyright (C) 2004 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Aldy Hernandez <aldyh@redhat.com>, 2004.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <fenv_libc.h>
+#include <bp-sym.h>
+
+int
+__fegetexceptflag (fexcept_t *flagp, int excepts)
+{
+ unsigned long fpescr;
+
+ /* Get the current state. */
+ fpescr = fegetenv_register ();
+
+ /* ?? Classic PPC doesn't do anything with `excepts', so we'll do
+ the same here. (We should really be ignoring exceptions in
+ excepts) ?? */
+ *flagp = fpescr & FE_ALL_EXCEPT;
+
+ /* Success. */
+ return 0;
+}
+
+#include <shlib-compat.h>
+#if SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_2)
+strong_alias (__fegetexceptflag, __old_fegetexceptflag)
+compat_symbol (libm, BP_SYM (__old_fegetexceptflag), BP_SYM (fegetexceptflag), GLIBC_2_1);
+#endif
+
+versioned_symbol (libm, BP_SYM (__fegetexceptflag), BP_SYM (fegetexceptflag), GLIBC_2_2);
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/fprrest.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/fprrest.c
new file mode 100644
index 000000000..1cc893170
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/fprrest.c
@@ -0,0 +1 @@
+/* Not needed. */
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/fprsave.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/fprsave.c
new file mode 100644
index 000000000..1cc893170
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/fprsave.c
@@ -0,0 +1 @@
+/* Not needed. */
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/fraiseexcpt.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/fraiseexcpt.c
new file mode 100644
index 000000000..80e96dcb1
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/fraiseexcpt.c
@@ -0,0 +1,29 @@
+/* Raise given exceptions.
+ Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Aldy Hernandez <aldyh@redhat.com>, 2004.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <fenv_libc.h>
+#include <bp-sym.h>
+
+#undef feraiseexcept
+
+#define __FERAISEEXCEPT_INTERNAL feraiseexcept
+#include "../spe-raise.c"
+
+libm_hidden_def (feraiseexcept)
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/fsetexcptflg.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/fsetexcptflg.c
new file mode 100644
index 000000000..e112e07bf
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/fsetexcptflg.c
@@ -0,0 +1,54 @@
+/* Set floating-point environment exception handling.
+ Copyright (C) 1997,99,2000,01,04 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <fenv_libc.h>
+#include <bp-sym.h>
+
+int
+__fesetexceptflag (const fexcept_t *flagp, int excepts)
+{
+ unsigned long spefscr;
+ fexcept_t flag;
+
+ /* Get the current state. */
+ spefscr = fegetenv_register ();
+
+ /* Ignore exceptions not listed in 'excepts'. */
+ flag = *flagp & excepts;
+
+ /* Replace the exception status */
+ spefscr = (spefscr & ~FE_ALL_EXCEPT) | flag;
+
+ /* Store the new status word (along with the rest of the environment).
+ This may cause floating-point exceptions if the restored state
+ requests it. */
+ fesetenv_register (spefscr);
+ feraiseexcept (spefscr & FE_ALL_EXCEPT);
+
+ /* Success. */
+ return 0;
+}
+
+#include <shlib-compat.h>
+#if SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_2)
+strong_alias (__fesetexceptflag, __old_fesetexceptflag)
+compat_symbol (libm, BP_SYM (__old_fesetexceptflag), BP_SYM (fesetexceptflag), GLIBC_2_1);
+#endif
+
+versioned_symbol (libm, BP_SYM (__fesetexceptflag), BP_SYM (fesetexceptflag), GLIBC_2_2);
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/ftestexcept.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/ftestexcept.c
new file mode 100644
index 000000000..33546aa00
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/ftestexcept.c
@@ -0,0 +1,32 @@
+/* Test exception in current environment.
+ Copyright (C) 2004 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Aldy Hernandez <aldyh@redhat.com>, 2004.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <fenv_libc.h>
+
+int
+fetestexcept (int excepts)
+{
+ unsigned long f;
+
+ /* Get the current state. */
+ f = fegetenv_register ();
+
+ return f & excepts;
+}
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/math_ldbl.h b/ports/sysdeps/powerpc/powerpc32/e500/fpu/math_ldbl.h
new file mode 100644
index 000000000..e99166bfc
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/math_ldbl.h
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/ldbl-128ibm/math_ldbl.h>
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/math_private.h b/ports/sysdeps/powerpc/powerpc32/e500/fpu/math_private.h
new file mode 100644
index 000000000..cb71bafe8
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/math_private.h
@@ -0,0 +1 @@
+#include <math/math_private.h>
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_ceil.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_ceil.c
new file mode 100644
index 000000000..f3f34216f
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_ceil.c
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/dbl-64/s_ceil.c>
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_ceilf.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_ceilf.c
new file mode 100644
index 000000000..2a71fcd7c
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_ceilf.c
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/flt-32/s_ceilf.c>
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_copysign.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_copysign.c
new file mode 100644
index 000000000..8616ca0bb
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_copysign.c
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/dbl-64/s_copysign.c>
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_copysignf.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_copysignf.c
new file mode 100644
index 000000000..34bcb6cce
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_copysignf.c
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/flt-32/s_copysignf.c>
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_copysignl.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_copysignl.c
new file mode 100644
index 000000000..29a02868f
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_copysignl.c
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/ldbl-128ibm/s_copysignl.c>
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fabs.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fabs.c
new file mode 100644
index 000000000..2ef531d44
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fabs.c
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/dbl-64/s_fabs.c>
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fabsf.S b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fabsf.S
new file mode 100644
index 000000000..85b1f39bb
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fabsf.S
@@ -0,0 +1,29 @@
+/* Floating-point absolute value. PowerPC E500 version.
+ Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Aldy Hernandez <aldyh@redhat.com>, 2004.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <sysdep.h>
+
+ENTRY(__fabsf)
+/* float [r3] fabsf (float [r3] x) ; */
+ efsabs r3,r3
+ blr
+END(__fabsf)
+
+weak_alias(__fabsf,fabsf)
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fabsl.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fabsl.c
new file mode 100644
index 000000000..33ebe78cb
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fabsl.c
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/ldbl-128ibm/s_fabsl.c>
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fdim.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fdim.c
new file mode 100644
index 000000000..5fb35edb5
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fdim.c
@@ -0,0 +1 @@
+#include <math/s_fdim.c>
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fdimf.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fdimf.c
new file mode 100644
index 000000000..42df1302d
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fdimf.c
@@ -0,0 +1 @@
+#include <math/s_fdimf.c>
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_floor.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_floor.c
new file mode 100644
index 000000000..2a43c817c
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_floor.c
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/dbl-64/s_floor.c>
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_floorf.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_floorf.c
new file mode 100644
index 000000000..d129d378f
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_floorf.c
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/flt-32/s_floorf.c>
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fmax.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fmax.c
new file mode 100644
index 000000000..95edd5f3d
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fmax.c
@@ -0,0 +1 @@
+#include <math/s_fmax.c>
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fmaxf.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fmaxf.c
new file mode 100644
index 000000000..084fe72e9
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fmaxf.c
@@ -0,0 +1 @@
+#include <math/s_fmaxf.c>
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fmin.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fmin.c
new file mode 100644
index 000000000..e072a91e7
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fmin.c
@@ -0,0 +1 @@
+#include <math/s_fmin.c>
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fminf.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fminf.c
new file mode 100644
index 000000000..e37e4ac4e
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fminf.c
@@ -0,0 +1 @@
+#include <math/s_fminf.c>
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_isnan.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_isnan.c
new file mode 100644
index 000000000..dec5dd0bf
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_isnan.c
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/dbl-64/s_isnan.c>
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_isnanf.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_isnanf.c
new file mode 100644
index 000000000..3be64a220
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_isnanf.c
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/flt-32/s_isnanf.c>
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_llrint.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_llrint.c
new file mode 100644
index 000000000..c8215aa17
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_llrint.c
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/dbl-64/s_llrint.c>
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_llrintf.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_llrintf.c
new file mode 100644
index 000000000..b74275e9c
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_llrintf.c
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/flt-32/s_llrintf.c>
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_llround.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_llround.c
new file mode 100644
index 000000000..69658f335
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_llround.c
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/dbl-64/s_llround.c>
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_llroundf.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_llroundf.c
new file mode 100644
index 000000000..386777ea9
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_llroundf.c
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/flt-32/s_llroundf.c>
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_lrint.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_lrint.c
new file mode 100644
index 000000000..909e699a0
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_lrint.c
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/dbl-64/s_lrint.c>
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_lrintf.S b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_lrintf.S
new file mode 100644
index 000000000..e94ec25cd
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_lrintf.S
@@ -0,0 +1,29 @@
+/* Round float to long int. PowerPC E500 version.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Joseph Myers <joseph@codesourcery.com>, 2006.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <sysdep.h>
+
+ENTRY(__lrintf)
+/* long int [r3] lrintf (float [r3] x) ; */
+ efsctsi r3,r3
+ blr
+END(__lrintf)
+
+weak_alias(__lrintf,lrintf)
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_lround.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_lround.c
new file mode 100644
index 000000000..83a87836b
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_lround.c
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/dbl-64/s_lround.c>
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_lroundf.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_lroundf.c
new file mode 100644
index 000000000..930abb527
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_lroundf.c
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/flt-32/s_lroundf.c>
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_rint.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_rint.c
new file mode 100644
index 000000000..b610359d3
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_rint.c
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/dbl-64/s_rint.c>
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_rintf.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_rintf.c
new file mode 100644
index 000000000..6593140fa
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_rintf.c
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/flt-32/s_rintf.c>
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_round.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_round.c
new file mode 100644
index 000000000..4c006d482
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_round.c
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/dbl-64/s_round.c>
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_roundf.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_roundf.c
new file mode 100644
index 000000000..e82d90aa1
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_roundf.c
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/flt-32/s_roundf.c>
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_trunc.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_trunc.c
new file mode 100644
index 000000000..bc5ec5401
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_trunc.c
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/dbl-64/s_trunc.c>
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_truncf.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_truncf.c
new file mode 100644
index 000000000..b8cc5f6bc
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_truncf.c
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/flt-32/s_truncf.c>
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/setjmp-common.S b/ports/sysdeps/powerpc/powerpc32/e500/fpu/setjmp-common.S
new file mode 100644
index 000000000..311f1583a
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/setjmp-common.S
@@ -0,0 +1,108 @@
+/* setjmp for PowerPC E500.
+ Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+ Contributed by Aldy Hernandez <aldyh@redhat.com>.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <sysdep.h>
+#define _ASM
+#ifdef __NO_VMX__
+# include <novmxsetjmp.h>
+#else
+# include <jmpbuf-offsets.h>
+#endif
+#include <bp-sym.h>
+#include <bp-asm.h>
+
+ENTRY (BP_SYM (__sigsetjmp))
+ CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE)
+
+#ifdef PTR_MANGLE
+ mr r5,r1
+ PTR_MANGLE(r5, r10)
+ stw r5,(JB_GPR1*4)(3)
+#else
+ stw r1,(JB_GPR1*4)(3)
+#endif
+ mflr r0
+ stw r14,((JB_GPRS+0)*4)(3)
+#ifdef PTR_MANGLE
+ PTR_MANGLE2 (r0, r10)
+ li r10,0
+#endif
+ /*stfd fp14,((JB_FPRS+0*2)*4)(3)*/
+ evstdd r14,((JB_FPRS+0*2)*4)(3)
+ stw r0,(JB_LR*4)(3)
+ stw r15,((JB_GPRS+1)*4)(3)
+ /*stfd fp15,((JB_FPRS+1*2)*4)(3)*/
+ evstdd r15,((JB_FPRS+1*2)*4)(3)
+ mfcr r0
+ stw r16,((JB_GPRS+2)*4)(3)
+ /*stfd fp16,((JB_FPRS+2*2)*4)(3)*/
+ evstdd r16,((JB_FPRS+2*2)*4)(3)
+ stw r0,(JB_CR*4)(3)
+ stw r17,((JB_GPRS+3)*4)(3)
+ /*stfd fp17,((JB_FPRS+3*2)*4)(3)*/
+ evstdd r17,((JB_FPRS+3*2)*4)(3)
+ stw r18,((JB_GPRS+4)*4)(3)
+ /*stfd fp18,((JB_FPRS+4*2)*4)(3)*/
+ evstdd r18,((JB_FPRS+4*2)*4)(3)
+ stw r19,((JB_GPRS+5)*4)(3)
+ /*stfd fp19,((JB_FPRS+5*2)*4)(3)*/
+ evstdd r19,((JB_FPRS+5*2)*4)(3)
+ stw r20,((JB_GPRS+6)*4)(3)
+ /*stfd fp20,((JB_FPRS+6*2)*4)(3)*/
+ evstdd r20,((JB_FPRS+6*2)*4)(3)
+ stw r21,((JB_GPRS+7)*4)(3)
+ /*stfd fp21,((JB_FPRS+7*2)*4)(3)*/
+ evstdd r21,((JB_FPRS+7*2)*4)(3)
+ stw r22,((JB_GPRS+8)*4)(3)
+ /*stfd fp22,((JB_FPRS+8*2)*4)(3)*/
+ evstdd r22,((JB_FPRS+8*2)*4)(3)
+ stw r23,((JB_GPRS+9)*4)(3)
+ /*stfd fp23,((JB_FPRS+9*2)*4)(3)*/
+ evstdd r23,((JB_FPRS+9*2)*4)(3)
+ stw r24,((JB_GPRS+10)*4)(3)
+ /*stfd fp24,((JB_FPRS+10*2)*4)(3)*/
+ evstdd r24,((JB_FPRS+10*2)*4)(3)
+ stw r25,((JB_GPRS+11)*4)(3)
+ /*stfd fp25,((JB_FPRS+11*2)*4)(3)*/
+ evstdd r25,((JB_FPRS+11*2)*4)(3)
+ stw r26,((JB_GPRS+12)*4)(3)
+ /*stfd fp26,((JB_FPRS+12*2)*4)(3)*/
+ evstdd r26,((JB_FPRS+12*2)*4)(3)
+ stw r27,((JB_GPRS+13)*4)(3)
+ /*stfd fp27,((JB_FPRS+13*2)*4)(3)*/
+ evstdd r27,((JB_FPRS+13*2)*4)(3)
+ stw r28,((JB_GPRS+14)*4)(3)
+ /*stfd fp28,((JB_FPRS+14*2)*4)(3)*/
+ evstdd r28,((JB_FPRS+14*2)*4)(3)
+ stw r29,((JB_GPRS+15)*4)(3)
+ /*stfd fp29,((JB_FPRS+15*2)*4)(3)*/
+ evstdd r29,((JB_FPRS+15*2)*4)(3)
+ stw r30,((JB_GPRS+16)*4)(3)
+ /*stfd fp30,((JB_FPRS+16*2)*4)(3)*/
+ evstdd r30,((JB_FPRS+16*2)*4)(3)
+ stw r31,((JB_GPRS+17)*4)(3)
+ /*stfd fp31,((JB_FPRS+17*2)*4)(3)*/
+ evstdd r31,((JB_FPRS+17*2)*4)(3)
+#if defined NOT_IN_libc && defined IS_IN_rtld
+ li r3,0
+ blr
+#else
+ b BP_SYM (__sigjmp_save@local)
+#endif
+END (BP_SYM (__sigsetjmp))
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/setjmp.S b/ports/sysdeps/powerpc/powerpc32/e500/fpu/setjmp.S
new file mode 100644
index 000000000..ef3514a46
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/setjmp.S
@@ -0,0 +1,44 @@
+/* non alitivec (old) version of setjmp for PowerPC.
+ Copyright (C) 1995-1997,1999-2001,2004 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <shlib-compat.h>
+#include <libc-symbols.h>
+
+#if defined NOT_IN_libc
+/* Build a non-versioned object for rtld-*. */
+# include "setjmp-common.S"
+
+#else /* !NOT_IN_libc */
+/* Build a versioned object for libc. */
+default_symbol_version (__vmx__sigsetjmp,__sigsetjmp,GLIBC_2.3.4)
+# define __sigsetjmp __vmx__sigsetjmp
+# define __sigjmp_save __vmx__sigjmp_save
+# include "setjmp-common.S"
+
+# if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4)
+# define __NO_VMX__
+# undef __sigsetjmp
+# undef __sigjmp_save
+# undef JB_SIZE
+symbol_version (__novmx__sigsetjmp,__sigsetjmp,GLIBC_2.0)
+# define __sigsetjmp __novmx__sigsetjmp
+# define __sigjmp_save __novmx__sigjmp_save
+# include "setjmp-common.S"
+# endif
+#endif /* !NOT_IN_libc */
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/strtofix.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/strtofix.c
new file mode 100644
index 000000000..6181fe12f
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/strtofix.c
@@ -0,0 +1,692 @@
+/* Convert string representing a number to float value, using given locale.
+ Copyright (C) 1997,1998,2002,2004,2005,2006 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+/* Cut down from strtod_l.c for converting to fixed-point, no locale
+ choice, no grouping, narrow strings only. */
+
+
+#include <ctype.h>
+#include <errno.h>
+#include <fenv_libc.h>
+#include <locale/localeinfo.h>
+#include <locale.h>
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* The gmp headers need some configuration frobs. */
+#define HAVE_ALLOCA 1
+
+/* Include gmp-mparam.h first, such that definitions of _SHORT_LIMB
+ and _LONG_LONG_LIMB in it can take effect into gmp.h. */
+#include <gmp-mparam.h>
+#include <gmp.h>
+#include <stdlib/gmp-impl.h>
+#include <stdlib/longlong.h>
+#include <stdlib/fpioconst.h>
+
+/*#define NDEBUG 1*/
+#include <assert.h>
+
+#if UNSIGNED
+#define RETURN_FRAC_BITS RETURN_TYPE_BITS
+#else
+#define RETURN_FRAC_BITS (RETURN_TYPE_BITS - 1)
+#endif
+
+#define RETURN(val,end) \
+ do { if (endptr != NULL) *endptr = (char *) (end); \
+ return val; } while (0)
+
+/* Definitions according to limb size used. */
+#if BITS_PER_MP_LIMB == 32
+# define MAX_DIG_PER_LIMB 9
+# define MAX_FAC_PER_LIMB 1000000000UL
+#elif BITS_PER_MP_LIMB == 64
+# define MAX_DIG_PER_LIMB 19
+# define MAX_FAC_PER_LIMB 10000000000000000000ULL
+#else
+# error "mp_limb_t size " BITS_PER_MP_LIMB "not accounted for"
+#endif
+
+/* Local data structure. */
+static const mp_limb_t _tens_in_limb[MAX_DIG_PER_LIMB + 1] =
+{ 0, 10, 100,
+ 1000, 10000, 100000L,
+ 1000000L, 10000000L, 100000000L,
+ 1000000000L
+#if BITS_PER_MP_LIMB > 32
+ , 10000000000ULL, 100000000000ULL,
+ 1000000000000ULL, 10000000000000ULL, 100000000000000ULL,
+ 1000000000000000ULL, 10000000000000000ULL, 100000000000000000ULL,
+ 1000000000000000000ULL, 10000000000000000000ULL
+#endif
+#if BITS_PER_MP_LIMB > 64
+ #error "Need to expand tens_in_limb table to" MAX_DIG_PER_LIMB
+#endif
+};
+
+/* Define pow5 to be 5^(RETURN_FRAC_BITS + 1), shifted left so the
+ most significant bit is set (as required by mpn_divrem), pow5size
+ to be the size in limbs and pow5shift to be the shift. */
+#if RETURN_FRAC_BITS + 1 == 16
+# if BITS_PER_MP_LIMB == 32
+static const mp_limb_t pow5[] = { 0x04000000, 0x8e1bc9bf };
+# define pow5shift 26
+# define pow5size 2
+# else
+static const mp_limb_t pow5[] = { 0x8e1bc9bf04000000ull };
+# define pow5shift 26
+# define pow5size 1
+# endif
+#elif RETURN_FRAC_BITS + 1 == 17
+# if BITS_PER_MP_LIMB == 32
+static const mp_limb_t pow5[] = { 0xc5000000, 0xb1a2bc2e };
+# define pow5shift 24
+# define pow5size 2
+# else
+static const mp_limb_t pow5[] = { 0xb1a2bc2ec5000000ull };
+# define pow5shift 24
+# define pow5size 1
+# endif
+#elif RETURN_FRAC_BITS + 1 == 32
+# if BITS_PER_MP_LIMB == 32
+static const mp_limb_t pow5[] = { 0xf0200000, 0x2b70b59d, 0x9dc5ada8 };
+# define pow5shift 21
+# define pow5size 3
+# else
+static const mp_limb_t pow5[] = { 0xf020000000000000ull, 0x9dc5ada82b70b59dull };
+# define pow5shift 53
+# define pow5size 2
+# endif
+#elif RETURN_FRAC_BITS + 1 == 33
+# if BITS_PER_MP_LIMB == 32
+static const mp_limb_t pow5[] = { 0x6c280000, 0x364ce305, 0xc5371912 };
+# define pow5shift 19
+# define pow5size 3
+# else
+static const mp_limb_t pow5[] = { 0x6c28000000000000ull, 0xc5371912364ce305ull };
+# define pow5shift 51
+# define pow5size 2
+# endif
+#elif RETURN_FRAC_BITS + 1 == 64
+# if BITS_PER_MP_LIMB == 32
+static const mp_limb_t pow5[] = { 0x50f80800, 0xc76b25fb, 0x3cbf6b71, 0xffcfa6d5, 0xc2781f49 };
+# define pow5shift 11
+# define pow5size 5
+# else
+static const mp_limb_t pow5[] = { 0x50f8080000000000ull, 0x3cbf6b71c76b25fbull, 0xc2781f49ffcfa6d5ull };
+# define pow5shift 43
+# define pow5size 3
+# endif
+#elif RETURN_FRAC_BITS + 1 == 65
+# if BITS_PER_MP_LIMB == 32
+static const mp_limb_t pow5[] = { 0x25360a00, 0x3945ef7a, 0x8bef464e, 0x7fc3908a, 0xf316271c };
+# define pow5shift 9
+# define pow5size 5
+# else
+static const mp_limb_t pow5[] = { 0x25360a0000000000ull, 8bef464e3945ef7aull, 0xf316271c7fc3908aull };
+# define pow5shift 41
+# define pow5size 3
+# endif
+#else
+# error "Unknown RETURN_FRAC_BITS value."
+#endif
+
+/* Read a multi-precision integer starting at STR with exactly DIGCNT digits
+ into N. Return the size of the number limbs in NSIZE. */
+static void
+str_to_mpn (const char *str, int digcnt, mp_limb_t *n, mp_size_t *nsize)
+{
+ /* Number of digits for actual limb. */
+ int cnt = 0;
+ mp_limb_t low = 0;
+ mp_limb_t start;
+
+ *nsize = 0;
+ assert (digcnt > 0);
+ do
+ {
+ if (cnt == MAX_DIG_PER_LIMB)
+ {
+ if (*nsize == 0)
+ {
+ n[0] = low;
+ *nsize = 1;
+ }
+ else
+ {
+ mp_limb_t cy;
+ cy = __mpn_mul_1 (n, n, *nsize, MAX_FAC_PER_LIMB);
+ cy += __mpn_add_1 (n, n, *nsize, low);
+ if (cy != 0)
+ {
+ n[*nsize] = cy;
+ ++(*nsize);
+ }
+ }
+ cnt = 0;
+ low = 0;
+ }
+
+ low = low * 10 + *str++ - '0';
+ ++cnt;
+ }
+ while (--digcnt > 0);
+
+ start = _tens_in_limb[cnt];
+
+ if (*nsize == 0)
+ {
+ n[0] = low;
+ *nsize = 1;
+ }
+ else
+ {
+ mp_limb_t cy;
+ cy = __mpn_mul_1 (n, n, *nsize, start);
+ cy += __mpn_add_1 (n, n, *nsize, low);
+ if (cy != 0)
+ n[(*nsize)++] = cy;
+ }
+}
+
+/* Round a fixed point number according to the current rounding mode
+ and set its sign. VAL is the initial part of the number
+ (RETURN_TYPE_BITS for unsigned, one fewer for signed; values equal
+ to -1.0 do not come here). SIGN is 1 for negative, 0 for positive;
+ this function will not be called for negative numbers in the
+ unsigned case. HALF is 1 if the next bit is 1; REST is 1 if any of
+ the subsequent bits are 1. */
+static RETURN_TYPE
+round_and_set_sign (RETURN_TYPE val, int sign, int half, int rest)
+{
+ int incr = 0;
+ unsigned int mode = fegetenv_register ();
+ mode &= 3;
+ switch (mode)
+ {
+ case FE_TONEAREST:
+ incr = (half && (rest || (val & 1)));
+ break;
+ case FE_TOWARDZERO:
+ break;
+ case FE_UPWARD:
+ incr = (!sign && (half || rest));
+ break;
+ case FE_DOWNWARD:
+ incr = (sign && (half || rest));
+ break;
+ }
+ if (incr)
+ {
+ if (val == SAT_MAX)
+ {
+ if (sign)
+ val = SAT_MIN;
+ else
+ {
+ __set_errno (ERANGE);
+ return SAT_MAX;
+ }
+ }
+ else
+ {
+ val++;
+ if (sign)
+ val = -val;
+ }
+ }
+ else if (sign)
+ val = -val;
+ return val;
+}
+
+/* Return a fixed point number with the value of the given string
+ NPTR, handling out-of-range numbers as described in the SPE PIM.
+ Set *ENDPTR to the character after the last used one. */
+RETURN_TYPE
+STRTOFIX (const char *nptr, char **endptr)
+{
+ int negative; /* The sign of the number. */
+ int exponent; /* Exponent of the number. */
+
+ /* Numbers starting `0X' or `0x' have to be processed with base 16. */
+ int base = 10;
+
+ /* Running pointer after the last character processed in the string. */
+ const char *cp;
+ /* Start of significant part of the number. */
+ const char *startp, *start_of_digits;
+ /* Points at the character following the integer and fractional digits. */
+ const char *expp;
+ /* Total number of digit and number of digits in integer part. */
+ int dig_no, int_no, lead_zero;
+ /* Contains the last character read. */
+ char c;
+
+ /* The radix character of the current locale. */
+ const char *decimal;
+ size_t decimal_len;
+ /* Used in several places. */
+ int cnt;
+
+ decimal = _NL_CURRENT (LC_NUMERIC, DECIMAL_POINT);
+ decimal_len = strlen (decimal);
+ assert (decimal_len > 0);
+
+ /* Prepare number representation. */
+ exponent = 0;
+ negative = 0;
+
+ /* Parse string to get maximal legal prefix. We need the number of
+ characters of the integer part, the fractional part and the exponent. */
+ cp = nptr - 1;
+ /* Ignore leading white space. */
+ do
+ c = *++cp;
+ while (isspace (c));
+
+ /* Get sign of the result. */
+ if (c == '-')
+ {
+ negative = 1;
+ c = *++cp;
+ }
+ else if (c == '+')
+ c = *++cp;
+
+ /* Return 0.0 if no legal string is found.
+ No character is used even if a sign was found. */
+ for (cnt = 0; decimal[cnt] != '\0'; ++cnt)
+ if (cp[cnt] != decimal[cnt])
+ break;
+ if (decimal[cnt] == '\0' && cp[cnt] >= '0' && cp[cnt] <= '9')
+ {
+ /* We accept it. This funny construct is here only to indent
+ the code directly. */
+ }
+ else if (c < '0' || c > '9')
+ {
+ /* The SPE PIM says NaN and Inf are not supported. */
+ /* It is really a text we do not recognize. */
+ RETURN (0, nptr);
+ }
+
+ /* First look whether we are faced with a hexadecimal number. */
+ if (c == '0' && tolower (cp[1]) == 'x')
+ {
+ /* Okay, it is a hexa-decimal number. Remember this and skip
+ the characters. BTW: hexadecimal numbers must not be
+ grouped. */
+ base = 16;
+ cp += 2;
+ c = *cp;
+ }
+
+ /* Record the start of the digits, in case we will check their grouping. */
+ start_of_digits = startp = cp;
+
+ /* Ignore leading zeroes. This helps us to avoid useless computations. */
+ while (c == '0')
+ c = *++cp;
+
+ /* If no other digit but a '0' is found the result is 0.0.
+ Return current read pointer. */
+ if ((c < '0' || c > '9')
+ && (base != 16 || (c < (char) tolower ('a')
+ || c > (char) tolower ('f')))
+ && ({ for (cnt = 0; decimal[cnt] != '\0'; ++cnt)
+ if (decimal[cnt] != cp[cnt])
+ break;
+ decimal[cnt] != '\0'; })
+ && (base != 16 || (cp == start_of_digits
+ || (char) tolower (c) != 'p'))
+ && (base == 16 || (char) tolower (c) != 'e'))
+ {
+ /* If CP is at the start of the digits, there was no correctly
+ grouped prefix of the string; so no number found. */
+ RETURN (0, cp == start_of_digits ? (base == 16 ? cp - 1 : nptr) : cp);
+ }
+
+ /* Remember first significant digit and read following characters until the
+ decimal point, exponent character or any non-FP number character. */
+ startp = cp;
+ dig_no = 0;
+ while (1)
+ {
+ if ((c >= '0' && c <= '9')
+ || (base == 16 && tolower (c) >= 'a'
+ && tolower (c) <= 'f'))
+ ++dig_no;
+ else
+ {
+ break;
+ }
+ c = *++cp;
+ }
+
+ /* We have the number digits in the integer part. Whether these are all or
+ any is really a fractional digit will be decided later. */
+ int_no = dig_no;
+ lead_zero = int_no == 0 ? -1 : 0;
+
+ /* Read the fractional digits. A special case are the 'american style'
+ numbers like `16.' i.e. with decimal but without trailing digits. */
+ if (
+ ({ for (cnt = 0; decimal[cnt] != '\0'; ++cnt)
+ if (decimal[cnt] != cp[cnt])
+ break;
+ decimal[cnt] == '\0'; })
+ )
+ {
+ cp += decimal_len;
+ c = *cp;
+ while ((c >= '0' && c <= '9') ||
+ (base == 16 && tolower (c) >= 'a' && tolower (c) <= 'f'))
+ {
+ if (c != '0' && lead_zero == -1)
+ lead_zero = dig_no - int_no;
+ ++dig_no;
+ c = *++cp;
+ }
+ }
+
+ /* Remember start of exponent (if any). */
+ expp = cp;
+
+ /* Read exponent. */
+ if ((base == 16 && tolower (c) == 'p')
+ || (base != 16 && tolower (c) == 'e'))
+ {
+ int exp_negative = 0;
+
+ c = *++cp;
+ if (c == '-')
+ {
+ exp_negative = 1;
+ c = *++cp;
+ }
+ else if (c == '+')
+ c = *++cp;
+
+ if (c >= '0' && c <= '9')
+ {
+ int exp_limit;
+
+ /* Get the exponent limit. */
+ if (base == 16)
+ exp_limit = (exp_negative ?
+ RETURN_TYPE_BITS + 4 * int_no :
+ 4 - 4 * int_no + 4 * lead_zero);
+ else
+ exp_limit = (exp_negative ?
+ (RETURN_TYPE_BITS + 2) / 3 + int_no :
+ 1 - int_no + lead_zero);
+
+ do
+ {
+ exponent *= 10;
+
+ if (exponent > exp_limit)
+ /* The exponent is too large/small to represent a valid
+ number. */
+ {
+ RETURN_TYPE result;
+
+ /* Accept all following digits as part of the exponent. */
+ do
+ ++cp;
+ while (*cp >= '0' && *cp <= '9');
+
+ /* We have to take care for special situation: a joker
+ might have written "0.0e100000" which is in fact
+ zero. */
+ if (lead_zero == -1)
+ result = 0;
+#if UNSIGNED
+ else if (negative)
+ {
+ /* Saturate to 0. */
+ __set_errno (ERANGE);
+ result = SAT_MIN;
+ }
+#endif
+ else if (exp_negative)
+ {
+ /* Round to either 0 or smallest value. */
+ result = round_and_set_sign (0, negative, 0, 1);
+ }
+ else
+ {
+ /* Overflow. */
+ __set_errno (ERANGE);
+ result = (negative ? SAT_MIN : SAT_MAX);
+ }
+
+ RETURN (result, cp);
+ /* NOTREACHED */
+ }
+
+ exponent += c - '0';
+ c = *++cp;
+ }
+ while (c >= '0' && c <= '9');
+
+ if (exp_negative)
+ exponent = -exponent;
+ }
+ else
+ cp = expp;
+ }
+
+ /* We don't want to have to work with trailing zeroes after the radix. */
+ if (dig_no > int_no)
+ {
+ while (expp[-1] == '0')
+ {
+ --expp;
+ --dig_no;
+ }
+ assert (dig_no >= int_no);
+ }
+
+ if (dig_no == int_no && dig_no > 0)
+ do
+ {
+ while (! (base == 16 ? isxdigit (expp[-1]) : isdigit (expp[-1])))
+ --expp;
+
+ if (expp[-1] != '0')
+ break;
+
+ --expp;
+ --dig_no;
+ --int_no;
+ exponent += (base == 16 ? 4 : 1);
+ }
+ while (dig_no > 0);
+
+ /* The whole string is parsed. Store the address of the next character. */
+ if (endptr)
+ *endptr = (char *) cp;
+
+ if (dig_no == 0)
+ return 0;
+
+#if UNSIGNED
+ if (negative)
+ {
+ /* Saturate to 0. */
+ __set_errno (ERANGE);
+ return SAT_MIN;
+ }
+#endif
+
+ if (lead_zero)
+ {
+ /* Find the decimal point */
+ while (1)
+ {
+ if (*startp == decimal[0])
+ {
+ for (cnt = 1; decimal[cnt] != '\0'; ++cnt)
+ if (decimal[cnt] != startp[cnt])
+ break;
+ if (decimal[cnt] == '\0')
+ break;
+ }
+ ++startp;
+ }
+ startp += lead_zero + decimal_len;
+ exponent -= base == 16 ? 4 * lead_zero : lead_zero;
+ dig_no -= lead_zero;
+ }
+
+ /* Normalize the exponent so that all digits can be considered to
+ start just after the point. */
+ exponent += int_no;
+
+ if (exponent > (base == 16 ? 4 : 1))
+ {
+ /* Overflow. */
+ __set_errno (ERANGE);
+ return (negative ? SAT_MIN : SAT_MAX);
+ }
+
+ /* Copy just the digits needed to a separate buffer. */
+ int digits_needed = (base == 16 ? RETURN_TYPE_BITS / 4 + 2 : RETURN_FRAC_BITS + 1);
+ char buf[RETURN_TYPE_BITS + 1];
+ int digits_copied = 0;
+ int extra = 0;
+ int rdigno = dig_no;
+ while (exponent < 0)
+ {
+ buf[digits_copied++] = '0';
+ exponent += (base == 16 ? 4 : 1);
+ if (digits_copied == digits_needed)
+ return round_and_set_sign (0, negative, 0, 1);
+ }
+ while (digits_copied < digits_needed && rdigno > 0)
+ {
+ if (!(base == 16 ? isxdigit (*startp) : isdigit (*startp)))
+ startp += decimal_len;
+ buf[digits_copied++] = *startp++;
+ rdigno--;
+ }
+ if (rdigno)
+ extra = 1;
+ else
+ while (digits_copied < digits_needed)
+ buf[digits_copied++] = '0';
+
+ if (base == 10 && exponent == 1)
+ {
+ assert (buf[0] != '0');
+ /* At least 1.0; see if there is overflow. */
+ if (UNSIGNED
+ || !negative
+ || buf[0] > '1'
+ || dig_no > 1)
+ __set_errno (ERANGE);
+ return (negative ? SAT_MIN : SAT_MAX);
+ }
+
+ if (base == 16 && exponent > 0)
+ {
+ int max_dig = (16 >> exponent) + '0';
+ assert (buf[0] != '0');
+ if (buf[0] >= max_dig)
+ {
+ /* At least 1.0; see if there is overflow. */
+ if (UNSIGNED
+ || !negative
+ || buf[0] > max_dig
+ || dig_no > 1)
+ __set_errno (ERANGE);
+ return (negative ? SAT_MIN : SAT_MAX);
+ }
+ }
+
+ /* Now strictly in the range (0, 1) (though rounding may yet
+ saturate to 1.0). */
+ if (base == 10)
+ assert (exponent == 0);
+ else
+ assert (exponent >= 0 && exponent <= 3);
+
+ if (base == 16)
+ {
+ RETURN_TYPE r = 0;
+ int half = 0;
+ for (int i = 0; i < digits_needed; i++)
+ {
+ RETURN_TYPE val;
+ int shift;
+ if (isdigit (buf[i]))
+ val = buf[i] - '0';
+ else
+ val = 10 + tolower (buf[i]) - 'a';
+ shift = RETURN_FRAC_BITS - 4 + exponent - 4 * i;
+ if (shift >= 0)
+ r |= val << shift;
+ else if (shift <= -4)
+ extra |= (val != 0);
+ else
+ {
+ r |= val >> -shift;
+ half = (val & (1 << (-shift - 1))) != 0;
+ extra |= (val & ((1 << (-shift - 1)) - 1)) != 0;
+ }
+ }
+ return round_and_set_sign (r, negative, half, extra);
+ }
+
+ /* Now we have RETURN_FRAC_BITS + 1 digits after the decimal point.
+ Interpret these as an integer and divide by 5^(RETURN_FRAC_BITS +
+ 1). If there is a remainder, set extra. If the result of the
+ division is odd, set half. Divide by 2 again, and round the
+ result. */
+ mp_limb_t frac[8];
+ mp_size_t fracsize;
+ str_to_mpn (buf, digits_needed, frac, &fracsize);
+ if (fracsize < pow5size)
+ return round_and_set_sign (0, negative, 0, 1);
+ frac[fracsize] = __mpn_lshift (frac, frac, fracsize, pow5shift);
+ if (frac[fracsize])
+ fracsize++;
+ mp_limb_t quot[8];
+ quot[fracsize - pow5size] = mpn_divmod (quot, frac, fracsize, pow5, pow5size);
+ for (int i = 0; i < pow5size; i++)
+ if (frac[i])
+ extra = 1;
+ int half = quot[0] & 1;
+ RETURN_TYPE val = quot[0] >> 1;
+#if RETURN_FRAC_BITS > BITS_PER_MP_LIMB - 1
+ val |= ((RETURN_TYPE) quot[1]) << (BITS_PER_MP_LIMB - 1);
+# if RETURN_FRAC_BITS > 2 * BITS_PER_MP_LIMB - 1
+ val |= ((RETURN_TYPE) quot[2]) << (2 * BITS_PER_MP_LIMB - 1);
+# if RETURN_FRAC_BITS > 3 * BITS_PER_MP_LIMB - 1
+# error "Too many bits."
+# endif
+# endif
+#endif
+ return round_and_set_sign (val, negative, half, extra);
+}
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/strtosfix16.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/strtosfix16.c
new file mode 100644
index 000000000..febd66172
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/strtosfix16.c
@@ -0,0 +1,28 @@
+/* Convert string to 16-bit signed fixed point.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Joseph Myers <joseph@codesourcery.com>, 2006.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#define RETURN_TYPE int16_t
+#define UNSIGNED 0
+#define RETURN_TYPE_BITS 16
+#define SAT_MIN -0x8000
+#define SAT_MAX 0x7fff
+#define STRTOFIX strtosfix16
+
+#include "strtofix.c"
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/strtosfix32.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/strtosfix32.c
new file mode 100644
index 000000000..39a563cbf
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/strtosfix32.c
@@ -0,0 +1,28 @@
+/* Convert string to 32-bit signed fixed point.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Joseph Myers <joseph@codesourcery.com>, 2006.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#define RETURN_TYPE int32_t
+#define UNSIGNED 0
+#define RETURN_TYPE_BITS 32
+#define SAT_MIN 0x80000000
+#define SAT_MAX 0x7fffffff
+#define STRTOFIX strtosfix32
+
+#include "strtofix.c"
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/strtosfix64.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/strtosfix64.c
new file mode 100644
index 000000000..ec186a407
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/strtosfix64.c
@@ -0,0 +1,28 @@
+/* Convert string to 64-bit signed fixed point.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Joseph Myers <joseph@codesourcery.com>, 2006.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#define RETURN_TYPE int64_t
+#define UNSIGNED 0
+#define RETURN_TYPE_BITS 64
+#define SAT_MIN 0x8000000000000000LL
+#define SAT_MAX 0x7fffffffffffffffLL
+#define STRTOFIX strtosfix64
+
+#include "strtofix.c"
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/strtoufix16.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/strtoufix16.c
new file mode 100644
index 000000000..771b436c0
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/strtoufix16.c
@@ -0,0 +1,28 @@
+/* Convert string to 16-bit unsigned fixed point.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Joseph Myers <joseph@codesourcery.com>, 2006.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#define RETURN_TYPE uint16_t
+#define UNSIGNED 1
+#define RETURN_TYPE_BITS 16
+#define SAT_MIN 0
+#define SAT_MAX 0xffff
+#define STRTOFIX strtoufix16
+
+#include "strtofix.c"
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/strtoufix32.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/strtoufix32.c
new file mode 100644
index 000000000..b47435bec
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/strtoufix32.c
@@ -0,0 +1,28 @@
+/* Convert string to 32-bit unsigned fixed point.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Joseph Myers <joseph@codesourcery.com>, 2006.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#define RETURN_TYPE uint32_t
+#define UNSIGNED 1
+#define RETURN_TYPE_BITS 32
+#define SAT_MIN 0
+#define SAT_MAX 0xffffffff
+#define STRTOFIX strtoufix32
+
+#include "strtofix.c"
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/strtoufix64.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/strtoufix64.c
new file mode 100644
index 000000000..e6b9cfe2c
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/strtoufix64.c
@@ -0,0 +1,28 @@
+/* Convert string to 64-bit unsigned fixed point.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Joseph Myers <joseph@codesourcery.com>, 2006.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#define RETURN_TYPE uint64_t
+#define UNSIGNED 1
+#define RETURN_TYPE_BITS 64
+#define SAT_MIN 0
+#define SAT_MAX 0xffffffffffffffffLL
+#define STRTOFIX strtoufix64
+
+#include "strtofix.c"
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/t_sqrt.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/t_sqrt.c
new file mode 100644
index 000000000..1cc893170
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/t_sqrt.c
@@ -0,0 +1 @@
+/* Not needed. */
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/w_sqrt.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/w_sqrt.c
new file mode 100644
index 000000000..3721f24a7
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/w_sqrt.c
@@ -0,0 +1 @@
+#include <math/w_sqrt.c>
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/w_sqrtf.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/w_sqrtf.c
new file mode 100644
index 000000000..7c6ca901a
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/w_sqrtf.c
@@ -0,0 +1 @@
+#include <math/w_sqrtf.c>
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/soft-fp/Makefile b/ports/sysdeps/powerpc/powerpc32/e500/soft-fp/Makefile
new file mode 100644
index 000000000..2d7d09205
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/soft-fp/Makefile
@@ -0,0 +1,4 @@
+# Double precision floating point gets emulated.
+ifeq ($(subdir),soft-fp)
+sysdep_routines += $(gcc-double-routines) fraiseexcept-soft
+endif
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/soft-fp/Subdirs b/ports/sysdeps/powerpc/powerpc32/e500/soft-fp/Subdirs
new file mode 100644
index 000000000..87eadf302
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/soft-fp/Subdirs
@@ -0,0 +1 @@
+soft-fp
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/soft-fp/Versions b/ports/sysdeps/powerpc/powerpc32/e500/soft-fp/Versions
new file mode 100644
index 000000000..f126c9a8a
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/soft-fp/Versions
@@ -0,0 +1,19 @@
+libc {
+ GLIBC_2.3.3 {
+ __feraiseexcept_soft;
+ __adddf3; __truncdfsf2;
+ __divdf3; __eqdf2;
+ __extendsfdf2; __fixdfdi; __fixdfsi; __fixsfdi;
+ __fixtfdi;
+ __fixunsdfdi; __fixunsdfsi;
+ __floatdidf; __floatsidf;
+ __gedf2; __ledf2; __muldf3;
+ __negdf2; __sqrtdf2; __subdf3;
+ __truncdfsf2;
+ }
+ GLIBC_2.5 {
+ __floatundidf; __floatunsidf;
+ __unorddf2; __nedf2;
+ __gtdf2; __ltdf2;
+ }
+}
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/soft-fp/fraiseexcept-soft.c b/ports/sysdeps/powerpc/powerpc32/e500/soft-fp/fraiseexcept-soft.c
new file mode 100644
index 000000000..0aea3a880
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/soft-fp/fraiseexcept-soft.c
@@ -0,0 +1,25 @@
+/* Raise given exceptions.
+ Copyright (C) 2004 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Aldy Hernandez <aldyh@redhat.com>, 2004.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <fenv_libc.h>
+#include <bp-sym.h>
+
+#define __FERAISEEXCEPT_INTERNAL __feraiseexcept_soft
+#include "../spe-raise.c"
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/soft-fp/sfp-machine.h b/ports/sysdeps/powerpc/powerpc32/e500/soft-fp/sfp-machine.h
new file mode 100644
index 000000000..ceff99b12
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/soft-fp/sfp-machine.h
@@ -0,0 +1,60 @@
+#ifndef _SFP_MACHINE_H_
+#define _SFP_MACHINE_H_
+#include <fenv_libc.h>
+
+#define _FP_W_TYPE_SIZE 32
+#define _FP_W_TYPE unsigned long
+#define _FP_WS_TYPE signed long
+#define _FP_I_TYPE long
+
+#define _FP_MUL_MEAT_S(R,X,Y) \
+ _FP_MUL_MEAT_1_wide(_FP_WFRACBITS_S,R,X,Y,umul_ppmm)
+#define _FP_MUL_MEAT_D(R,X,Y) \
+ _FP_MUL_MEAT_2_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm)
+#define _FP_MUL_MEAT_Q(R,X,Y) \
+ _FP_MUL_MEAT_4_wide(_FP_WFRACBITS_Q,R,X,Y,umul_ppmm)
+
+#define _FP_DIV_MEAT_S(R,X,Y) _FP_DIV_MEAT_1_loop(S,R,X,Y)
+#define _FP_DIV_MEAT_D(R,X,Y) _FP_DIV_MEAT_2_udiv(D,R,X,Y)
+#define _FP_DIV_MEAT_Q(R,X,Y) _FP_DIV_MEAT_4_udiv(Q,R,X,Y)
+
+#define _FP_NANFRAC_S ((_FP_QNANBIT_S << 1) - 1)
+#define _FP_NANFRAC_D ((_FP_QNANBIT_D << 1) - 1), -1
+#define _FP_NANFRAC_Q ((_FP_QNANBIT_Q << 1) - 1), -1, -1, -1
+#define _FP_NANSIGN_S 0
+#define _FP_NANSIGN_D 0
+#define _FP_NANSIGN_Q 0
+
+#define _FP_KEEPNANFRACP 1
+
+/* Someone please check this. */
+#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP) \
+ do { \
+ if ((_FP_FRAC_HIGH_RAW_##fs(X) & _FP_QNANBIT_##fs) \
+ && !(_FP_FRAC_HIGH_RAW_##fs(Y) & _FP_QNANBIT_##fs)) \
+ { \
+ R##_s = Y##_s; \
+ _FP_FRAC_COPY_##wc(R,Y); \
+ } \
+ else \
+ { \
+ R##_s = X##_s; \
+ _FP_FRAC_COPY_##wc(R,X); \
+ } \
+ R##_c = FP_CLS_NAN; \
+ } while (0)
+
+/* Exception flags. We use the bit positions of the appropriate bits
+ in the FPEFSCR, which also correspond to the FE_* bits. This makes
+ everything easier ;-). */
+#define FP_EX_INEXACT (1 << (63 - 42))
+#define FP_EX_INVALID (1 << (63 - 43))
+#define FP_EX_DIVZERO (1 << (63 - 44))
+#define FP_EX_UNDERFLOW (1 << (63 - 45))
+#define FP_EX_OVERFLOW (1 << (63 - 46))
+
+/* This will work inasmuch as FP_EX_* are the same as FE_*. */
+#define FP_HANDLE_EXCEPTIONS __feraiseexcept_soft (_fex)
+
+#define FP_ROUNDMODE (fegetenv_register() & 0x3)
+#endif /* _SFP_MACHINE_H_ */
diff --git a/ports/sysdeps/powerpc/powerpc32/e500/spe-raise.c b/ports/sysdeps/powerpc/powerpc32/e500/spe-raise.c
new file mode 100644
index 000000000..6ff880c61
--- /dev/null
+++ b/ports/sysdeps/powerpc/powerpc32/e500/spe-raise.c
@@ -0,0 +1,68 @@
+/* Raise given exceptions.
+ Copyright (C) 1997,99,2000,01,02,04 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <fenv_libc.h>
+#include <bp-sym.h>
+
+int
+__FERAISEEXCEPT_INTERNAL (int excepts)
+{
+ unsigned long f;
+
+ f = fegetenv_register ();
+ f |= (excepts & FE_ALL_EXCEPT);
+ fesetenv_register (f);
+
+ /* Force the operations that cause the exceptions. */
+ if ((FE_INVALID & excepts) != 0)
+ {
+ /* ?? Does not set sticky bit ?? */
+ /* 0 / 0 */
+ asm volatile ("efsdiv %0,%0,%1" : : "r" (0), "r" (0));
+ }
+
+ if ((FE_DIVBYZERO & excepts) != 0)
+ {
+ /* 1.0 / 0.0 */
+ asm volatile ("efsdiv %0,%0,%1" : : "r" (1.0F), "r" (0));
+ }
+
+ if ((FE_OVERFLOW & excepts) != 0)
+ {
+ /* ?? Does not set sticky bit ?? */
+ /* Largest normalized number plus itself. */
+ asm volatile ("efsadd %0,%0,%1" : : "r" (0x7f7fffff), "r" (0x7f7fffff));
+ }
+
+ if ((FE_UNDERFLOW & excepts) != 0)
+ {
+ /* ?? Does not set sticky bit ?? */
+ /* Smallest normalized number times itself. */
+ asm volatile ("efsmul %0,%0,%1" : : "r" (0x800000), "r" (0x800000));
+ }
+
+ if ((FE_INEXACT & excepts) != 0)
+ {
+ /* Smallest normalized minus 1.0 raises the inexact flag. */
+ asm volatile ("efssub %0,%0,%1" : : "r" (0x00800000), "r" (1.0F));
+ }
+
+ /* Success. */
+ return 0;
+}
diff --git a/ports/sysdeps/powerpc/preconfigure b/ports/sysdeps/powerpc/preconfigure
new file mode 100644
index 000000000..57f24a086
--- /dev/null
+++ b/ports/sysdeps/powerpc/preconfigure
@@ -0,0 +1,20 @@
+# Check for E500.
+
+case "$machine" in
+powerpc)
+ if test "$with_fp" = "yes"; then
+ variant=`(echo "#ifdef __NO_FPRS__"
+ echo "#ifdef _SOFT_DOUBLE"
+ echo "e500/single"
+ echo "#else"
+ echo "e500"
+ echo "#endif"
+ echo "#endif") |
+ $CC $CFLAGS $CPPFLAGS -E - |
+ grep '^[a-z]'`
+ if test -n "$variant"; then
+ base_machine=powerpc machine=powerpc/powerpc32/$variant
+ fi
+ fi
+ ;;
+esac
diff --git a/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/Implies b/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/Implies
new file mode 100644
index 000000000..be4188aac
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/Implies
@@ -0,0 +1 @@
+powerpc/powerpc32/e500/fpu
diff --git a/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/getcontext-extra.S b/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/getcontext-extra.S
new file mode 100644
index 000000000..145f4aa86
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/getcontext-extra.S
@@ -0,0 +1,58 @@
+/* Save current context. Support for saving high parts of registers.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Joseph Myers <joseph@codesourcery.com>, 2006.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+/* We follow the kernel's layout, which saves the high parts of the
+ SPE registers in the vregs area, immediately followed by the
+ SPEFSCR value. */
+ la r10,(_UC_VREGS)(r3)
+ evstwwe r0,(0*4)(r10)
+ evstwwe r1,(1*4)(r10)
+ evstwwe r2,(2*4)(r10)
+ evstwwe r3,(3*4)(r10)
+ evstwwe r4,(4*4)(r10)
+ evstwwe r5,(5*4)(r10)
+ evstwwe r6,(6*4)(r10)
+ evstwwe r7,(7*4)(r10)
+ evstwwe r8,(8*4)(r10)
+ evstwwe r9,(9*4)(r10)
+ evstwwe r10,(10*4)(r10)
+ evstwwe r11,(11*4)(r10)
+ evstwwe r12,(12*4)(r10)
+ evstwwe r13,(13*4)(r10)
+ evstwwe r14,(14*4)(r10)
+ evstwwe r15,(15*4)(r10)
+ evstwwe r16,(16*4)(r10)
+ evstwwe r17,(17*4)(r10)
+ evstwwe r18,(18*4)(r10)
+ evstwwe r19,(19*4)(r10)
+ evstwwe r20,(20*4)(r10)
+ evstwwe r21,(21*4)(r10)
+ evstwwe r22,(22*4)(r10)
+ evstwwe r23,(23*4)(r10)
+ evstwwe r24,(24*4)(r10)
+ evstwwe r25,(25*4)(r10)
+ evstwwe r26,(26*4)(r10)
+ evstwwe r27,(27*4)(r10)
+ evstwwe r28,(28*4)(r10)
+ evstwwe r29,(29*4)(r10)
+ evstwwe r30,(30*4)(r10)
+ evstwwe r31,(31*4)(r10)
+ mfspefscr r9
+ stw r9,(32*4)(r10)
diff --git a/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/getcontext.S b/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/getcontext.S
new file mode 100644
index 000000000..5b3f2cc54
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/getcontext.S
@@ -0,0 +1,60 @@
+/* Save current context.
+ Copyright (C) 2002, 2004, 2005, 2006 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <sysdep.h>
+#include <rtld-global-offsets.h>
+#include <shlib-compat.h>
+
+#define __ASSEMBLY__
+#include <asm/ptrace.h>
+#include "ucontext_i.h"
+
+#define __CONTEXT_FUNC_NAME __getcontext
+#undef __CONTEXT_ENABLE_FPRS
+#undef __CONTEXT_ENABLE_VRS
+#define __CONTEXT_EXTRA
+
+#include "getcontext-common.S"
+
+versioned_symbol (libc, __getcontext, getcontext, GLIBC_2_3_4)
+
+#if SHLIB_COMPAT (libc, GLIBC_2_3_3, GLIBC_2_3_4)
+
+/* For the nofpu case the old/new versions are the same function. */
+strong_alias (__getcontext, __novec_getcontext)
+
+compat_symbol (libc, __novec_getcontext, getcontext, GLIBC_2_3_3)
+
+#endif
+
+#if SHLIB_COMPAT (libc, GLIBC_2_1, GLIBC_2_3_3)
+
+#define _ERRNO_H 1
+#include <bits/errno.h>
+
+ compat_text_section
+ENTRY (__getcontext_stub)
+ li r3,ENOSYS
+ b __syscall_error@local
+END (__getcontext_stub)
+ .previous
+
+compat_symbol (libc, __getcontext_stub, getcontext, GLIBC_2_1)
+
+#endif
diff --git a/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/setcontext-extra.S b/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/setcontext-extra.S
new file mode 100644
index 000000000..089153c1e
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/setcontext-extra.S
@@ -0,0 +1,90 @@
+/* Jump to a new context. Support for restoring high parts of registers.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Joseph Myers <joseph@codesourcery.com>, 2006.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+ lwz r3,_UC_VREGS+(0*4)(r31)
+ evmergelo r0,r3,r0
+ lwz r3,_UC_VREGS+(1*4)(r31)
+ evmergelo r1,r3,r1
+ lwz r3,_UC_VREGS+(2*4)(r31)
+ evmergelo r2,r3,r2
+ lwz r3,_UC_VREGS+(1*4)(r31)
+ evmergelo r1,r3,r1
+ lwz r3,_UC_VREGS+(2*4)(r31)
+ evmergelo r2,r3,r2
+ lwz r3,_UC_VREGS+(3*4)(r31)
+ evmergelo r3,r3,r3
+ lwz r3,_UC_VREGS+(4*4)(r31)
+ evmergelo r4,r3,r4
+ lwz r3,_UC_VREGS+(5*4)(r31)
+ evmergelo r5,r3,r5
+ lwz r3,_UC_VREGS+(6*4)(r31)
+ evmergelo r6,r3,r6
+ lwz r3,_UC_VREGS+(7*4)(r31)
+ evmergelo r7,r3,r7
+ lwz r3,_UC_VREGS+(8*4)(r31)
+ evmergelo r8,r3,r8
+ lwz r3,_UC_VREGS+(9*4)(r31)
+ evmergelo r9,r3,r9
+ lwz r3,_UC_VREGS+(10*4)(r31)
+ evmergelo r10,r3,r10
+ lwz r3,_UC_VREGS+(11*4)(r31)
+ evmergelo r11,r3,r11
+ lwz r3,_UC_VREGS+(12*4)(r31)
+ evmergelo r12,r3,r12
+ lwz r3,_UC_VREGS+(13*4)(r31)
+ evmergelo r13,r3,r13
+ lwz r3,_UC_VREGS+(14*4)(r31)
+ evmergelo r14,r3,r14
+ lwz r3,_UC_VREGS+(15*4)(r31)
+ evmergelo r15,r3,r15
+ lwz r3,_UC_VREGS+(16*4)(r31)
+ evmergelo r16,r3,r16
+ lwz r3,_UC_VREGS+(17*4)(r31)
+ evmergelo r17,r3,r17
+ lwz r3,_UC_VREGS+(18*4)(r31)
+ evmergelo r18,r3,r18
+ lwz r3,_UC_VREGS+(19*4)(r31)
+ evmergelo r19,r3,r19
+ lwz r3,_UC_VREGS+(20*4)(r31)
+ evmergelo r20,r3,r20
+ lwz r3,_UC_VREGS+(21*4)(r31)
+ evmergelo r21,r3,r21
+ lwz r3,_UC_VREGS+(22*4)(r31)
+ evmergelo r22,r3,r22
+ lwz r3,_UC_VREGS+(23*4)(r31)
+ evmergelo r23,r3,r23
+ lwz r3,_UC_VREGS+(24*4)(r31)
+ evmergelo r24,r3,r24
+ lwz r3,_UC_VREGS+(25*4)(r31)
+ evmergelo r25,r3,r25
+ lwz r3,_UC_VREGS+(26*4)(r31)
+ evmergelo r26,r3,r26
+ lwz r3,_UC_VREGS+(27*4)(r31)
+ evmergelo r27,r3,r27
+ lwz r3,_UC_VREGS+(28*4)(r31)
+ evmergelo r28,r3,r28
+ lwz r3,_UC_VREGS+(29*4)(r31)
+ evmergelo r29,r3,r29
+ lwz r3,_UC_VREGS+(30*4)(r31)
+ evmergelo r30,r3,r30
+ lwz r3,_UC_VREGS+(31*4)(r31)
+ evmergelo r31,r3,r31
+ lwz r3,_UC_VREGS+(32*4)(r31)
+ mtspefscr r3
diff --git a/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/setcontext.S b/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/setcontext.S
new file mode 100644
index 000000000..f4344f76f
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/setcontext.S
@@ -0,0 +1,60 @@
+/* Jump to a new context.
+ Copyright (C) 2002, 2004, 2005, 2006 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <sysdep.h>
+#include <rtld-global-offsets.h>
+#include <shlib-compat.h>
+
+#define __ASSEMBLY__
+#include <asm/ptrace.h>
+#include "ucontext_i.h"
+
+#define __CONTEXT_FUNC_NAME __setcontext
+#undef __CONTEXT_ENABLE_FPRS
+#undef __CONTEXT_ENABLE_VRS
+#define __CONTEXT_EXTRA
+
+#include "setcontext-common.S"
+
+versioned_symbol (libc, __setcontext, setcontext, GLIBC_2_3_4)
+
+#if SHLIB_COMPAT (libc, GLIBC_2_3_3, GLIBC_2_3_4)
+
+/* For the nofpu case the old/new versions are the same function. */
+strong_alias (__setcontext, __novec_setcontext)
+
+compat_symbol (libc, __novec_setcontext, setcontext, GLIBC_2_3_3)
+
+#endif
+
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_3)
+
+#define _ERRNO_H 1
+#include <bits/errno.h>
+
+ compat_text_section
+ENTRY (__setcontext_stub)
+ li r3,ENOSYS
+ b __syscall_error@local
+END (__setcontext_stub)
+ .previous
+
+compat_symbol (libc, __setcontext_stub, setcontext, GLIBC_2_0)
+
+#endif
diff --git a/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/swapcontext.S b/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/swapcontext.S
new file mode 100644
index 000000000..d5be04d63
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/swapcontext.S
@@ -0,0 +1,60 @@
+/* Save current context and jump to a new context.
+ Copyright (C) 2002, 2004, 2005, 2006 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <sysdep.h>
+#include <rtld-global-offsets.h>
+#include <shlib-compat.h>
+
+#define __ASSEMBLY__
+#include <asm/ptrace.h>
+#include "ucontext_i.h"
+
+#define __CONTEXT_FUNC_NAME __swapcontext
+#undef __CONTEXT_ENABLE_FPRS
+#undef __CONTEXT_ENABLE_VRS
+#define __CONTEXT_EXTRA
+
+# include "swapcontext-common.S"
+
+versioned_symbol (libc, __swapcontext, swapcontext, GLIBC_2_3_4)
+
+#if SHLIB_COMPAT (libc, GLIBC_2_3_3, GLIBC_2_3_4)
+
+/* For the nofpu case the old/new versions are the same function. */
+strong_alias (__swapcontext, __novec_swapcontext)
+
+compat_symbol (libc, __novec_swapcontext, swapcontext, GLIBC_2_3_3)
+
+#endif
+
+#if SHLIB_COMPAT (libc, GLIBC_2_1, GLIBC_2_3_3)
+
+#define _ERRNO_H 1
+#include <bits/errno.h>
+
+ compat_text_section
+ENTRY (__swapcontext_stub)
+ li r3,ENOSYS
+ b __syscall_error@local
+END (__swapcontext_stub)
+ .previous
+
+compat_symbol (libc, __swapcontext_stub, swapcontext, GLIBC_2_1)
+
+#endif
diff --git a/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/single/Implies b/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/single/Implies
new file mode 100644
index 000000000..ec387963f
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/single/Implies
@@ -0,0 +1 @@
+powerpc/powerpc32/e500/soft-fp