PowerPC E500 port

classic Classic list List threaded Threaded
11 messages Options
Reply | Threaded
Open this post in threaded view
|

PowerPC E500 port

Joseph Myers
These patches add a port to the E500 variant of PowerPC.  The port is
selected automatically if configuring --with-fp but with the compiler
defining __NO_FPRS__.  Note this this port requires the E500 support for
IBM long double, added by my GCC patch
<http://gcc.gnu.org/ml/gcc-patches/2006-12/msg01388.html>; that patch is
now in GCC trunk.

The port is mostly based on Aldy's SPE add-on for glibc 2.3, various
derivatives of which have been in use for some time (hence the symbol
versions).

This port version has been designed to have as much as possible in ports
and to require minimal changes to core libc.  The libc patch changes
_SOFT_FLOAT conditionals to __NO_FPRS__ in two headers and allows for E500
getcontext/setcontext support from ports to be conditionally included
with the support code itself going in ports.

--
Joseph S. Myers
[hidden email]

glibc-e500-ports.bz2 (25K) Download Attachment
glibc-e500-libc.bz2 (1K) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Ping Re: PowerPC E500 port

Joseph Myers
Ping.  Could a ports maintainer review this ports patch
<http://sourceware.org/ml/libc-ports/2007-02/msg00002.html> even if noone
is interested in the core glibc patch?

--
Joseph S. Myers
[hidden email]
Reply | Threaded
Open this post in threaded view
|

Re: Ping Re: PowerPC E500 port

Roland McGrath
Please don't use compressed attachments.  Just put the patches in your
email with the least amount of encoding you can manage.

I don't think the main powerpc files should do conditional includes of
nonexistent files like that.  Instead, have your port override with a file
that #include's the main file.  If you need to modify the main files to
facilitate that, I think a pure macro #ifdef bit without an #include is better.
You can use a gas macro in your file to make defining the part with your
code prettier than a big #define.

For changes to powerpc files in the main tree, you should get an OK from
Steve Munroe <[hidden email]> and then post to libc-alpha.  For the
ports additions, with an OK from Steven and general review from me or
Daniel, one of us can commit it.


Thanks,
Roland

Reply | Threaded
Open this post in threaded view
|

Re: Ping Re: PowerPC E500 port

Joseph Myers
On Mon, 19 Mar 2007, Roland McGrath wrote:

> I don't think the main powerpc files should do conditional includes of
> nonexistent files like that.  Instead, have your port override with a file
> that #include's the main file.  If you need to modify the main files to
> facilitate that, I think a pure macro #ifdef bit without an #include is better.

You mean

#ifdef __SETCONTEXT_EXTRA
        __SETCONTEXT_EXTRA
#endif
(still working on the principle that the actual E500-specific code must
remain entirely in ports)?

--
Joseph S. Myers
[hidden email]
Reply | Threaded
Open this post in threaded view
|

Re: Ping Re: PowerPC E500 port

Roland McGrath
> You mean
>
> #ifdef __SETCONTEXT_EXTRA
> __SETCONTEXT_EXTRA
> #endif

Something like that, yes.

> (still working on the principle that the actual E500-specific code must
> remain entirely in ports)?

Right.


Thanks,
Roland
Reply | Threaded
Open this post in threaded view
|

Re: Ping Re: PowerPC E500 port

Joseph Myers
Here are new versions of the patches, revised as requested.  For
reference, the original submission was
<http://sourceware.org/ml/libc-ports/2007-02/msg00002.html>.


2007-04-17  Joseph Myers  <[hidden email]>

        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.

diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/Makefile glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/Makefile
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/Makefile 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/Makefile 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1,11 @@
+ifeq ($(subdir),stdlib)
+spepim_routines = atosfix16 atosfix32 atosfix64 atoufix16 atoufix32 atoufix64 \
+  strtosfix16 strtosfix32 strtosfix64 strtoufix16 strtoufix32 strtoufix64
+sysdep_routines += $(spepim_routines)
+tests += tst-spepim
+ifeq ($(build-shared),yes)
+$(objpfx)tst-spepim: $(common-objpfx)math/libm.so$(libm.so-version)
+else
+$(objpfx)tst-spepim: $(common-objpfx)math/libm.a
+endif
+endif
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/Versions glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/Versions
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/Versions 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/Versions 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1,8 @@
+libc {
+  GLIBC_2.3.3 {
+    atosfix16; atosfix32; atosfix64;
+    atoufix16; atoufix32; atoufix64;
+    strtosfix16; strtosfix32; strtosfix64;
+    strtoufix16; strtoufix32; strtoufix64;
+  }
+}
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/__longjmp-common.S glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/__longjmp-common.S
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/__longjmp-common.S 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/__longjmp-common.S 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1,103 @@
+/* longjmp for PowerPC E500.
+   Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+   Contributed by Aldy Hernandez <[hidden email]>.
+
+   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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/__longjmp.S glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/__longjmp.S
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/__longjmp.S 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/__longjmp.S 2007-04-16 13:01:08.000000000 -0700
@@ -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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/atosfix16.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/atosfix16.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/atosfix16.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/atosfix16.c 2007-04-16 13:01:08.000000000 -0700
@@ -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 <[hidden email]>, 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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/atosfix32.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/atosfix32.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/atosfix32.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/atosfix32.c 2007-04-16 13:01:08.000000000 -0700
@@ -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 <[hidden email]>, 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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/atosfix64.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/atosfix64.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/atosfix64.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/atosfix64.c 2007-04-16 13:01:08.000000000 -0700
@@ -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 <[hidden email]>, 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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/atoufix16.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/atoufix16.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/atoufix16.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/atoufix16.c 2007-04-16 13:01:08.000000000 -0700
@@ -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 <[hidden email]>, 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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/atoufix32.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/atoufix32.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/atoufix32.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/atoufix32.c 2007-04-16 13:01:08.000000000 -0700
@@ -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 <[hidden email]>, 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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/atoufix64.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/atoufix64.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/atoufix64.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/atoufix64.c 2007-04-16 13:01:08.000000000 -0700
@@ -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 <[hidden email]>, 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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/bits/fenv.h glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/bits/fenv.h
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/bits/fenv.h 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/bits/fenv.h 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1,78 @@
+/* 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
+   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_H
+# error "Never use <bits/fenv.h> directly; include <fenv.h> instead."
+#endif
+
+/* 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
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/e_sqrt.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/e_sqrt.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/e_sqrt.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/e_sqrt.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/dbl-64/e_sqrt.c>
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/e_sqrtf.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/e_sqrtf.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/e_sqrtf.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/e_sqrtf.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/flt-32/e_sqrtf.c>
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/fclrexcpt.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/fclrexcpt.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/fclrexcpt.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/fclrexcpt.c 2007-04-16 13:01:08.000000000 -0700
@@ -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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/fe_nomask.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/fe_nomask.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/fe_nomask.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/fe_nomask.c 2007-04-16 13:01:08.000000000 -0700
@@ -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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/fedisblxcpt.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/fedisblxcpt.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/fedisblxcpt.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/fedisblxcpt.c 2007-04-16 13:01:08.000000000 -0700
@@ -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 <[hidden email]>, 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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/feenablxcpt.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/feenablxcpt.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/feenablxcpt.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/feenablxcpt.c 2007-04-16 13:01:08.000000000 -0700
@@ -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 <[hidden email]>, 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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/fegetenv.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/fegetenv.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/fegetenv.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/fegetenv.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1,46 @@
+/* Store current floating-point environment.
+   Copyright (C) 2004 Free Software Foundation, Inc.
+   Contributed by Aldy Hernandez <[hidden email]>, 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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/fegetexcept.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/fegetexcept.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/fegetexcept.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/fegetexcept.c 2007-04-16 13:01:08.000000000 -0700
@@ -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 <[hidden email]>, 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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/fegetround.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/fegetround.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/fegetround.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/fegetround.c 2007-04-16 13:01:08.000000000 -0700
@@ -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 <[hidden email]>, 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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/feholdexcpt.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/feholdexcpt.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/feholdexcpt.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/feholdexcpt.c 2007-04-16 13:01:08.000000000 -0700
@@ -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 <[hidden email]>, 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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/fenv_const.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/fenv_const.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/fenv_const.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/fenv_const.c 2007-04-16 13:01:08.000000000 -0700
@@ -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 <[hidden email]>, 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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/fenv_libc.h glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/fenv_libc.h
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/fenv_libc.h 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/fenv_libc.h 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1,77 @@
+/* Internal libc stuff for floating point environment routines.
+   Copyright (C) 2004 Free Software Foundation, Inc.
+   Contributed by Aldy Hernandez <[hidden email]>, 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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/fesetenv.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/fesetenv.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/fesetenv.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/fesetenv.c 2007-04-16 13:01:08.000000000 -0700
@@ -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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/fesetround.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/fesetround.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/fesetround.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/fesetround.c 2007-04-16 13:01:08.000000000 -0700
@@ -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 <[hidden email]>, 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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/feupdateenv.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/feupdateenv.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/feupdateenv.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/feupdateenv.c 2007-04-16 13:01:08.000000000 -0700
@@ -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 <[hidden email]>, 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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/fgetexcptflg.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/fgetexcptflg.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/fgetexcptflg.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/fgetexcptflg.c 2007-04-16 13:01:08.000000000 -0700
@@ -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 <[hidden email]>, 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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/fprrest.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/fprrest.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/fprrest.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/fprrest.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+/* Not needed.  */
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/fprsave.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/fprsave.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/fprsave.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/fprsave.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+/* Not needed.  */
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/fpu_control.h glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/fpu_control.h
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/fpu_control.h 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/fpu_control.h 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1,61 @@
+/* FPU control word definitions.  PowerPC version.
+   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
+   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 _FPU_CONTROL_H
+#define _FPU_CONTROL_H
+
+/* 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;
+
+#endif /* _FPU_CONTROL_H */
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/fraiseexcpt.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/fraiseexcpt.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/fraiseexcpt.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/fraiseexcpt.c 2007-04-16 13:01:08.000000000 -0700
@@ -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 <[hidden email]>, 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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/fsetexcptflg.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/fsetexcptflg.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/fsetexcptflg.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/fsetexcptflg.c 2007-04-16 13:01:08.000000000 -0700
@@ -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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/ftestexcept.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/ftestexcept.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/ftestexcept.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/ftestexcept.c 2007-04-16 13:01:08.000000000 -0700
@@ -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 <[hidden email]>, 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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/math_ldbl.h glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/math_ldbl.h
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/math_ldbl.h 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/math_ldbl.h 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/ldbl-128ibm/math_ldbl.h>
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/math_private.h glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/math_private.h
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/math_private.h 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/math_private.h 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+#include <math/math_private.h>
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_ceil.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_ceil.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_ceil.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_ceil.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/dbl-64/s_ceil.c>
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_ceilf.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_ceilf.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_ceilf.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_ceilf.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/flt-32/s_ceilf.c>
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_copysign.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_copysign.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_copysign.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_copysign.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/dbl-64/s_copysign.c>
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_copysignf.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_copysignf.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_copysignf.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_copysignf.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/flt-32/s_copysignf.c>
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_copysignl.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_copysignl.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_copysignl.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_copysignl.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/ldbl-128ibm/s_copysignl.c>
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_fabs.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_fabs.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_fabs.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_fabs.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/dbl-64/s_fabs.c>
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_fabsf.S glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_fabsf.S
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_fabsf.S 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_fabsf.S 2007-04-16 13:01:08.000000000 -0700
@@ -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 <[hidden email]>, 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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_fabsl.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_fabsl.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_fabsl.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_fabsl.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/ldbl-128ibm/s_fabsl.c>
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_fdim.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_fdim.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_fdim.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_fdim.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+#include <math/s_fdim.c>
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_fdimf.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_fdimf.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_fdimf.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_fdimf.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+#include <math/s_fdimf.c>
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_floor.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_floor.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_floor.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_floor.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/dbl-64/s_floor.c>
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_floorf.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_floorf.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_floorf.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_floorf.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/flt-32/s_floorf.c>
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_fmax.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_fmax.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_fmax.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_fmax.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+#include <math/s_fmax.c>
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_fmaxf.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_fmaxf.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_fmaxf.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_fmaxf.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+#include <math/s_fmaxf.c>
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_fmin.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_fmin.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_fmin.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_fmin.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+#include <math/s_fmin.c>
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_fminf.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_fminf.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_fminf.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_fminf.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+#include <math/s_fminf.c>
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_isnan.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_isnan.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_isnan.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_isnan.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/dbl-64/s_isnan.c>
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_isnanf.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_isnanf.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_isnanf.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_isnanf.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/flt-32/s_isnanf.c>
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_llrint.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_llrint.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_llrint.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_llrint.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/dbl-64/s_llrint.c>
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_llrintf.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_llrintf.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_llrintf.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_llrintf.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/flt-32/s_llrintf.c>
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_llround.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_llround.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_llround.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_llround.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/dbl-64/s_llround.c>
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_llroundf.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_llroundf.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_llroundf.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_llroundf.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/flt-32/s_llroundf.c>
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_lrint.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_lrint.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_lrint.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_lrint.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/dbl-64/s_lrint.c>
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_lrintf.S glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_lrintf.S
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_lrintf.S 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_lrintf.S 2007-04-16 13:01:08.000000000 -0700
@@ -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 <[hidden email]>, 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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_lround.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_lround.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_lround.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_lround.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/dbl-64/s_lround.c>
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_lroundf.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_lroundf.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_lroundf.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_lroundf.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/flt-32/s_lroundf.c>
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_rint.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_rint.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_rint.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_rint.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/dbl-64/s_rint.c>
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_rintf.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_rintf.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_rintf.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_rintf.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/flt-32/s_rintf.c>
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_round.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_round.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_round.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_round.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/dbl-64/s_round.c>
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_roundf.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_roundf.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_roundf.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_roundf.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/flt-32/s_roundf.c>
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_trunc.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_trunc.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_trunc.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_trunc.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/dbl-64/s_trunc.c>
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_truncf.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_truncf.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/s_truncf.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/s_truncf.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/flt-32/s_truncf.c>
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/setjmp-common.S glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/setjmp-common.S
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/setjmp-common.S 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/setjmp-common.S 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1,108 @@
+/* setjmp for PowerPC E500.
+   Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+   Contributed by Aldy Hernandez <[hidden email]>.
+
+   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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/setjmp.S glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/setjmp.S
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/setjmp.S 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/setjmp.S 2007-04-16 13:01:08.000000000 -0700
@@ -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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/strtofix.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/strtofix.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/strtofix.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/strtofix.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1,698 @@
+/* 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 <[hidden email]>, 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;
+ }
+    }
+
+  /* For numbers like "0x." with no hex digits, only the "0" is valid.  */
+  if (base == 16
+      && startp == start_of_digits
+      && dig_no == 0)
+    RETURN (0, start_of_digits - 1);
+
+  /* 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 += base == 16 ? 4 * int_no : 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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/strtosfix16.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/strtosfix16.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/strtosfix16.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/strtosfix16.c 2007-04-16 13:01:08.000000000 -0700
@@ -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 <[hidden email]>, 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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/strtosfix32.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/strtosfix32.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/strtosfix32.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/strtosfix32.c 2007-04-16 13:01:08.000000000 -0700
@@ -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 <[hidden email]>, 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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/strtosfix64.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/strtosfix64.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/strtosfix64.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/strtosfix64.c 2007-04-16 13:01:08.000000000 -0700
@@ -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 <[hidden email]>, 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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/strtoufix16.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/strtoufix16.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/strtoufix16.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/strtoufix16.c 2007-04-16 13:01:08.000000000 -0700
@@ -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 <[hidden email]>, 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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/strtoufix32.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/strtoufix32.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/strtoufix32.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/strtoufix32.c 2007-04-16 13:01:08.000000000 -0700
@@ -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 <[hidden email]>, 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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/strtoufix64.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/strtoufix64.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/strtoufix64.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/strtoufix64.c 2007-04-16 13:01:08.000000000 -0700
@@ -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 <[hidden email]>, 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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/t_sqrt.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/t_sqrt.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/t_sqrt.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/t_sqrt.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+/* Not needed.  */
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/tst-spepim.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/tst-spepim.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/tst-spepim.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/tst-spepim.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1,494 @@
+/* Test SPE PIM functions.
+   Copyright (C) 2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Joseph Myers <[hidden email]>, 2007.
+
+   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 <errno.h>
+#include <fenv.h>
+#include <spe.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+typedef int16_t sint16_t;
+typedef int32_t sint32_t;
+typedef int64_t sint64_t;
+
+#define SAT_MAX_U16 0xffff
+#define SAT_MAX_U32 0xffffffffu
+#define SAT_MAX_U64 0xffffffffffffffffull
+#define SAT_MAX_S16 0x7fff
+#define SAT_MAX_S32 0x7fffffff
+#define SAT_MAX_S64 0x7fffffffffffffffll
+#define SAT_MIN_S16 (-SAT_MAX_S16 - 1)
+#define SAT_MIN_S32 (-SAT_MAX_S32 - 1)
+#define SAT_MIN_S64 (-SAT_MAX_S64 - 1)
+
+/* Test results for a single rounding mode.  For each type of result,
+   store the expected result and the expected errno.  */
+struct res {
+  sint16_t s16;
+  int es16;
+  sint32_t s32;
+  int es32;
+  sint64_t s64;
+  int es64;
+  uint16_t u16;
+  int eu16;
+  uint32_t u32;
+  int eu32;
+  uint64_t u64;
+  int eu64;
+};
+
+struct testcase {
+  /* String to test.  */
+  const char *s;
+  /* Number of junk characters at end.  */
+  size_t njunk;
+  /* Expected results for rounding to nearest, zero, upward and
+     downward.  */
+  struct res res[4];
+};
+
+/* Saturating value.  */
+#define SAT(VAL) VAL, ERANGE
+/* Unsaturating value.  */
+#define UNSAT(VAL) VAL, 0
+/* Values saturating for both signed and unsigned.  */
+#define SAT6(VAL0, VAL1, VAL2, VAL3, VAL4, VAL5) \
+  { \
+    SAT (VAL0), SAT (VAL1), SAT (VAL2), \
+    SAT (VAL3), SAT (VAL4), SAT (VAL5) \
+  }
+#define SAT6_MAX \
+  SAT6 (SAT_MAX_S16, SAT_MAX_S32, SAT_MAX_S64, \
+ SAT_MAX_U16, SAT_MAX_U32, SAT_MAX_U64)
+#define SAT6_MIN \
+  SAT6 (SAT_MIN_S16, SAT_MIN_S32, SAT_MIN_S64, 0, 0, 0)
+/* Values saturating for unsigned but not signed.  */
+#define SATNEG(VAL0, VAL1, VAL2) \
+  { \
+    UNSAT (VAL0), UNSAT (VAL1), UNSAT (VAL2), \
+    SAT (0), SAT (0), SAT (0) \
+  }
+/* Values not saturating.  */
+#define UNSAT6(VAL0, VAL1, VAL2, VAL3, VAL4, VAL5) \
+  { \
+    UNSAT (VAL0), UNSAT (VAL1), UNSAT (VAL2), \
+    UNSAT (VAL3), UNSAT (VAL4), UNSAT (VAL5) \
+  }
+/* Results not depending on rounding mode.  */
+#define EXACT_SAT6_MAX \
+  { \
+    SAT6_MAX, \
+    SAT6_MAX, \
+    SAT6_MAX, \
+    SAT6_MAX \
+  }
+#define EXACT_SAT6_MIN \
+  { \
+    SAT6_MIN, \
+    SAT6_MIN, \
+    SAT6_MIN, \
+    SAT6_MIN \
+  }
+#define EXACT_SATNEG(VAL0, VAL1, VAL2) \
+  { \
+    SATNEG (VAL0, VAL1, VAL2), \
+    SATNEG (VAL0, VAL1, VAL2), \
+    SATNEG (VAL0, VAL1, VAL2), \
+    SATNEG (VAL0, VAL1, VAL2) \
+  }
+#define EXACT_UNSAT6(VAL0, VAL1, VAL2, VAL3, VAL4, VAL5) \
+  { \
+    UNSAT6 (VAL0, VAL1, VAL2, VAL3, VAL4, VAL5), \
+    UNSAT6 (VAL0, VAL1, VAL2, VAL3, VAL4, VAL5), \
+    UNSAT6 (VAL0, VAL1, VAL2, VAL3, VAL4, VAL5), \
+    UNSAT6 (VAL0, VAL1, VAL2, VAL3, VAL4, VAL5) \
+  }
+
+static const struct testcase tests[] = {
+  /* Strings evaluating to 0, including INF and NaN (not supported by
+     SPE PIM functions).  */
+  { "", 0, EXACT_UNSAT6 (0, 0, 0, 0, 0, 0) },
+  { "0", 0, EXACT_UNSAT6 (0, 0, 0, 0, 0, 0) },
+  { "00", 0, EXACT_UNSAT6 (0, 0, 0, 0, 0, 0) },
+  { "+0", 0, EXACT_UNSAT6 (0, 0, 0, 0, 0, 0) },
+  { "-0", 0, EXACT_UNSAT6 (0, 0, 0, 0, 0, 0) },
+  { "0.0", 0, EXACT_UNSAT6 (0, 0, 0, 0, 0, 0) },
+  { ".0", 0, EXACT_UNSAT6 (0, 0, 0, 0, 0, 0) },
+  { "0.", 0, EXACT_UNSAT6 (0, 0, 0, 0, 0, 0) },
+  { " \n-0.", 0, EXACT_UNSAT6 (0, 0, 0, 0, 0, 0) },
+  { "0e100000000000000000", 0, EXACT_UNSAT6 (0, 0, 0, 0, 0, 0) },
+  { " \t 0e-100000000000000000", 0, EXACT_UNSAT6 (0, 0, 0, 0, 0, 0) },
+  { "0x0", 0, EXACT_UNSAT6 (0, 0, 0, 0, 0, 0) },
+  { "0x0.", 0, EXACT_UNSAT6 (0, 0, 0, 0, 0, 0) },
+  { "0x.0", 0, EXACT_UNSAT6 (0, 0, 0, 0, 0, 0) },
+  { "0x0.p100000000000000000", 0, EXACT_UNSAT6 (0, 0, 0, 0, 0, 0) },
+  { "-0x0.p002000000000000000", 0, EXACT_UNSAT6 (0, 0, 0, 0, 0, 0) },
+  { "0x.0p-100000000000000000", 0, EXACT_UNSAT6 (0, 0, 0, 0, 0, 0) },
+  { "0x", 1, EXACT_UNSAT6 (0, 0, 0, 0, 0, 0) },
+  { "0x.", 2, EXACT_UNSAT6 (0, 0, 0, 0, 0, 0) },
+  { ".", 1, EXACT_UNSAT6 (0, 0, 0, 0, 0, 0) },
+  { " .", 2, EXACT_UNSAT6 (0, 0, 0, 0, 0, 0) },
+  { "+.", 2, EXACT_UNSAT6 (0, 0, 0, 0, 0, 0) },
+  { " +.", 3, EXACT_UNSAT6 (0, 0, 0, 0, 0, 0) },
+  { " -.", 3, EXACT_UNSAT6 (0, 0, 0, 0, 0, 0) },
+  { "0xp", 2, EXACT_UNSAT6 (0, 0, 0, 0, 0, 0) },
+  { "0x.p", 3, EXACT_UNSAT6 (0, 0, 0, 0, 0, 0) },
+  { "+0x.p", 3, EXACT_UNSAT6 (0, 0, 0, 0, 0, 0) },
+  { "-0x.p0", 4, EXACT_UNSAT6 (0, 0, 0, 0, 0, 0) },
+  { "0x0q", 1, EXACT_UNSAT6 (0, 0, 0, 0, 0, 0) },
+  { "INF", 3, EXACT_UNSAT6 (0, 0, 0, 0, 0, 0) },
+  { "nan", 3, EXACT_UNSAT6 (0, 0, 0, 0, 0, 0) },
+  /* Strings evaluating to 1.0 or greater, saturating unconditionally.  */
+  { "1", 0, EXACT_SAT6_MAX },
+  { "1.0", 0, EXACT_SAT6_MAX },
+  { "1e0", 0, EXACT_SAT6_MAX },
+  { "10e-1", 0, EXACT_SAT6_MAX },
+  { "0.1e1", 0, EXACT_SAT6_MAX },
+  { "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-100", 0, EXACT_SAT6_MAX },
+  { "2", 0, EXACT_SAT6_MAX },
+  { "0x1", 0, EXACT_SAT6_MAX },
+  { "0x2p-1", 0, EXACT_SAT6_MAX },
+  { "0x.8p1", 0, EXACT_SAT6_MAX },
+  { "0x.40p2", 0, EXACT_SAT6_MAX },
+  /* Strings evaluating to less than -1.0, saturating unconditionally.  */
+  { "-1.1", 0, EXACT_SAT6_MIN },
+  { "-.11e1", 0, EXACT_SAT6_MIN },
+  { "-11e-1", 0, EXACT_SAT6_MIN },
+  { "-100", 0, EXACT_SAT6_MIN },
+  { "-2", 0, EXACT_SAT6_MIN },
+  { "-0x1.00000000000000000000000001", 0, EXACT_SAT6_MIN },
+  { "-0x2.00000000000000000000000001p-1", 0, EXACT_SAT6_MIN },
+  { "-0x0.80000000000000000000000001p1", 0, EXACT_SAT6_MIN },
+  { "-1.000000000000000000000000000000000000000000000000000000000000000000000000000000001", 0, EXACT_SAT6_MIN },
+  /* Strings evaluating to -1.0 exactly, saturating for unsigned but
+     exactly representable for signed.  */
+  { "-1", 0, EXACT_SATNEG (SAT_MIN_S16, SAT_MIN_S32, SAT_MIN_S64) },
+  { "-1e", 1, EXACT_SATNEG (SAT_MIN_S16, SAT_MIN_S32, SAT_MIN_S64) },
+  { "-1.0", 0, EXACT_SATNEG (SAT_MIN_S16, SAT_MIN_S32, SAT_MIN_S64) },
+  { "-10e-1", 0, EXACT_SATNEG (SAT_MIN_S16, SAT_MIN_S32, SAT_MIN_S64) },
+  { "-.1e+1", 0, EXACT_SATNEG (SAT_MIN_S16, SAT_MIN_S32, SAT_MIN_S64) },
+  { "-.0000000001e+10", 0, EXACT_SATNEG (SAT_MIN_S16, SAT_MIN_S32, SAT_MIN_S64) },
+  { "-10000000000e-10", 0, EXACT_SATNEG (SAT_MIN_S16, SAT_MIN_S32, SAT_MIN_S64) },
+  { "-0x1", 0, EXACT_SATNEG (SAT_MIN_S16, SAT_MIN_S32, SAT_MIN_S64) },
+  { "-0x1p+", 2, EXACT_SATNEG (SAT_MIN_S16, SAT_MIN_S32, SAT_MIN_S64) },
+  { "-0x2p-1", 0, EXACT_SATNEG (SAT_MIN_S16, SAT_MIN_S32, SAT_MIN_S64) },
+  { "-0x4.0p-2", 0, EXACT_SATNEG (SAT_MIN_S16, SAT_MIN_S32, SAT_MIN_S64) },
+  { "-0x8.p-3", 0, EXACT_SATNEG (SAT_MIN_S16, SAT_MIN_S32, SAT_MIN_S64) },
+  { "-0x10p-4", 0, EXACT_SATNEG (SAT_MIN_S16, SAT_MIN_S32, SAT_MIN_S64) },
+  { "-0x.8p1", 0, EXACT_SATNEG (SAT_MIN_S16, SAT_MIN_S32, SAT_MIN_S64) },
+  { "-0x.4p+2", 0, EXACT_SATNEG (SAT_MIN_S16, SAT_MIN_S32, SAT_MIN_S64) },
+  { "-0x.2p+3", 0, EXACT_SATNEG (SAT_MIN_S16, SAT_MIN_S32, SAT_MIN_S64) },
+  { "-0x.1p+4", 0, EXACT_SATNEG (SAT_MIN_S16, SAT_MIN_S32, SAT_MIN_S64) },
+  { "-0x.08p5", 0, EXACT_SATNEG (SAT_MIN_S16, SAT_MIN_S32, SAT_MIN_S64) },
+  /* Strings evaluating to exactly representable values between -1.0
+     and 0.0, saturating for unsigned.  */
+  { "-0.5", 0, EXACT_SATNEG (-0x4000, -0x40000000, -0x4000000000000000ll) },
+  { "-0.5e-", 2, EXACT_SATNEG (-0x4000, -0x40000000, -0x4000000000000000ll) },
+  { "-05e-1", 0, EXACT_SATNEG (-0x4000, -0x40000000, -0x4000000000000000ll) },
+  { "-05000000000e-10", 0, EXACT_SATNEG (-0x4000, -0x40000000, -0x4000000000000000ll) },
+  { "-0.5e0", 0, EXACT_SATNEG (-0x4000, -0x40000000, -0x4000000000000000ll) },
+  { "-0.00000000005e10", 0, EXACT_SATNEG (-0x4000, -0x40000000, -0x4000000000000000ll) },
+  { "-0x.8", 0, EXACT_SATNEG (-0x4000, -0x40000000, -0x4000000000000000ll) },
+  { "-0x1p-1", 0, EXACT_SATNEG (-0x4000, -0x40000000, -0x4000000000000000ll) },
+  { "-0x.4p1", 0, EXACT_SATNEG (-0x4000, -0x40000000, -0x4000000000000000ll) },
+  { "-0.25", 0, EXACT_SATNEG (-0x2000, -0x20000000, -0x2000000000000000ll) },
+  { "-2.5e-1", 0, EXACT_SATNEG (-0x2000, -0x20000000, -0x2000000000000000ll) },
+  { "-0.75", 0, EXACT_SATNEG (-0x6000, -0x60000000, -0x6000000000000000ll) },
+  { "-0.000030517578125", 0, EXACT_SATNEG (-0x0001, -0x00010000, -0x0001000000000000ll) },
+  { "-0.376739501953125", 0, EXACT_SATNEG (-12345, -12345*0x10000, -12345*0x1000000000000ll) },
+  { "-0x.dcba", 0, EXACT_SATNEG (-0x6e5d, -0x6e5d0000, -0x6e5d000000000000ll) },
+  { "-0xd.cbap-4", 0, EXACT_SATNEG (-0x6e5d, -0x6e5d0000, -0x6e5d000000000000ll) },
+  /* Strings evaluating to exactly representable values between 0.0
+     and 1.0.  */
+  { "0.5", 0, EXACT_UNSAT6 (0x4000, 0x40000000, 0x4000000000000000ll, 0x8000, 0x80000000u, 0x8000000000000000ull) },
+  { "0.5e-", 2, EXACT_UNSAT6 (0x4000, 0x40000000, 0x4000000000000000ll, 0x8000, 0x80000000u, 0x8000000000000000ull) },
+  { "05e-1", 0, EXACT_UNSAT6 (0x4000, 0x40000000, 0x4000000000000000ll, 0x8000, 0x80000000u, 0x8000000000000000ull) },
+  { "05000000000e-10", 0, EXACT_UNSAT6 (0x4000, 0x40000000, 0x4000000000000000ll, 0x8000, 0x80000000u, 0x8000000000000000ull) },
+  { "0.5e0", 0, EXACT_UNSAT6 (0x4000, 0x40000000, 0x4000000000000000ll, 0x8000, 0x80000000u, 0x8000000000000000ull) },
+  { "0.00000000005e10", 0, EXACT_UNSAT6 (0x4000, 0x40000000, 0x4000000000000000ll, 0x8000, 0x80000000u, 0x8000000000000000ull) },
+  { "0x.8", 0, EXACT_UNSAT6 (0x4000, 0x40000000, 0x4000000000000000ll, 0x8000, 0x80000000u, 0x8000000000000000ull) },
+  { "0x1p-1", 0, EXACT_UNSAT6 (0x4000, 0x40000000, 0x4000000000000000ll, 0x8000, 0x80000000u, 0x8000000000000000ull) },
+  { "0x.4p1", 0, EXACT_UNSAT6 (0x4000, 0x40000000, 0x4000000000000000ll, 0x8000, 0x80000000u, 0x8000000000000000ull) },
+  { "0.25", 0, EXACT_UNSAT6 (0x2000, 0x20000000, 0x2000000000000000ll, 0x4000, 0x40000000u, 0x4000000000000000ull) },
+  { "2.5e-1", 0, EXACT_UNSAT6 (0x2000, 0x20000000, 0x2000000000000000ll, 0x4000, 0x40000000u, 0x4000000000000000ull) },
+  { "0.75", 0, EXACT_UNSAT6 (0x6000, 0x60000000, 0x6000000000000000ll, 0xc000, 0xc0000000u, 0xc000000000000000ull) },
+  { "0.000030517578125", 0, EXACT_UNSAT6 (0x0001, 0x00010000, 0x0001000000000000ll, 0x0002, 0x00020000u, 0x0002000000000000ull) },
+  { "0.376739501953125", 0, EXACT_UNSAT6 (12345, 12345*0x10000, 12345*0x1000000000000ll, 12345*0x2, 12345*0x20000u, 12345*0x2000000000000ull) },
+  { "0x.dcba", 0, EXACT_UNSAT6 (0x6e5d, 0x6e5d0000, 0x6e5d000000000000ll, 0xdcba, 0xdcba0000u, 0xdcba000000000000ull) },
+  { "0xd.cbap-4", 0, EXACT_UNSAT6 (0x6e5d, 0x6e5d0000, 0x6e5d000000000000ll, 0xdcba, 0xdcba0000u, 0xdcba000000000000ull) },
+  /* Strings evaluating to values between 0.0 and 1.0, depending on
+     rounding mode.  */
+  { "0.1", 0,
+    {
+      UNSAT6 (0xccd, 0xccccccd, 0xccccccccccccccdll, 0x199a, 0x1999999au, 0x199999999999999aull),
+      UNSAT6 (0xccc, 0xccccccc, 0xcccccccccccccccll, 0x1999, 0x19999999u, 0x1999999999999999ull),
+      UNSAT6 (0xccd, 0xccccccd, 0xccccccccccccccdll, 0x199a, 0x1999999au, 0x199999999999999aull),
+      UNSAT6 (0xccc, 0xccccccc, 0xcccccccccccccccll, 0x1999, 0x19999999u, 0x1999999999999999ull)
+    }
+  },
+  { "0.5000152587890625", 0,
+    {
+      UNSAT6 (0x4000, 0x40008000, 0x4000800000000000ll, 0x8001, 0x80010000u, 0x8001000000000000ull),
+      UNSAT6 (0x4000, 0x40008000, 0x4000800000000000ll, 0x8001, 0x80010000u, 0x8001000000000000ull),
+      UNSAT6 (0x4001, 0x40008000, 0x4000800000000000ll, 0x8001, 0x80010000u, 0x8001000000000000ull),
+      UNSAT6 (0x4000, 0x40008000, 0x4000800000000000ll, 0x8001, 0x80010000u, 0x8001000000000000ull)
+    }
+  },
+  { "0.50001525878906250000000000000000000000000000000000000000000000000000000000001", 0,
+    {
+      UNSAT6 (0x4001, 0x40008000, 0x4000800000000000ll, 0x8001, 0x80010000u, 0x8001000000000000ull),
+      UNSAT6 (0x4000, 0x40008000, 0x4000800000000000ll, 0x8001, 0x80010000u, 0x8001000000000000ull),
+      UNSAT6 (0x4001, 0x40008001, 0x4000800000000001ll, 0x8002, 0x80010001u, 0x8001000000000001ull),
+      UNSAT6 (0x4000, 0x40008000, 0x4000800000000000ll, 0x8001, 0x80010000u, 0x8001000000000000ull)
+    }
+  },
+  { "0.50000000000000000008131516293641283255055896006524562835693359375", 0,
+    {
+      UNSAT6 (0x4000, 0x40000000, 0x4000000000000001ll, 0x8000, 0x80000000u, 0x8000000000000002ull),
+      UNSAT6 (0x4000, 0x40000000, 0x4000000000000000ll, 0x8000, 0x80000000u, 0x8000000000000001ull),
+      UNSAT6 (0x4001, 0x40000001, 0x4000000000000001ll, 0x8001, 0x80000001u, 0x8000000000000002ull),
+      UNSAT6 (0x4000, 0x40000000, 0x4000000000000000ll, 0x8000, 0x80000000u, 0x8000000000000001ull)
+    }
+  },
+  { "0.50000000000000000008131516293641283255055896006524562835693359376", 0,
+    {
+      UNSAT6 (0x4000, 0x40000000, 0x4000000000000001ll, 0x8000, 0x80000000u, 0x8000000000000002ull),
+      UNSAT6 (0x4000, 0x40000000, 0x4000000000000000ll, 0x8000, 0x80000000u, 0x8000000000000001ull),
+      UNSAT6 (0x4001, 0x40000001, 0x4000000000000001ll, 0x8001, 0x80000001u, 0x8000000000000002ull),
+      UNSAT6 (0x4000, 0x40000000, 0x4000000000000000ll, 0x8000, 0x80000000u, 0x8000000000000001ull)
+    }
+  },
+  { "0.50000000000000000008131516293641283255055896006524562835693359374", 0,
+    {
+      UNSAT6 (0x4000, 0x40000000, 0x4000000000000001ll, 0x8000, 0x80000000u, 0x8000000000000001ull),
+      UNSAT6 (0x4000, 0x40000000, 0x4000000000000000ll, 0x8000, 0x80000000u, 0x8000000000000001ull),
+      UNSAT6 (0x4001, 0x40000001, 0x4000000000000001ll, 0x8001, 0x80000001u, 0x8000000000000002ull),
+      UNSAT6 (0x4000, 0x40000000, 0x4000000000000000ll, 0x8000, 0x80000000u, 0x8000000000000001ull)
+    }
+  },
+  { "0x0.80000000000000018", 0,
+    {
+      UNSAT6 (0x4000, 0x40000000, 0x4000000000000001ll, 0x8000, 0x80000000u, 0x8000000000000002ull),
+      UNSAT6 (0x4000, 0x40000000, 0x4000000000000000ll, 0x8000, 0x80000000u, 0x8000000000000001ull),
+      UNSAT6 (0x4001, 0x40000001, 0x4000000000000001ll, 0x8001, 0x80000001u, 0x8000000000000002ull),
+      UNSAT6 (0x4000, 0x40000000, 0x4000000000000000ll, 0x8000, 0x80000000u, 0x8000000000000001ull)
+    }
+  },
+  { "0x0.80000000000000017", 0,
+    {
+      UNSAT6 (0x4000, 0x40000000, 0x4000000000000001ll, 0x8000, 0x80000000u, 0x8000000000000001ull),
+      UNSAT6 (0x4000, 0x40000000, 0x4000000000000000ll, 0x8000, 0x80000000u, 0x8000000000000001ull),
+      UNSAT6 (0x4001, 0x40000001, 0x4000000000000001ll, 0x8001, 0x80000001u, 0x8000000000000002ull),
+      UNSAT6 (0x4000, 0x40000000, 0x4000000000000000ll, 0x8000, 0x80000000u, 0x8000000000000001ull)
+    }
+  },
+  /* Strings evaluating to values between -1.0 and 0.0, depending on
+     rounding mode.  */
+  { "-0.1", 0,
+    {
+      SATNEG (-0xccd, -0xccccccd, -0xccccccccccccccdll),
+      SATNEG (-0xccc, -0xccccccc, -0xcccccccccccccccll),
+      SATNEG (-0xccc, -0xccccccc, -0xcccccccccccccccll),
+      SATNEG (-0xccd, -0xccccccd, -0xccccccccccccccdll)
+    }
+  },
+  { "-0.5000000000000000001626303258728256651011179201304912567138671875", 0,
+    {
+      SATNEG (-0x4000, -0x40000000, -0x4000000000000002ll),
+      SATNEG (-0x4000, -0x40000000, -0x4000000000000001ll),
+      SATNEG (-0x4000, -0x40000000, -0x4000000000000001ll),
+      SATNEG (-0x4001, -0x40000001, -0x4000000000000002ll)
+    }
+  },
+  { "-0.5000000000000000001626303258728256651011179201304912567138671874", 0,
+    {
+      SATNEG (-0x4000, -0x40000000, -0x4000000000000001ll),
+      SATNEG (-0x4000, -0x40000000, -0x4000000000000001ll),
+      SATNEG (-0x4000, -0x40000000, -0x4000000000000001ll),
+      SATNEG (-0x4001, -0x40000001, -0x4000000000000002ll)
+    }
+  },
+  { "-0.5000000000000000001626303258728256651011179201304912567138671876", 0,
+    {
+      SATNEG (-0x4000, -0x40000000, -0x4000000000000002ll),
+      SATNEG (-0x4000, -0x40000000, -0x4000000000000001ll),
+      SATNEG (-0x4000, -0x40000000, -0x4000000000000001ll),
+      SATNEG (-0x4001, -0x40000001, -0x4000000000000002ll)
+    }
+  },
+  { "-0x.8000000000000003", 0,
+    {
+      SATNEG (-0x4000, -0x40000000, -0x4000000000000002ll),
+      SATNEG (-0x4000, -0x40000000, -0x4000000000000001ll),
+      SATNEG (-0x4000, -0x40000000, -0x4000000000000001ll),
+      SATNEG (-0x4001, -0x40000001, -0x4000000000000002ll)
+    }
+  },
+  { "-0x.8000000000000002f", 0,
+    {
+      SATNEG (-0x4000, -0x40000000, -0x4000000000000001ll),
+      SATNEG (-0x4000, -0x40000000, -0x4000000000000001ll),
+      SATNEG (-0x4000, -0x40000000, -0x4000000000000001ll),
+      SATNEG (-0x4001, -0x40000001, -0x4000000000000002ll)
+    }
+  },
+  /* Strings evaluating very close to 1.0, saturation depending on
+     rounding mode.  */
+  { "0x.fffe1", 0,
+    {
+      { UNSAT (0x7fff), UNSAT (0x7fff0800), UNSAT (0x7fff080000000000ll), UNSAT (0xfffe), UNSAT (0xfffe1000u), UNSAT (0xfffe100000000000ull) },
+      { UNSAT (0x7fff), UNSAT (0x7fff0800), UNSAT (0x7fff080000000000ll), UNSAT (0xfffe), UNSAT (0xfffe1000u), UNSAT (0xfffe100000000000ull) },
+      { SAT (0x7fff), UNSAT (0x7fff0800), UNSAT (0x7fff080000000000ll), UNSAT (0xffff), UNSAT (0xfffe1000u), UNSAT (0xfffe100000000000ull) },
+      { UNSAT (0x7fff), UNSAT (0x7fff0800), UNSAT (0x7fff080000000000ll), UNSAT (0xfffe), UNSAT (0xfffe1000u), UNSAT (0xfffe100000000000ull) }
+    }
+  },
+  { "0x.ffff8", 0,
+    {
+      { SAT (0x7fff), UNSAT (0x7fffc000), UNSAT (0x7fffc00000000000ll), SAT (0xffff), UNSAT (0xffff8000u), UNSAT (0xffff800000000000ull) },
+      { UNSAT (0x7fff), UNSAT (0x7fffc000), UNSAT (0x7fffc00000000000ll), UNSAT (0xffff), UNSAT (0xffff8000u), UNSAT (0xffff800000000000ull) },
+      { SAT (0x7fff), UNSAT (0x7fffc000), UNSAT (0x7fffc00000000000ll), SAT (0xffff), UNSAT (0xffff8000u), UNSAT (0xffff800000000000ull) },
+      { UNSAT (0x7fff), UNSAT (0x7fffc000), UNSAT (0x7fffc00000000000ll), UNSAT (0xffff), UNSAT (0xffff8000u), UNSAT (0xffff800000000000ull) }
+    }
+  },
+  { "0x.fffffffffffffffff", 0,
+    {
+      { SAT (0x7fff), SAT (0x7fffffff), SAT (0x7fffffffffffffffll), SAT (0xffff), SAT (0xffffffffu), SAT (0xffffffffffffffffull) },
+      { UNSAT (0x7fff), UNSAT (0x7fffffff), UNSAT (0x7fffffffffffffffll), UNSAT (0xffff), UNSAT (0xffffffffu), UNSAT (0xffffffffffffffffull) },
+      { SAT (0x7fff), SAT (0x7fffffff), SAT (0x7fffffffffffffffll), SAT (0xffff), SAT (0xffffffffu), SAT (0xffffffffffffffffull) },
+      { UNSAT (0x7fff), UNSAT (0x7fffffff), UNSAT (0x7fffffffffffffffll), UNSAT (0xffff), UNSAT (0xffffffffu), UNSAT (0xffffffffffffffffull) }
+    }
+  },
+  /* Strings evaluating very close to -1.0, may round to -1 but only
+     saturate for unsigned.  */
+  { "-0x.fffe1", 0,
+    {
+      SATNEG (-0x7fff, -0x7fff0800, -0x7fff080000000000ll),
+      SATNEG (-0x7fff, -0x7fff0800, -0x7fff080000000000ll),
+      SATNEG (-0x7fff, -0x7fff0800, -0x7fff080000000000ll),
+      SATNEG (SAT_MIN_S16, -0x7fff0800, -0x7fff080000000000ll)
+    }
+  },
+  { "-0x.ffffffffffffffff", 0,
+    {
+      SATNEG (SAT_MIN_S16, SAT_MIN_S32, SAT_MIN_S64),
+      SATNEG (-0x7fff, -0x7fffffff, -0x7fffffffffffffffll),
+      SATNEG (-0x7fff, -0x7fffffff, -0x7fffffffffffffffll),
+      SATNEG (SAT_MIN_S16, SAT_MIN_S32, SAT_MIN_S64)
+    }
+  }
+};
+
+static const int rounding_modes[4] = {
+  FE_TONEAREST,
+  FE_TOWARDZERO,
+  FE_UPWARD,
+  FE_DOWNWARD
+};
+
+static const char *const mode_names[4] = {
+  "FE_TONEAREST",
+  "FE_TOWARDZERO",
+  "FE_UPWARD",
+  "FE_DOWNWARD"
+};
+
+int
+main (void)
+{
+  int passes = 0;
+  int fails = 0;
+  size_t i;
+  for (i = 0; i < sizeof (tests) / sizeof (tests[0]); i++)
+    {
+      size_t j;
+      for (j = 0; j < 4; j++)
+ {
+  if (fesetround (rounding_modes[j]) != 0)
+    {
+      printf ("fesetround (%s) failed.\n", mode_names[j]);
+      abort ();
+    }
+#define DO_TEST(SU, SZ, PR) \
+  do { \
+    SU##int##SZ##_t expret = tests[i].res[j].SU##SZ; \
+    int experr = tests[i].res[j].e##SU##SZ; \
+    size_t explen = strlen (tests[i].s) - tests[i].njunk; \
+    SU##int##SZ##_t ret0, ret1; \
+    int reterr; \
+    size_t retlen; \
+    char *ep; \
+    errno = 0; \
+    ret0 = strto##SU##fix##SZ (tests[i].s, &ep); \
+    reterr = errno; \
+    retlen = ep - tests[i].s; \
+    if (ret0 == expret) \
+      passes++; \
+    else \
+      { \
+ fails++; \
+ printf ("strto"#SU"fix"#SZ" (\"%s\") in mode %s " \
+ "returned %0"PR"x, expected %0"PR"x.\n", \
+ tests[i].s, mode_names[j], ret0, expret); \
+      } \
+    if (reterr == experr) \
+      passes++; \
+    else \
+      { \
+ fails++; \
+ printf ("strto"#SU"fix"#SZ" (\"%s\") in mode %s " \
+ "left errno as %d, expected %d.\n", \
+ tests[i].s, mode_names[j], reterr, experr); \
+      } \
+    if (retlen == explen) \
+      passes++; \
+    else \
+      { \
+ fails++; \
+ printf ("strto"#SU"fix"#SZ" (\"%s\") in mode %s " \
+ "consumed %zu characters, expected %zu.\n", \
+ tests[i].s, mode_names[j], retlen, explen); \
+      } \
+    if (experr == 0) \
+      { \
+ ret1 = ato##SU##fix##SZ (tests[i].s); \
+ if (ret1 == expret) \
+  passes++; \
+ else \
+  { \
+    fails++; \
+    printf ("ato"#SU"fix"#SZ" (\"%s\") in mode %s " \
+    "returned %0"PR"x, expected %0"PR"x.\n", \
+    tests[i].s, mode_names[j], ret1, expret); \
+  } \
+      } \
+  } while (0)
+  DO_TEST (s, 16, "4h");
+  DO_TEST (s, 32, "8");
+  DO_TEST (s, 64, "16ll");
+  DO_TEST (u, 16, "4h");
+  DO_TEST (u, 32, "8");
+  DO_TEST (u, 64, "16ll");
+ }
+    }
+  printf ("Number of passes: %d\nNumber of failures: %d\n", passes, fails);
+  return fails != 0;
+}
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/w_sqrt.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/w_sqrt.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/w_sqrt.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/w_sqrt.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+#include <math/w_sqrt.c>
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/w_sqrtf.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/w_sqrtf.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/fpu/w_sqrtf.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/fpu/w_sqrtf.c 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+#include <math/w_sqrtf.c>
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/soft-fp/Makefile glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/soft-fp/Makefile
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/soft-fp/Makefile 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/soft-fp/Makefile 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1,4 @@
+# Double precision floating point gets emulated.
+ifeq ($(subdir),soft-fp)
+sysdep_routines += $(gcc-double-routines) fraiseexcept-soft
+endif
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/soft-fp/Subdirs glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/soft-fp/Subdirs
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/soft-fp/Subdirs 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/soft-fp/Subdirs 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+soft-fp
diff -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/soft-fp/Versions glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/soft-fp/Versions
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/soft-fp/Versions 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/soft-fp/Versions 2007-04-16 13:01:08.000000000 -0700
@@ -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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/soft-fp/fraiseexcept-soft.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/soft-fp/fraiseexcept-soft.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/soft-fp/fraiseexcept-soft.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/soft-fp/fraiseexcept-soft.c 2007-04-16 13:01:08.000000000 -0700
@@ -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 <[hidden email]>, 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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/soft-fp/sfp-machine.h glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/soft-fp/sfp-machine.h
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/soft-fp/sfp-machine.h 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/soft-fp/sfp-machine.h 2007-04-16 13:01:08.000000000 -0700
@@ -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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/spe-raise.c glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/spe-raise.c
--- glibc-ports-mainline.orig/sysdeps/powerpc/powerpc32/e500/spe-raise.c 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/powerpc32/e500/spe-raise.c 2007-04-16 13:01:08.000000000 -0700
@@ -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 -rupN glibc-ports-mainline.orig/sysdeps/powerpc/preconfigure glibc-ports-mainline/sysdeps/powerpc/preconfigure
--- glibc-ports-mainline.orig/sysdeps/powerpc/preconfigure 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/powerpc/preconfigure 2007-04-16 13:01:08.000000000 -0700
@@ -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 -rupN glibc-ports-mainline.orig/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/Implies glibc-ports-mainline/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/Implies
--- glibc-ports-mainline.orig/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/Implies 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/Implies 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+powerpc/powerpc32/e500/fpu
diff -rupN glibc-ports-mainline.orig/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/getcontext-extra.S glibc-ports-mainline/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/getcontext-extra.S
--- glibc-ports-mainline.orig/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/getcontext-extra.S 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/getcontext-extra.S 2007-04-16 13:01:57.000000000 -0700
@@ -0,0 +1,61 @@
+/* Save current context.  Support for saving high parts of registers.
+   Copyright (C) 2006, 2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Joseph Myers <[hidden email]>, 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.  */
+.macro getcontext_extra
+ 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)
+.endm
+#define __GETCONTEXT_EXTRA getcontext_extra
diff -rupN glibc-ports-mainline.orig/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/getcontext.S glibc-ports-mainline/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/getcontext.S
--- glibc-ports-mainline.orig/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/getcontext.S 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/getcontext.S 2007-04-16 13:01:57.000000000 -0700
@@ -0,0 +1,60 @@
+/* Save current context.
+   Copyright (C) 2002, 2004, 2005, 2006, 2007 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
+#include "getcontext-extra.S"
+
+#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 -rupN glibc-ports-mainline.orig/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/setcontext-extra.S glibc-ports-mainline/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/setcontext-extra.S
--- glibc-ports-mainline.orig/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/setcontext-extra.S 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/setcontext-extra.S 2007-04-16 13:01:57.000000000 -0700
@@ -0,0 +1,93 @@
+/* Jump to a new context.  Support for restoring high parts of registers.
+   Copyright (C) 2006, 2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Joseph Myers <[hidden email]>, 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.  */
+
+.macro setcontext_extra
+ 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
+.endm
+#define __SETCONTEXT_EXTRA setcontext_extra
diff -rupN glibc-ports-mainline.orig/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/setcontext.S glibc-ports-mainline/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/setcontext.S
--- glibc-ports-mainline.orig/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/setcontext.S 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/setcontext.S 2007-04-16 13:01:57.000000000 -0700
@@ -0,0 +1,60 @@
+/* Jump to a new context.
+   Copyright (C) 2002, 2004, 2005, 2006, 2007 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
+#include "setcontext-extra.S"
+
+#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 -rupN glibc-ports-mainline.orig/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/swapcontext.S glibc-ports-mainline/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/swapcontext.S
--- glibc-ports-mainline.orig/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/swapcontext.S 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/fpu/swapcontext.S 2007-04-16 13:01:57.000000000 -0700
@@ -0,0 +1,61 @@
+/* Save current context and jump to a new context.
+   Copyright (C) 2002, 2004, 2005, 2006, 2007 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
+#include "getcontext-extra.S"
+#include "setcontext-extra.S"
+
+# 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 -rupN glibc-ports-mainline.orig/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/single/Implies glibc-ports-mainline/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/single/Implies
--- glibc-ports-mainline.orig/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/single/Implies 1969-12-31 16:00:00.000000000 -0800
+++ glibc-ports-mainline/sysdeps/unix/sysv/linux/powerpc/powerpc32/e500/single/Implies 2007-04-16 13:01:08.000000000 -0700
@@ -0,0 +1 @@
+powerpc/powerpc32/e500/soft-fp













2007-04-17  Joseph Myers  <[hidden email]>

        * sysdeps/powerpc/fpu/bits/fenvinline.h: Check __NO_FPRS__ as well
        as _SOFT_FLOAT.
        * sysdeps/powerpc/fpu/bits/mathinline.h: Likewise.
        * sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext-common.S:
        Include text of __GETCONTEXT_EXTRA if defined
        * sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext-common.S:
        Include text of __SETCONTEXT_EXTRA if defined.
        * sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext-common.S:
        Include text of __GETCONTEXT_EXTRA and __SETCONTEXT_EXTRA if
        defined.

diff -rupN glibc-mainline.orig/sysdeps/powerpc/fpu/bits/fenvinline.h glibc-mainline/sysdeps/powerpc/fpu/bits/fenvinline.h
--- glibc-mainline.orig/sysdeps/powerpc/fpu/bits/fenvinline.h 2006-02-03 14:28:37.000000000 -0800
+++ glibc-mainline/sysdeps/powerpc/fpu/bits/fenvinline.h 2007-04-16 13:01:39.000000000 -0700
@@ -18,7 +18,8 @@
    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 _SOFT_FLOAT && !defined __NO_FPRS__ \
+  && !defined __NO_MATH_INLINES
 
 /* Inline definition for fegetround.  */
 # define fegetround() \
