packages/glibc/glibc_2.5.bb: The following set of patches adds support for soft-float...
authorStelios Koroneos <skoroneos@digital-opsis.com>
Mon, 12 Mar 2007 12:50:09 +0000 (12:50 +0000)
committerStelios Koroneos <skoroneos@digital-opsis.com>
Mon, 12 Mar 2007 12:50:09 +0000 (12:50 +0000)
without fpu for gcc 4.1.1/glibc 2.5

packages/glibc/files/ppc-ld-nofpu-20070104.patch [new file with mode: 0644]
packages/glibc/files/ppc-ports-ld-nofpu-20070114.patch [new file with mode: 0644]
packages/glibc/files/ppc-sfp-machine.patch [new file with mode: 0644]
packages/glibc/files/ppc-soft-fp-20070115.patch [new file with mode: 0644]
packages/glibc/glibc_2.5.bb

diff --git a/packages/glibc/files/ppc-ld-nofpu-20070104.patch b/packages/glibc/files/ppc-ld-nofpu-20070104.patch
new file mode 100644 (file)
index 0000000..d5b1d31
--- /dev/null
@@ -0,0 +1,190 @@
+2007-01-12  Steven Munroe  <sjmunroe@us.ibm.com>
+           Joe Kerian  <jkerian@us.us.ibm.com>
+
+       [BZ #2749]
+       * sysdeps/ieee754/ldbl-128ibm/s_copysignl.c:
+       Include <math_ldbl_opt.h>.
+       Remove weak_alias.  Use long_double_symbol macro.
+       (__copysignl): Use signbit() for comparison.
+       * sysdeps/ieee754/ldbl-128ibm/s_fabsl.c: Correct parms for
+       SET_LDOUBLE_WORDS64.
+
+       [BZ #2423, #2749]
+       * sysdeps/ieee754/ldbl-128ibm/s_ceill.c: Don't include <fenv_libc.h>.
+       (__ceill): Remove calls to fegetround(), fesetround().
+       * sysdeps/ieee754/ldbl-128ibm/s_floorl.c: Likewise.
+       * sysdeps/ieee754/ldbl-128ibm/s_roundl.c: Likewise.
+       * sysdeps/ieee754/ldbl-128ibm/s_truncl.c: Likewise.
+
+diff -urN libc25-cvstip-20070104/sysdeps/ieee754/ldbl-128ibm/s_ceill.c libc24/sysdeps/ieee754/ldbl-128ibm/s_ceill.c
+--- libc25-cvstip-20070104/sysdeps/ieee754/ldbl-128ibm/s_ceill.c       2006-03-16 05:46:37.000000000 -0600
++++ libc24/sysdeps/ieee754/ldbl-128ibm/s_ceill.c       2007-01-11 10:30:12.856890432 -0600
+@@ -19,7 +19,6 @@
+    02111-1307 USA.  */
+ #include <math.h>
+-#include <fenv_libc.h>
+ #include <math_ldbl_opt.h>
+ #include <float.h>
+ #include <ieee754.h>
+@@ -44,11 +43,9 @@
+                                            __builtin_inf ()), 1))
+     {
+       double orig_xh;
+-      int save_round = fegetround ();
+       /* Long double arithmetic, including the canonicalisation below,
+        only works in round-to-nearest mode.  */
+-      fesetround (FE_TONEAREST);
+       /* Convert the high double to integer.  */
+       orig_xh = xh;
+@@ -81,8 +78,6 @@
+       /* Ensure we return -0 rather than +0 when appropriate.  */
+       if (orig_xh < 0.0)
+       xh = -__builtin_fabs (xh);
+-
+-      fesetround (save_round);
+     }
+   return ldbl_pack (xh, xl);
+diff -urN libc25-cvstip-20070104/sysdeps/ieee754/ldbl-128ibm/s_copysignl.c libc24/sysdeps/ieee754/ldbl-128ibm/s_copysignl.c
+--- libc25-cvstip-20070104/sysdeps/ieee754/ldbl-128ibm/s_copysignl.c   2006-01-27 18:07:25.000000000 -0600
++++ libc24/sysdeps/ieee754/ldbl-128ibm/s_copysignl.c   2007-01-11 10:30:12.857890280 -0600
+@@ -25,6 +25,7 @@
+ #include "math.h"
+ #include "math_private.h"
++#include <math_ldbl_opt.h>
+ #ifdef __STDC__
+       long double __copysignl(long double x, long double y)
+@@ -33,13 +34,13 @@
+       long double x,y;
+ #endif
+ {
+-  if (y < 0.0)
+-    {
+-      if (x >= 0.0)
+-      x = -x;
+-    }
+-  else if (x < 0.0)
++  if( signbit(x) != signbit(y) )
+     x = -x;
+   return x;
+ }
+-weak_alias (__copysignl, copysignl)
++
++#ifdef IS_IN_libm
++long_double_symbol (libm, __copysignl, copysignl);
++#else
++long_double_symbol (libc, __copysignl, copysignl);
++#endif
+diff -urN libc25-cvstip-20070104/sysdeps/ieee754/ldbl-128ibm/s_fabsl.c libc24/sysdeps/ieee754/ldbl-128ibm/s_fabsl.c
+--- libc25-cvstip-20070104/sysdeps/ieee754/ldbl-128ibm/s_fabsl.c       2006-01-27 18:07:25.000000000 -0600
++++ libc24/sysdeps/ieee754/ldbl-128ibm/s_fabsl.c       2007-01-11 10:30:12.857890280 -0600
+@@ -37,7 +37,7 @@
+       GET_LDOUBLE_WORDS64(hx,lx,x);
+       lx = lx ^ ( hx & 0x8000000000000000LL );
+       hx = hx & 0x7fffffffffffffffLL;
+-      SET_LDOUBLE_WORDS64(hx,lx,x);
++      SET_LDOUBLE_WORDS64(x,hx,lx);
+         return x;
+ }
+ long_double_symbol (libm, __fabsl, fabsl);
+diff -urN libc25-cvstip-20070104/sysdeps/ieee754/ldbl-128ibm/s_floorl.c libc24/sysdeps/ieee754/ldbl-128ibm/s_floorl.c
+--- libc25-cvstip-20070104/sysdeps/ieee754/ldbl-128ibm/s_floorl.c      2006-03-16 05:46:37.000000000 -0600
++++ libc24/sysdeps/ieee754/ldbl-128ibm/s_floorl.c      2007-01-11 10:30:12.858890128 -0600
+@@ -19,7 +19,6 @@
+    02111-1307 USA.  */
+ #include <math.h>
+-#include <fenv_libc.h>
+ #include <math_ldbl_opt.h>
+ #include <float.h>
+ #include <ieee754.h>
+@@ -43,11 +42,8 @@
+                       && __builtin_isless (__builtin_fabs (xh),
+                                            __builtin_inf ()), 1))
+     {
+-      int save_round = fegetround ();
+-
+       /* Long double arithmetic, including the canonicalisation below,
+        only works in round-to-nearest mode.  */
+-      fesetround (FE_TONEAREST);
+       /* Convert the high double to integer.  */
+       hi = ldbl_nearbyint (xh);
+@@ -75,8 +71,6 @@
+       xh = hi;
+       xl = lo;
+       ldbl_canonicalize (&xh, &xl);
+-
+-      fesetround (save_round);
+     }
+   return ldbl_pack (xh, xl);
+diff -urN libc25-cvstip-20070104/sysdeps/ieee754/ldbl-128ibm/s_roundl.c libc24/sysdeps/ieee754/ldbl-128ibm/s_roundl.c
+--- libc25-cvstip-20070104/sysdeps/ieee754/ldbl-128ibm/s_roundl.c      2006-03-16 05:46:37.000000000 -0600
++++ libc24/sysdeps/ieee754/ldbl-128ibm/s_roundl.c      2007-01-11 10:30:12.859889976 -0600
+@@ -22,7 +22,6 @@
+    when it's coded in C.  */
+ #include <math.h>
+-#include <fenv_libc.h>
+ #include <math_ldbl_opt.h>
+ #include <float.h>
+ #include <ieee754.h>
+@@ -47,11 +46,9 @@
+                                            __builtin_inf ()), 1))
+     {
+       double orig_xh;
+-      int save_round = fegetround ();
+       /* Long double arithmetic, including the canonicalisation below,
+        only works in round-to-nearest mode.  */
+-      fesetround (FE_TONEAREST);
+       /* Convert the high double to integer.  */
+       orig_xh = xh;
+@@ -88,8 +85,6 @@
+       xh = hi;
+       xl = lo;
+       ldbl_canonicalize (&xh, &xl);
+-
+-      fesetround (save_round);
+     }
+   return ldbl_pack (xh, xl);
+diff -urN libc25-cvstip-20070104/sysdeps/ieee754/ldbl-128ibm/s_truncl.c libc24/sysdeps/ieee754/ldbl-128ibm/s_truncl.c
+--- libc25-cvstip-20070104/sysdeps/ieee754/ldbl-128ibm/s_truncl.c      2006-03-16 05:46:37.000000000 -0600
++++ libc24/sysdeps/ieee754/ldbl-128ibm/s_truncl.c      2007-01-11 10:30:12.860889824 -0600
+@@ -22,7 +22,6 @@
+    when it's coded in C.  */
+ #include <math.h>
+-#include <fenv_libc.h>
+ #include <math_ldbl_opt.h>
+ #include <float.h>
+ #include <ieee754.h>
+@@ -47,11 +46,9 @@
+                                            __builtin_inf ()), 1))
+     {
+       double orig_xh;
+-      int save_round = fegetround ();
+       /* Long double arithmetic, including the canonicalisation below,
+        only works in round-to-nearest mode.  */
+-      fesetround (FE_TONEAREST);
+       /* Convert the high double to integer.  */
+       orig_xh = xh;
+@@ -92,8 +89,6 @@
+       /* Ensure we return -0 rather than +0 when appropriate.  */
+       if (orig_xh < 0.0)
+       xh = -__builtin_fabs (xh);
+-
+-      fesetround (save_round);
+     }
+   return ldbl_pack (xh, xl);
diff --git a/packages/glibc/files/ppc-ports-ld-nofpu-20070114.patch b/packages/glibc/files/ppc-ports-ld-nofpu-20070114.patch
new file mode 100644 (file)
index 0000000..b4d9959
--- /dev/null
@@ -0,0 +1,38 @@
+2007-01-14  Steven Munroe  <sjmunroe@us.ibm.com>
+
+       [BZ #2749]
+       * sysdeps/powerpc/nofpu/fenv_libc.h: New file.
+
+diff -urN dummy-libc/ports-cvstip-20070104/sysdeps/powerpc/nofpu/fenv_libc.h libc25/ports/sysdeps/powerpc/nofpu/fenv_libc.h
+--- dummy-libc/ports-cvstip-20070104/sysdeps/powerpc/nofpu/fenv_libc.h Wed Dec 31 18:00:00 1969
++++ libc25/ports/sysdeps/powerpc/nofpu/fenv_libc.h     Thu Jan 11 11:00:53 2007
+@@ -0,0 +1,29 @@
++/* Internal libc stuff for floating point environment routines.
++   Copyright (C) 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.  */
++
++#ifndef _FENV_LIBC_H
++#define _FENV_LIBC_H  1
++
++/* fenv_libc.h is used in libm implementations of ldbl-128ibm.  So we
++   need this version in the soft-fp to at minimum include fenv.h to
++   get the fegetround definition.  */
++
++#include <fenv.h>
++ 
++#endif /* fenv_libc.h */
diff --git a/packages/glibc/files/ppc-sfp-machine.patch b/packages/glibc/files/ppc-sfp-machine.patch
new file mode 100644 (file)
index 0000000..6171a03
--- /dev/null
@@ -0,0 +1,297 @@
+This patch combined with the other patches from Bugzilla #2749 allows
+powerpc32 to build. The Subdirs pulls in the soft-fp directory from
+libc, The Implies pulls in the ports powerpc/soft-fp directory which
+includes sfp-machine.h
+
+The get/set/swapcontext changes overide the common implimentation in
+libc to avoid using hardware FP instructions.
+
+
+
+2006-06-01  Steven Munroe  <sjmunroe@us.ibm.com>
+
+       [BZ #2749]
+       * sysdeps/powerpc/soft-fp/Subdirs: New file.
+       * sysdeps/powerpc/soft-fp/sfp-machine.h: New file.
+       * sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/Implies: New file.
+
+       * sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/getcontext.S:
+       New file.
+       * sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/setcontext.S:
+       New file.
+       * sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/swapcontext.S:
+       New file.
+
+diff -urN dummy-libc/ports-cvstip-20060512/sysdeps/powerpc/soft-fp/Subdirs 
+libc24/ports/sysdeps/powerpc/soft-fp/Subdirs
+--- dummy-libc/ports-cvstip-20060512/sysdeps/powerpc/soft-fp/Subdirs   Wed Dec 31 18:00:00 1969
++++ libc24/ports/sysdeps/powerpc/soft-fp/Subdirs       Wed May 31 16:58:44 2006
+@@ -0,0 +1,1 @@
++soft-fp
+diff -urN dummy-libc/ports-cvstip-20060512/sysdeps/powerpc/soft-fp/sfp-machine.h 
+libc24/ports/sysdeps/powerpc/soft-fp/sfp-machine.h
+--- dummy-libc/ports-cvstip-20060512/sysdeps/powerpc/soft-fp/sfp-machine.h     Wed Dec 31 18:00:00 1969
++++ libc24/ports/sysdeps/powerpc/soft-fp/sfp-machine.h Wed May 31 13:57:07 2006
+@@ -0,0 +1,63 @@
++#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 FPSCR, which also correspond to the FE_* bits.  This makes
++   everything easier ;-).  */
++#define FP_EX_INVALID         (1 << (31 - 2))
++#define FP_EX_OVERFLOW        (1 << (31 - 3))
++#define FP_EX_UNDERFLOW       (1 << (31 - 4))
++#define FP_EX_DENORM          FP_EX_UNDERFLOW
++#define FP_EX_DIVZERO         (1 << (31 - 5))
++#define FP_EX_INEXACT         (1 << (31 - 6))
++
++#define FP_HANDLE_EXCEPTIONS  __simulate_exceptions (_fex)
++#define FP_ROUNDMODE          __sim_round_mode
++
++extern int __sim_exceptions;
++libc_hidden_proto (__sim_exceptions);
++extern int __sim_disabled_exceptions;
++libc_hidden_proto (__sim_disabled_exceptions);
++extern int __sim_round_mode;
++libc_hidden_proto (__sim_round_mode);
++
++extern void __simulate_exceptions (int x) attribute_hidden;
+diff -urN dummy-libc/ports-cvstip-20060512/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/Implies 
+libc24/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/Implies
+--- dummy-libc/ports-cvstip-20060512/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/Implies   Wed Dec 31 18:00:00 1969
++++ libc24/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/Implies       Wed May 31 15:46:44 2006
+@@ -0,0 +1,1 @@
++powerpc/soft-fp
+diff -urN dummy-libc/ports-cvstip-20060512/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/getcontext.S 
+libc24/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/getcontext.S
+--- dummy-libc/ports-cvstip-20060512/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/getcontext.S      Wed Dec 31 18:00:00 1969
++++ libc24/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/getcontext.S  Thu Jun 01 15:31:03 2006
+@@ -0,0 +1,59 @@
++/* Save current context.
++   Copyright (C) 2002, 2004, 2005 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-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 -urN dummy-libc/ports-cvstip-20060512/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/setcontext.S 
+libc24/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/setcontext.S
+--- dummy-libc/ports-cvstip-20060512/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/setcontext.S      Wed Dec 31 18:00:00 1969
++++ libc24/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/setcontext.S  Thu Jun 01 15:31:03 2006
+@@ -0,0 +1,59 @@
++/* Jump to a new context.
++   Copyright (C) 2002, 2004, 2005 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-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 -urN dummy-libc/ports-cvstip-20060512/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/swapcontext.S 
+libc24/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/swapcontext.S
+--- dummy-libc/ports-cvstip-20060512/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/swapcontext.S     Wed Dec 31 18:00:00 1969
++++ libc24/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/swapcontext.S Thu Jun 01 15:31:03 2006
+@@ -0,0 +1,59 @@
++/* Save current context and jump to a new context.
++   Copyright (C) 2002, 2004, 2005 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 "swapcontext-common.S"
++
++versioned_symbol (libc, __swapcontext, swapcontext, GLIBC_2_3_4)
++
++#if SHLIB_COMPAT (libc, GLIBC_2_3_3, GLIBC_2_3_4)
++
++/* For the nofpu case the old/new versions are the same function.  */  
++strong_alias (__swapcontext, __novec_swapcontext)
++
++compat_symbol (libc, __novec_swapcontext, swapcontext, GLIBC_2_3_3)
++
++#endif
++
++#if SHLIB_COMPAT (libc, GLIBC_2_1, GLIBC_2_3_3)
++
++#define _ERRNO_H      1
++#include <bits/errno.h>
++
++      compat_text_section
++ENTRY (__swapcontext_stub)
++      li      r3,ENOSYS
++      b       __syscall_error@local
++END (__swapcontext_stub)
++      .previous
++
++compat_symbol (libc, __swapcontext_stub, swapcontext, GLIBC_2_1)
++
++#endif
+
diff --git a/packages/glibc/files/ppc-soft-fp-20070115.patch b/packages/glibc/files/ppc-soft-fp-20070115.patch
new file mode 100644 (file)
index 0000000..a84bc2f
--- /dev/null
@@ -0,0 +1,182 @@
+2007-01-14  Steven Munroe  <sjmunroe@us.ibm.com>
+           Joe Kerian  <jkerian@us.us.ibm.com>
+
+       [BZ #2749]
+       * soft-fp/op-4.h (__FP_FRAC_SUB_3, __FP_FRAC_SUB_4): Correct borrow
+       handling for high words.
+       * soft-fp/op-common.h (_FP_OVERFLOW_SEMIRAW): Always set inexact
+       and overflow for infinity.
+       (_FP_PACK_SEMIRAW): Update comment.  Do not round if NaN or Inf.
+
+       * math/basic-test.c (truncdfsf_test): New function.
+       [!NO_LONG_DOUBLE] (trunctfsf_test): New function.
+       [!NO_LONG_DOUBLE] (trunctfdf_test): New function.
+       Change main() to do_test. Define TEST_FUNCTION. Include test-skeleton.c. 
+       (do_test): Run new tests.
+
+2007-01-15  Jakub Jelinek  <jakub@redhat.com>
+
+       * soft-fp/op-common.h (FP_TRUNC): When truncating a NaN, clear
+       workbits in semi-raw fraction.
+
+
+diff -urN libc25-cvstip-20070104/math/basic-test.c libc24/math/basic-test.c
+--- libc25-cvstip-20070104/math/basic-test.c   2001-07-05 23:55:35.000000000 -0500
++++ libc24/math/basic-test.c   2007-01-15 11:41:17.260963824 -0600
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 1999 Free Software Foundation, Inc.
++/* Copyright (C) 1999, 2007 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Andreas Jaeger <aj@suse.de>, 1999.
+@@ -107,17 +107,90 @@
+ TEST_FUNC (double_test, double, nan, DBL_EPSILON, HUGE_VAL)
+ #ifndef NO_LONG_DOUBLE
+ TEST_FUNC (ldouble_test, long double, nanl, LDBL_EPSILON, HUGE_VALL)
++
++void
++trunctfsf_test(void)
++{
++  volatile long double Inf_var, NaN_var, zero_var, one_var;
++  float x1, x2;
++
++  zero_var = 0.0;
++  one_var = 1.0;
++  NaN_var = zero_var/zero_var;
++  Inf_var = one_var / zero_var;
++
++  (void) &zero_var;
++  (void) &one_var;
++  (void) &NaN_var;
++  (void) &Inf_var;
++
++  x1 = (float)NaN_var;
++  check (" float x = (float)((long double)NaN))", isnan (x1) != 0);
++  x2 = (float)Inf_var;
++  check (" float x = (float)((long double)Inf))", isinf (x2) != 0);
++}
++
++void
++trunctfdf_test(void)
++{
++  volatile long double Inf_var, NaN_var, zero_var, one_var;
++  double x1, x2;
++
++  zero_var = 0.0;
++  one_var = 1.0;
++  NaN_var = zero_var/zero_var;
++  Inf_var = one_var / zero_var;
++
++  (void) &zero_var;
++  (void) &one_var;
++  (void) &NaN_var;
++  (void) &Inf_var;
++
++  x1 = (double)NaN_var;
++  check (" double x = (double)((long double)NaN))", isnan (x1) != 0);
++  x2 = (double)Inf_var;
++  check (" double x = (double)((long double)Inf))", isinf (x2) != 0);
++}
++
+ #endif
++void
++truncdfsf_test(void)
++{
++  volatile double Inf_var, NaN_var, zero_var, one_var;
++  float x1, x2;
++
++  zero_var = 0.0;
++  one_var = 1.0;
++  NaN_var = zero_var/zero_var;
++  Inf_var = one_var / zero_var;
++
++  (void) &zero_var;
++  (void) &one_var;
++  (void) &NaN_var;
++  (void) &Inf_var;
++
++  x1 = (float)NaN_var;
++  check (" float x = (float)((double)NaN))", isnan (x1) != 0);
++  x2 = (float)Inf_var;
++  check (" float x = (float)((double)Inf))", isinf (x2) != 0);
++}
++
+ int
+-main (void)
++do_test (void)
+ {
+   float_test ();
+   double_test ();
++  truncdfsf_test();
+ #ifndef NO_LONG_DOUBLE
+   ldouble_test ();
++  trunctfsf_test();
++  trunctfdf_test();
+ #endif
+   return errors != 0;
+ }
++
++#define TEST_FUNCTION do_test ()
++#include "../test-skeleton.c"
+diff -urN libc25-cvstip-20070104/soft-fp/op-4.h libc24/soft-fp/op-4.h
+--- libc25-cvstip-20070104/soft-fp/op-4.h      2006-04-04 03:24:47.000000000 -0500
++++ libc24/soft-fp/op-4.h      2007-01-11 11:00:53.000000000 -0600
+@@ -564,7 +564,7 @@
+     r1 = x1 - y1;                                             \
+     _c2 = r1 > x1;                                            \
+     r1 -= _c1;                                                        \
+-    _c2 |= r1 > _c1;                                          \
++    _c2 |= _c1 && (y1 == x1);                                 \
+     r2 = x2 - y2 - _c2;                                               \
+   } while (0)
+ #endif
+@@ -578,11 +578,11 @@
+     r1 = x1 - y1;                                             \
+     _c2 = r1 > x1;                                            \
+     r1 -= _c1;                                                        \
+-    _c2 |= r1 > _c1;                                          \
++    _c2 |= _c1 && (y1 == x1);                                 \
+     r2 = x2 - y2;                                             \
+     _c3 = r2 > x2;                                            \
+     r2 -= _c2;                                                        \
+-    _c3 |= r2 > _c2;                                          \
++    _c3 |= _c2 && (y2 == x2);                                 \
+     r3 = x3 - y3 - _c3;                                               \
+   } while (0)
+ #endif
+diff -urN libc25-cvstip-20070104/soft-fp/op-common.h libc24/soft-fp/op-common.h
+--- libc25-cvstip-20070104/soft-fp/op-common.h 2006-04-04 03:24:47.000000000 -0500
++++ libc24/soft-fp/op-common.h 2007-01-15 11:46:17.290882288 -0600
+@@ -1,5 +1,5 @@
+ /* Software floating-point emulation. Common operations.
+-   Copyright (C) 1997,1998,1999,2006 Free Software Foundation, Inc.
++   Copyright (C) 1997,1998,1999,2006,2007 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Richard Henderson (rth@cygnus.com),
+                 Jakub Jelinek (jj@ultra.linux.cz),
+@@ -99,10 +99,10 @@
+   else                                                        \
+     {                                                 \
+       X##_e = _FP_EXPMAX_##fs - 1;                    \
+-      FP_SET_EXCEPTION(FP_EX_OVERFLOW);                       \
+-      FP_SET_EXCEPTION(FP_EX_INEXACT);                        \
+       _FP_FRAC_SET_##wc(X, _FP_MAXFRAC_##wc);         \
+     }                                                 \
++    FP_SET_EXCEPTION(FP_EX_INEXACT);                  \
++    FP_SET_EXCEPTION(FP_EX_OVERFLOW);                 \
+ } while (0)
+ /* Check for a semi-raw value being a signaling NaN and raise the
+@@ -1252,6 +1252,9 @@
+             _FP_FRAC_SRL_##swc(S, (_FP_WFRACBITS_##sfs                     \
+                                    - _FP_WFRACBITS_##dfs));                \
+             _FP_FRAC_COPY_##dwc##_##swc(D, S);                             \
++            /* Semi-raw NaN must have all workbits cleared.  */            \
++            _FP_FRAC_LOW_##dwc(D)                                          \
++              &= ~(_FP_W_TYPE) ((1 << _FP_WORKBITS) - 1);                  \
+             _FP_FRAC_HIGH_##dfs(D) |= _FP_QNANBIT_SH_##dfs;                \
+           }                                                                \
+       }                                                                    \
index f9f24bb..e34bf99 100644 (file)
@@ -5,7 +5,7 @@ ARM_INSTRUCTION_SET = "arm"
 PACKAGES_DYNAMIC = "libc6*"
 RPROVIDES_${PN}-dev = "libc6-dev"
 
-PR = "r4"
+PR = "r5"
 
 # the -isystem in bitbake.conf screws up glibc do_stage
 BUILD_CPPFLAGS = "-I${STAGING_DIR}/${BUILD_SYS}/include"
@@ -74,7 +74,12 @@ SRC_URI = "ftp://ftp.gnu.org/pub/gnu/glibc/glibc-${PV}.tar.bz2 \
 SRC_URI_append_sh3 = " file://no-z-defs.patch;patch=1"
 SRC_URI_append_sh4 = " file://no-z-defs.patch;patch=1"
 
-SRC_URI_append_powerpc = " file://powerpc-sqrt-hack.diff;patch=1"
+#powerpc patches to add support for soft-float
+SRC_URI_append_powerpc= " file://ppc-sfp-machine.patch;patch=1 \
+                          file://ppc-soft-fp-20070115.patch;patch=1 \
+                          file://ppc-ld-nofpu-20070104.patch;patch=1 \
+                          file://ppc-ports-ld-nofpu-20070114.patch;patch=1 \
+                          file://powerpc-sqrt-hack.diff;patch=1""
 
 S = "${WORKDIR}/glibc-${PV}"
 B = "${WORKDIR}/build-${TARGET_SYS}"