@@ -58,4 +59,4 @@
       : 0)      \
    : (feclearexcept) (__excepts))
 
-#endif /* __GNUC__ && !_SOFT_FLOAT */
+#endif /* __GNUC__ && !__NO_FPRS__ */
diff -rupN glibc-mainline.orig/sysdeps/powerpc/fpu/bits/mathinline.h glibc-mainline/sysdeps/powerpc/fpu/bits/mathinline.h
--- glibc-mainline.orig/sysdeps/powerpc/fpu/bits/mathinline.h 2007-03-17 10:04:10.000000000 -0700
+++ glibc-mainline/sysdeps/powerpc/fpu/bits/mathinline.h 2007-04-16 13:01:39.000000000 -0700
@@ -28,7 +28,7 @@
 # define __MATH_INLINE __extern_inline
 #endif  /* __cplusplus */
 
-#if defined __GNUC__ && !defined _SOFT_FLOAT
+#if defined __GNUC__ && !defined _SOFT_FLOAT && !defined __NO_FPRS__
 
 #ifdef __USE_ISOC99
 # if !__GNUC_PREREQ (2,97)
@@ -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 -rupN glibc-mainline.orig/sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext-common.S glibc-mainline/sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext-common.S
--- glibc-mainline.orig/sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext-common.S 2006-01-06 19:56:26.000000000 -0800
+++ glibc-mainline/sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext-common.S 2007-04-16 13:01:39.000000000 -0700
@@ -267,6 +267,11 @@ ENTRY(__CONTEXT_FUNC_NAME)
 2: /* L(no_vec): */
 # endif
 #endif
+
+#ifdef __GETCONTEXT_EXTRA
+ __GETCONTEXT_EXTRA
+#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 -rupN glibc-mainline.orig/sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext-common.S glibc-mainline/sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext-common.S
--- glibc-mainline.orig/sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext-common.S 2006-03-16 03:48:55.000000000 -0800
+++ glibc-mainline/sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext-common.S 2007-04-16 13:01:39.000000000 -0700
@@ -233,6 +233,10 @@ ENTRY(__CONTEXT_FUNC_NAME)
  lfd fp31,_UC_FREGS+(31*8)(r31)
 #endif /* __CONTEXT_ENABLE_FPRS */
 
+#ifdef __SETCONTEXT_EXTRA
+ __SETCONTEXT_EXTRA
+#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 -rupN glibc-mainline.orig/sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext-common.S glibc-mainline/sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext-common.S
--- glibc-mainline.orig/sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext-common.S 2006-01-06 19:56:26.000000000 -0800
+++ glibc-mainline/sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext-common.S 2007-04-16 13:01:39.000000000 -0700
@@ -270,6 +270,10 @@ ENTRY(__CONTEXT_FUNC_NAME)
 # endif /* __CONTEXT_ENABLE_VRS */
 #endif /* __CONTEXT_ENABLE_FPRS */
 
+#ifdef __GETCONTEXT_EXTRA
+ __GETCONTEXT_EXTRA
+#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 __SETCONTEXT_EXTRA
+ __SETCONTEXT_EXTRA
+#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)





--
Joseph S. Myers
[hidden email]
Reply | Threaded
Open this post in threaded view
|

Re: Ping Re: PowerPC E500 port

Roland McGrath
The log entry should mention each new file by name.

Make preconfigure be preconfigure.in and use a proper autoconf test if you
are going to do a compiler test.  That whole bit seems pretty questionable
to me.  Perhaps you should just be using --with-cpu=e500.  

I'm really not convinced that the *to*fix symbols belong in libc at all.
Why aren't they just in some other little library you can provide with gcc?

As for the soft-fp symbols, what's with the GLIBC_2.5?
If it's new now, it's GLIBC_2.6.  

I'd like some other ppc people to comment on the actual code, which I
haven't really looked into.


Thanks,
Roland
Reply | Threaded
Open this post in threaded view
|

Re: Ping Re: PowerPC E500 port

Joseph Myers
On Fri, 11 May 2007, Roland McGrath wrote:

> I'm really not convinced that the *to*fix symbols belong in libc at all.
> Why aren't they just in some other little library you can provide with gcc?

Different trade-offs are appropriate for users of different C libraries;
newlib and uClibc use a different implementation that's smaller but less
accurate.  Existing practice regarding ABI-specified functions when they
aren't of the nature of functions generally included in libgcc puts them
in libc (e.g., the ARM EABI functions in glibc).

> As for the soft-fp symbols, what's with the GLIBC_2.5?
> If it's new now, it's GLIBC_2.6.  

Existing practice with users of this code has both the GLIBC_2.3.3 and
GLIBC_2.5 symbols.  Existing practice for development of new ports is to
develop the code (using versions current at that time) and get it in use
among users of that hardware, then merge in with the same symbol versions
as are in use in the field (so ColdFire was merged with GLIBC_2.4 version
although that merge was just after 2.5 branched).

--
Joseph S. Myers
[hidden email]
Reply | Threaded
Open this post in threaded view
|

Re: Ping Re: PowerPC E500 port

Roland McGrath
> Different trade-offs are appropriate for users of different C libraries;
> newlib and uClibc use a different implementation that's smaller but less
> accurate.  Existing practice regarding ABI-specified functions when they
> aren't of the nature of functions generally included in libgcc puts them
> in libc (e.g., the ARM EABI functions in glibc).

Ok, I don't much care for an obscure port.  
I would not repeat that mistake the future, however.
New machine-independent user interfaces belong in separate libraries.

> Existing practice with users of this code has both the GLIBC_2.3.3 and
> GLIBC_2.5 symbols.  Existing practice for development of new ports is to
> develop the code (using versions current at that time) and get it in use
> among users of that hardware, then merge in with the same symbol versions
> as are in use in the field (so ColdFire was merged with GLIBC_2.4 version
> although that merge was just after 2.5 branched).

Ok.


Thanks,
Roland
Reply | Threaded
Open this post in threaded view
|

Re: Ping Re: PowerPC E500 port

Daniel Jacobowitz-2
In reply to this post by Joseph Myers
On Tue, Apr 17, 2007 at 11:55:48AM +0000, Joseph S. Myers wrote:

> Here are new versions of the patches, revised as requested.  For
> reference, the original submission was
> <http://sourceware.org/ml/libc-ports/2007-02/msg00002.html>.
>
>
> 2007-04-17  Joseph Myers  <[hidden email]>
>
> 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.
>

Steve, Roland wanted someone to look at the PPC-specific bits of this
before he or I checked it in.  Would you like to do that?

Failing that, I know Joseph has tested this code extensively, so I am
inclined to commit it.

--
Daniel Jacobowitz
CodeSourcery
Reply | Threaded
Open this post in threaded view
|

Re: Ping Re: PowerPC E500 port

Steve Munroe

Daniel Jacobowitz <[hidden email]> wrote on 05/23/2007 12:37:11 PM:

> On Tue, Apr 17, 2007 at 11:55:48AM +0000, Joseph S. Myers wrote:
> > Here are new versions of the patches, revised as requested.  For
> > reference, the original submission was
> > <http://sourceware.org/ml/libc-ports/2007-02/msg00002.html>.
> >
> >
> > 2007-04-17  Joseph Myers  <[hidden email]>
> >
> >    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.
> >
>
> Steve, Roland wanted someone to look at the PPC-specific bits of this
> before he or I checked it in.  Would you like to do that?
>

I'll take a look

Steven J. Munroe
Linux on Power Toolchain Architect
IBM Corporation, Linux Technology Center