[OE-core] [PATCH 3/5] eglibc: Update 2.13 to avoid multilib conflicts

Richard Purdie richard.purdie at linuxfoundation.org
Mon Jul 25 13:47:18 UTC 2011


From: Mark Hatle <mark.hatle at windriver.com>

A number of headers were different between i386 and x86_64 builds.

Generally, the x86_64 version of the header is correct for both i386
and x86_64.  The arch-ia32.patch updates the 1386 fils with the x86_64
definitions so that we're using identical headers for both systems.  The
exception to this is bits/syscall.h, which is dynamically generated.
Use the oe_multilib_header to work around this issue.

Signed-off-by: Mark Hatle <mark.hatle at windriver.com>
---
 .../eglibc/eglibc-2.13/arch-ia32.patch             | 5309 ++++++++++++++++++++
 meta/recipes-core/eglibc/eglibc-package.inc        |    4 +-
 meta/recipes-core/eglibc/eglibc_2.13.bb            |    1 +
 3 files changed, 5313 insertions(+), 1 deletions(-)
 create mode 100644 meta/recipes-core/eglibc/eglibc-2.13/arch-ia32.patch

diff --git a/meta/recipes-core/eglibc/eglibc-2.13/arch-ia32.patch b/meta/recipes-core/eglibc/eglibc-2.13/arch-ia32.patch
new file mode 100644
index 0000000..6f1ea51
--- /dev/null
+++ b/meta/recipes-core/eglibc/eglibc-2.13/arch-ia32.patch
@@ -0,0 +1,5309 @@
+Sync the i386 and x86_64 headers into one common IA32 set of headers.
+
+The goal is to ensure that any headers produced in a 32-bit or 64-bit build
+are not only functionally equivalent, but actually the same in order to avoid
+file conflicts.
+
+The only remaining conflict is the bits/syscall.h.  This is dynamically
+generated, and so far I've been unable to figure out how to get both
+i386 and x86_64 to generate the same file.  We'll need to handle this
+in the recipe itself.
+
+Signed-off-by: Mark Hatle <mark.hatle at windriver.com>
+
+diff -urN libc.org/nptl/sysdeps/unix/sysv/linux/i386/bits/pthreadtypes.h libc/nptl/sysdeps/unix/sysv/linux/i386/bits/pthreadtypes.h
+--- libc.org/nptl/sysdeps/unix/sysv/linux/i386/bits/pthreadtypes.h	2011-05-06 23:48:07.000000000 -0500
++++ libc/nptl/sysdeps/unix/sysv/linux/i386/bits/pthreadtypes.h	2011-07-14 17:37:32.979710951 -0500
+@@ -1,5 +1,6 @@
+ /* Copyright (C) 2002,2003,2004,2005,2006,2007 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper at redhat.com>, 2002.
+ 
+    The GNU C Library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+@@ -19,16 +20,29 @@
+ #ifndef _BITS_PTHREADTYPES_H
+ #define _BITS_PTHREADTYPES_H	1
+ 
+-#define __SIZEOF_PTHREAD_ATTR_T 36
+-#define __SIZEOF_PTHREAD_MUTEX_T 24
+-#define __SIZEOF_PTHREAD_MUTEXATTR_T 4
+-#define __SIZEOF_PTHREAD_COND_T 48
+-#define __SIZEOF_PTHREAD_COND_COMPAT_T 12
+-#define __SIZEOF_PTHREAD_CONDATTR_T 4
+-#define __SIZEOF_PTHREAD_RWLOCK_T 32
+-#define __SIZEOF_PTHREAD_RWLOCKATTR_T 8
+-#define __SIZEOF_PTHREAD_BARRIER_T 20
+-#define __SIZEOF_PTHREAD_BARRIERATTR_T 4
++#include <bits/wordsize.h>
++
++#if __WORDSIZE == 64
++# define __SIZEOF_PTHREAD_ATTR_T 56
++# define __SIZEOF_PTHREAD_MUTEX_T 40
++# define __SIZEOF_PTHREAD_MUTEXATTR_T 4
++# define __SIZEOF_PTHREAD_COND_T 48
++# define __SIZEOF_PTHREAD_CONDATTR_T 4
++# define __SIZEOF_PTHREAD_RWLOCK_T 56
++# define __SIZEOF_PTHREAD_RWLOCKATTR_T 8
++# define __SIZEOF_PTHREAD_BARRIER_T 32
++# define __SIZEOF_PTHREAD_BARRIERATTR_T 4
++#else
++# define __SIZEOF_PTHREAD_ATTR_T 36
++# define __SIZEOF_PTHREAD_MUTEX_T 24
++# define __SIZEOF_PTHREAD_MUTEXATTR_T 4
++# define __SIZEOF_PTHREAD_COND_T 48
++# define __SIZEOF_PTHREAD_CONDATTR_T 4
++# define __SIZEOF_PTHREAD_RWLOCK_T 32
++# define __SIZEOF_PTHREAD_RWLOCKATTR_T 8
++# define __SIZEOF_PTHREAD_BARRIER_T 20
++# define __SIZEOF_PTHREAD_BARRIERATTR_T 4
++#endif
+ 
+ 
+ /* Thread identifiers.  The structure of the attribute type is not
+@@ -43,10 +57,18 @@
+ } pthread_attr_t;
+ 
+ 
++#if __WORDSIZE == 64
++typedef struct __pthread_internal_list
++{
++  struct __pthread_internal_list *__prev;
++  struct __pthread_internal_list *__next;
++} __pthread_list_t;
++#else
+ typedef struct __pthread_internal_slist
+ {
+   struct __pthread_internal_slist *__next;
+ } __pthread_slist_t;
++#endif
+ 
+ 
+ /* Data structures for mutex handling.  The structure of the attribute
+@@ -58,15 +80,24 @@
+     int __lock;
+     unsigned int __count;
+     int __owner;
++#if __WORDSIZE == 64
++    unsigned int __nusers;
++#endif
+     /* KIND must stay at this position in the structure to maintain
+        binary compatibility.  */
+     int __kind;
++#if __WORDSIZE == 64
++    int __spins;
++    __pthread_list_t __list;
++# define __PTHREAD_MUTEX_HAVE_PREV	1
++#else
+     unsigned int __nusers;
+     __extension__ union
+     {
+       int __spins;
+       __pthread_slist_t __list;
+     };
++#endif
+   } __data;
+   char __size[__SIZEOF_PTHREAD_MUTEX_T];
+   long int __align;
+@@ -75,7 +106,7 @@
+ typedef union
+ {
+   char __size[__SIZEOF_PTHREAD_MUTEXATTR_T];
+-  long int __align;
++  int __align;
+ } pthread_mutexattr_t;
+ 
+ 
+@@ -101,7 +132,7 @@
+ typedef union
+ {
+   char __size[__SIZEOF_PTHREAD_CONDATTR_T];
+-  long int __align;
++  int __align;
+ } pthread_condattr_t;
+ 
+ 
+@@ -118,6 +149,24 @@
+    structure of the attribute type is not exposed on purpose.  */
+ typedef union
+ {
++# if __WORDSIZE == 64
++  struct
++  {
++    int __lock;
++    unsigned int __nr_readers;
++    unsigned int __readers_wakeup;
++    unsigned int __writer_wakeup;
++    unsigned int __nr_readers_queued;
++    unsigned int __nr_writers_queued;
++    int __writer;
++    int __shared;
++    unsigned long int __pad1;
++    unsigned long int __pad2;
++    /* FLAGS must stay at this position in the structure to maintain
++       binary compatibility.  */
++    unsigned int __flags;
++  } __data;
++# else
+   struct
+   {
+     int __lock;
+@@ -134,6 +183,7 @@
+     unsigned char __pad2;
+     int __writer;
+   } __data;
++# endif
+   char __size[__SIZEOF_PTHREAD_RWLOCK_T];
+   long int __align;
+ } pthread_rwlock_t;
+@@ -167,7 +217,9 @@
+ #endif
+ 
+ 
++#if __WORDSIZE == 32
+ /* Extra attributes for the cleanup functions.  */
+-#define __cleanup_fct_attribute __attribute__ ((__regparm__ (1)))
++# define __cleanup_fct_attribute __attribute__ ((__regparm__ (1)))
++#endif
+ 
+ #endif	/* bits/pthreadtypes.h */
+diff -urN libc.org/nptl/sysdeps/unix/sysv/linux/i386/bits/semaphore.h libc/nptl/sysdeps/unix/sysv/linux/i386/bits/semaphore.h
+--- libc.org/nptl/sysdeps/unix/sysv/linux/i386/bits/semaphore.h	2011-05-06 23:48:07.000000000 -0500
++++ libc/nptl/sysdeps/unix/sysv/linux/i386/bits/semaphore.h	2011-07-14 17:38:15.725697161 -0500
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 2002 Free Software Foundation, Inc.
++/* Copyright (C) 2002, 2004 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper at redhat.com>, 2002.
+ 
+@@ -21,8 +21,13 @@
+ # error "Never use <bits/semaphore.h> directly; include <semaphore.h> instead."
+ #endif
+ 
++#include <bits/wordsize.h>
+ 
+-#define __SIZEOF_SEM_T	16
++#if __WORDSIZE == 64
++# define __SIZEOF_SEM_T	32
++#else
++# define __SIZEOF_SEM_T	16
++#endif
+ 
+ 
+ /* Value returned if `sem_open' failed.  */
+diff -urN libc.org/sysdeps/i386/bits/byteswap.h libc/sysdeps/i386/bits/byteswap.h
+--- libc.org/sysdeps/i386/bits/byteswap.h	2011-05-06 23:45:39.000000000 -0500
++++ libc/sysdeps/i386/bits/byteswap.h	2011-07-14 18:11:55.117758949 -0500
+@@ -25,13 +25,14 @@
+ #ifndef _BITS_BYTESWAP_H
+ #define _BITS_BYTESWAP_H 1
+ 
++#include <bits/wordsize.h>
++
+ /* Swap bytes in 16 bit value.  */
+ #define __bswap_constant_16(x) \
+      ((unsigned short int) ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8)))
+ 
+-#ifdef __GNUC__
+-# if __GNUC__ >= 2
+-#  define __bswap_16(x) \
++#if defined __GNUC__ && __GNUC__ >= 2
++# define __bswap_16(x) \
+      (__extension__							      \
+       ({ register unsigned short int __v, __x = (unsigned short int) (x);     \
+ 	 if (__builtin_constant_p (__x))				      \
+@@ -42,74 +43,62 @@
+ 		    : "0" (__x)						      \
+ 		    : "cc");						      \
+ 	 __v; }))
+-# else
++#else
+ /* This is better than nothing.  */
+-#  define __bswap_16(x) \
++# define __bswap_16(x) \
+      (__extension__							      \
+-      ({ register unsigned short int __x = (unsigned short int) (x);	      \
++      ({ register unsigned short int __x = (unsigned short int) (x);          \
+ 	 __bswap_constant_16 (__x); }))
+-# endif
+-#else
+-static __inline unsigned short int
+-__bswap_16 (unsigned short int __bsx)
+-{
+-  return __bswap_constant_16 (__bsx);
+-}
+ #endif
+ 
++
+ /* Swap bytes in 32 bit value.  */
+ #define __bswap_constant_32(x) \
+      ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >>  8) |		      \
+       (((x) & 0x0000ff00) <<  8) | (((x) & 0x000000ff) << 24))
+ 
+-#ifdef __GNUC__
+-# if __GNUC__ >= 2
++#if defined __GNUC__ && __GNUC__ >= 2
++# if __WORDSIZE == 64 || (defined __i486__ || defined __pentium__	      \
++			  || defined __pentiumpro__ || defined __pentium4__   \
++			  || defined __k8__ || defined __athlon__	      \
++			  || defined __k6__ || defined __nocona__	      \
++			  || defined __core2__ || defined __geode__	      \
++			  || defined __amdfam10__)
+ /* To swap the bytes in a word the i486 processors and up provide the
+    `bswap' opcode.  On i386 we have to use three instructions.  */
+-#  if !defined __i486__ && !defined __pentium__ && !defined __pentiumpro__ \
+-      && !defined __pentium4__ && !defined __k8__ && !defined __athlon__ \
+-      && !defined __k6__ && !defined __nocona__ && !defined __core2__ \
+-      && !defined __geode__ && !defined __amdfam10__
+-#   define __bswap_32(x)						      \
++#  define __bswap_32(x) \
+      (__extension__							      \
+       ({ register unsigned int __v, __x = (x);				      \
+ 	 if (__builtin_constant_p (__x))				      \
+ 	   __v = __bswap_constant_32 (__x);				      \
+ 	 else								      \
+-	   __asm__ ("rorw $8, %w0;"					      \
+-		    "rorl $16, %0;"					      \
+-		    "rorw $8, %w0"					      \
+-		    : "=r" (__v)					      \
+-		    : "0" (__x)						      \
+-		    : "cc");						      \
++	   __asm__ ("bswap %0" : "=r" (__v) : "0" (__x));		      \
+ 	 __v; }))
+-#  else
+-#   define __bswap_32(x) \
++# else
++#  define __bswap_32(x)							      \
+      (__extension__							      \
+       ({ register unsigned int __v, __x = (x);				      \
+ 	 if (__builtin_constant_p (__x))				      \
+ 	   __v = __bswap_constant_32 (__x);				      \
+ 	 else								      \
+-	   __asm__ ("bswap %0" : "=r" (__v) : "0" (__x));		      \
++	   __asm__ ("rorw $8, %w0;"					      \
++		    "rorl $16, %0;"					      \
++		    "rorw $8, %w0"					      \
++		    : "=r" (__v)					      \
++		    : "0" (__x)						      \
++		    : "cc");						      \
+ 	 __v; }))
+-#  endif
+-# else
+-#  define __bswap_32(x) \
+-     (__extension__							      \
+-      ({ register unsigned int __x = (x); __bswap_constant_32 (__x); }))
+ # endif
+ #else
+-static __inline unsigned int
+-__bswap_32 (unsigned int __bsx)
+-{
+-  return __bswap_constant_32 (__bsx);
+-}
++# define __bswap_32(x) \
++     (__extension__							      \
++      ({ register unsigned int __x = (x); __bswap_constant_32 (__x); }))
+ #endif
+ 
+ 
+ #if defined __GNUC__ && __GNUC__ >= 2
+ /* Swap bytes in 64 bit value.  */
+-#define __bswap_constant_64(x) \
++# define __bswap_constant_64(x) \
+      ((((x) & 0xff00000000000000ull) >> 56)				      \
+       | (((x) & 0x00ff000000000000ull) >> 40)				      \
+       | (((x) & 0x0000ff0000000000ull) >> 24)				      \
+@@ -119,19 +108,30 @@
+       | (((x) & 0x000000000000ff00ull) << 40)				      \
+       | (((x) & 0x00000000000000ffull) << 56))
+ 
+-# define __bswap_64(x) \
++# if __WORDSIZE == 64
++#  define __bswap_64(x) \
+      (__extension__							      \
+-      ({ union { __extension__ unsigned long long int __ll;		      \
+-		 unsigned long int __l[2]; } __w, __r;			      \
+-	 if (__builtin_constant_p (x))					      \
+-	   __r.__ll = __bswap_constant_64 (x);				      \
++      ({ register unsigned long __v, __x = (x);				      \
++	 if (__builtin_constant_p (__x))				      \
++	   __v = __bswap_constant_64 (__x);				      \
+ 	 else								      \
+-	   {								      \
+-	     __w.__ll = (x);						      \
+-	     __r.__l[0] = __bswap_32 (__w.__l[1]);			      \
+-	     __r.__l[1] = __bswap_32 (__w.__l[0]);			      \
+-	   }								      \
++	   __asm__ ("bswap %q0" : "=r" (__v) : "0" (__x));		      \
++	 __v; }))
++# else
++#  define __bswap_64(x) \
++     (__extension__                                                           \
++      ({ union { __extension__ unsigned long long int __ll;                   \
++		 unsigned int __l[2]; } __w, __r;                             \
++	 if (__builtin_constant_p (x))                                        \
++	   __r.__ll = __bswap_constant_64 (x);                                \
++	 else                                                                 \
++	   {                                                                  \
++	     __w.__ll = (x);                                                  \
++	     __r.__l[0] = __bswap_32 (__w.__l[1]);                            \
++	     __r.__l[1] = __bswap_32 (__w.__l[0]);                            \
++	   }                                                                  \
+ 	 __r.__ll; }))
++# endif
+ #endif
+ 
+ #endif /* _BITS_BYTESWAP_H */
+diff -urN libc.org/sysdeps/i386/bits/endian.h libc/sysdeps/i386/bits/endian.h
+--- libc.org/sysdeps/i386/bits/endian.h	2011-05-06 23:45:39.000000000 -0500
++++ libc/sysdeps/i386/bits/endian.h	2011-07-14 16:02:56.220759089 -0500
+@@ -1,4 +1,4 @@
+-/* i386 is little-endian.  */
++/* i386/x86_64 is little-endian.  */
+ 
+ #ifndef _ENDIAN_H
+ # error "Never use <bits/endian.h> directly; include <endian.h> instead."
+diff -urN libc.org/sysdeps/i386/bits/huge_vall.h libc/sysdeps/i386/bits/huge_vall.h
+--- libc.org/sysdeps/i386/bits/huge_vall.h	2011-05-06 23:45:39.000000000 -0500
++++ libc/sysdeps/i386/bits/huge_vall.h	2011-07-14 16:15:12.661759133 -0500
+@@ -23,12 +23,14 @@
+ # error "Never use <bits/huge_vall.h> directly; include <math.h> instead."
+ #endif
+ 
++#include <bits/wordsize.h>
++
+ #if __GNUC_PREREQ(3,3)
+ # define HUGE_VALL	(__builtin_huge_vall())
+-#elif __GNUC_PREREQ(2,96)
++#elif __GNUC_PREREQ(2,96) && __WORDSIZE == 32
+ # define HUGE_VALL	(__extension__ 0x1.0p32767L)
+ #else
+-
++#if __WORDSIZE == 32
+ # define __HUGE_VALL_bytes	{ 0, 0, 0, 0, 0, 0, 0, 0x80, 0xff, 0x7f, 0, 0 }
+ 
+ # define __huge_vall_t	union { unsigned char __c[12]; long double __ld; }
+@@ -39,5 +41,7 @@
+ static __huge_vall_t __huge_vall = { __HUGE_VALL_bytes };
+ #  define HUGE_VALL	(__huge_vall.__ld)
+ #  endif /* GCC.  */
+-
++#else /* __WORDSIZE == 64 */
++# define HUGE_VALL	((long double) HUGE_VAL)
++#endif /* __WORDSIZE */
+ #endif /* GCC 2.95 */
+diff -urN libc.org/sysdeps/i386/bits/link.h libc/sysdeps/i386/bits/link.h
+--- libc.org/sysdeps/i386/bits/link.h	2011-05-06 23:45:39.000000000 -0500
++++ libc/sysdeps/i386/bits/link.h	2011-07-14 16:17:39.127712127 -0500
+@@ -21,6 +21,7 @@
+ #endif
+ 
+ 
++#if __ELF_NATIVE_CLASS == 32
+ /* Registers for entry into PLT on IA-32.  */
+ typedef struct La_i86_regs
+ {
+@@ -55,6 +56,74 @@
+ 					uintptr_t *__defcook,
+ 					const La_i86_regs *__inregs,
+ 					La_i86_retval *__outregs,
+-					const char *__symname);
++					const char *symname);
+ 
+ __END_DECLS
++
++#else
++
++/* Registers for entry into PLT on x86-64.  */
++# if __GNUC_PREREQ (4,0)
++typedef float La_x86_64_xmm __attribute__ ((__vector_size__ (16)));
++typedef float La_x86_64_ymm __attribute__ ((__vector_size__ (32)));
++# else
++typedef float La_x86_64_xmm __attribute__ ((__mode__ (__V4SF__)));
++# endif
++
++typedef union
++{
++# if __GNUC_PREREQ (4,0)
++  La_x86_64_ymm ymm[2];
++# endif
++  La_x86_64_xmm xmm[4];
++} La_x86_64_vector __attribute__ ((aligned(16)));
++
++typedef struct La_x86_64_regs
++{
++  uint64_t lr_rdx;
++  uint64_t lr_r8;
++  uint64_t lr_r9;
++  uint64_t lr_rcx;
++  uint64_t lr_rsi;
++  uint64_t lr_rdi;
++  uint64_t lr_rbp;
++  uint64_t lr_rsp;
++  La_x86_64_xmm lr_xmm[8];
++  La_x86_64_vector lr_vector[8];
++} La_x86_64_regs;
++
++/* Return values for calls from PLT on x86-64.  */
++typedef struct La_x86_64_retval
++{
++  uint64_t lrv_rax;
++  uint64_t lrv_rdx;
++  La_x86_64_xmm lrv_xmm0;
++  La_x86_64_xmm lrv_xmm1;
++  long double lrv_st0;
++  long double lrv_st1;
++  La_x86_64_vector lrv_vector0;
++  La_x86_64_vector lrv_vector1;
++} La_x86_64_retval;
++
++
++__BEGIN_DECLS
++
++extern Elf64_Addr la_x86_64_gnu_pltenter (Elf64_Sym *__sym,
++					  unsigned int __ndx,
++					  uintptr_t *__refcook,
++					  uintptr_t *__defcook,
++					  La_x86_64_regs *__regs,
++					  unsigned int *__flags,
++					  const char *__symname,
++					  long int *__framesizep);
++extern unsigned int la_x86_64_gnu_pltexit (Elf64_Sym *__sym,
++					   unsigned int __ndx,
++					   uintptr_t *__refcook,
++					   uintptr_t *__defcook,
++					   const La_x86_64_regs *__inregs,
++					   La_x86_64_retval *__outregs,
++					   const char *__symname);
++
++__END_DECLS
++
++#endif
+diff -urN libc.org/sysdeps/i386/bits/mathdef.h libc/sysdeps/i386/bits/mathdef.h
+--- libc.org/sysdeps/i386/bits/mathdef.h	2011-05-06 23:45:39.000000000 -0500
++++ libc/sysdeps/i386/bits/mathdef.h	2011-07-14 18:13:22.231701515 -0500
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 1997, 1998, 1999, 2000, 2004, 2010 Free Software Foundation, Inc.
++/* Copyright (C) 1997, 1998, 1999, 2000, 2001, 2004, 2010 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
+@@ -23,12 +23,14 @@
+ #if defined __USE_ISOC99 && defined _MATH_H && !defined _MATH_H_MATHDEF
+ # define _MATH_H_MATHDEF	1
+ 
+-# if defined __FLT_EVAL_METHOD__ && __FLT_EVAL_METHOD__ == 0
+-/* When using -mfpmath=sse, values are computed with the precission of the
+-   used type.  */
++# include <bits/wordsize.h>
++
++# if __WORDSIZE == 64 || (defined __FLT_EVAL_METHOD__ && __FLT_EVAL_METHOD__ == 0)
++/* The x86-64 architecture computes values with the precission of the
++   used type.  Similarly for -m32 -mfpmath=sse.  */
+ typedef float float_t;		/* `float' expressions are evaluated as `float'.  */
+-typedef double double_t;	/* `double' expressions are evaluated as
+-				   `double'.  */
++typedef double double_t;	/* `double' expressions are evaluated
++				   as `double'.  */
+ # else
+ /* The ix87 FPUs evaluate all values in the 80 bit floating-point format
+    which is also available for the user as `long double'.  Therefore we
+diff -urN libc.org/sysdeps/i386/bits/select.h libc/sysdeps/i386/bits/select.h
+--- libc.org/sysdeps/i386/bits/select.h	2011-05-06 23:45:39.000000000 -0500
++++ libc/sysdeps/i386/bits/select.h	2011-07-14 17:37:55.304710405 -0500
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 1997, 1998, 1999, 2001, 2011 Free Software Foundation, Inc.
++/* Copyright (C) 1997-1999,2001,2008,2009,2011 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+    The GNU C Library is free software; you can redistribute it and/or
+@@ -20,12 +20,21 @@
+ # error "Never use <bits/select.h> directly; include <sys/select.h> instead."
+ #endif
+ 
++#include <bits/wordsize.h>
++
+ 
+ #if defined __GNUC__ && __GNUC__ >= 2
++
++# if __WORDSIZE == 64
++#  define __FD_ZERO_STOS "stosq"
++# else
++#  define __FD_ZERO_STOS "stosl"
++# endif
++
+ # define __FD_ZERO(fdsp) \
+   do {									      \
+     int __d0, __d1;							      \
+-    __asm__ __volatile__ ("cld; rep; stosl"				      \
++    __asm__ __volatile__ ("cld; rep; " __FD_ZERO_STOS			      \
+ 			  : "=c" (__d0), "=D" (__d1)			      \
+ 			  : "a" (0), "0" (sizeof (fd_set)		      \
+ 					  / sizeof (__fd_mask)),	      \
+diff -urN libc.org/sysdeps/i386/bits/setjmp.h libc/sysdeps/i386/bits/setjmp.h
+--- libc.org/sysdeps/i386/bits/setjmp.h	2011-05-06 23:45:39.000000000 -0500
++++ libc/sysdeps/i386/bits/setjmp.h	2011-07-14 18:14:51.877761307 -0500
+@@ -1,5 +1,4 @@
+-/* Copyright (C) 1997,1998,2000,2001,2003,2005,2006
+-	Free Software Foundation, Inc.
++/* Copyright (C) 1997,1998,2000,2001,2002,2003,2005,2006 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+    The GNU C Library is free software; you can redistribute it and/or
+@@ -17,16 +16,24 @@
+    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+    02111-1307 USA.  */
+ 
+-/* Define the machine-dependent type `jmp_buf'.  Intel 386 version.  */
++/* Define the machine-dependent type `jmp_buf'.  i386/x86-64 version.  */
+ #ifndef _BITS_SETJMP_H
+-#define _BITS_SETJMP_H	1
++#define _BITS_SETJMP_H  1
+ 
+ #if !defined _SETJMP_H && !defined _PTHREAD_H
+ # error "Never include <bits/setjmp.h> directly; use <setjmp.h> instead."
+ #endif
+ 
+-#ifndef	_ASM
++#include <bits/wordsize.h>
++
++#ifndef _ASM
++
++# if __WORDSIZE == 64
++typedef long int __jmp_buf[8];
++# else
+ typedef int __jmp_buf[6];
++# endif
++
+ #endif
+ 
+-#endif	/* bits/setjmp.h */
++#endif  /* bits/setjmp.h */
+diff -urN libc.org/sysdeps/i386/bits/wordsize.h libc/sysdeps/i386/bits/wordsize.h
+--- libc.org/sysdeps/i386/bits/wordsize.h	1969-12-31 18:00:00.000000000 -0600
++++ libc/sysdeps/i386/bits/wordsize.h	2011-07-14 17:54:56.644707616 -0500
+@@ -0,0 +1,8 @@
++/* Determine the wordsize from the preprocessor defines.  */
++
++#if defined __x86_64__
++# define __WORDSIZE	64
++# define __WORDSIZE_COMPAT32	1
++#else
++# define __WORDSIZE	32
++#endif
+diff -urN libc.org/sysdeps/i386/bits/xtitypes.h libc/sysdeps/i386/bits/xtitypes.h
+--- libc.org/sysdeps/i386/bits/xtitypes.h	1969-12-31 18:00:00.000000000 -0600
++++ libc/sysdeps/i386/bits/xtitypes.h	2011-07-14 18:02:01.966708183 -0500
+@@ -0,0 +1,34 @@
++/* bits/xtitypes.h -- Define some types used by <bits/stropts.h>.  x86-64.
++   Copyright (C) 2002 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 _STROPTS_H
++# error "Never include <bits/xtitypes.h> directly; use <stropts.h> instead."
++#endif
++
++#ifndef _BITS_XTITYPES_H
++#define _BITS_XTITYPES_H	1
++
++#include <bits/types.h>
++
++/* This type is used by some structs in <bits/stropts.h>.  */
++typedef __SLONG32_TYPE __t_scalar_t;
++typedef __ULONG32_TYPE __t_uscalar_t;
++
++
++#endif /* bits/xtitypes.h */
+diff -urN libc.org/sysdeps/i386/fpu/bits/fenv.h libc/sysdeps/i386/fpu/bits/fenv.h
+--- libc.org/sysdeps/i386/fpu/bits/fenv.h	2011-05-06 23:45:40.000000000 -0500
++++ libc/sysdeps/i386/fpu/bits/fenv.h	2011-07-14 16:06:25.547707233 -0500
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
++/* Copyright (C) 1997,1998,1999,2000,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
+@@ -20,6 +20,8 @@
+ # error "Never use <bits/fenv.h> directly; include <fenv.h> instead."
+ #endif
+ 
++#include <bits/wordsize.h>
++
+ 
+ /* Define bits representing the exception.  We use the bit positions
+    of the appropriate bits in the FPU control word.  */
+@@ -61,8 +63,10 @@
+ typedef unsigned short int fexcept_t;
+ 
+ 
+-/* Type representing floating-point environment.  This function corresponds
+-   to the layout of the block written by the `fstenv'.  */
++/* Type representing floating-point environment.  This structure
++   corresponds to the layout of the block written by the `fstenv'
++   instruction and has additional fields for the contents of the MXCSR
++   register as written by the `stmxcsr' instruction.  */
+ typedef struct
+   {
+     unsigned short int __control_word;
+@@ -78,6 +82,9 @@
+     unsigned int __data_offset;
+     unsigned short int __data_selector;
+     unsigned short int __unused5;
++#if __WORDSIZE == 64
++    unsigned int __mxcsr;
++#endif
+   }
+ fenv_t;
+ 
+diff -urN libc.org/sysdeps/i386/fpu/bits/mathinline.h libc/sysdeps/i386/fpu/bits/mathinline.h
+--- libc.org/sysdeps/i386/fpu/bits/mathinline.h	2011-05-06 23:45:40.000000000 -0500
++++ libc/sysdeps/i386/fpu/bits/mathinline.h	2011-07-14 18:22:39.632884094 -0500
+@@ -1,8 +1,9 @@
+-/* Inline math functions for i387.
+-   Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2003,2004,2006,2007,2009,
++/* Inline math functions for i387/x86-64.
++   Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2006,2007,2009,
+    2010 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+-   Contributed by John C. Bowman <bowman at math.ualberta.ca>, 1995.
++   Contributed by John C. Bowman <bowman at math.ualberta.ca>, 1995. (i387)
++   Contributed by Andreas Jaeger <aj at suse.de>, 2002. (x86-64)
+ 
+    The GNU C Library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+@@ -23,6 +24,8 @@
+ # error "Never use <bits/mathinline.h> directly; include <math.h> instead."
+ #endif
+ 
++#include <bits/wordsize.h>
++
+ #ifndef __extern_inline
+ # define __MATH_INLINE __inline
+ #else
+@@ -32,7 +35,7 @@
+ 
+ #if defined __USE_ISOC99 && defined __GNUC__ && __GNUC__ >= 2
+ /* GCC 2.97 and up have builtins that actually can be used.  */
+-# if !__GNUC_PREREQ (2,97)
++# if __WORDSIZE == 32 && !__GNUC_PREREQ (2,97)
+ /* ISO C99 defines some macros to perform unordered comparisons.  The
+    ix87 FPU supports this with special opcodes and we should use them.
+    These must not be inline functions since we have to be able to handle
+@@ -118,7 +121,7 @@
+ 		 : "=a" (__result) : "u" (y), "t" (x) : "cc", "st", "st(1)"); \
+ 	__result; })
+ #  endif /* __i686__ */
+-# endif	/* GCC 2.97 */
++# endif	/* __WORDSIZE == 32 && GCC 2.97 */
+ 
+ /* The gcc, version 2.7 or below, has problems with all this inlining
+    code.  So disable it for this version of the compiler.  */
+@@ -127,14 +130,26 @@
+ __MATH_INLINE int
+ __NTH (__signbitf (float __x))
+ {
++#if __WORDSIZE == 32
+   __extension__ union { float __f; int __i; } __u = { __f: __x };
+   return __u.__i < 0;
++#else
++  int __m;
++  __asm ("pmovmskb %1, %0" : "=r" (__m) : "x" (__x));
++  return __m & 0x8;
++#endif
+ }
+ __MATH_INLINE int
+ __NTH (__signbit (double __x))
+ {
++#if __WORDSIZE == 32
+   __extension__ union { double __d; int __i[2]; } __u = { __d: __x };
+   return __u.__i[1] < 0;
++#else
++  int __m;
++  __asm ("pmovmskb %1, %0" : "=r" (__m) : "x" (__x));
++  return __m & 0x80;
++#endif
+ }
+ __MATH_INLINE int
+ __NTH (__signbitl (long double __x))
+@@ -148,7 +163,7 @@
+ 
+ /* The gcc, version 2.7 or below, has problems with all this inlining
+    code.  So disable it for this version of the compiler.  */
+-#if __GNUC_PREREQ (2, 8)
++#if __WORDSIZE == 32 && __GNUC_PREREQ (2, 8)
+ 
+ #if ((!defined __NO_MATH_INLINES || defined __LIBC_INTERNAL_MATH_INLINES) \
+      && defined __OPTIMIZE__)
+@@ -768,4 +783,4 @@
+ 		    return __value;)
+ #endif
+ 
+-#endif /* __GNUC__  */
++#endif /* WORDSIZE == 32 && __GNUC__  */
+diff -urN libc.org/sysdeps/i386/fpu_control.h libc/sysdeps/i386/fpu_control.h
+--- libc.org/sysdeps/i386/fpu_control.h	2011-05-06 23:45:44.000000000 -0500
++++ libc/sysdeps/i386/fpu_control.h	2011-07-14 18:35:06.818710463 -0500
+@@ -1,5 +1,5 @@
+-/* FPU control word bits.  i387 version.
+-   Copyright (C) 1993,1995-1998,2000,2001,2003 Free Software Foundation, Inc.
++/* FPU control word bits.  i387/x86_64 version.
++   Copyright (C) 1993,1995-1998,2000,2001,2002,2003 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Olaf Flebbe.
+ 
+diff -urN libc.org/sysdeps/i386/i486/bits/string.h libc/sysdeps/i386/i486/bits/string.h
+--- libc.org/sysdeps/i386/i486/bits/string.h	2011-05-06 23:45:42.000000000 -0500
++++ libc/sysdeps/i386/i486/bits/string.h	2011-07-14 18:33:54.669709654 -0500
+@@ -1,4 +1,4 @@
+-/* Optimized, inlined string functions.  i486 version.
++/* Optimized, inlined string functions.  i486/x86-64 version.
+    Copyright (C) 1997,1998,1999,2000,2001,2002,2003,2004,2007
+    	Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+@@ -25,10 +25,11 @@
+ /* The ix86 processors can access unaligned multi-byte variables.  */
+ #define _STRING_ARCH_unaligned	1
+ 
++#include <bits/wordsize.h>
+ 
+ /* We only provide optimizations if the user selects them and if
+    GNU CC is used.  */
+-#if !defined __NO_STRING_INLINES && defined __USE_STRING_INLINES \
++#if __WORDSIZE == 32 && !defined __NO_STRING_INLINES && defined __USE_STRING_INLINES \
+     && defined __GNUC__ && __GNUC__ >= 2 && !__BOUNDED_POINTERS__
+ 
+ #ifndef __STRING_INLINE
+@@ -1972,4 +1973,4 @@
+ # undef __STRING_INLINE
+ #endif
+ 
+-#endif	/* use string inlines && GNU CC */
++#endif	/* wordsize == 32 && use string inlines && GNU CC */
+diff -urN libc.org/sysdeps/unix/sysv/linux/i386/bits/a.out.h libc/sysdeps/unix/sysv/linux/i386/bits/a.out.h
+--- libc.org/sysdeps/unix/sysv/linux/i386/bits/a.out.h	2011-05-06 23:45:14.000000000 -0500
++++ libc/sysdeps/unix/sysv/linux/i386/bits/a.out.h	2011-07-14 16:00:21.230681171 -0500
+@@ -1,3 +1,13 @@
+ #ifndef __A_OUT_GNU_H__
+ # error "Never use <bits/a.out.h> directly; include <a.out.h> instead."
+ #endif
++
++#include <bits/wordsize.h>
++
++#if __WORDSIZE == 64
++
++/* Signal to users of this header that this architecture really doesn't
++   support a.out binary format.  */
++#define __NO_A_OUT_SUPPORT 1
++
++#endif
+diff -urN libc.org/sysdeps/unix/sysv/linux/i386/bits/environments.h libc/sysdeps/unix/sysv/linux/i386/bits/environments.h
+--- libc.org/sysdeps/unix/sysv/linux/i386/bits/environments.h	2011-05-06 23:45:14.000000000 -0500
++++ libc/sysdeps/unix/sysv/linux/i386/bits/environments.h	2011-07-14 16:03:42.026708596 -0500
+@@ -20,6 +20,8 @@
+ # error "Never include this file directly.  Use <unistd.h> instead"
+ #endif
+ 
++#include <bits/wordsize.h>
++
+ /* This header should define the following symbols under the described
+    situations.  A value `1' means that the model is always supported,
+    `-1' means it is never supported.  Undefined means it cannot be
+@@ -38,14 +40,39 @@
+    only for compatibility.
+ */
+ 
++#if __WORDSIZE == 64
++
++/* Environments with 32-bit wide pointers are optionally provided.
++   Therefore following macros aren't defined:
++   # undef _POSIX_V7_ILP32_OFF32
++   # undef _POSIX_V7_ILP32_OFFBIG
++   # undef _POSIX_V6_ILP32_OFF32
++   # undef _POSIX_V6_ILP32_OFFBIG
++   # undef _XBS5_ILP32_OFF32
++   # undef _XBS5_ILP32_OFFBIG
++   and users need to check at runtime.  */
++
++/* We also have no use (for now) for an environment with bigger pointers
++   and offsets.  */
++# define _POSIX_V7_LPBIG_OFFBIG	-1
++# define _POSIX_V6_LPBIG_OFFBIG	-1
++# define _XBS5_LPBIG_OFFBIG	-1
++
++/* By default we have 64-bit wide `long int', pointers and `off_t'.  */
++# define _POSIX_V7_LP64_OFF64	1
++# define _POSIX_V6_LP64_OFF64	1
++# define _XBS5_LP64_OFF64	1
++
++#else /* __WORDSIZE == 32 */
++
+ /* By default we have 32-bit wide `int', `long int', pointers and `off_t'
+    and all platforms support LFS.  */
+-#define _POSIX_V7_ILP32_OFF32	1
+-#define _POSIX_V7_ILP32_OFFBIG	1
+-#define _POSIX_V6_ILP32_OFF32	1
+-#define _POSIX_V6_ILP32_OFFBIG	1
+-#define _XBS5_ILP32_OFF32	1
+-#define _XBS5_ILP32_OFFBIG	1
++# define _POSIX_V7_ILP32_OFF32	1
++# define _POSIX_V7_ILP32_OFFBIG	1
++# define _POSIX_V6_ILP32_OFF32	1
++# define _POSIX_V6_ILP32_OFFBIG	1
++# define _XBS5_ILP32_OFF32	1
++# define _XBS5_ILP32_OFFBIG	1
+ 
+ /* We optionally provide an environment with the above size but an 64-bit
+    side `off_t'.  Therefore we don't define _POSIX_V7_ILP32_OFFBIG.  */
+@@ -60,6 +87,8 @@
+    # undef _XBS5_LPBIG_OFFBIG
+    and sysconf tests for it at runtime.  */
+ 
++#endif /* __WORDSIZE == 32 */
++
+ #define __ILP32_OFF32_CFLAGS	"-m32"
+ #define __ILP32_OFFBIG_CFLAGS	"-m32 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64"
+ #define __ILP32_OFF32_LDFLAGS	"-m32"
+diff -urN libc.org/sysdeps/unix/sysv/linux/i386/bits/fcntl.h libc/sysdeps/unix/sysv/linux/i386/bits/fcntl.h
+--- libc.org/sysdeps/unix/sysv/linux/i386/bits/fcntl.h	2011-05-06 23:45:14.000000000 -0500
++++ libc/sysdeps/unix/sysv/linux/i386/bits/fcntl.h	2011-07-14 18:23:59.266883948 -0500
+@@ -1,5 +1,5 @@
+-/* O_*, F_*, FD_* bit values for Linux.
+-   Copyright (C) 1995, 1996, 1997, 1998, 2000, 2004, 2006, 2007, 2009, 2010
++/* O_*, F_*, FD_* bit values for Linux/i386/x86-64.
++   Copyright (C) 1995,1996,1997,1998,2000,2001,2002,2004,2006,2007,2009,2010
+    Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+@@ -23,6 +23,7 @@
+ #endif
+ 
+ #include <sys/types.h>
++#include <bits/wordsize.h>
+ #ifdef __USE_GNU
+ # include <bits/uio.h>
+ #endif
+@@ -64,7 +65,11 @@
+ #endif
+ 
+ #ifdef __USE_LARGEFILE64
+-# define O_LARGEFILE	0100000
++# if __WORDSIZE == 64
++#  define O_LARGEFILE	0
++# else
++#  define O_LARGEFILE	0100000
++# endif
+ #endif
+ 
+ /* Values for the second argument to `fcntl'.  */
+@@ -73,18 +78,28 @@
+ #define F_SETFD		2	/* Set file descriptor flags.  */
+ #define F_GETFL		3	/* Get file status flags.  */
+ #define F_SETFL		4	/* Set file status flags.  */
+-#ifndef __USE_FILE_OFFSET64
++#if __WORDSIZE == 64
+ # define F_GETLK	5	/* Get record locking info.  */
+ # define F_SETLK	6	/* Set record locking info (non-blocking).  */
+ # define F_SETLKW	7	/* Set record locking info (blocking).	*/
++/* Not necessary, we always have 64-bit offsets.  */
++# define F_GETLK64	5	/* Get record locking info.  */
++# define F_SETLK64	6	/* Set record locking info (non-blocking).  */
++# define F_SETLKW64	7	/* Set record locking info (blocking).	*/
+ #else
+-# define F_GETLK	F_GETLK64  /* Get record locking info.	*/
+-# define F_SETLK	F_SETLK64  /* Set record locking info (non-blocking).*/
+-# define F_SETLKW	F_SETLKW64 /* Set record locking info (blocking).  */
+-#endif
+-#define F_GETLK64	12	/* Get record locking info.  */
+-#define F_SETLK64	13	/* Set record locking info (non-blocking).  */
+-#define F_SETLKW64	14	/* Set record locking info (blocking).	*/
++# ifndef __USE_FILE_OFFSET64
++#  define F_GETLK	5	/* Get record locking info.  */
++#  define F_SETLK	6	/* Set record locking info (non-blocking).  */
++#  define F_SETLKW	7	/* Set record locking info (blocking).	*/
++# else
++#  define F_GETLK	F_GETLK64  /* Get record locking info.	*/
++#  define F_SETLK	F_SETLK64  /* Set record locking info (non-blocking).*/
++#  define F_SETLKW	F_SETLKW64 /* Set record locking info (blocking).  */
++# endif
++# define F_GETLK64	12	/* Get record locking info.  */
++# define F_SETLK64	13	/* Set record locking info (non-blocking).  */
++# define F_SETLKW64	14	/* Set record locking info (blocking).	*/
++#endif
+ 
+ #if defined __USE_BSD || defined __USE_UNIX98 || defined __USE_XOPEN2K8
+ # define F_SETOWN	8	/* Get owner (process receiving SIGIO).  */
+@@ -277,7 +292,6 @@
+ extern int fallocate64 (int __fd, int __mode, __off64_t __offset,
+ 			__off64_t __len);
+ # endif
+-
+ #endif
+ 
+ __END_DECLS
+diff -urN libc.org/sysdeps/unix/sysv/linux/i386/bits/mman.h libc/sysdeps/unix/sysv/linux/i386/bits/mman.h
+--- libc.org/sysdeps/unix/sysv/linux/i386/bits/mman.h	2011-05-06 23:45:14.000000000 -0500
++++ libc/sysdeps/unix/sysv/linux/i386/bits/mman.h	2011-07-14 18:24:51.776883897 -0500
+@@ -1,5 +1,5 @@
+-/* Definitions for POSIX memory map interface.  Linux/i386 version.
+-   Copyright (C) 1997,2000,2003,2005,2006,2009,2010,2011
++/* Definitions for POSIX memory map interface.  Linux/i386/x86_64 version.
++   Copyright (C) 1997,2000,2001,2003,2005,2006,2009,2010,2011
+    Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+@@ -53,6 +53,7 @@
+ # define MAP_FILE	0
+ # define MAP_ANONYMOUS	0x20		/* Don't use a file.  */
+ # define MAP_ANON	MAP_ANONYMOUS
++# define MAP_32BIT	0x40		/* Only give out 32-bit addresses.  */
+ #endif
+ 
+ /* These are Linux-specific.  */
+diff -urN libc.org/sysdeps/unix/sysv/linux/i386/bits/msq.h libc/sysdeps/unix/sysv/linux/i386/bits/msq.h
+--- libc.org/sysdeps/unix/sysv/linux/i386/bits/msq.h	1969-12-31 18:00:00.000000000 -0600
++++ libc/sysdeps/unix/sysv/linux/i386/bits/msq.h	2011-07-14 17:37:07.336711547 -0500
+@@ -0,0 +1,83 @@
++/* Copyright (C) 1995, 1996, 1997, 2000, 2002 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 _SYS_MSG_H
++# error "Never use <bits/msq.h> directly; include <sys/msg.h> instead."
++#endif
++
++#include <bits/types.h>
++#include <bits/wordsize.h>
++
++/* Define options for message queue functions.  */
++#define MSG_NOERROR	010000	/* no error if message is too big */
++#ifdef __USE_GNU
++# define MSG_EXCEPT	020000	/* recv any msg except of specified type */
++#endif
++
++/* Types used in the structure definition.  */
++typedef unsigned long int msgqnum_t;
++typedef unsigned long int msglen_t;
++
++/* Structure of record for one message inside the kernel.
++   The type `struct msg' is opaque.  */
++struct msqid_ds
++{
++  struct ipc_perm msg_perm;	/* structure describing operation permission */
++  __time_t msg_stime;		/* time of last msgsnd command */
++#if __WORDSIZE == 32
++  unsigned long int __unused1;
++#endif
++  __time_t msg_rtime;		/* time of last msgrcv command */
++#if __WORDSIZE == 32
++  unsigned long int __unused2;
++#endif
++  __time_t msg_ctime;		/* time of last change */
++#if __WORDSIZE == 32
++  unsigned long int __unused3;
++#endif
++  unsigned long int __msg_cbytes; /* current number of bytes on queue */
++  msgqnum_t msg_qnum;		/* number of messages currently on queue */
++  msglen_t msg_qbytes;		/* max number of bytes allowed on queue */
++  __pid_t msg_lspid;		/* pid of last msgsnd() */
++  __pid_t msg_lrpid;		/* pid of last msgrcv() */
++  unsigned long int __unused4;
++  unsigned long int __unused5;
++};
++
++#ifdef __USE_MISC
++
++# define msg_cbytes	__msg_cbytes
++
++/* ipcs ctl commands */
++# define MSG_STAT 11
++# define MSG_INFO 12
++
++/* buffer for msgctl calls IPC_INFO, MSG_INFO */
++struct msginfo
++  {
++    int msgpool;
++    int msgmap;
++    int msgmax;
++    int msgmnb;
++    int msgmni;
++    int msgssz;
++    int msgtql;
++    unsigned short int msgseg;
++  };
++
++#endif /* __USE_MISC */
+diff -urN libc.org/sysdeps/unix/sysv/linux/i386/bits/shm.h libc/sysdeps/unix/sysv/linux/i386/bits/shm.h
+--- libc.org/sysdeps/unix/sysv/linux/i386/bits/shm.h	1969-12-31 18:00:00.000000000 -0600
++++ libc/sysdeps/unix/sysv/linux/i386/bits/shm.h	2011-07-14 17:41:11.898707540 -0500
+@@ -0,0 +1,111 @@
++/* Copyright (C) 1995, 1996, 1997, 2000, 2002, 2004, 2009
++   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 _SYS_SHM_H
++# error "Never include <bits/shm.h> directly; use <sys/shm.h> instead."
++#endif
++
++#include <bits/types.h>
++
++/* Permission flag for shmget.  */
++#define SHM_R		0400		/* or S_IRUGO from <linux/stat.h> */
++#define SHM_W		0200		/* or S_IWUGO from <linux/stat.h> */
++
++/* Flags for `shmat'.  */
++#define SHM_RDONLY	010000		/* attach read-only else read-write */
++#define SHM_RND		020000		/* round attach address to SHMLBA */
++#define SHM_REMAP	040000		/* take-over region on attach */
++#define SHM_EXEC	0100000		/* execution access */
++
++/* Commands for `shmctl'.  */
++#define SHM_LOCK	11		/* lock segment (root only) */
++#define SHM_UNLOCK	12		/* unlock segment (root only) */
++
++__BEGIN_DECLS
++
++/* Segment low boundary address multiple.  */
++#define SHMLBA		(__getpagesize ())
++extern int __getpagesize (void) __THROW __attribute__ ((__const__));
++
++
++/* Type to count number of attaches.  */
++typedef unsigned long int shmatt_t;
++
++/* Data structure describing a shared memory segment.  */
++struct shmid_ds
++  {
++    struct ipc_perm shm_perm;		/* operation permission struct */
++    size_t shm_segsz;			/* size of segment in bytes */
++    __time_t shm_atime;			/* time of last shmat() */
++#if __WORDSIZE == 32
++    unsigned long int __unused1;
++#endif
++    __time_t shm_dtime;			/* time of last shmdt() */
++#if __WORDSIZE == 32
++    unsigned long int __unused2;
++#endif
++    __time_t shm_ctime;			/* time of last change by shmctl() */
++#if __WORDSIZE == 32
++    unsigned long int __unused3;
++#endif
++    __pid_t shm_cpid;			/* pid of creator */
++    __pid_t shm_lpid;			/* pid of last shmop */
++    shmatt_t shm_nattch;		/* number of current attaches */
++    unsigned long int __unused4;
++    unsigned long int __unused5;
++  };
++
++#ifdef __USE_MISC
++
++/* ipcs ctl commands */
++# define SHM_STAT 	13
++# define SHM_INFO 	14
++
++/* shm_mode upper byte flags */
++# define SHM_DEST	01000	/* segment will be destroyed on last detach */
++# define SHM_LOCKED	02000   /* segment will not be swapped */
++# define SHM_HUGETLB	04000	/* segment is mapped via hugetlb */
++# define SHM_NORESERVE	010000	/* don't check for reservations */
++
++struct	shminfo
++  {
++    unsigned long int shmmax;
++    unsigned long int shmmin;
++    unsigned long int shmmni;
++    unsigned long int shmseg;
++    unsigned long int shmall;
++    unsigned long int __unused1;
++    unsigned long int __unused2;
++    unsigned long int __unused3;
++    unsigned long int __unused4;
++  };
++
++struct shm_info
++  {
++    int used_ids;
++    unsigned long int shm_tot;	/* total allocated shm */
++    unsigned long int shm_rss;	/* total resident shm */
++    unsigned long int shm_swp;	/* total swapped shm */
++    unsigned long int swap_attempts;
++    unsigned long int swap_successes;
++  };
++
++#endif /* __USE_MISC */
++
++__END_DECLS
+diff -urN libc.org/sysdeps/unix/sysv/linux/i386/bits/sigcontext.h libc/sysdeps/unix/sysv/linux/i386/bits/sigcontext.h
+--- libc.org/sysdeps/unix/sysv/linux/i386/bits/sigcontext.h	1969-12-31 18:00:00.000000000 -0600
++++ libc/sysdeps/unix/sysv/linux/i386/bits/sigcontext.h	2011-07-14 17:41:49.414695257 -0500
+@@ -0,0 +1,159 @@
++/* Copyright (C) 2002 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 _BITS_SIGCONTEXT_H
++#define _BITS_SIGCONTEXT_H  1
++
++#if !defined _SIGNAL_H && !defined _SYS_UCONTEXT_H
++# error "Never use <bits/sigcontext.h> directly; include <signal.h> instead."
++#endif
++
++#include <bits/wordsize.h>
++
++struct _fpreg
++{
++  unsigned short significand[4];
++  unsigned short exponent;
++};
++
++struct _fpxreg
++{
++  unsigned short significand[4];
++  unsigned short exponent;
++  unsigned short padding[3];
++};
++
++struct _xmmreg
++{
++  __uint32_t	element[4];
++};
++
++
++
++#if __WORDSIZE == 32
++
++struct _fpstate
++{
++  /* Regular FPU environment.  */
++  __uint32_t	cw;
++  __uint32_t		sw;
++  __uint32_t		tag;
++  __uint32_t		ipoff;
++  __uint32_t		cssel;
++  __uint32_t		dataoff;
++  __uint32_t		datasel;
++  struct _fpreg	_st[8];
++  unsigned short status;
++  unsigned short magic;
++
++  /* FXSR FPU environment.  */
++  __uint32_t		_fxsr_env[6];
++  __uint32_t		mxcsr;
++  __uint32_t		reserved;
++  struct _fpxreg	_fxsr_st[8];
++  struct _xmmreg	_xmm[8];
++  __uint32_t		padding[56];
++};
++
++#ifndef sigcontext_struct
++/* Kernel headers before 2.1.1 define a struct sigcontext_struct, but
++   we need sigcontext.  Some packages have come to rely on
++   sigcontext_struct being defined on 32-bit x86, so define this for
++   their benefit.  */
++# define sigcontext_struct sigcontext
++#endif
++
++struct sigcontext
++{
++  unsigned short gs, __gsh;
++  unsigned short fs, __fsh;
++  unsigned short es, __esh;
++  unsigned short ds, __dsh;
++  unsigned long edi;
++  unsigned long esi;
++  unsigned long ebp;
++  unsigned long esp;
++  unsigned long ebx;
++  unsigned long edx;
++  unsigned long ecx;
++  unsigned long eax;
++  unsigned long trapno;
++  unsigned long err;
++  unsigned long eip;
++  unsigned short cs, __csh;
++  unsigned long eflags;
++  unsigned long esp_at_signal;
++  unsigned short ss, __ssh;
++  struct _fpstate * fpstate;
++  unsigned long oldmask;
++  unsigned long cr2;
++};
++
++#else /* __WORDSIZE == 64 */
++
++struct _fpstate
++{
++  /* FPU environment matching the 64-bit FXSAVE layout.  */
++  __uint16_t		cwd;
++  __uint16_t		swd;
++  __uint16_t		ftw;
++  __uint16_t		fop;
++  __uint64_t		rip;
++  __uint64_t		rdp;
++  __uint32_t		mxcsr;
++  __uint32_t		mxcr_mask;
++  struct _fpxreg	_st[8];
++  struct _xmmreg	_xmm[16];
++  __uint32_t		padding[24];
++};
++
++struct sigcontext
++{
++  unsigned long r8;
++  unsigned long r9;
++  unsigned long r10;
++  unsigned long r11;
++  unsigned long r12;
++  unsigned long r13;
++  unsigned long r14;
++  unsigned long r15;
++  unsigned long rdi;
++  unsigned long rsi;
++  unsigned long rbp;
++  unsigned long rbx;
++  unsigned long rdx;
++  unsigned long rax;
++  unsigned long rcx;
++  unsigned long rsp;
++  unsigned long rip;
++  unsigned long eflags;
++  unsigned short cs;
++  unsigned short gs;
++  unsigned short fs;
++  unsigned short __pad0;
++  unsigned long err;
++  unsigned long trapno;
++  unsigned long oldmask;
++  unsigned long cr2;
++  struct _fpstate * fpstate;
++  unsigned long __reserved1 [8];
++};
++
++#endif /* __WORDSIZE == 64 */
++
++#endif /* _BITS_SIGCONTEXT_H */
+diff -urN libc.org/sysdeps/unix/sysv/linux/i386/bits/stat.h libc/sysdeps/unix/sysv/linux/i386/bits/stat.h
+--- libc.org/sysdeps/unix/sysv/linux/i386/bits/stat.h	1969-12-31 18:00:00.000000000 -0600
++++ libc/sysdeps/unix/sysv/linux/i386/bits/stat.h	2011-07-14 17:43:35.440711457 -0500
+@@ -0,0 +1,213 @@
++/* Copyright (C) 1999-2003,2009,2010 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.  */
++
++#if !defined _SYS_STAT_H && !defined _FCNTL_H
++# error "Never include <bits/stat.h> directly; use <sys/stat.h> instead."
++#endif
++
++#ifndef _BITS_STAT_H
++#define _BITS_STAT_H	1
++
++/* Versions of the `struct stat' data structure.  */
++#define _STAT_VER_KERNEL	0
++
++#if __WORDSIZE == 32
++# define _STAT_VER_SVR4		2
++# define _STAT_VER_LINUX	3
++
++/* i386 versions of the `xmknod' interface.  */
++# define _MKNOD_VER_LINUX	1
++# define _MKNOD_VER_SVR4	2
++# define _MKNOD_VER		_MKNOD_VER_LINUX /* The bits defined below.  */
++#else
++# define _STAT_VER_LINUX	1
++
++/* x86-64 versions of the `xmknod' interface.  */
++# define _MKNOD_VER_LINUX	0
++#endif
++
++#define _STAT_VER		_STAT_VER_LINUX
++
++struct stat
++  {
++    __dev_t st_dev;		/* Device.  */
++#if __WORDSIZE == 32
++    unsigned short int __pad1;
++#endif
++#if __WORDSIZE == 64 || !defined __USE_FILE_OFFSET64
++    __ino_t st_ino;		/* File serial number.	*/
++#else
++    __ino_t __st_ino;			/* 32bit file serial number.	*/
++#endif
++#if __WORDSIZE == 32
++    __mode_t st_mode;			/* File mode.  */
++    __nlink_t st_nlink;			/* Link count.  */
++#else
++    __nlink_t st_nlink;		/* Link count.  */
++    __mode_t st_mode;		/* File mode.  */
++#endif
++    __uid_t st_uid;		/* User ID of the file's owner.	*/
++    __gid_t st_gid;		/* Group ID of the file's group.*/
++#if __WORDSIZE == 64
++    int __pad0;
++#endif
++    __dev_t st_rdev;		/* Device number, if device.  */
++#if __WORDSIZE == 32
++    unsigned short int __pad2;
++#endif
++#if __WORDSIZE == 64 || !defined __USE_FILE_OFFSET64
++    __off_t st_size;			/* Size of file, in bytes.  */
++#else
++    __off64_t st_size;			/* Size of file, in bytes.  */
++#endif
++    __blksize_t st_blksize;	/* Optimal block size for I/O.  */
++#if __WORDSIZE == 64 || !defined __USE_FILE_OFFSET64
++    __blkcnt_t st_blocks;		/* Number 512-byte blocks allocated. */
++#else
++    __blkcnt64_t st_blocks;		/* Number 512-byte blocks allocated. */
++#endif
++#if defined __USE_MISC || defined __USE_XOPEN2K8
++    /* Nanosecond resolution timestamps are stored in a format
++       equivalent to 'struct timespec'.  This is the type used
++       whenever possible but the Unix namespace rules do not allow the
++       identifier 'timespec' to appear in the <sys/stat.h> header.
++       Therefore we have to handle the use of this header in strictly
++       standard-compliant sources special.  */
++    struct timespec st_atim;		/* Time of last access.  */
++    struct timespec st_mtim;		/* Time of last modification.  */
++    struct timespec st_ctim;		/* Time of last status change.  */
++# define st_atime st_atim.tv_sec	/* Backward compatibility.  */
++# define st_mtime st_mtim.tv_sec
++# define st_ctime st_ctim.tv_sec
++#else
++    __time_t st_atime;			/* Time of last access.  */
++    unsigned long int st_atimensec;	/* Nscecs of last access.  */
++    __time_t st_mtime;			/* Time of last modification.  */
++    unsigned long int st_mtimensec;	/* Nsecs of last modification.  */
++    __time_t st_ctime;			/* Time of last status change.  */
++    unsigned long int st_ctimensec;	/* Nsecs of last status change.  */
++#endif
++#if __WORDSIZE == 64
++    long int __unused[3];
++#else
++# ifndef __USE_FILE_OFFSET64
++    unsigned long int __unused4;
++    unsigned long int __unused5;
++# else
++    __ino64_t st_ino;			/* File serial number.	*/
++# endif
++#endif
++  };
++
++#ifdef __USE_LARGEFILE64
++/* Note stat64 has the same shape as stat for x86-64.  */
++struct stat64
++  {
++    __dev_t st_dev;		/* Device.  */
++# if __WORDSIZE == 64
++    __ino64_t st_ino;		/* File serial number.  */
++    __nlink_t st_nlink;		/* Link count.  */
++    __mode_t st_mode;		/* File mode.  */
++# else
++    unsigned int __pad1;
++    __ino_t __st_ino;			/* 32bit file serial number.	*/
++    __mode_t st_mode;			/* File mode.  */
++    __nlink_t st_nlink;			/* Link count.  */
++# endif
++    __uid_t st_uid;		/* User ID of the file's owner.	*/
++    __gid_t st_gid;		/* Group ID of the file's group.*/
++# if __WORDSIZE == 64
++    int __pad0;
++    __dev_t st_rdev;		/* Device number, if device.  */
++    __off_t st_size;		/* Size of file, in bytes.  */
++# else
++    __dev_t st_rdev;			/* Device number, if device.  */
++    unsigned int __pad2;
++    __off64_t st_size;			/* Size of file, in bytes.  */
++# endif
++    __blksize_t st_blksize;	/* Optimal block size for I/O.  */
++    __blkcnt64_t st_blocks;	/* Nr. 512-byte blocks allocated.  */
++# if defined __USE_MISC || defined __USE_XOPEN2K8
++    /* Nanosecond resolution timestamps are stored in a format
++       equivalent to 'struct timespec'.  This is the type used
++       whenever possible but the Unix namespace rules do not allow the
++       identifier 'timespec' to appear in the <sys/stat.h> header.
++       Therefore we have to handle the use of this header in strictly
++       standard-compliant sources special.  */
++    struct timespec st_atim;		/* Time of last access.  */
++    struct timespec st_mtim;		/* Time of last modification.  */
++    struct timespec st_ctim;		/* Time of last status change.  */
++#  define st_atime st_atim.tv_sec	/* Backward compatibility.  */
++#  define st_mtime st_mtim.tv_sec
++#  define st_ctime st_ctim.tv_sec
++# else
++    __time_t st_atime;			/* Time of last access.  */
++    unsigned long int st_atimensec;	/* Nscecs of last access.  */
++    __time_t st_mtime;			/* Time of last modification.  */
++    unsigned long int st_mtimensec;	/* Nsecs of last modification.  */
++    __time_t st_ctime;			/* Time of last status change.  */
++    unsigned long int st_ctimensec;	/* Nsecs of last status change.  */
++# endif
++# if __WORDSIZE == 64
++    long int __unused[3];
++# else
++    __ino64_t st_ino;			/* File serial number.		*/
++# endif
++  };
++#endif
++
++/* Tell code we have these members.  */
++#define	_STATBUF_ST_BLKSIZE
++#define _STATBUF_ST_RDEV
++/* Nanosecond resolution time values are supported.  */
++#define _STATBUF_ST_NSEC
++
++/* Encoding of the file mode.  */
++
++#define	__S_IFMT	0170000	/* These bits determine file type.  */
++
++/* File types.  */
++#define	__S_IFDIR	0040000	/* Directory.  */
++#define	__S_IFCHR	0020000	/* Character device.  */
++#define	__S_IFBLK	0060000	/* Block device.  */
++#define	__S_IFREG	0100000	/* Regular file.  */
++#define	__S_IFIFO	0010000	/* FIFO.  */
++#define	__S_IFLNK	0120000	/* Symbolic link.  */
++#define	__S_IFSOCK	0140000	/* Socket.  */
++
++/* POSIX.1b objects.  Note that these macros always evaluate to zero.  But
++   they do it by enforcing the correct use of the macros.  */
++#define __S_TYPEISMQ(buf)  ((buf)->st_mode - (buf)->st_mode)
++#define __S_TYPEISSEM(buf) ((buf)->st_mode - (buf)->st_mode)
++#define __S_TYPEISSHM(buf) ((buf)->st_mode - (buf)->st_mode)
++
++/* Protection bits.  */
++
++#define	__S_ISUID	04000	/* Set user ID on execution.  */
++#define	__S_ISGID	02000	/* Set group ID on execution.  */
++#define	__S_ISVTX	01000	/* Save swapped text after use (sticky).  */
++#define	__S_IREAD	0400	/* Read by owner.  */
++#define	__S_IWRITE	0200	/* Write by owner.  */
++#define	__S_IEXEC	0100	/* Execute by owner.  */
++
++#ifdef __USE_ATFILE
++# define UTIME_NOW	((1l << 30) - 1l)
++# define UTIME_OMIT	((1l << 30) - 2l)
++#endif
++
++#endif	/* bits/stat.h */
+diff -urN libc.org/sysdeps/unix/sysv/linux/i386/bits/wchar.h libc/sysdeps/unix/sysv/linux/i386/bits/wchar.h
+--- libc.org/sysdeps/unix/sysv/linux/i386/bits/wchar.h	2011-05-06 23:45:14.000000000 -0500
++++ libc/sysdeps/unix/sysv/linux/i386/bits/wchar.h	1969-12-31 18:00:00.000000000 -0600
+@@ -1,26 +0,0 @@
+-/* wchar_t type related definitions.
+-   Copyright (C) 2000 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 _BITS_WCHAR_H
+-#define _BITS_WCHAR_H	1
+-
+-#define __WCHAR_MIN	(-2147483647l - 1l)
+-#define __WCHAR_MAX	(2147483647l)
+-
+-#endif	/* bits/wchar.h */
+diff -urN libc.org/sysdeps/unix/sysv/linux/i386/sys/debugreg.h libc/sysdeps/unix/sysv/linux/i386/sys/debugreg.h
+--- libc.org/sysdeps/unix/sysv/linux/i386/sys/debugreg.h	2011-05-06 23:45:14.000000000 -0500
++++ libc/sysdeps/unix/sysv/linux/i386/sys/debugreg.h	2011-07-14 18:30:49.918885810 -0500
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 1998, 2000 Free Software Foundation, Inc.
++/* Copyright (C) 1998, 2000, 2001, 2003 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
+@@ -18,6 +18,7 @@
+ 
+ #ifndef _SYS_DEBUGREG_H
+ #define _SYS_DEBUGREG_H	1
++#include <bits/wordsize.h>
+ 
+ /* Indicate the register numbers for a number of the specific
+    debug registers.  Registers 0-3 contain the addresses we wish to trap on */
+@@ -55,6 +56,7 @@
+ #define DR_LEN_1 (0x0)	      /* Settings for data length to trap on */
+ #define DR_LEN_2 (0x4)
+ #define DR_LEN_4 (0xC)
++#define DR_LEN_8 (0x8)
+ 
+ /* The low byte to the control register determine which registers are
+    enabled.  There are 4 fields of two bits.  One bit is "local", meaning
+@@ -70,21 +72,16 @@
+ #define DR_LOCAL_ENABLE_MASK  (0x55) /* Set  local bits for all 4 regs */
+ #define DR_GLOBAL_ENABLE_MASK (0xAA) /* Set global bits for all 4 regs */
+ 
+-/* The second byte to the control register has a few special things.
++/* The second byte to the control register has a few special
++   things.  */
+ 
+-    On the i386, you should set the DR_LOCAL_SLOWDOWN or
+-    DR_GLOBAL_SLOWDOWN bits if you want to know exactly which
+-    instruction triggered the watchpoint.  Setting these bits causes
+-    the processor to run more slowly, but leaving them clear makes it
+-    treat watchpoint hits as imprecise exceptions, so you can't
+-    reliably determine which instruction caused the hit.
+-
+-    The i486 and all later IA-32 processors ignore DR_LOCAL_SLOWDOWN
+-    and DR_GLOBAL_SLOWDOWN.  They always report the exception
+-    precisely, except in some rare cases, which the user can't do
+-    anything about.  */
+ 
+-#define DR_CONTROL_RESERVED (0xFC00) /* Reserved by Intel */
++
++#if __WORDSIZE == 64
++# define DR_CONTROL_RESERVED (0xFFFFFFFF0000FC00UL) /* Reserved */
++#else
++# define DR_CONTROL_RESERVED (0x00FC00U) /* Reserved */
++#endif
+ #define DR_LOCAL_SLOWDOWN   (0x100)  /* Local slow the pipeline */
+ #define DR_GLOBAL_SLOWDOWN  (0x200)  /* Global slow the pipeline */
+ 
+diff -urN libc.org/sysdeps/unix/sysv/linux/i386/sys/epoll.h libc/sysdeps/unix/sysv/linux/i386/sys/epoll.h
+--- libc.org/sysdeps/unix/sysv/linux/i386/sys/epoll.h	1969-12-31 18:00:00.000000000 -0600
++++ libc/sysdeps/unix/sysv/linux/i386/sys/epoll.h	2011-05-06 23:45:28.000000000 -0500
+@@ -0,0 +1,144 @@
++/* Copyright (C) 2002-2008, 2010 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	_SYS_EPOLL_H
++#define	_SYS_EPOLL_H	1
++
++#include <stdint.h>
++#include <sys/types.h>
++
++/* Get __sigset_t.  */
++#include <bits/sigset.h>
++
++#ifndef __sigset_t_defined
++# define __sigset_t_defined
++typedef __sigset_t sigset_t;
++#endif
++
++
++/* Flags to be passed to epoll_create1.  */
++enum
++  {
++    EPOLL_CLOEXEC = 02000000,
++#define EPOLL_CLOEXEC EPOLL_CLOEXEC
++    EPOLL_NONBLOCK = 04000
++#define EPOLL_NONBLOCK EPOLL_NONBLOCK
++  };
++
++
++enum EPOLL_EVENTS
++  {
++    EPOLLIN = 0x001,
++#define EPOLLIN EPOLLIN
++    EPOLLPRI = 0x002,
++#define EPOLLPRI EPOLLPRI
++    EPOLLOUT = 0x004,
++#define EPOLLOUT EPOLLOUT
++    EPOLLRDNORM = 0x040,
++#define EPOLLRDNORM EPOLLRDNORM
++    EPOLLRDBAND = 0x080,
++#define EPOLLRDBAND EPOLLRDBAND
++    EPOLLWRNORM = 0x100,
++#define EPOLLWRNORM EPOLLWRNORM
++    EPOLLWRBAND = 0x200,
++#define EPOLLWRBAND EPOLLWRBAND
++    EPOLLMSG = 0x400,
++#define EPOLLMSG EPOLLMSG
++    EPOLLERR = 0x008,
++#define EPOLLERR EPOLLERR
++    EPOLLHUP = 0x010,
++#define EPOLLHUP EPOLLHUP
++    EPOLLRDHUP = 0x2000,
++#define EPOLLRDHUP EPOLLRDHUP
++    EPOLLONESHOT = (1 << 30),
++#define EPOLLONESHOT EPOLLONESHOT
++    EPOLLET = (1 << 31)
++#define EPOLLET EPOLLET
++  };
++
++
++/* Valid opcodes ( "op" parameter ) to issue to epoll_ctl().  */
++#define EPOLL_CTL_ADD 1	/* Add a file decriptor to the interface.  */
++#define EPOLL_CTL_DEL 2	/* Remove a file decriptor from the interface.  */
++#define EPOLL_CTL_MOD 3	/* Change file decriptor epoll_event structure.  */
++
++
++typedef union epoll_data
++{
++  void *ptr;
++  int fd;
++  uint32_t u32;
++  uint64_t u64;
++} epoll_data_t;
++
++struct epoll_event
++{
++  uint32_t events;	/* Epoll events */
++  epoll_data_t data;	/* User data variable */
++} __attribute__ ((__packed__));
++
++
++__BEGIN_DECLS
++
++/* Creates an epoll instance.  Returns an fd for the new instance.
++   The "size" parameter is a hint specifying the number of file
++   descriptors to be associated with the new instance.  The fd
++   returned by epoll_create() should be closed with close().  */
++extern int epoll_create (int __size) __THROW;
++
++/* Same as epoll_create but with an FLAGS parameter.  The unused SIZE
++   parameter has been dropped.  */
++extern int epoll_create1 (int __flags) __THROW;
++
++
++/* Manipulate an epoll instance "epfd". Returns 0 in case of success,
++   -1 in case of error ( the "errno" variable will contain the
++   specific error code ) The "op" parameter is one of the EPOLL_CTL_*
++   constants defined above. The "fd" parameter is the target of the
++   operation. The "event" parameter describes which events the caller
++   is interested in and any associated user data.  */
++extern int epoll_ctl (int __epfd, int __op, int __fd,
++		      struct epoll_event *__event) __THROW;
++
++
++/* Wait for events on an epoll instance "epfd". Returns the number of
++   triggered events returned in "events" buffer. Or -1 in case of
++   error with the "errno" variable set to the specific error code. The
++   "events" parameter is a buffer that will contain triggered
++   events. The "maxevents" is the maximum number of events to be
++   returned ( usually size of "events" ). The "timeout" parameter
++   specifies the maximum wait time in milliseconds (-1 == infinite).
++
++   This function is a cancellation point and therefore not marked with
++   __THROW.  */
++extern int epoll_wait (int __epfd, struct epoll_event *__events,
++		       int __maxevents, int __timeout);
++
++
++/* Same as epoll_wait, but the thread's signal mask is temporarily
++   and atomically replaced with the one provided as parameter.
++
++   This function is a cancellation point and therefore not marked with
++   __THROW.  */
++extern int epoll_pwait (int __epfd, struct epoll_event *__events,
++			int __maxevents, int __timeout,
++			__const __sigset_t *__ss);
++
++__END_DECLS
++
++#endif /* sys/epoll.h */
+diff -urN libc.org/sysdeps/unix/sysv/linux/i386/sys/io.h libc/sysdeps/unix/sysv/linux/i386/sys/io.h
+--- libc.org/sysdeps/unix/sysv/linux/i386/sys/io.h	2011-05-06 23:45:14.000000000 -0500
++++ libc/sysdeps/unix/sysv/linux/i386/sys/io.h	2011-07-14 18:07:17.890707900 -0500
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 1996, 2000, 2009 Free Software Foundation, Inc.
++/* Copyright (C) 1996, 2000, 2002, 2009 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
+@@ -89,94 +89,90 @@
+ inl_p (unsigned short int __port)
+ {
+   unsigned int _v;
+-  __asm__ __volatile__ ("inl %w1,%0\noutb %%al,$0x80":"=a" (_v)
+-			:"Nd" (__port));
++  __asm__ __volatile__ ("inl %w1,%0\noutb %%al,$0x80":"=a" (_v):"Nd" (__port));
+   return _v;
+ }
+ 
+ static __inline void
+-outb (unsigned char value, unsigned short int __port)
++outb (unsigned char __value, unsigned short int __port)
+ {
+-  __asm__ __volatile__ ("outb %b0,%w1": :"a" (value), "Nd" (__port));
++  __asm__ __volatile__ ("outb %b0,%w1": :"a" (__value), "Nd" (__port));
+ }
+ 
+ static __inline void
+-outb_p (unsigned char value, unsigned short int __port)
++outb_p (unsigned char __value, unsigned short int __port)
+ {
+-  __asm__ __volatile__ ("outb %b0,%w1\noutb %%al,$0x80": :"a" (value),
++  __asm__ __volatile__ ("outb %b0,%w1\noutb %%al,$0x80": :"a" (__value),
+ 			"Nd" (__port));
+ }
+ 
+ static __inline void
+-outw (unsigned short int value, unsigned short int __port)
++outw (unsigned short int __value, unsigned short int __port)
+ {
+-  __asm__ __volatile__ ("outw %w0,%w1": :"a" (value), "Nd" (__port));
++  __asm__ __volatile__ ("outw %w0,%w1": :"a" (__value), "Nd" (__port));
+ 
+ }
+ 
+ static __inline void
+-outw_p (unsigned short int value, unsigned short int __port)
++outw_p (unsigned short int __value, unsigned short int __port)
+ {
+-  __asm__ __volatile__ ("outw %w0,%w1\noutb %%al,$0x80": :"a" (value),
++  __asm__ __volatile__ ("outw %w0,%w1\noutb %%al,$0x80": :"a" (__value),
+ 			"Nd" (__port));
+ }
+ 
+ static __inline void
+-outl (unsigned int value, unsigned short int __port)
++outl (unsigned int __value, unsigned short int __port)
+ {
+-  __asm__ __volatile__ ("outl %0,%w1": :"a" (value), "Nd" (__port));
++  __asm__ __volatile__ ("outl %0,%w1": :"a" (__value), "Nd" (__port));
+ }
+ 
+ static __inline void
+-outl_p (unsigned int value, unsigned short int __port)
++outl_p (unsigned int __value, unsigned short int __port)
+ {
+-  __asm__ __volatile__ ("outl %0,%w1\noutb %%al,$0x80": :"a" (value),
++  __asm__ __volatile__ ("outl %0,%w1\noutb %%al,$0x80": :"a" (__value),
+ 			"Nd" (__port));
+ }
+ 
+ static __inline void
+-insb (unsigned short int __port, void *__addr, unsigned long int __count)
++insb (unsigned short int __port, void *addr, unsigned long int __count)
+ {
+-  __asm__ __volatile__ ("cld ; rep ; insb":"=D" (__addr), "=c" (__count)
+-			:"d" (__port), "0" (__addr), "1" (__count));
++  __asm__ __volatile__ ("cld ; rep ; insb":"=D" (addr), "=c" (__count)
++			:"d" (__port), "0" (addr), "1" (__count));
+ }
+ 
+ static __inline void
+-insw (unsigned short int __port, void *__addr, unsigned long int __count)
++insw (unsigned short int __port, void *addr, unsigned long int __count)
+ {
+-  __asm__ __volatile__ ("cld ; rep ; insw":"=D" (__addr), "=c" (__count)
+-			:"d" (__port), "0" (__addr), "1" (__count));
++  __asm__ __volatile__ ("cld ; rep ; insw":"=D" (addr), "=c" (__count)
++			:"d" (__port), "0" (addr), "1" (__count));
+ }
+ 
+ static __inline void
+-insl (unsigned short int __port, void *__addr, unsigned long int __count)
++insl (unsigned short int __port, void *addr, unsigned long int __count)
+ {
+-  __asm__ __volatile__ ("cld ; rep ; insl":"=D" (__addr), "=c" (__count)
+-			:"d" (__port), "0" (__addr), "1" (__count));
++  __asm__ __volatile__ ("cld ; rep ; insl":"=D" (addr), "=c" (__count)
++			:"d" (__port), "0" (addr), "1" (__count));
+ }
+ 
+ static __inline void
+-outsb (unsigned short int __port, const void *__addr,
+-       unsigned long int __count)
++outsb (unsigned short int __port, const void *addr, unsigned long int __count)
+ {
+-  __asm__ __volatile__ ("cld ; rep ; outsb":"=S" (__addr), "=c" (__count)
+-			:"d" (__port), "0" (__addr), "1" (__count));
++  __asm__ __volatile__ ("cld ; rep ; outsb":"=S" (addr), "=c" (__count)
++			:"d" (__port), "0" (addr), "1" (__count));
+ }
+ 
+ static __inline void
+-outsw (unsigned short int __port, const void *__addr,
+-       unsigned long int __count)
++outsw (unsigned short int __port, const void *addr, unsigned long int __count)
+ {
+-  __asm__ __volatile__ ("cld ; rep ; outsw":"=S" (__addr), "=c" (__count)
+-			:"d" (__port), "0" (__addr), "1" (__count));
++  __asm__ __volatile__ ("cld ; rep ; outsw":"=S" (addr), "=c" (__count)
++  			:"d" (__port), "0" (addr), "1" (__count));
+ }
+ 
+ static __inline void
+-outsl (unsigned short int __port, const void *__addr,
+-       unsigned long int __count)
++outsl (unsigned short int __port, const void *addr, unsigned long int __count)
+ {
+-  __asm__ __volatile__ ("cld ; rep ; outsl":"=S" (__addr), "=c" (__count)
+-			:"d" (__port), "0" (__addr), "1" (__count));
++  __asm__ __volatile__ ("cld ; rep ; outsl":"=S" (addr), "=c" (__count)
++			:"d" (__port), "0" (addr), "1" (__count));
+ }
+ 
+ #endif	/* GNU C */
+diff -urN libc.org/sysdeps/unix/sysv/linux/i386/sys/perm.h libc/sysdeps/unix/sysv/linux/i386/sys/perm.h
+--- libc.org/sysdeps/unix/sysv/linux/i386/sys/perm.h	2011-05-06 23:45:14.000000000 -0500
++++ libc/sysdeps/unix/sysv/linux/i386/sys/perm.h	2011-07-14 18:08:11.745707497 -0500
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 1996, 1999 Free Software Foundation, Inc.
++/* Copyright (C) 1996, 1999, 2001 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
+diff -urN libc.org/sysdeps/unix/sysv/linux/i386/sys/procfs.h libc/sysdeps/unix/sysv/linux/i386/sys/procfs.h
+--- libc.org/sysdeps/unix/sysv/linux/i386/sys/procfs.h	2011-05-06 23:45:14.000000000 -0500
++++ libc/sysdeps/unix/sysv/linux/i386/sys/procfs.h	2011-07-14 18:31:47.930883763 -0500
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
++/* Copyright (C) 1996, 1997, 1999, 2000, 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
+@@ -45,6 +45,7 @@
+ #define ELF_NGREG (sizeof (struct user_regs_struct) / sizeof(elf_greg_t))
+ typedef elf_greg_t elf_gregset_t[ELF_NGREG];
+ 
++#if __WORDSIZE == 32
+ /* Register set for the floating-point registers.  */
+ typedef struct user_fpregs_struct elf_fpregset_t;
+ 
+@@ -52,7 +53,12 @@
+    the Pentium III SSE registers in addition to the classic
+    floating-point stuff.  */
+ typedef struct user_fpxregs_struct elf_fpxregset_t;
+-
++#else
++/* Register set for the extended floating-point registers.  Includes
++   the Pentium III SSE registers in addition to the classic
++   floating-point stuff.  */
++typedef struct user_fpregs_struct elf_fpregset_t;
++#endif
+ 
+ /* Signal info.  */
+ struct elf_siginfo
+@@ -98,8 +104,13 @@
+     char pr_zomb;			/* Zombie.  */
+     char pr_nice;			/* Nice val.  */
+     unsigned long int pr_flag;		/* Flags.  */
++#if __WORDSIZE == 32
+     unsigned short int pr_uid;
+     unsigned short int pr_gid;
++#else
++    unsigned int pr_uid;
++    unsigned int pr_gid;
++#endif
+     int pr_pid, pr_ppid, pr_pgrp, pr_sid;
+     /* Lots missing */
+     char pr_fname[16];			/* Filename of executable.  */
+diff -urN libc.org/sysdeps/unix/sysv/linux/i386/sys/reg.h libc/sysdeps/unix/sysv/linux/i386/sys/reg.h
+--- libc.org/sysdeps/unix/sysv/linux/i386/sys/reg.h	2011-05-06 23:45:14.000000000 -0500
++++ libc/sysdeps/unix/sysv/linux/i386/sys/reg.h	2011-07-14 18:09:30.621708097 -0500
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 1998 Free Software Foundation, Inc.
++/* Copyright (C) 2001, 2002 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
+@@ -18,26 +18,62 @@
+ 
+ #ifndef _SYS_REG_H
+ #define _SYS_REG_H	1
++#include <bits/wordsize.h>
++
++
++#if __WORDSIZE == 64
++/* Index into an array of 8 byte longs returned from ptrace for
++   location of the users' stored general purpose registers.  */
++
++# define R15	0
++# define R14	1
++# define R13	2
++# define R12	3
++# define RBP	4
++# define RBX	5
++# define R11	6
++# define R10	7
++# define R9	8
++# define R8	9
++# define RAX	10
++# define RCX	11
++# define RDX	12
++# define RSI	13
++# define RDI	14
++# define ORIG_RAX 15
++# define RIP	16
++# define CS	17
++# define EFLAGS	18
++# define RSP	19
++# define SS	20
++# define FS_BASE 21
++# define GS_BASE 22
++# define DS	23
++# define ES	24
++# define FS	25
++# define GS	26
++#else
+ 
+ /* Index into an array of 4 byte integers returned from ptrace for
+  * location of the users' stored general purpose registers. */
+ 
+-#define EBX 0
+-#define ECX 1
+-#define EDX 2
+-#define ESI 3
+-#define EDI 4
+-#define EBP 5
+-#define EAX 6
+-#define DS 7
+-#define ES 8
+-#define FS 9
+-#define GS 10
+-#define ORIG_EAX 11
+-#define EIP 12
+-#define CS  13
+-#define EFL 14
+-#define UESP 15
+-#define SS   16
++# define EBX 0
++# define ECX 1
++# define EDX 2
++# define ESI 3
++# define EDI 4
++# define EBP 5
++# define EAX 6
++# define DS 7
++# define ES 8
++# define FS 9
++# define GS 10
++# define ORIG_EAX 11
++# define EIP 12
++# define CS  13
++# define EFL 14
++# define UESP 15
++# define SS   16
++#endif
+ 
+-#endif	/* _SYS_REG_H */
++#endif
+diff -urN libc.org/sysdeps/unix/sysv/linux/i386/sys/ucontext.h libc/sysdeps/unix/sysv/linux/i386/sys/ucontext.h
+--- libc.org/sysdeps/unix/sysv/linux/i386/sys/ucontext.h	2011-05-06 23:45:14.000000000 -0500
++++ libc/sysdeps/unix/sysv/linux/i386/sys/ucontext.h	2011-07-14 18:32:17.084884017 -0500
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
++/* Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 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
+@@ -21,11 +21,128 @@
+ 
+ #include <features.h>
+ #include <signal.h>
++#include <bits/wordsize.h>
+ 
+ /* We need the signal context definitions even if they are not used
+    included in <signal.h>.  */
+ #include <bits/sigcontext.h>
+ 
++#if __WORDSIZE == 64
++
++/* Type for general register.  */
++typedef long int greg_t;
++
++/* Number of general registers.  */
++#define NGREG	23
++
++/* Container for all general registers.  */
++typedef greg_t gregset_t[NGREG];
++
++#ifdef __USE_GNU
++/* Number of each register in the `gregset_t' array.  */
++enum
++{
++  REG_R8 = 0,
++# define REG_R8		REG_R8
++  REG_R9,
++# define REG_R9		REG_R9
++  REG_R10,
++# define REG_R10	REG_R10
++  REG_R11,
++# define REG_R11	REG_R11
++  REG_R12,
++# define REG_R12	REG_R12
++  REG_R13,
++# define REG_R13	REG_R13
++  REG_R14,
++# define REG_R14	REG_R14
++  REG_R15,
++# define REG_R15	REG_R15
++  REG_RDI,
++# define REG_RDI	REG_RDI
++  REG_RSI,
++# define REG_RSI	REG_RSI
++  REG_RBP,
++# define REG_RBP	REG_RBP
++  REG_RBX,
++# define REG_RBX	REG_RBX
++  REG_RDX,
++# define REG_RDX	REG_RDX
++  REG_RAX,
++# define REG_RAX	REG_RAX
++  REG_RCX,
++# define REG_RCX	REG_RCX
++  REG_RSP,
++# define REG_RSP	REG_RSP
++  REG_RIP,
++# define REG_RIP	REG_RIP
++  REG_EFL,
++# define REG_EFL	REG_EFL
++  REG_CSGSFS,		/* Actually short cs, gs, fs, __pad0.  */
++# define REG_CSGSFS	REG_CSGSFS
++  REG_ERR,
++# define REG_ERR	REG_ERR
++  REG_TRAPNO,
++# define REG_TRAPNO	REG_TRAPNO
++  REG_OLDMASK,
++# define REG_OLDMASK	REG_OLDMASK
++  REG_CR2
++# define REG_CR2	REG_CR2
++};
++#endif
++
++struct _libc_fpxreg
++{
++  unsigned short int significand[4];
++  unsigned short int exponent;
++  unsigned short int padding[3];
++};
++
++struct _libc_xmmreg
++{
++  __uint32_t	element[4];
++};
++
++struct _libc_fpstate
++{
++  /* 64-bit FXSAVE format.  */
++  __uint16_t		cwd;
++  __uint16_t		swd;
++  __uint16_t		ftw;
++  __uint16_t		fop;
++  __uint64_t		rip;
++  __uint64_t		rdp;
++  __uint32_t		mxcsr;
++  __uint32_t		mxcr_mask;
++  struct _libc_fpxreg	_st[8];
++  struct _libc_xmmreg	_xmm[16];
++  __uint32_t		padding[24];
++};
++
++/* Structure to describe FPU registers.  */
++typedef struct _libc_fpstate *fpregset_t;
++
++/* Context to describe whole processor state.  */
++typedef struct
++  {
++    gregset_t gregs;
++    /* Note that fpregs is a pointer.  */
++    fpregset_t fpregs;
++    unsigned long __reserved1 [8];
++} mcontext_t;
++
++/* Userlevel context.  */
++typedef struct ucontext
++  {
++    unsigned long int uc_flags;
++    struct ucontext *uc_link;
++    stack_t uc_stack;
++    mcontext_t uc_mcontext;
++    __sigset_t uc_sigmask;
++    struct _libc_fpstate __fpregs_mem;
++  } ucontext_t;
++
++#else /* __WORDSIZE == 32 */
+ 
+ /* Type for general register.  */
+ typedef int greg_t;
+@@ -126,4 +243,6 @@
+     struct _libc_fpstate __fpregs_mem;
+   } ucontext_t;
+ 
++#endif /* __WORDSIZE == 32 */
++
+ #endif /* sys/ucontext.h */
+diff -urN libc.org/sysdeps/unix/sysv/linux/i386/sys/user.h libc/sysdeps/unix/sysv/linux/i386/sys/user.h
+--- libc.org/sysdeps/unix/sysv/linux/i386/sys/user.h	2011-05-06 23:45:14.000000000 -0500
++++ libc/sysdeps/unix/sysv/linux/i386/sys/user.h	2011-07-14 18:32:43.343884215 -0500
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 1998, 2000 Free Software Foundation, Inc.
++/* Copyright (C) 1998, 2000, 2001, 2002, 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
+@@ -23,6 +23,77 @@
+    too much into it.  Don't use it for anything other than GDB unless
+    you know what you are doing.  */
+ 
++#include <bits/wordsize.h>
++
++#if __WORDSIZE == 64
++
++struct user_fpregs_struct
++{
++  __uint16_t		cwd;
++  __uint16_t		swd;
++  __uint16_t		ftw;
++  __uint16_t		fop;
++  __uint64_t		rip;
++  __uint64_t		rdp;
++  __uint32_t		mxcsr;
++  __uint32_t		mxcr_mask;
++  __uint32_t		st_space[32];   /* 8*16 bytes for each FP-reg = 128 bytes */
++  __uint32_t		xmm_space[64];  /* 16*16 bytes for each XMM-reg = 256 bytes */
++  __uint32_t		padding[24];
++};
++
++struct user_regs_struct
++{
++  unsigned long r15;
++  unsigned long r14;
++  unsigned long r13;
++  unsigned long r12;
++  unsigned long rbp;
++  unsigned long rbx;
++  unsigned long r11;
++  unsigned long r10;
++  unsigned long r9;
++  unsigned long r8;
++  unsigned long rax;
++  unsigned long rcx;
++  unsigned long rdx;
++  unsigned long rsi;
++  unsigned long rdi;
++  unsigned long orig_rax;
++  unsigned long rip;
++  unsigned long cs;
++  unsigned long eflags;
++  unsigned long rsp;
++  unsigned long ss;
++  unsigned long fs_base;
++  unsigned long gs_base;
++  unsigned long ds;
++  unsigned long es;
++  unsigned long fs;
++  unsigned long gs;
++};
++
++struct user
++{
++  struct user_regs_struct	regs;
++  int				u_fpvalid;
++  struct user_fpregs_struct	i387;
++  unsigned long int		u_tsize;
++  unsigned long int		u_dsize;
++  unsigned long int		u_ssize;
++  unsigned long			start_code;
++  unsigned long			start_stack;
++  long int			signal;
++  int				reserved;
++  struct user_regs_struct*	u_ar0;
++  struct user_fpregs_struct*	u_fpstate;
++  unsigned long int		magic;
++  char				u_comm [32];
++  unsigned long int		u_debugreg [8];
++};
++
++#else
++/* These are the 32-bit x86 structures.  */
+ struct user_fpregs_struct
+ {
+   long int cwd;
+@@ -91,6 +162,7 @@
+   char				u_comm [32];
+   int				u_debugreg [8];
+ };
++#endif  /* __WORDSIZE */
+ 
+ #define PAGE_SHIFT		12
+ #define PAGE_SIZE		(1UL << PAGE_SHIFT)
+diff -urN libc.org/sysdeps/unix/sysv/linux/x86_64/bits/fcntl.h libc/sysdeps/unix/sysv/linux/x86_64/bits/fcntl.h
+--- libc.org/sysdeps/unix/sysv/linux/x86_64/bits/fcntl.h	2011-05-06 23:45:28.000000000 -0500
++++ libc/sysdeps/unix/sysv/linux/x86_64/bits/fcntl.h	2011-07-14 18:24:08.841710671 -0500
+@@ -1,5 +1,5 @@
+-/* O_*, F_*, FD_* bit values for Linux/x86-64.
+-   Copyright (C) 2001,2002,2004,2006,2007,2009,2010
++/* O_*, F_*, FD_* bit values for Linux/i386/x86-64.
++   Copyright (C) 1995,1996,1997,1998,2000,2001,2002,2004,2006,2007,2009,2010
+    Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+diff -urN libc.org/sysdeps/unix/sysv/linux/x86_64/bits/mman.h libc/sysdeps/unix/sysv/linux/x86_64/bits/mman.h
+--- libc.org/sysdeps/unix/sysv/linux/x86_64/bits/mman.h	2011-05-06 23:45:28.000000000 -0500
++++ libc/sysdeps/unix/sysv/linux/x86_64/bits/mman.h	2011-07-14 18:25:02.037710526 -0500
+@@ -1,5 +1,5 @@
+-/* Definitions for POSIX memory map interface.  Linux/x86_64 version.
+-   Copyright (C) 2001,2003,2005,2006,2009,2010,2011
++/* Definitions for POSIX memory map interface.  Linux/i386/x86_64 version.
++   Copyright (C) 1997,2000,2001,2003,2005,2006,2009,2010,2011
+    Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+diff -urN libc.org/sysdeps/unix/sysv/linux/x86_64/bits/sem.h libc/sysdeps/unix/sysv/linux/x86_64/bits/sem.h
+--- libc.org/sysdeps/unix/sysv/linux/x86_64/bits/sem.h	2011-05-06 23:45:28.000000000 -0500
++++ libc/sysdeps/unix/sysv/linux/x86_64/bits/sem.h	1969-12-31 18:00:00.000000000 -0600
+@@ -1,87 +0,0 @@
+-/* Copyright (C) 2002 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 _SYS_SEM_H
+-# error "Never include <bits/sem.h> directly; use <sys/sem.h> instead."
+-#endif
+-
+-#include <sys/types.h>
+-
+-/* Flags for `semop'.  */
+-#define SEM_UNDO	0x1000		/* undo the operation on exit */
+-
+-/* Commands for `semctl'.  */
+-#define GETPID		11		/* get sempid */
+-#define GETVAL		12		/* get semval */
+-#define GETALL		13		/* get all semval's */
+-#define GETNCNT		14		/* get semncnt */
+-#define GETZCNT		15		/* get semzcnt */
+-#define SETVAL		16		/* set semval */
+-#define SETALL		17		/* set all semval's */
+-
+-
+-/* Data structure describing a set of semaphores.  */
+-struct semid_ds
+-{
+-  struct ipc_perm sem_perm;		/* operation permission struct */
+-  __time_t sem_otime;			/* last semop() time */
+-  unsigned long int __unused1;
+-  __time_t sem_ctime;			/* last time changed by semctl() */
+-  unsigned long int __unused2;
+-  unsigned long int sem_nsems;		/* number of semaphores in set */
+-  unsigned long int __unused3;
+-  unsigned long int __unused4;
+-};
+-
+-/* The user should define a union like the following to use it for arguments
+-   for `semctl'.
+-
+-   union semun
+-   {
+-     int val;				<= value for SETVAL
+-     struct semid_ds *buf;		<= buffer for IPC_STAT & IPC_SET
+-     unsigned short int *array;		<= array for GETALL & SETALL
+-     struct seminfo *__buf;		<= buffer for IPC_INFO
+-   };
+-
+-   Previous versions of this file used to define this union but this is
+-   incorrect.  One can test the macro _SEM_SEMUN_UNDEFINED to see whether
+-   one must define the union or not.  */
+-#define _SEM_SEMUN_UNDEFINED	1
+-
+-#ifdef __USE_MISC
+-
+-/* ipcs ctl cmds */
+-# define SEM_STAT 18
+-# define SEM_INFO 19
+-
+-struct  seminfo
+-{
+-  int semmap;
+-  int semmni;
+-  int semmns;
+-  int semmnu;
+-  int semmsl;
+-  int semopm;
+-  int semume;
+-  int semusz;
+-  int semvmx;
+-  int semaem;
+-};
+-
+-#endif /* __USE_MISC */
+diff -urN libc.org/sysdeps/unix/sysv/linux/x86_64/sys/debugreg.h libc/sysdeps/unix/sysv/linux/x86_64/sys/debugreg.h
+--- libc.org/sysdeps/unix/sysv/linux/x86_64/sys/debugreg.h	2011-05-06 23:45:28.000000000 -0500
++++ libc/sysdeps/unix/sysv/linux/x86_64/sys/debugreg.h	2011-07-14 18:30:59.762685496 -0500
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 2001, 2003 Free Software Foundation, Inc.
++/* Copyright (C) 1998, 2000, 2001, 2003 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
+diff -urN libc.org/sysdeps/unix/sysv/linux/x86_64/sys/procfs.h libc/sysdeps/unix/sysv/linux/x86_64/sys/procfs.h
+--- libc.org/sysdeps/unix/sysv/linux/x86_64/sys/procfs.h	2011-05-06 23:45:28.000000000 -0500
++++ libc/sysdeps/unix/sysv/linux/x86_64/sys/procfs.h	2011-07-14 18:31:54.803710763 -0500
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 2001, 2004 Free Software Foundation, Inc.
++/* Copyright (C) 1996, 1997, 1999, 2000, 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
+diff -urN libc.org/sysdeps/unix/sysv/linux/x86_64/sys/ucontext.h libc/sysdeps/unix/sysv/linux/x86_64/sys/ucontext.h
+--- libc.org/sysdeps/unix/sysv/linux/x86_64/sys/ucontext.h	2011-05-06 23:45:28.000000000 -0500
++++ libc/sysdeps/unix/sysv/linux/x86_64/sys/ucontext.h	2011-07-14 18:32:24.216711939 -0500
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 2001, 2002 Free Software Foundation, Inc.
++/* Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 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
+diff -urN libc.org/sysdeps/unix/sysv/linux/x86_64/sys/user.h libc/sysdeps/unix/sysv/linux/x86_64/sys/user.h
+--- libc.org/sysdeps/unix/sysv/linux/x86_64/sys/user.h	2011-05-06 23:45:28.000000000 -0500
++++ libc/sysdeps/unix/sysv/linux/x86_64/sys/user.h	2011-07-14 18:32:49.807711167 -0500
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 2001, 2002, 2004 Free Software Foundation, Inc.
++/* Copyright (C) 1998, 2000, 2001, 2002, 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
+diff -urN libc.org/sysdeps/x86_64/bits/byteswap.h libc/sysdeps/x86_64/bits/byteswap.h
+--- libc.org/sysdeps/x86_64/bits/byteswap.h	2011-05-06 23:45:46.000000000 -0500
++++ libc/sysdeps/x86_64/bits/byteswap.h	2011-07-14 18:12:08.225761132 -0500
+@@ -1,5 +1,5 @@
+ /* Macros to swap the order of bytes in integer values.
+-   Copyright (C) 1997, 1998, 2000, 2002, 2003, 2007, 2008, 2010
++   Copyright (C) 1997, 1998, 2000, 2002, 2003, 2006, 2007, 2008, 2010
+    Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+diff -urN libc.org/sysdeps/x86_64/bits/endian.h libc/sysdeps/x86_64/bits/endian.h
+--- libc.org/sysdeps/x86_64/bits/endian.h	2011-05-06 23:45:46.000000000 -0500
++++ libc/sysdeps/x86_64/bits/endian.h	2011-07-14 16:02:44.436758681 -0500
+@@ -1,4 +1,4 @@
+-/* x86_64 is little-endian.  */
++/* i386/x86_64 is little-endian.  */
+ 
+ #ifndef _ENDIAN_H
+ # error "Never use <bits/endian.h> directly; include <endian.h> instead."
+diff -urN libc.org/sysdeps/x86_64/bits/huge_vall.h libc/sysdeps/x86_64/bits/huge_vall.h
+--- libc.org/sysdeps/x86_64/bits/huge_vall.h	1969-12-31 18:00:00.000000000 -0600
++++ libc/sysdeps/x86_64/bits/huge_vall.h	2011-07-14 16:17:02.398711441 -0500
+@@ -0,0 +1,47 @@
++/* `HUGE_VALL' constant for ix86 (where it is infinity).
++   Used by <stdlib.h> and <math.h> functions for overflow.
++   Copyright (C) 1992, 1995, 1996, 1997, 1999, 2000, 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.  */
++
++#ifndef _MATH_H
++# error "Never use <bits/huge_vall.h> directly; include <math.h> instead."
++#endif
++
++#include <bits/wordsize.h>
++
++#if __GNUC_PREREQ(3,3)
++# define HUGE_VALL	(__builtin_huge_vall())
++#elif __GNUC_PREREQ(2,96) && __WORDSIZE == 32
++# define HUGE_VALL	(__extension__ 0x1.0p32767L)
++#else
++#if __WORDSIZE == 32
++# define __HUGE_VALL_bytes	{ 0, 0, 0, 0, 0, 0, 0, 0x80, 0xff, 0x7f, 0, 0 }
++
++# define __huge_vall_t	union { unsigned char __c[12]; long double __ld; }
++# ifdef __GNUC__
++#  define HUGE_VALL	(__extension__ \
++			 ((__huge_vall_t) { __c: __HUGE_VALL_bytes }).__ld)
++# else	/* Not GCC.  */
++static __huge_vall_t __huge_vall = { __HUGE_VALL_bytes };
++#  define HUGE_VALL	(__huge_vall.__ld)
++#  endif /* GCC.  */
++#else /* __WORDSIZE == 64 */
++# define HUGE_VALL	((long double) HUGE_VAL)
++#endif /* __WORDSIZE */
++#endif /* GCC 2.95 */
+diff -urN libc.org/sysdeps/x86_64/bits/mathdef.h libc/sysdeps/x86_64/bits/mathdef.h
+--- libc.org/sysdeps/x86_64/bits/mathdef.h	2011-05-06 23:45:46.000000000 -0500
++++ libc/sysdeps/x86_64/bits/mathdef.h	2011-07-14 18:13:40.518708502 -0500
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 2001, 2004, 2010 Free Software Foundation, Inc.
++/* Copyright (C) 1997, 1998, 1999, 2000, 2001, 2004, 2010 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
+diff -urN libc.org/sysdeps/x86_64/bits/setjmp.h libc/sysdeps/x86_64/bits/setjmp.h
+--- libc.org/sysdeps/x86_64/bits/setjmp.h	2011-05-06 23:45:46.000000000 -0500
++++ libc/sysdeps/x86_64/bits/setjmp.h	2011-07-14 18:15:01.136707346 -0500
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 2001,2002,2003,2005,2006 Free Software Foundation, Inc.
++/* Copyright (C) 1997,1998,2000,2001,2002,2003,2005,2006 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+    The GNU C Library is free software; you can redistribute it and/or
+@@ -16,7 +16,7 @@
+    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+    02111-1307 USA.  */
+ 
+-/* Define the machine-dependent type `jmp_buf'.  x86-64 version.  */
++/* Define the machine-dependent type `jmp_buf'.  i386/x86-64 version.  */
+ #ifndef _BITS_SETJMP_H
+ #define _BITS_SETJMP_H  1
+ 
+diff -urN libc.org/sysdeps/x86_64/bits/string.h libc/sysdeps/x86_64/bits/string.h
+--- libc.org/sysdeps/x86_64/bits/string.h	2011-05-06 23:45:46.000000000 -0500
++++ libc/sysdeps/x86_64/bits/string.h	2011-07-14 18:33:46.149778284 -0500
+@@ -1,5 +1,6 @@
+-/* Optimized, inlined string functions.  AMD x86-64 version.
+-   Copyright (C) 2001 Free Software Foundation, Inc.
++/* Optimized, inlined string functions.  i486/x86-64 version.
++   Copyright (C) 1997,1998,1999,2000,2001,2002,2003,2004,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
+@@ -21,6 +22,1955 @@
+ # error "Never use <bits/string.h> directly; include <string.h> instead."
+ #endif
+ 
+-/* Currently the only purpose of this file is to tell the generic inline
+-   macros that unaligned memory access is possible for x86-64.  */
++/* The ix86 processors can access unaligned multi-byte variables.  */
+ #define _STRING_ARCH_unaligned	1
++
++#include <bits/wordsize.h>
++
++/* We only provide optimizations if the user selects them and if
++   GNU CC is used.  */
++#if __WORDSIZE == 32 && !defined __NO_STRING_INLINES && defined __USE_STRING_INLINES \
++    && defined __GNUC__ && __GNUC__ >= 2 && !__BOUNDED_POINTERS__
++
++#ifndef __STRING_INLINE
++# ifndef __extern_inline
++#  define __STRING_INLINE inline
++# else
++#  define __STRING_INLINE __extern_inline
++# endif
++#endif
++
++/* The macros are used in some of the optimized implementations below.  */
++#define __STRING_SMALL_GET16(src, idx) \
++  ((((__const unsigned char *) (src))[idx + 1] << 8)			      \
++   | ((__const unsigned char *) (src))[idx])
++#define __STRING_SMALL_GET32(src, idx) \
++  (((((__const unsigned char *) (src))[idx + 3] << 8			      \
++     | ((__const unsigned char *) (src))[idx + 2]) << 8			      \
++    | ((__const unsigned char *) (src))[idx + 1]) << 8			      \
++   | ((__const unsigned char *) (src))[idx])
++
++
++/* Copy N bytes of SRC to DEST.  */
++#define _HAVE_STRING_ARCH_memcpy 1
++#define memcpy(dest, src, n) \
++  (__extension__ (__builtin_constant_p (n)				      \
++		  ? __memcpy_c ((dest), (src), (n))			      \
++		  : __memcpy_g ((dest), (src), (n))))
++#define __memcpy_c(dest, src, n) \
++  ((n) == 0								      \
++   ? (dest)								      \
++   : (((n) % 4 == 0)							      \
++      ? __memcpy_by4 (dest, src, n)					      \
++      : (((n) % 2 == 0)							      \
++	 ? __memcpy_by2 (dest, src, n)					      \
++	 : __memcpy_g (dest, src, n))))
++
++__STRING_INLINE void *__memcpy_by4 (void *__dest, __const void *__src,
++				    size_t __n);
++
++__STRING_INLINE void *
++__memcpy_by4 (void *__dest, __const void *__src, size_t __n)
++{
++  register unsigned long int __d0, __d1;
++  register void *__tmp = __dest;
++  __asm__ __volatile__
++    ("1:\n\t"
++     "movl	(%2),%0\n\t"
++     "leal	4(%2),%2\n\t"
++     "movl	%0,(%1)\n\t"
++     "leal	4(%1),%1\n\t"
++     "decl	%3\n\t"
++     "jnz	1b"
++     : "=&r" (__d0), "=&r" (__tmp), "=&r" (__src), "=&r" (__d1)
++     : "1" (__tmp), "2" (__src), "3" (__n / 4)
++     : "memory", "cc");
++  return __dest;
++}
++
++__STRING_INLINE void *__memcpy_by2 (void *__dest, __const void *__src,
++				    size_t __n);
++
++__STRING_INLINE void *
++__memcpy_by2 (void *__dest, __const void *__src, size_t __n)
++{
++  register unsigned long int __d0, __d1;
++  register void *__tmp = __dest;
++  __asm__ __volatile__
++    ("shrl	$1,%3\n\t"
++     "jz	2f\n"                 /* only a word */
++     "1:\n\t"
++     "movl	(%2),%0\n\t"
++     "leal	4(%2),%2\n\t"
++     "movl	%0,(%1)\n\t"
++     "leal	4(%1),%1\n\t"
++     "decl	%3\n\t"
++     "jnz	1b\n"
++     "2:\n\t"
++     "movw	(%2),%w0\n\t"
++     "movw	%w0,(%1)"
++     : "=&q" (__d0), "=&r" (__tmp), "=&r" (__src), "=&r" (__d1)
++     : "1" (__tmp), "2" (__src), "3" (__n / 2)
++     : "memory", "cc");
++  return __dest;
++}
++
++__STRING_INLINE void *__memcpy_g (void *__dest, __const void *__src,
++				  size_t __n);
++
++__STRING_INLINE void *
++__memcpy_g (void *__dest, __const void *__src, size_t __n)
++{
++  register unsigned long int __d0, __d1, __d2;
++  register void *__tmp = __dest;
++  __asm__ __volatile__
++    ("cld\n\t"
++     "shrl	$1,%%ecx\n\t"
++     "jnc	1f\n\t"
++     "movsb\n"
++     "1:\n\t"
++     "shrl	$1,%%ecx\n\t"
++     "jnc	2f\n\t"
++     "movsw\n"
++     "2:\n\t"
++     "rep; movsl"
++     : "=&c" (__d0), "=&D" (__d1), "=&S" (__d2),
++       "=m" ( *(struct { __extension__ char __x[__n]; } *)__dest)
++     : "0" (__n), "1" (__tmp), "2" (__src),
++       "m" ( *(struct { __extension__ char __x[__n]; } *)__src)
++     : "cc");
++  return __dest;
++}
++
++#define _HAVE_STRING_ARCH_memmove 1
++#ifndef _FORCE_INLINES
++/* Copy N bytes of SRC to DEST, guaranteeing
++   correct behavior for overlapping strings.  */
++#define memmove(dest, src, n) __memmove_g (dest, src, n)
++
++__STRING_INLINE void *__memmove_g (void *, __const void *, size_t)
++     __asm__ ("memmove");
++
++__STRING_INLINE void *
++__memmove_g (void *__dest, __const void *__src, size_t __n)
++{
++  register unsigned long int __d0, __d1, __d2;
++  register void *__tmp = __dest;
++  if (__dest < __src)
++    __asm__ __volatile__
++      ("cld\n\t"
++       "rep; movsb"
++       : "=&c" (__d0), "=&S" (__d1), "=&D" (__d2),
++	 "=m" ( *(struct { __extension__ char __x[__n]; } *)__dest)
++       : "0" (__n), "1" (__src), "2" (__tmp),
++	 "m" ( *(struct { __extension__ char __x[__n]; } *)__src));
++  else
++    __asm__ __volatile__
++      ("std\n\t"
++       "rep; movsb\n\t"
++       "cld"
++       : "=&c" (__d0), "=&S" (__d1), "=&D" (__d2),
++	 "=m" ( *(struct { __extension__ char __x[__n]; } *)__dest)
++       : "0" (__n), "1" (__n - 1 + (__const char *) __src),
++	 "2" (__n - 1 + (char *) __tmp),
++	 "m" ( *(struct { __extension__ char __x[__n]; } *)__src));
++  return __dest;
++}
++#endif
++
++/* Compare N bytes of S1 and S2.  */
++#define _HAVE_STRING_ARCH_memcmp 1
++#ifndef _FORCE_INLINES
++# ifndef __PIC__
++/* gcc has problems to spill registers when using PIC.  */
++__STRING_INLINE int
++memcmp (__const void *__s1, __const void *__s2, size_t __n)
++{
++  register unsigned long int __d0, __d1, __d2;
++  register int __res;
++  __asm__ __volatile__
++    ("cld\n\t"
++     "testl %3,%3\n\t"
++     "repe; cmpsb\n\t"
++     "je	1f\n\t"
++     "sbbl	%0,%0\n\t"
++     "orl	$1,%0\n"
++     "1:"
++     : "=&a" (__res), "=&S" (__d0), "=&D" (__d1), "=&c" (__d2)
++     : "0" (0), "1" (__s1), "2" (__s2), "3" (__n),
++       "m" ( *(struct { __extension__ char __x[__n]; } *)__s1),
++       "m" ( *(struct { __extension__ char __x[__n]; } *)__s2)
++     : "cc");
++  return __res;
++}
++# endif
++#endif
++
++/* Set N bytes of S to C.  */
++#define _HAVE_STRING_ARCH_memset 1
++#define _USE_STRING_ARCH_memset 1
++#define memset(s, c, n) \
++  (__extension__ (__builtin_constant_p (n) && (n) <= 16			      \
++		  ? ((n) == 1						      \
++		     ? __memset_c1 ((s), (c))				      \
++		     : __memset_gc ((s), (c), (n)))			      \
++		  : (__builtin_constant_p (c)				      \
++		     ? (__builtin_constant_p (n)			      \
++			? __memset_ccn ((s), (c), (n))			      \
++			: memset ((s), (c), (n)))			      \
++		     : (__builtin_constant_p (n)			      \
++			? __memset_gcn ((s), (c), (n))			      \
++			: memset ((s), (c), (n))))))
++
++#define __memset_c1(s, c) ({ void *__s = (s);				      \
++			     *((unsigned char *) __s) = (unsigned char) (c);  \
++			     __s; })
++
++#define __memset_gc(s, c, n) \
++  ({ void *__s = (s);							      \
++     union {								      \
++       unsigned int __ui;						      \
++       unsigned short int __usi;					      \
++       unsigned char __uc;						      \
++     } *__u = __s;							      \
++     unsigned int __c = ((unsigned int) ((unsigned char) (c))) * 0x01010101;  \
++									      \
++     /* We apply a trick here.  `gcc' would implement the following	      \
++	assignments using immediate operands.  But this uses to much	      \
++	memory (7, instead of 4 bytes).  So we force the value in a	      \
++	registers.  */							      \
++     if ((n) == 3 || (n) >= 5)						      \
++       __asm__ __volatile__ ("" : "=r" (__c) : "0" (__c));		      \
++									      \
++     /* This `switch' statement will be removed at compile-time.  */	      \
++     switch (n)								      \
++       {								      \
++       case 15:								      \
++	 __u->__ui = __c;						      \
++	 __u = __extension__ ((void *) __u + 4);			      \
++       case 11:								      \
++	 __u->__ui = __c;						      \
++	 __u = __extension__ ((void *) __u + 4);			      \
++       case 7:								      \
++	 __u->__ui = __c;						      \
++	 __u = __extension__ ((void *) __u + 4);			      \
++       case 3:								      \
++	 __u->__usi = (unsigned short int) __c;				      \
++	 __u = __extension__ ((void *) __u + 2);			      \
++	 __u->__uc = (unsigned char) __c;				      \
++	 break;								      \
++									      \
++       case 14:								      \
++	 __u->__ui = __c;						      \
++	 __u = __extension__ ((void *) __u + 4);			      \
++       case 10:								      \
++	 __u->__ui = __c;						      \
++	 __u = __extension__ ((void *) __u + 4);			      \
++       case 6:								      \
++	 __u->__ui = __c;						      \
++	 __u = __extension__ ((void *) __u + 4);			      \
++       case 2:								      \
++	 __u->__usi = (unsigned short int) __c;				      \
++	 break;								      \
++									      \
++       case 13:								      \
++	 __u->__ui = __c;						      \
++	 __u = __extension__ ((void *) __u + 4);			      \
++       case 9:								      \
++	 __u->__ui = __c;						      \
++	 __u = __extension__ ((void *) __u + 4);			      \
++       case 5:								      \
++	 __u->__ui = __c;						      \
++	 __u = __extension__ ((void *) __u + 4);			      \
++       case 1:								      \
++	 __u->__uc = (unsigned char) __c;				      \
++	 break;								      \
++									      \
++       case 16:								      \
++	 __u->__ui = __c;						      \
++	 __u = __extension__ ((void *) __u + 4);			      \
++       case 12:								      \
++	 __u->__ui = __c;						      \
++	 __u = __extension__ ((void *) __u + 4);			      \
++       case 8:								      \
++	 __u->__ui = __c;						      \
++	 __u = __extension__ ((void *) __u + 4);			      \
++       case 4:								      \
++	 __u->__ui = __c;						      \
++       case 0:								      \
++	 break;								      \
++       }								      \
++									      \
++     __s; })
++
++#define __memset_ccn(s, c, n) \
++  (((n) % 4 == 0)							      \
++   ? __memset_ccn_by4 (s, ((unsigned int) ((unsigned char) (c))) * 0x01010101,\
++		       n)						      \
++   : (((n) % 2 == 0)							      \
++      ? __memset_ccn_by2 (s,						      \
++			  ((unsigned int) ((unsigned char) (c))) * 0x01010101,\
++			   n)						      \
++      : memset (s, c, n)))
++
++__STRING_INLINE void *__memset_ccn_by4 (void *__s, unsigned int __c,
++					size_t __n);
++
++__STRING_INLINE void *
++__memset_ccn_by4 (void *__s, unsigned int __c, size_t __n)
++{
++  register void *__tmp = __s;
++  register unsigned long int __d0;
++#ifdef __i686__
++  __asm__ __volatile__
++    ("cld\n\t"
++     "rep; stosl"
++     : "=&a" (__c), "=&D" (__tmp), "=&c" (__d0),
++       "=m" ( *(struct { __extension__ char __x[__n]; } *)__s)
++     : "0" ((unsigned int) __c), "1" (__tmp), "2" (__n / 4)
++     : "cc");
++#else
++  __asm__ __volatile__
++    ("1:\n\t"
++     "movl	%0,(%1)\n\t"
++     "addl	$4,%1\n\t"
++     "decl	%2\n\t"
++     "jnz	1b\n"
++     : "=&r" (__c), "=&r" (__tmp), "=&r" (__d0),
++       "=m" ( *(struct { __extension__ char __x[__n]; } *)__s)
++     : "0" ((unsigned int) __c), "1" (__tmp), "2" (__n / 4)
++     : "cc");
++#endif
++  return __s;
++}
++
++__STRING_INLINE void *__memset_ccn_by2 (void *__s, unsigned int __c,
++					size_t __n);
++
++__STRING_INLINE void *
++__memset_ccn_by2 (void *__s, unsigned int __c, size_t __n)
++{
++  register unsigned long int __d0, __d1;
++  register void *__tmp = __s;
++#ifdef __i686__
++  __asm__ __volatile__
++    ("cld\n\t"
++     "rep; stosl\n"
++     "stosw"
++     : "=&a" (__d0), "=&D" (__tmp), "=&c" (__d1),
++       "=m" ( *(struct { __extension__ char __x[__n]; } *)__s)
++     : "0" ((unsigned int) __c), "1" (__tmp), "2" (__n / 4)
++     : "cc");
++#else
++  __asm__ __volatile__
++    ("1:\tmovl	%0,(%1)\n\t"
++     "leal	4(%1),%1\n\t"
++     "decl	%2\n\t"
++     "jnz	1b\n"
++     "movw	%w0,(%1)"
++     : "=&q" (__d0), "=&r" (__tmp), "=&r" (__d1),
++       "=m" ( *(struct { __extension__ char __x[__n]; } *)__s)
++     : "0" ((unsigned int) __c), "1" (__tmp), "2" (__n / 4)
++     : "cc");
++#endif
++  return __s;
++}
++
++#define __memset_gcn(s, c, n) \
++  (((n) % 4 == 0)							      \
++   ? __memset_gcn_by4 (s, c, n)						      \
++   : (((n) % 2 == 0)							      \
++      ? __memset_gcn_by2 (s, c, n)					      \
++      : memset (s, c, n)))
++
++__STRING_INLINE void *__memset_gcn_by4 (void *__s, int __c, size_t __n);
++
++__STRING_INLINE void *
++__memset_gcn_by4 (void *__s, int __c, size_t __n)
++{
++  register void *__tmp = __s;
++  register unsigned long int __d0;
++  __asm__ __volatile__
++    ("movb	%b0,%h0\n"
++     "pushw	%w0\n\t"
++     "shll	$16,%0\n\t"
++     "popw	%w0\n"
++     "1:\n\t"
++     "movl	%0,(%1)\n\t"
++     "addl	$4,%1\n\t"
++     "decl	%2\n\t"
++     "jnz	1b\n"
++     : "=&q" (__c), "=&r" (__tmp), "=&r" (__d0),
++       "=m" ( *(struct { __extension__ char __x[__n]; } *)__s)
++     : "0" ((unsigned int) __c), "1" (__tmp), "2" (__n / 4)
++     : "cc");
++  return __s;
++}
++
++__STRING_INLINE void *__memset_gcn_by2 (void *__s, int __c, size_t __n);
++
++__STRING_INLINE void *
++__memset_gcn_by2 (void *__s, int __c, size_t __n)
++{
++  register unsigned long int __d0, __d1;
++  register void *__tmp = __s;
++  __asm__ __volatile__
++    ("movb	%b0,%h0\n\t"
++     "pushw	%w0\n\t"
++     "shll	$16,%0\n\t"
++     "popw	%w0\n"
++     "1:\n\t"
++     "movl	%0,(%1)\n\t"
++     "leal	4(%1),%1\n\t"
++     "decl	%2\n\t"
++     "jnz	1b\n"
++     "movw	%w0,(%1)"
++     : "=&q" (__d0), "=&r" (__tmp), "=&r" (__d1),
++       "=m" ( *(struct { __extension__ char __x[__n]; } *)__s)
++     : "0" ((unsigned int) __c), "1" (__tmp), "2" (__n / 4)
++     : "cc");
++  return __s;
++}
++
++
++/* Search N bytes of S for C.  */
++#define _HAVE_STRING_ARCH_memchr 1
++#ifndef _FORCE_INLINES
++__STRING_INLINE void *
++memchr (__const void *__s, int __c, size_t __n)
++{
++  register unsigned long int __d0;
++#ifdef __i686__
++  register unsigned long int __d1;
++#endif
++  register unsigned char *__res;
++  if (__n == 0)
++    return NULL;
++#ifdef __i686__
++  __asm__ __volatile__
++    ("cld\n\t"
++     "repne; scasb\n\t"
++     "cmovne %2,%0"
++     : "=D" (__res), "=&c" (__d0), "=&r" (__d1)
++     : "a" (__c), "0" (__s), "1" (__n), "2" (1),
++       "m" ( *(struct { __extension__ char __x[__n]; } *)__s)
++     : "cc");
++#else
++  __asm__ __volatile__
++    ("cld\n\t"
++     "repne; scasb\n\t"
++     "je	1f\n\t"
++     "movl	$1,%0\n"
++     "1:"
++     : "=D" (__res), "=&c" (__d0)
++     : "a" (__c), "0" (__s), "1" (__n),
++       "m" ( *(struct { __extension__ char __x[__n]; } *)__s)
++     : "cc");
++#endif
++  return __res - 1;
++}
++#endif
++
++#define _HAVE_STRING_ARCH_memrchr 1
++#ifndef _FORCE_INLINES
++__STRING_INLINE void *__memrchr (__const void *__s, int __c, size_t __n);
++
++__STRING_INLINE void *
++__memrchr (__const void *__s, int __c, size_t __n)
++{
++  register unsigned long int __d0;
++# ifdef __i686__
++  register unsigned long int __d1;
++# endif
++  register void *__res;
++  if (__n == 0)
++    return NULL;
++# ifdef __i686__
++  __asm__ __volatile__
++    ("std\n\t"
++     "repne; scasb\n\t"
++     "cmovne %2,%0\n\t"
++     "cld\n\t"
++     "incl %0"
++     : "=D" (__res), "=&c" (__d0), "=&r" (__d1)
++     : "a" (__c), "0" (__s + __n - 1), "1" (__n), "2" (-1),
++       "m" ( *(struct { __extension__ char __x[__n]; } *)__s)
++     : "cc");
++# else
++  __asm__ __volatile__
++    ("std\n\t"
++     "repne; scasb\n\t"
++     "je 1f\n\t"
++     "orl $-1,%0\n"
++     "1:\tcld\n\t"
++     "incl %0"
++     : "=D" (__res), "=&c" (__d0)
++     : "a" (__c), "0" (__s + __n - 1), "1" (__n),
++       "m" ( *(struct { __extension__ char __x[__n]; } *)__s)
++     : "cc");
++# endif
++  return __res;
++}
++# ifdef __USE_GNU
++#  define memrchr(s, c, n) __memrchr ((s), (c), (n))
++# endif
++#endif
++
++/* Return pointer to C in S.  */
++#define _HAVE_STRING_ARCH_rawmemchr 1
++__STRING_INLINE void *__rawmemchr (const void *__s, int __c);
++
++#ifndef _FORCE_INLINES
++__STRING_INLINE void *
++__rawmemchr (const void *__s, int __c)
++{
++  register unsigned long int __d0;
++  register unsigned char *__res;
++  __asm__ __volatile__
++    ("cld\n\t"
++     "repne; scasb\n\t"
++     : "=D" (__res), "=&c" (__d0)
++     : "a" (__c), "0" (__s), "1" (0xffffffff),
++       "m" ( *(struct { char __x[0xfffffff]; } *)__s)
++     : "cc");
++  return __res - 1;
++}
++# ifdef __USE_GNU
++__STRING_INLINE void *
++rawmemchr (const void *__s, int __c)
++{
++  return __rawmemchr (__s, __c);
++}
++# endif	/* use GNU */
++#endif
++
++
++/* Return the length of S.  */
++#define _HAVE_STRING_ARCH_strlen 1
++#define strlen(str) \
++  (__extension__ (__builtin_constant_p (str)				      \
++		  ? __builtin_strlen (str)				      \
++		  : __strlen_g (str)))
++__STRING_INLINE size_t __strlen_g (__const char *__str);
++
++__STRING_INLINE size_t
++__strlen_g (__const char *__str)
++{
++  register char __dummy;
++  register __const char *__tmp = __str;
++  __asm__ __volatile__
++    ("1:\n\t"
++     "movb	(%0),%b1\n\t"
++     "leal	1(%0),%0\n\t"
++     "testb	%b1,%b1\n\t"
++     "jne	1b"
++     : "=r" (__tmp), "=&q" (__dummy)
++     : "0" (__str),
++       "m" ( *(struct { char __x[0xfffffff]; } *)__str)
++     : "cc" );
++  return __tmp - __str - 1;
++}
++
++
++/* Copy SRC to DEST.  */
++#define _HAVE_STRING_ARCH_strcpy 1
++#define strcpy(dest, src) \
++  (__extension__ (__builtin_constant_p (src)				      \
++		  ? (sizeof ((src)[0]) == 1 && strlen (src) + 1 <= 8	      \
++		     ? __strcpy_a_small ((dest), (src), strlen (src) + 1)     \
++		     : (char *) memcpy ((char *) (dest),		      \
++					(__const char *) (src),		      \
++					strlen (src) + 1))		      \
++		  : __strcpy_g ((dest), (src))))
++
++#define __strcpy_a_small(dest, src, srclen) \
++  (__extension__ ({ char *__dest = (dest);				      \
++		    union {						      \
++		      unsigned int __ui;				      \
++		      unsigned short int __usi;				      \
++		      unsigned char __uc;				      \
++		      char __c;						      \
++		    } *__u = (void *) __dest;				      \
++		    switch (srclen)					      \
++		      {							      \
++		      case 1:						      \
++			__u->__uc = '\0';				      \
++			break;						      \
++		      case 2:						      \
++			__u->__usi = __STRING_SMALL_GET16 (src, 0);	      \
++			break;						      \
++		      case 3:						      \
++			__u->__usi = __STRING_SMALL_GET16 (src, 0);	      \
++			__u = __extension__ ((void *) __u + 2);		      \
++			__u->__uc = '\0';				      \
++			break;						      \
++		      case 4:						      \
++			__u->__ui = __STRING_SMALL_GET32 (src, 0);	      \
++			break;						      \
++		      case 5:						      \
++			__u->__ui = __STRING_SMALL_GET32 (src, 0);	      \
++			__u = __extension__ ((void *) __u + 4);		      \
++			__u->__uc = '\0';				      \
++			break;						      \
++		      case 6:						      \
++			__u->__ui = __STRING_SMALL_GET32 (src, 0);	      \
++			__u = __extension__ ((void *) __u + 4);		      \
++			__u->__usi = __STRING_SMALL_GET16 (src, 4);	      \
++			break;						      \
++		      case 7:						      \
++			__u->__ui = __STRING_SMALL_GET32 (src, 0);	      \
++			__u = __extension__ ((void *) __u + 4);		      \
++			__u->__usi = __STRING_SMALL_GET16 (src, 4);	      \
++			__u = __extension__ ((void *) __u + 2);		      \
++			__u->__uc = '\0';				      \
++			break;						      \
++		      case 8:						      \
++			__u->__ui = __STRING_SMALL_GET32 (src, 0);	      \
++			__u = __extension__ ((void *) __u + 4);		      \
++			__u->__ui = __STRING_SMALL_GET32 (src, 4);	      \
++			break;						      \
++		      }							      \
++		    (char *) __dest; }))
++
++__STRING_INLINE char *__strcpy_g (char *__dest, __const char *__src);
++
++__STRING_INLINE char *
++__strcpy_g (char *__dest, __const char *__src)
++{
++  register char *__tmp = __dest;
++  register char __dummy;
++  __asm__ __volatile__
++    (
++     "1:\n\t"
++     "movb	(%0),%b2\n\t"
++     "leal	1(%0),%0\n\t"
++     "movb	%b2,(%1)\n\t"
++     "leal	1(%1),%1\n\t"
++     "testb	%b2,%b2\n\t"
++     "jne	1b"
++     : "=&r" (__src), "=&r" (__tmp), "=&q" (__dummy),
++       "=m" ( *(struct { char __x[0xfffffff]; } *)__dest)
++     : "0" (__src), "1" (__tmp),
++       "m" ( *(struct { char __x[0xfffffff]; } *)__src)
++     : "cc");
++  return __dest;
++}
++
++
++#ifdef __USE_GNU
++# define _HAVE_STRING_ARCH_stpcpy 1
++/* Copy SRC to DEST.  */
++# define __stpcpy(dest, src) \
++  (__extension__ (__builtin_constant_p (src)				      \
++		  ? (strlen (src) + 1 <= 8				      \
++		     ? __stpcpy_a_small ((dest), (src), strlen (src) + 1)     \
++		     : __stpcpy_c ((dest), (src), strlen (src) + 1))	      \
++		  : __stpcpy_g ((dest), (src))))
++# define __stpcpy_c(dest, src, srclen) \
++  ((srclen) % 4 == 0							      \
++   ? __mempcpy_by4 (dest, src, srclen) - 1				      \
++   : ((srclen) % 2 == 0							      \
++      ? __mempcpy_by2 (dest, src, srclen) - 1				      \
++      : __mempcpy_byn (dest, src, srclen) - 1))
++
++/* In glibc itself we use this symbol for namespace reasons.  */
++# define stpcpy(dest, src) __stpcpy ((dest), (src))
++
++# define __stpcpy_a_small(dest, src, srclen) \
++  (__extension__ ({ union {						      \
++		      unsigned int __ui;				      \
++		      unsigned short int __usi;				      \
++		      unsigned char __uc;				      \
++		      char __c;						      \
++		    } *__u = (void *) (dest);				      \
++		    switch (srclen)					      \
++		      {							      \
++		      case 1:						      \
++			__u->__uc = '\0';				      \
++			break;						      \
++		      case 2:						      \
++			__u->__usi = __STRING_SMALL_GET16 (src, 0);	      \
++			__u = __extension__ ((void *) __u + 1);		      \
++			break;						      \
++		      case 3:						      \
++			__u->__usi = __STRING_SMALL_GET16 (src, 0);	      \
++			__u = __extension__ ((void *) __u + 2);		      \
++			__u->__uc = '\0';				      \
++			break;						      \
++		      case 4:						      \
++			__u->__ui = __STRING_SMALL_GET32 (src, 0);	      \
++			__u = __extension__ ((void *) __u + 3);		      \
++			break;						      \
++		      case 5:						      \
++			__u->__ui = __STRING_SMALL_GET32 (src, 0);	      \
++			__u = __extension__ ((void *) __u + 4);		      \
++			__u->__uc = '\0';				      \
++			break;						      \
++		      case 6:						      \
++			__u->__ui = __STRING_SMALL_GET32 (src, 0);	      \
++			__u = __extension__ ((void *) __u + 4);		      \
++			__u->__usi = __STRING_SMALL_GET16 (src, 4);	      \
++			__u = __extension__ ((void *) __u + 1);		      \
++			break;						      \
++		      case 7:						      \
++			__u->__ui = __STRING_SMALL_GET32 (src, 0);	      \
++			__u = __extension__ ((void *) __u + 4);		      \
++			__u->__usi = __STRING_SMALL_GET16 (src, 4);	      \
++			__u = __extension__ ((void *) __u + 2);		      \
++			__u->__uc = '\0';				      \
++			break;						      \
++		      case 8:						      \
++			__u->__ui = __STRING_SMALL_GET32 (src, 0);	      \
++			__u = __extension__ ((void *) __u + 4);		      \
++			__u->__ui = __STRING_SMALL_GET32 (src, 4);	      \
++			__u = __extension__ ((void *) __u + 3);		      \
++			break;						      \
++		      }							      \
++		    (char *) __u; }))
++
++__STRING_INLINE char *__mempcpy_by4 (char *__dest, __const char *__src,
++				     size_t __srclen);
++
++__STRING_INLINE char *
++__mempcpy_by4 (char *__dest, __const char *__src, size_t __srclen)
++{
++  register char *__tmp = __dest;
++  register unsigned long int __d0, __d1;
++  __asm__ __volatile__
++    ("1:\n\t"
++     "movl	(%2),%0\n\t"
++     "leal	4(%2),%2\n\t"
++     "movl	%0,(%1)\n\t"
++     "leal	4(%1),%1\n\t"
++     "decl	%3\n\t"
++     "jnz	1b"
++     : "=&r" (__d0), "=r" (__tmp), "=&r" (__src), "=&r" (__d1)
++     : "1" (__tmp), "2" (__src), "3" (__srclen / 4)
++     : "memory", "cc");
++  return __tmp;
++}
++
++__STRING_INLINE char *__mempcpy_by2 (char *__dest, __const char *__src,
++				     size_t __srclen);
++
++__STRING_INLINE char *
++__mempcpy_by2 (char *__dest, __const char *__src, size_t __srclen)
++{
++  register char *__tmp = __dest;
++  register unsigned long int __d0, __d1;
++  __asm__ __volatile__
++    ("shrl	$1,%3\n\t"
++     "jz	2f\n"                 /* only a word */
++     "1:\n\t"
++     "movl	(%2),%0\n\t"
++     "leal	4(%2),%2\n\t"
++     "movl	%0,(%1)\n\t"
++     "leal	4(%1),%1\n\t"
++     "decl	%3\n\t"
++     "jnz	1b\n"
++     "2:\n\t"
++     "movw	(%2),%w0\n\t"
++     "movw	%w0,(%1)"
++     : "=&q" (__d0), "=r" (__tmp), "=&r" (__src), "=&r" (__d1),
++       "=m" ( *(struct { __extension__ char __x[__srclen]; } *)__dest)
++     : "1" (__tmp), "2" (__src), "3" (__srclen / 2),
++       "m" ( *(struct { __extension__ char __x[__srclen]; } *)__src)
++     : "cc");
++  return __tmp + 2;
++}
++
++__STRING_INLINE char *__mempcpy_byn (char *__dest, __const char *__src,
++				     size_t __srclen);
++
++__STRING_INLINE char *
++__mempcpy_byn (char *__dest, __const char *__src, size_t __srclen)
++{
++  register unsigned long __d0, __d1;
++  register char *__tmp = __dest;
++  __asm__ __volatile__
++    ("cld\n\t"
++     "shrl	$1,%%ecx\n\t"
++     "jnc	1f\n\t"
++     "movsb\n"
++     "1:\n\t"
++     "shrl	$1,%%ecx\n\t"
++     "jnc	2f\n\t"
++     "movsw\n"
++     "2:\n\t"
++     "rep; movsl"
++     : "=D" (__tmp), "=&c" (__d0), "=&S" (__d1),
++       "=m" ( *(struct { __extension__ char __x[__srclen]; } *)__dest)
++     : "0" (__tmp), "1" (__srclen), "2" (__src),
++       "m" ( *(struct { __extension__ char __x[__srclen]; } *)__src)
++     : "cc");
++  return __tmp;
++}
++
++__STRING_INLINE char *__stpcpy_g (char *__dest, __const char *__src);
++
++__STRING_INLINE char *
++__stpcpy_g (char *__dest, __const char *__src)
++{
++  register char *__tmp = __dest;
++  register char __dummy;
++  __asm__ __volatile__
++    (
++     "1:\n\t"
++     "movb	(%0),%b2\n\t"
++     "leal	1(%0),%0\n\t"
++     "movb	%b2,(%1)\n\t"
++     "leal	1(%1),%1\n\t"
++     "testb	%b2,%b2\n\t"
++     "jne	1b"
++     : "=&r" (__src), "=r" (__tmp), "=&q" (__dummy),
++       "=m" ( *(struct { char __x[0xfffffff]; } *)__dest)
++     : "0" (__src), "1" (__tmp),
++       "m" ( *(struct { char __x[0xfffffff]; } *)__src)
++     : "cc");
++  return __tmp - 1;
++}
++#endif
++
++
++/* Copy no more than N characters of SRC to DEST.  */
++#define _HAVE_STRING_ARCH_strncpy 1
++#define strncpy(dest, src, n) \
++  (__extension__ (__builtin_constant_p (src)				      \
++		  ? ((strlen (src) + 1 >= ((size_t) (n))		      \
++		      ? (char *) memcpy ((char *) (dest),		      \
++					 (__const char *) (src), n)	      \
++		      : __strncpy_cg ((dest), (src), strlen (src) + 1, n)))   \
++		  : __strncpy_gg ((dest), (src), n)))
++#define __strncpy_cg(dest, src, srclen, n) \
++  (((srclen) % 4 == 0)							      \
++   ? __strncpy_by4 (dest, src, srclen, n)				      \
++   : (((srclen) % 2 == 0)						      \
++      ? __strncpy_by2 (dest, src, srclen, n)				      \
++      : __strncpy_byn (dest, src, srclen, n)))
++
++__STRING_INLINE char *__strncpy_by4 (char *__dest, __const char __src[],
++				     size_t __srclen, size_t __n);
++
++__STRING_INLINE char *
++__strncpy_by4 (char *__dest, __const char __src[], size_t __srclen, size_t __n)
++{
++  register char *__tmp = __dest;
++  register int __dummy1, __dummy2;
++  __asm__ __volatile__
++    ("1:\n\t"
++     "movl	(%2),%0\n\t"
++     "leal	4(%2),%2\n\t"
++     "movl	%0,(%1)\n\t"
++     "leal	4(%1),%1\n\t"
++     "decl	%3\n\t"
++     "jnz	1b"
++     : "=&r" (__dummy1), "=r" (__tmp), "=&r" (__src), "=&r" (__dummy2),
++       "=m" ( *(struct { __extension__ char __x[__srclen]; } *)__dest)
++     : "1" (__tmp), "2" (__src), "3" (__srclen / 4),
++       "m" ( *(struct { __extension__ char __x[__srclen]; } *)__src)
++     : "cc");
++  (void) memset (__tmp, '\0', __n - __srclen);
++  return __dest;
++}
++
++__STRING_INLINE char *__strncpy_by2 (char *__dest, __const char __src[],
++				     size_t __srclen, size_t __n);
++
++__STRING_INLINE char *
++__strncpy_by2 (char *__dest, __const char __src[], size_t __srclen, size_t __n)
++{
++  register char *__tmp = __dest;
++  register int __dummy1, __dummy2;
++  __asm__ __volatile__
++    ("shrl	$1,%3\n\t"
++     "jz	2f\n"                 /* only a word */
++     "1:\n\t"
++     "movl	(%2),%0\n\t"
++     "leal	4(%2),%2\n\t"
++     "movl	%0,(%1)\n\t"
++     "leal	4(%1),%1\n\t"
++     "decl	%3\n\t"
++     "jnz	1b\n"
++     "2:\n\t"
++     "movw	(%2),%w0\n\t"
++     "movw	%w0,(%1)\n\t"
++     : "=&q" (__dummy1), "=r" (__tmp), "=&r" (__src), "=&r" (__dummy2),
++       "=m" ( *(struct { __extension__ char __x[__srclen]; } *)__dest)
++     : "1" (__tmp), "2" (__src), "3" (__srclen / 2),
++       "m" ( *(struct { __extension__ char __x[__srclen]; } *)__src)
++     : "cc");
++  (void) memset (__tmp + 2, '\0', __n - __srclen);
++  return __dest;
++}
++
++__STRING_INLINE char *__strncpy_byn (char *__dest, __const char __src[],
++				     size_t __srclen, size_t __n);
++
++__STRING_INLINE char *
++__strncpy_byn (char *__dest, __const char __src[], size_t __srclen, size_t __n)
++{
++  register unsigned long int __d0, __d1;
++  register char *__tmp = __dest;
++  __asm__ __volatile__
++    ("cld\n\t"
++     "shrl	$1,%1\n\t"
++     "jnc	1f\n\t"
++     "movsb\n"
++     "1:\n\t"
++     "shrl	$1,%1\n\t"
++     "jnc	2f\n\t"
++     "movsw\n"
++     "2:\n\t"
++     "rep; movsl"
++     : "=D" (__tmp), "=&c" (__d0), "=&S" (__d1),
++       "=m" ( *(struct { __extension__ char __x[__srclen]; } *)__dest)
++     : "1" (__srclen), "0" (__tmp),"2" (__src),
++       "m" ( *(struct { __extension__ char __x[__srclen]; } *)__src)
++     : "cc");
++  (void) memset (__tmp, '\0', __n - __srclen);
++  return __dest;
++}
++
++__STRING_INLINE char *__strncpy_gg (char *__dest, __const char *__src,
++				    size_t __n);
++
++__STRING_INLINE char *
++__strncpy_gg (char *__dest, __const char *__src, size_t __n)
++{
++  register char *__tmp = __dest;
++  register char __dummy;
++  if (__n > 0)
++    __asm__ __volatile__
++      ("1:\n\t"
++       "movb	(%0),%2\n\t"
++       "incl	%0\n\t"
++       "movb	%2,(%1)\n\t"
++       "incl	%1\n\t"
++       "decl	%3\n\t"
++       "je	3f\n\t"
++       "testb	%2,%2\n\t"
++       "jne	1b\n\t"
++       "2:\n\t"
++       "movb	%2,(%1)\n\t"
++       "incl	%1\n\t"
++       "decl	%3\n\t"
++       "jne	2b\n\t"
++       "3:"
++       : "=&r" (__src), "=&r" (__tmp), "=&q" (__dummy), "=&r" (__n)
++       : "0" (__src), "1" (__tmp), "3" (__n)
++       : "memory", "cc");
++
++  return __dest;
++}
++
++
++/* Append SRC onto DEST.  */
++#define _HAVE_STRING_ARCH_strcat 1
++#define strcat(dest, src) \
++  (__extension__ (__builtin_constant_p (src)				      \
++		  ? __strcat_c ((dest), (src), strlen (src) + 1)	      \
++		  : __strcat_g ((dest), (src))))
++
++__STRING_INLINE char *__strcat_c (char *__dest, __const char __src[],
++				  size_t __srclen);
++
++__STRING_INLINE char *
++__strcat_c (char *__dest, __const char __src[], size_t __srclen)
++{
++#ifdef __i686__
++  register unsigned long int __d0;
++  register char *__tmp;
++  __asm__ __volatile__
++    ("repne; scasb"
++     : "=D" (__tmp), "=&c" (__d0),
++       "=m" ( *(struct { char __x[0xfffffff]; } *)__dest)
++     : "0" (__dest), "1" (0xffffffff), "a" (0),
++       "m" ( *(struct { __extension__ char __x[__srclen]; } *)__src)
++     : "cc");
++  --__tmp;
++#else
++  register char *__tmp = __dest - 1;
++  __asm__ __volatile__
++    ("1:\n\t"
++     "incl	%0\n\t"
++     "cmpb	$0,(%0)\n\t"
++     "jne	1b\n"
++     : "=r" (__tmp),
++       "=m" ( *(struct { char __x[0xfffffff]; } *)__dest)
++     : "0" (__tmp),
++       "m" ( *(struct { __extension__ char __x[__srclen]; } *)__src)
++     : "cc");
++#endif
++  (void) memcpy (__tmp, __src, __srclen);
++  return __dest;
++}
++
++__STRING_INLINE char *__strcat_g (char *__dest, __const char *__src);
++
++__STRING_INLINE char *
++__strcat_g (char *__dest, __const char *__src)
++{
++  register char *__tmp = __dest - 1;
++  register char __dummy;
++  __asm__ __volatile__
++    ("1:\n\t"
++     "incl	%1\n\t"
++     "cmpb	$0,(%1)\n\t"
++     "jne	1b\n"
++     "2:\n\t"
++     "movb	(%2),%b0\n\t"
++     "incl	%2\n\t"
++     "movb	%b0,(%1)\n\t"
++     "incl	%1\n\t"
++     "testb	%b0,%b0\n\t"
++     "jne	2b\n"
++     : "=&q" (__dummy), "=&r" (__tmp), "=&r" (__src),
++       "=m" ( *(struct { char __x[0xfffffff]; } *)__dest)
++     : "1"  (__tmp), "2"  (__src),
++       "m" ( *(struct { char __x[0xfffffff]; } *)__src)
++     : "memory", "cc");
++  return __dest;
++}
++
++
++/* Append no more than N characters from SRC onto DEST.  */
++#define _HAVE_STRING_ARCH_strncat 1
++#define strncat(dest, src, n) \
++  (__extension__ ({ char *__dest = (dest);				      \
++		    __builtin_constant_p (src) && __builtin_constant_p (n)    \
++		    ? (strlen (src) < ((size_t) (n))			      \
++		       ? strcat (__dest, (src))				      \
++		       : (*(char *)__mempcpy (strchr (__dest, '\0'),	      \
++					       (__const char *) (src),	      \
++					      (n)) = 0, __dest))	      \
++		    : __strncat_g (__dest, (src), (n)); }))
++
++__STRING_INLINE char *__strncat_g (char *__dest, __const char __src[],
++				   size_t __n);
++
++__STRING_INLINE char *
++__strncat_g (char *__dest, __const char __src[], size_t __n)
++{
++  register char *__tmp = __dest;
++  register char __dummy;
++#ifdef __i686__
++  __asm__ __volatile__
++    ("repne; scasb\n"
++     "movl %4, %3\n\t"
++     "decl %1\n\t"
++     "1:\n\t"
++     "decl	%3\n\t"
++     "js	2f\n\t"
++     "movb	(%2),%b0\n\t"
++     "movsb\n\t"
++     "testb	%b0,%b0\n\t"
++     "jne	1b\n\t"
++     "decl	%1\n"
++     "2:\n\t"
++     "movb	$0,(%1)"
++     : "=&a" (__dummy), "=&D" (__tmp), "=&S" (__src), "=&c" (__n)
++     :  "g" (__n), "0" (0), "1" (__tmp), "2" (__src), "3" (0xffffffff)
++     : "memory", "cc");
++#else
++  --__tmp;
++  __asm__ __volatile__
++    ("1:\n\t"
++     "cmpb	$0,1(%1)\n\t"
++     "leal	1(%1),%1\n\t"
++     "jne	1b\n"
++     "2:\n\t"
++     "decl	%3\n\t"
++     "js	3f\n\t"
++     "movb	(%2),%b0\n\t"
++     "leal	1(%2),%2\n\t"
++     "movb	%b0,(%1)\n\t"
++     "leal	1(%1),%1\n\t"
++     "testb	%b0,%b0\n\t"
++     "jne	2b\n\t"
++     "decl	%1\n"
++     "3:\n\t"
++     "movb	$0,(%1)"
++     : "=&q" (__dummy), "=&r" (__tmp), "=&r" (__src), "=&r" (__n)
++     : "1" (__tmp), "2" (__src), "3" (__n)
++     : "memory", "cc");
++#endif
++  return __dest;
++}
++
++
++/* Compare S1 and S2.  */
++#define _HAVE_STRING_ARCH_strcmp 1
++#define strcmp(s1, s2) \
++  (__extension__ (__builtin_constant_p (s1) && __builtin_constant_p (s2)      \
++		  && (sizeof ((s1)[0]) != 1 || strlen (s1) >= 4)	      \
++		  && (sizeof ((s2)[0]) != 1 || strlen (s2) >= 4)	      \
++		  ? memcmp ((__const char *) (s1), (__const char *) (s2),     \
++			    (strlen (s1) < strlen (s2)			      \
++			     ? strlen (s1) : strlen (s2)) + 1)		      \
++		  : (__builtin_constant_p (s1) && sizeof ((s1)[0]) == 1	      \
++		     && sizeof ((s2)[0]) == 1 && strlen (s1) < 4	      \
++		     ? (__builtin_constant_p (s2) && sizeof ((s2)[0]) == 1    \
++			? __strcmp_cc ((__const unsigned char *) (s1),	      \
++				       (__const unsigned char *) (s2),	      \
++				       strlen (s1))			      \
++			: __strcmp_cg ((__const unsigned char *) (s1),	      \
++				       (__const unsigned char *) (s2),	      \
++				       strlen (s1)))			      \
++		     : (__builtin_constant_p (s2) && sizeof ((s1)[0]) == 1    \
++			&& sizeof ((s2)[0]) == 1 && strlen (s2) < 4	      \
++			? (__builtin_constant_p (s1)			      \
++			   ? __strcmp_cc ((__const unsigned char *) (s1),     \
++					  (__const unsigned char *) (s2),     \
++					  strlen (s2))			      \
++			   : __strcmp_gc ((__const unsigned char *) (s1),     \
++					  (__const unsigned char *) (s2),     \
++					  strlen (s2)))			      \
++			: __strcmp_gg ((s1), (s2))))))
++
++#define __strcmp_cc(s1, s2, l) \
++  (__extension__ ({ register int __result = (s1)[0] - (s2)[0];		      \
++		    if (l > 0 && __result == 0)				      \
++		      {							      \
++			__result = (s1)[1] - (s2)[1];			      \
++			if (l > 1 && __result == 0)			      \
++			  {						      \
++			    __result = (s1)[2] - (s2)[2];		      \
++			    if (l > 2 && __result == 0)			      \
++			      __result = (s1)[3] - (s2)[3];		      \
++			  }						      \
++		      }							      \
++		    __result; }))
++
++#define __strcmp_cg(s1, s2, l1) \
++  (__extension__ ({ __const unsigned char *__s2 = (s2);			      \
++		    register int __result = (s1)[0] - __s2[0];		      \
++		    if (l1 > 0 && __result == 0)			      \
++		      {							      \
++			__result = (s1)[1] - __s2[1];			      \
++			if (l1 > 1 && __result == 0)			      \
++			  {						      \
++			    __result = (s1)[2] - __s2[2];		      \
++			    if (l1 > 2 && __result == 0)		      \
++			      __result = (s1)[3] - __s2[3];		      \
++			  }						      \
++		      }							      \
++		    __result; }))
++
++#define __strcmp_gc(s1, s2, l2) \
++  (__extension__ ({ __const unsigned char *__s1 = (s1);			      \
++		    register int __result = __s1[0] - (s2)[0];		      \
++		    if (l2 > 0 && __result == 0)			      \
++		      {							      \
++			__result = __s1[1] - (s2)[1];			      \
++			if (l2 > 1 && __result == 0)			      \
++			  {						      \
++			    __result = __s1[2] - (s2)[2];		      \
++			    if (l2 > 2 && __result == 0)		      \
++			      __result = __s1[3] - (s2)[3];		      \
++			  }						      \
++		      }							      \
++		    __result; }))
++
++__STRING_INLINE int __strcmp_gg (__const char *__s1, __const char *__s2);
++
++__STRING_INLINE int
++__strcmp_gg (__const char *__s1, __const char *__s2)
++{
++  register int __res;
++  __asm__ __volatile__
++    ("1:\n\t"
++     "movb	(%1),%b0\n\t"
++     "leal	1(%1),%1\n\t"
++     "cmpb	%b0,(%2)\n\t"
++     "jne	2f\n\t"
++     "leal	1(%2),%2\n\t"
++     "testb	%b0,%b0\n\t"
++     "jne	1b\n\t"
++     "xorl	%0,%0\n\t"
++     "jmp	3f\n"
++     "2:\n\t"
++     "movl	$1,%0\n\t"
++     "jb	3f\n\t"
++     "negl	%0\n"
++     "3:"
++     : "=q" (__res), "=&r" (__s1), "=&r" (__s2)
++     : "1" (__s1), "2" (__s2),
++       "m" ( *(struct { char __x[0xfffffff]; } *)__s1),
++       "m" ( *(struct { char __x[0xfffffff]; } *)__s2)
++     : "cc");
++  return __res;
++}
++
++
++/* Compare N characters of S1 and S2.  */
++#define _HAVE_STRING_ARCH_strncmp 1
++#define strncmp(s1, s2, n) \
++  (__extension__ (__builtin_constant_p (s1) && strlen (s1) < ((size_t) (n))   \
++		  ? strcmp ((s1), (s2))					      \
++		  : (__builtin_constant_p (s2) && strlen (s2) < ((size_t) (n))\
++		     ? strcmp ((s1), (s2))				      \
++		     : __strncmp_g ((s1), (s2), (n)))))
++
++__STRING_INLINE int __strncmp_g (__const char *__s1, __const char *__s2,
++				 size_t __n);
++
++__STRING_INLINE int
++__strncmp_g (__const char *__s1, __const char *__s2, size_t __n)
++{
++  register int __res;
++  __asm__ __volatile__
++    ("1:\n\t"
++     "decl	%3\n\t"
++     "js	2f\n\t"
++     "movb	(%1),%b0\n\t"
++     "incl	%1\n\t"
++     "cmpb	%b0,(%2)\n\t"
++     "jne	3f\n\t"
++     "incl	%2\n\t"
++     "testb	%b0,%b0\n\t"
++     "jne	1b\n"
++     "2:\n\t"
++     "xorl	%0,%0\n\t"
++     "jmp	4f\n"
++     "3:\n\t"
++     "movl	$1,%0\n\t"
++     "jb	4f\n\t"
++     "negl	%0\n"
++     "4:"
++     : "=q" (__res), "=&r" (__s1), "=&r" (__s2), "=&r" (__n)
++     : "1"  (__s1), "2"  (__s2),  "3" (__n),
++       "m" ( *(struct { __extension__ char __x[__n]; } *)__s1),
++       "m" ( *(struct { __extension__ char __x[__n]; } *)__s2)
++     : "cc");
++  return __res;
++}
++
++
++/* Find the first occurrence of C in S.  */
++#define _HAVE_STRING_ARCH_strchr 1
++#define _USE_STRING_ARCH_strchr 1
++#define strchr(s, c) \
++  (__extension__ (__builtin_constant_p (c)				      \
++		  ? ((c) == '\0'					      \
++		     ? (char *) __rawmemchr ((s), (c))			      \
++		     : __strchr_c ((s), ((c) & 0xff) << 8))		      \
++		  : __strchr_g ((s), (c))))
++
++__STRING_INLINE char *__strchr_c (__const char *__s, int __c);
++
++__STRING_INLINE char *
++__strchr_c (__const char *__s, int __c)
++{
++  register unsigned long int __d0;
++  register char *__res;
++  __asm__ __volatile__
++    ("1:\n\t"
++     "movb	(%0),%%al\n\t"
++     "cmpb	%%ah,%%al\n\t"
++     "je	2f\n\t"
++     "leal	1(%0),%0\n\t"
++     "testb	%%al,%%al\n\t"
++     "jne	1b\n\t"
++     "xorl	%0,%0\n"
++     "2:"
++     : "=r" (__res), "=&a" (__d0)
++     : "0" (__s), "1" (__c),
++       "m" ( *(struct { char __x[0xfffffff]; } *)__s)
++     : "cc");
++  return __res;
++}
++
++__STRING_INLINE char *__strchr_g (__const char *__s, int __c);
++
++__STRING_INLINE char *
++__strchr_g (__const char *__s, int __c)
++{
++  register unsigned long int __d0;
++  register char *__res;
++  __asm__ __volatile__
++    ("movb	%%al,%%ah\n"
++     "1:\n\t"
++     "movb	(%0),%%al\n\t"
++     "cmpb	%%ah,%%al\n\t"
++     "je	2f\n\t"
++     "leal	1(%0),%0\n\t"
++     "testb	%%al,%%al\n\t"
++     "jne	1b\n\t"
++     "xorl	%0,%0\n"
++     "2:"
++     : "=r" (__res), "=&a" (__d0)
++     : "0" (__s), "1" (__c),
++       "m" ( *(struct { char __x[0xfffffff]; } *)__s)
++     : "cc");
++  return __res;
++}
++
++
++/* Find the first occurrence of C in S or the final NUL byte.  */
++#define _HAVE_STRING_ARCH_strchrnul 1
++#define __strchrnul(s, c) \
++  (__extension__ (__builtin_constant_p (c)				      \
++		  ? ((c) == '\0'					      \
++		     ? (char *) __rawmemchr ((s), c)			      \
++		     : __strchrnul_c ((s), ((c) & 0xff) << 8))		      \
++		  : __strchrnul_g ((s), c)))
++
++__STRING_INLINE char *__strchrnul_c (__const char *__s, int __c);
++
++__STRING_INLINE char *
++__strchrnul_c (__const char *__s, int __c)
++{
++  register unsigned long int __d0;
++  register char *__res;
++  __asm__ __volatile__
++    ("1:\n\t"
++     "movb	(%0),%%al\n\t"
++     "cmpb	%%ah,%%al\n\t"
++     "je	2f\n\t"
++     "leal	1(%0),%0\n\t"
++     "testb	%%al,%%al\n\t"
++     "jne	1b\n\t"
++     "decl	%0\n"
++     "2:"
++     : "=r" (__res), "=&a" (__d0)
++     : "0" (__s), "1" (__c),
++       "m" ( *(struct { char __x[0xfffffff]; } *)__s)
++     : "cc");
++  return __res;
++}
++
++__STRING_INLINE char *__strchrnul_g (__const char *__s, int __c);
++
++__STRING_INLINE char *
++__strchrnul_g (__const char *__s, int __c)
++{
++  register unsigned long int __d0;
++  register char *__res;
++  __asm__ __volatile__
++    ("movb	%%al,%%ah\n"
++     "1:\n\t"
++     "movb	(%0),%%al\n\t"
++     "cmpb	%%ah,%%al\n\t"
++     "je	2f\n\t"
++     "leal	1(%0),%0\n\t"
++     "testb	%%al,%%al\n\t"
++     "jne	1b\n\t"
++     "decl	%0\n"
++     "2:"
++     : "=r" (__res), "=&a" (__d0)
++     : "0" (__s), "1" (__c),
++       "m" ( *(struct { char __x[0xfffffff]; } *)__s)
++     : "cc");
++  return __res;
++}
++#ifdef __USE_GNU
++# define strchrnul(s, c) __strchrnul ((s), (c))
++#endif
++
++
++#if defined __USE_BSD || defined __USE_XOPEN_EXTENDED
++/* Find the first occurrence of C in S.  This is the BSD name.  */
++# define _HAVE_STRING_ARCH_index 1
++# define index(s, c) \
++  (__extension__ (__builtin_constant_p (c)				      \
++		  ? __strchr_c ((s), ((c) & 0xff) << 8)			      \
++		  : __strchr_g ((s), (c))))
++#endif
++
++
++/* Find the last occurrence of C in S.  */
++#define _HAVE_STRING_ARCH_strrchr 1
++#define strrchr(s, c) \
++  (__extension__ (__builtin_constant_p (c)				      \
++		  ? __strrchr_c ((s), ((c) & 0xff) << 8)		      \
++		  : __strrchr_g ((s), (c))))
++
++#ifdef __i686__
++__STRING_INLINE char *__strrchr_c (__const char *__s, int __c);
++
++__STRING_INLINE char *
++__strrchr_c (__const char *__s, int __c)
++{
++  register unsigned long int __d0, __d1;
++  register char *__res;
++  __asm__ __volatile__
++    ("cld\n"
++     "1:\n\t"
++     "lodsb\n\t"
++     "cmpb	%h2,%b2\n\t"
++     "cmove	%1,%0\n\t"
++     "testb	%b2,%b2\n\t"
++     "jne 1b"
++     : "=d" (__res), "=&S" (__d0), "=&a" (__d1)
++     : "0" (1), "1" (__s), "2" (__c),
++       "m" ( *(struct { char __x[0xfffffff]; } *)__s)
++     : "cc");
++  return __res - 1;
++}
++
++__STRING_INLINE char *__strrchr_g (__const char *__s, int __c);
++
++__STRING_INLINE char *
++__strrchr_g (__const char *__s, int __c)
++{
++  register unsigned long int __d0, __d1;
++  register char *__res;
++  __asm__ __volatile__
++    ("movb	%b2,%h2\n"
++     "cld\n\t"
++     "1:\n\t"
++     "lodsb\n\t"
++     "cmpb	%h2,%b2\n\t"
++     "cmove	%1,%0\n\t"
++     "testb	%b2,%b2\n\t"
++     "jne 1b"
++     : "=d" (__res), "=&S" (__d0), "=&a" (__d1)
++     : "0" (1), "1" (__s), "2" (__c),
++       "m" ( *(struct { char __x[0xfffffff]; } *)__s)
++     : "cc");
++  return __res - 1;
++}
++#else
++__STRING_INLINE char *__strrchr_c (__const char *__s, int __c);
++
++__STRING_INLINE char *
++__strrchr_c (__const char *__s, int __c)
++{
++  register unsigned long int __d0, __d1;
++  register char *__res;
++  __asm__ __volatile__
++    ("cld\n"
++     "1:\n\t"
++     "lodsb\n\t"
++     "cmpb	%%ah,%%al\n\t"
++     "jne	2f\n\t"
++     "leal	-1(%%esi),%0\n"
++     "2:\n\t"
++     "testb	%%al,%%al\n\t"
++     "jne 1b"
++     : "=d" (__res), "=&S" (__d0), "=&a" (__d1)
++     : "0" (0), "1" (__s), "2" (__c),
++       "m" ( *(struct { char __x[0xfffffff]; } *)__s)
++     : "cc");
++  return __res;
++}
++
++__STRING_INLINE char *__strrchr_g (__const char *__s, int __c);
++
++__STRING_INLINE char *
++__strrchr_g (__const char *__s, int __c)
++{
++  register unsigned long int __d0, __d1;
++  register char *__res;
++  __asm__ __volatile__
++    ("movb	%%al,%%ah\n"
++     "cld\n\t"
++     "1:\n\t"
++     "lodsb\n\t"
++     "cmpb	%%ah,%%al\n\t"
++     "jne	2f\n\t"
++     "leal	-1(%%esi),%0\n"
++     "2:\n\t"
++     "testb	%%al,%%al\n\t"
++     "jne 1b"
++     : "=r" (__res), "=&S" (__d0), "=&a" (__d1)
++     : "0" (0), "1" (__s), "2" (__c),
++       "m" ( *(struct { char __x[0xfffffff]; } *)__s)
++     : "cc");
++  return __res;
++}
++#endif
++
++
++#if defined __USE_BSD || defined __USE_XOPEN_EXTENDED
++/* Find the last occurrence of C in S.  This is the BSD name.  */
++# define _HAVE_STRING_ARCH_rindex 1
++# define rindex(s, c) \
++  (__extension__ (__builtin_constant_p (c)				      \
++		  ? __strrchr_c ((s), ((c) & 0xff) << 8)		      \
++		  : __strrchr_g ((s), (c))))
++#endif
++
++
++/* Return the length of the initial segment of S which
++   consists entirely of characters not in REJECT.  */
++#define _HAVE_STRING_ARCH_strcspn 1
++#define strcspn(s, reject) \
++  (__extension__ (__builtin_constant_p (reject) && sizeof ((reject)[0]) == 1  \
++		  ? ((reject)[0] == '\0'				      \
++		     ? strlen (s)					      \
++		     : ((reject)[1] == '\0'				      \
++			? __strcspn_c1 ((s), (((reject)[0] << 8) & 0xff00))   \
++			: __strcspn_cg ((s), (reject), strlen (reject))))     \
++		  : __strcspn_g ((s), (reject))))
++
++__STRING_INLINE size_t __strcspn_c1 (__const char *__s, int __reject);
++
++#ifndef _FORCE_INLINES
++__STRING_INLINE size_t
++__strcspn_c1 (__const char *__s, int __reject)
++{
++  register unsigned long int __d0;
++  register char *__res;
++  __asm__ __volatile__
++    ("1:\n\t"
++     "movb	(%0),%%al\n\t"
++     "leal	1(%0),%0\n\t"
++     "cmpb	%%ah,%%al\n\t"
++     "je	2f\n\t"
++     "testb	%%al,%%al\n\t"
++     "jne	1b\n"
++     "2:"
++     : "=r" (__res), "=&a" (__d0)
++     : "0" (__s), "1" (__reject),
++       "m" ( *(struct { char __x[0xfffffff]; } *)__s)
++     : "cc");
++  return (__res - 1) - __s;
++}
++#endif
++
++__STRING_INLINE size_t __strcspn_cg (__const char *__s, __const char __reject[],
++				    size_t __reject_len);
++
++__STRING_INLINE size_t
++__strcspn_cg (__const char *__s, __const char __reject[], size_t __reject_len)
++{
++  register unsigned long int __d0, __d1, __d2;
++  register __const char *__res;
++  __asm__ __volatile__
++    ("cld\n"
++     "1:\n\t"
++     "lodsb\n\t"
++     "testb	%%al,%%al\n\t"
++     "je	2f\n\t"
++     "movl	%5,%%edi\n\t"
++     "movl	%6,%%ecx\n\t"
++     "repne; scasb\n\t"
++     "jne	1b\n"
++     "2:"
++     : "=S" (__res), "=&a" (__d0), "=&c" (__d1), "=&D" (__d2)
++     : "0" (__s), "d" (__reject), "g" (__reject_len)
++     : "memory", "cc");
++  return (__res - 1) - __s;
++}
++
++__STRING_INLINE size_t __strcspn_g (__const char *__s, __const char *__reject);
++#ifdef __PIC__
++
++__STRING_INLINE size_t
++__strcspn_g (__const char *__s, __const char *__reject)
++{
++  register unsigned long int __d0, __d1, __d2;
++  register __const char *__res;
++  __asm__ __volatile__
++    ("pushl	%%ebx\n\t"
++     "movl	%4,%%edi\n\t"
++     "cld\n\t"
++     "repne; scasb\n\t"
++     "notl	%%ecx\n\t"
++     "leal	-1(%%ecx),%%ebx\n"
++     "1:\n\t"
++     "lodsb\n\t"
++     "testb	%%al,%%al\n\t"
++     "je	2f\n\t"
++     "movl	%4,%%edi\n\t"
++     "movl	%%ebx,%%ecx\n\t"
++     "repne; scasb\n\t"
++     "jne	1b\n"
++     "2:\n\t"
++     "popl	%%ebx"
++     : "=S" (__res), "=&a" (__d0), "=&c" (__d1), "=&D" (__d2)
++     : "r" (__reject), "0" (__s), "1" (0), "2" (0xffffffff)
++     : "memory", "cc");
++  return (__res - 1) - __s;
++}
++#else
++__STRING_INLINE size_t
++__strcspn_g (__const char *__s, __const char *__reject)
++{
++  register unsigned long int __d0, __d1, __d2, __d3;
++  register __const char *__res;
++  __asm__ __volatile__
++    ("cld\n\t"
++     "repne; scasb\n\t"
++     "notl	%%ecx\n\t"
++     "leal	-1(%%ecx),%%edx\n"
++     "1:\n\t"
++     "lodsb\n\t"
++     "testb	%%al,%%al\n\t"
++     "je	2f\n\t"
++     "movl	%%ebx,%%edi\n\t"
++     "movl	%%edx,%%ecx\n\t"
++     "repne; scasb\n\t"
++     "jne	1b\n"
++     "2:"
++     : "=S" (__res), "=&a" (__d0), "=&c" (__d1), "=&D" (__d2), "=&d" (__d3)
++     : "0" (__s), "1" (0), "2" (0xffffffff), "3" (__reject), "b" (__reject)
++     /* Clobber memory, otherwise GCC cannot handle this.  */
++     : "memory", "cc");
++  return (__res - 1) - __s;
++}
++#endif
++
++
++/* Return the length of the initial segment of S which
++   consists entirely of characters in ACCEPT.  */
++#define _HAVE_STRING_ARCH_strspn 1
++#define strspn(s, accept) \
++  (__extension__ (__builtin_constant_p (accept) && sizeof ((accept)[0]) == 1  \
++		  ? ((accept)[0] == '\0'				      \
++		     ? ((void) (s), 0)					      \
++		     : ((accept)[1] == '\0'				      \
++			? __strspn_c1 ((s), (((accept)[0] << 8 ) & 0xff00))   \
++			: __strspn_cg ((s), (accept), strlen (accept))))      \
++		  : __strspn_g ((s), (accept))))
++
++#ifndef _FORCE_INLINES
++__STRING_INLINE size_t __strspn_c1 (__const char *__s, int __accept);
++
++__STRING_INLINE size_t
++__strspn_c1 (__const char *__s, int __accept)
++{
++  register unsigned long int __d0;
++  register char *__res;
++  /* Please note that __accept never can be '\0'.  */
++  __asm__ __volatile__
++    ("1:\n\t"
++     "movb	(%0),%b1\n\t"
++     "leal	1(%0),%0\n\t"
++     "cmpb	%h1,%b1\n\t"
++     "je	1b"
++     : "=r" (__res), "=&q" (__d0)
++     : "0" (__s), "1" (__accept),
++       "m" ( *(struct { char __x[0xfffffff]; } *)__s)
++     : "cc");
++  return (__res - 1) - __s;
++}
++#endif
++
++__STRING_INLINE size_t __strspn_cg (__const char *__s, __const char __accept[],
++				    size_t __accept_len);
++
++__STRING_INLINE size_t
++__strspn_cg (__const char *__s, __const char __accept[], size_t __accept_len)
++{
++  register unsigned long int __d0, __d1, __d2;
++  register __const char *__res;
++  __asm__ __volatile__
++    ("cld\n"
++     "1:\n\t"
++     "lodsb\n\t"
++     "testb	%%al,%%al\n\t"
++     "je	2f\n\t"
++     "movl	%5,%%edi\n\t"
++     "movl	%6,%%ecx\n\t"
++     "repne; scasb\n\t"
++     "je	1b\n"
++     "2:"
++     : "=S" (__res), "=&a" (__d0), "=&c" (__d1), "=&D" (__d2)
++     : "0" (__s), "g" (__accept), "g" (__accept_len),
++       /* Since we do not know how large the memory we access it, use a
++	  really large amount.  */
++       "m" ( *(struct { char __x[0xfffffff]; } *)__s),
++       "m" ( *(struct { __extension__ char __x[__accept_len]; } *)__accept)
++     : "cc");
++  return (__res - 1) - __s;
++}
++
++__STRING_INLINE size_t __strspn_g (__const char *__s, __const char *__accept);
++#ifdef __PIC__
++
++__STRING_INLINE size_t
++__strspn_g (__const char *__s, __const char *__accept)
++{
++  register unsigned long int __d0, __d1, __d2;
++  register __const char *__res;
++  __asm__ __volatile__
++    ("pushl	%%ebx\n\t"
++     "cld\n\t"
++     "repne; scasb\n\t"
++     "notl	%%ecx\n\t"
++     "leal	-1(%%ecx),%%ebx\n"
++     "1:\n\t"
++     "lodsb\n\t"
++     "testb	%%al,%%al\n\t"
++     "je	2f\n\t"
++     "movl	%%edx,%%edi\n\t"
++     "movl	%%ebx,%%ecx\n\t"
++     "repne; scasb\n\t"
++     "je	1b\n"
++     "2:\n\t"
++     "popl	%%ebx"
++     : "=S" (__res), "=&a" (__d0), "=&c" (__d1), "=&D" (__d2)
++     : "d" (__accept), "0" (__s), "1" (0), "2" (0xffffffff), "3" (__accept)
++     : "memory", "cc");
++  return (__res - 1) - __s;
++}
++#else
++__STRING_INLINE size_t
++__strspn_g (__const char *__s, __const char *__accept)
++{
++  register unsigned long int __d0, __d1, __d2, __d3;
++  register __const char *__res;
++  __asm__ __volatile__
++    ("cld\n\t"
++     "repne; scasb\n\t"
++     "notl	%%ecx\n\t"
++     "leal	-1(%%ecx),%%edx\n"
++     "1:\n\t"
++     "lodsb\n\t"
++     "testb	%%al,%%al\n\t"
++     "je	2f\n\t"
++     "movl	%%ebx,%%edi\n\t"
++     "movl	%%edx,%%ecx\n\t"
++     "repne; scasb\n\t"
++     "je	1b\n"
++     "2:"
++     : "=S" (__res), "=&a" (__d0), "=&c" (__d1), "=&D" (__d2), "=&d" (__d3)
++     : "0" (__s), "1" (0), "2" (0xffffffff), "3" (__accept), "b" (__accept)
++     : "memory", "cc");
++  return (__res - 1) - __s;
++}
++#endif
++
++
++/* Find the first occurrence in S of any character in ACCEPT.  */
++#define _HAVE_STRING_ARCH_strpbrk 1
++#define strpbrk(s, accept) \
++  (__extension__ (__builtin_constant_p (accept) && sizeof ((accept)[0]) == 1  \
++		  ? ((accept)[0] == '\0'				      \
++		     ? ((void) (s), (char *) 0)				      \
++		     : ((accept)[1] == '\0'				      \
++			? strchr ((s), (accept)[0])			      \
++			: __strpbrk_cg ((s), (accept), strlen (accept))))     \
++		  : __strpbrk_g ((s), (accept))))
++
++__STRING_INLINE char *__strpbrk_cg (__const char *__s, __const char __accept[],
++				    size_t __accept_len);
++
++__STRING_INLINE char *
++__strpbrk_cg (__const char *__s, __const char __accept[], size_t __accept_len)
++{
++  register unsigned long int __d0, __d1, __d2;
++  register char *__res;
++  __asm__ __volatile__
++    ("cld\n"
++     "1:\n\t"
++     "lodsb\n\t"
++     "testb	%%al,%%al\n\t"
++     "je	2f\n\t"
++     "movl	%5,%%edi\n\t"
++     "movl	%6,%%ecx\n\t"
++     "repne; scasb\n\t"
++     "jne	1b\n\t"
++     "decl	%0\n\t"
++     "jmp	3f\n"
++     "2:\n\t"
++     "xorl	%0,%0\n"
++     "3:"
++     : "=S" (__res), "=&a" (__d0), "=&c" (__d1), "=&D" (__d2)
++     : "0" (__s), "d" (__accept), "g" (__accept_len)
++     : "memory", "cc");
++  return __res;
++}
++
++__STRING_INLINE char *__strpbrk_g (__const char *__s, __const char *__accept);
++#ifdef __PIC__
++
++__STRING_INLINE char *
++__strpbrk_g (__const char *__s, __const char *__accept)
++{
++  register unsigned long int __d0, __d1, __d2;
++  register char *__res;
++  __asm__ __volatile__
++    ("pushl	%%ebx\n\t"
++     "movl	%%edx,%%edi\n\t"
++     "cld\n\t"
++     "repne; scasb\n\t"
++     "notl	%%ecx\n\t"
++     "leal	-1(%%ecx),%%ebx\n"
++     "1:\n\t"
++     "lodsb\n\t"
++     "testb	%%al,%%al\n\t"
++     "je	2f\n\t"
++     "movl	%%edx,%%edi\n\t"
++     "movl	%%ebx,%%ecx\n\t"
++     "repne; scasb\n\t"
++     "jne	1b\n\t"
++     "decl	%0\n\t"
++     "jmp	3f\n"
++     "2:\n\t"
++     "xorl	%0,%0\n"
++     "3:\n\t"
++     "popl	%%ebx"
++     : "=S" (__res), "=&a" (__d0), "=&c" (__d1), "=&D" (__d2)
++     : "d" (__accept), "0" (__s), "1" (0), "2" (0xffffffff)
++     : "memory", "cc");
++  return __res;
++}
++#else
++__STRING_INLINE char *
++__strpbrk_g (__const char *__s, __const char *__accept)
++{
++  register unsigned long int __d0, __d1, __d2, __d3;
++  register char *__res;
++  __asm__ __volatile__
++    ("movl	%%ebx,%%edi\n\t"
++     "cld\n\t"
++     "repne; scasb\n\t"
++     "notl	%%ecx\n\t"
++     "leal	-1(%%ecx),%%edx\n"
++     "1:\n\t"
++     "lodsb\n\t"
++     "testb	%%al,%%al\n\t"
++     "je	2f\n\t"
++     "movl	%%ebx,%%edi\n\t"
++     "movl	%%edx,%%ecx\n\t"
++     "repne; scasb\n\t"
++     "jne	1b\n\t"
++     "decl	%0\n\t"
++     "jmp	3f\n"
++     "2:\n\t"
++     "xorl	%0,%0\n"
++     "3:"
++     : "=S" (__res), "=&a" (__d0), "=&c" (__d1), "=&d" (__d2), "=&D" (__d3)
++     : "0" (__s), "1" (0), "2" (0xffffffff), "b" (__accept)
++     : "memory", "cc");
++  return __res;
++}
++#endif
++
++
++/* Find the first occurrence of NEEDLE in HAYSTACK.  */
++#define _HAVE_STRING_ARCH_strstr 1
++#define strstr(haystack, needle) \
++  (__extension__ (__builtin_constant_p (needle) && sizeof ((needle)[0]) == 1  \
++		  ? ((needle)[0] == '\0'				      \
++		     ? (haystack)					      \
++		     : ((needle)[1] == '\0'				      \
++			? strchr ((haystack), (needle)[0])		      \
++			: __strstr_cg ((haystack), (needle),		      \
++				       strlen (needle))))		      \
++		  : __strstr_g ((haystack), (needle))))
++
++/* Please note that this function need not handle NEEDLEs with a
++   length shorter than two.  */
++__STRING_INLINE char *__strstr_cg (__const char *__haystack, __const char __needle[],
++				   size_t __needle_len);
++
++__STRING_INLINE char *
++__strstr_cg (__const char *__haystack, __const char __needle[],
++	     size_t __needle_len)
++{
++  register unsigned long int __d0, __d1, __d2;
++  register char *__res;
++  __asm__ __volatile__
++    ("cld\n" \
++     "1:\n\t"
++     "movl	%6,%%edi\n\t"
++     "movl	%5,%%eax\n\t"
++     "movl	%4,%%ecx\n\t"
++     "repe; cmpsb\n\t"
++     "je	2f\n\t"
++     "cmpb	$0,-1(%%esi)\n\t"
++     "leal	1(%%eax),%5\n\t"
++     "jne	1b\n\t"
++     "xorl	%%eax,%%eax\n"
++     "2:"
++     : "=&a" (__res), "=&S" (__d0), "=&D" (__d1), "=&c" (__d2)
++     : "g" (__needle_len), "1" (__haystack), "d" (__needle)
++     : "memory", "cc");
++  return __res;
++}
++
++__STRING_INLINE char *__strstr_g (__const char *__haystack, __const char *__needle);
++#ifdef __PIC__
++
++__STRING_INLINE char *
++__strstr_g (__const char *__haystack, __const char *__needle)
++{
++  register unsigned long int __d0, __d1, __d2;
++  register char *__res;
++  __asm__ __volatile__
++    ("cld\n\t"
++     "repne; scasb\n\t"
++     "notl	%%ecx\n\t"
++     "pushl	%%ebx\n\t"
++     "decl	%%ecx\n\t"	/* NOTE! This also sets Z if searchstring='' */
++     "movl	%%ecx,%%ebx\n"
++     "1:\n\t"
++     "movl	%%edx,%%edi\n\t"
++     "movl	%%esi,%%eax\n\t"
++     "movl	%%ebx,%%ecx\n\t"
++     "repe; cmpsb\n\t"
++     "je	2f\n\t"		/* also works for empty string, see above */
++     "cmpb	$0,-1(%%esi)\n\t"
++     "leal	1(%%eax),%%esi\n\t"
++     "jne	1b\n\t"
++     "xorl	%%eax,%%eax\n"
++     "2:\n\t"
++     "popl	%%ebx"
++     : "=&a" (__res), "=&c" (__d0), "=&S" (__d1), "=&D" (__d2)
++     : "0" (0), "1" (0xffffffff), "2" (__haystack), "3" (__needle),
++       "d" (__needle)
++     : "memory", "cc");
++  return __res;
++}
++#else
++__STRING_INLINE char *
++__strstr_g (__const char *__haystack, __const char *__needle)
++{
++  register unsigned long int __d0, __d1, __d2, __d3;
++  register char *__res;
++  __asm__ __volatile__
++    ("cld\n\t"
++     "repne; scasb\n\t"
++     "notl	%%ecx\n\t"
++     "decl	%%ecx\n\t"	/* NOTE! This also sets Z if searchstring='' */
++     "movl	%%ecx,%%edx\n"
++     "1:\n\t"
++     "movl	%%ebx,%%edi\n\t"
++     "movl	%%esi,%%eax\n\t"
++     "movl	%%edx,%%ecx\n\t"
++     "repe; cmpsb\n\t"
++     "je	2f\n\t"		/* also works for empty string, see above */
++     "cmpb	$0,-1(%%esi)\n\t"
++     "leal	1(%%eax),%%esi\n\t"
++     "jne	1b\n\t"
++     "xorl	%%eax,%%eax\n"
++     "2:"
++     : "=&a" (__res), "=&c" (__d0), "=&S" (__d1), "=&D" (__d2), "=&d" (__d3)
++     : "0" (0), "1" (0xffffffff), "2" (__haystack), "3" (__needle),
++       "b" (__needle)
++     : "memory", "cc");
++  return __res;
++}
++#endif
++
++
++/* Bit find functions.  We define only the i686 version since for the other
++   processors gcc generates good code.  */
++#if defined __USE_BSD || defined __USE_XOPEN_EXTENDED
++# ifdef __i686__
++#  define _HAVE_STRING_ARCH_ffs 1
++#  define ffs(word) (__builtin_constant_p (word)			      \
++		     ? __builtin_ffs (word)				      \
++		     : ({ int __cnt, __tmp;				      \
++			  __asm__ __volatile__				      \
++			    ("bsfl %2,%0\n\t"				      \
++			     "cmovel %1,%0"				      \
++			     : "=&r" (__cnt), "=r" (__tmp)		      \
++			     : "rm" (word), "1" (-1));			      \
++			  __cnt + 1; }))
++
++#  ifndef ffsl
++#   define ffsl(word) ffs(word)
++#  endif
++# endif	/* i686 */
++#endif	/* BSD || X/Open */
++
++#ifndef _FORCE_INLINES
++# undef __STRING_INLINE
++#endif
++
++#endif	/* wordsize == 32 && use string inlines && GNU CC */
+diff -urN libc.org/sysdeps/x86_64/fpu/bits/mathinline.h libc/sysdeps/x86_64/fpu/bits/mathinline.h
+--- libc.org/sysdeps/x86_64/fpu/bits/mathinline.h	2011-05-06 23:45:46.000000000 -0500
++++ libc/sysdeps/x86_64/fpu/bits/mathinline.h	2011-07-14 18:22:51.206711080 -0500
+@@ -1,7 +1,9 @@
+-/* Inline math functions for x86-64.
+-   Copyright (C) 2002, 2003, 2004, 2007, 2009 Free Software Foundation, Inc.
++/* Inline math functions for i387/x86-64.
++   Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2006,2007,2009,
++   2010 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+-   Contributed by Andreas Jaeger <aj at suse.de>, 2002.
++   Contributed by John C. Bowman <bowman at math.ualberta.ca>, 1995. (i387)
++   Contributed by Andreas Jaeger <aj at suse.de>, 2002. (x86-64)
+ 
+    The GNU C Library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+@@ -32,7 +34,98 @@
+ 
+ 
+ #if defined __USE_ISOC99 && defined __GNUC__ && __GNUC__ >= 2
++/* GCC 2.97 and up have builtins that actually can be used.  */
++# if __WORDSIZE == 32 && !__GNUC_PREREQ (2,97)
++/* ISO C99 defines some macros to perform unordered comparisons.  The
++   ix87 FPU supports this with special opcodes and we should use them.
++   These must not be inline functions since we have to be able to handle
++   all floating-point types.  */
++#  undef isgreater
++#  undef isgreaterequal
++#  undef isless
++#  undef islessequal
++#  undef islessgreater
++#  undef isunordered
++#  ifdef __i686__
++/* For the PentiumPro and more recent processors we can provide
++   better code.  */
++#   define isgreater(x, y) \
++     ({ register char __result;						      \
++	__asm__ ("fucomip %%st(1), %%st; seta %%al"			      \
++		 : "=a" (__result) : "u" (y), "t" (x) : "cc", "st");	      \
++	__result; })
++#   define isgreaterequal(x, y) \
++     ({ register char __result;						      \
++	__asm__ ("fucomip %%st(1), %%st; setae %%al"			      \
++		 : "=a" (__result) : "u" (y), "t" (x) : "cc", "st");	      \
++	__result; })
+ 
++#   define isless(x, y) \
++     ({ register char __result;						      \
++	__asm__ ("fucomip %%st(1), %%st; seta %%al"			      \
++		 : "=a" (__result) : "u" (x), "t" (y) : "cc", "st");	      \
++	__result; })
++
++#   define islessequal(x, y) \
++     ({ register char __result;						      \
++	__asm__ ("fucomip %%st(1), %%st; setae %%al"			      \
++		 : "=a" (__result) : "u" (x), "t" (y) : "cc", "st");	      \
++	__result; })
++
++#   define islessgreater(x, y) \
++     ({ register char __result;						      \
++	__asm__ ("fucomip %%st(1), %%st; setne %%al"			      \
++		 : "=a" (__result) : "u" (y), "t" (x) : "cc", "st");	      \
++	__result; })
++
++#   define isunordered(x, y) \
++     ({ register char __result;						      \
++	__asm__ ("fucomip %%st(1), %%st; setp %%al"			      \
++		 : "=a" (__result) : "u" (y), "t" (x) : "cc", "st");	      \
++	__result; })
++#  else
++/* This is the dumb, portable code for i386 and above.  */
++#   define isgreater(x, y) \
++     ({ register char __result;						      \
++	__asm__ ("fucompp; fnstsw; testb $0x45, %%ah; setz %%al"	      \
++		 : "=a" (__result) : "u" (y), "t" (x) : "cc", "st", "st(1)"); \
++	__result; })
++
++#   define isgreaterequal(x, y) \
++     ({ register char __result;						      \
++	__asm__ ("fucompp; fnstsw; testb $0x05, %%ah; setz %%al"	      \
++		 : "=a" (__result) : "u" (y), "t" (x) : "cc", "st", "st(1)"); \
++	__result; })
++
++#   define isless(x, y) \
++     ({ register char __result;						      \
++	__asm__ ("fucompp; fnstsw; testb $0x45, %%ah; setz %%al"	      \
++		 : "=a" (__result) : "u" (x), "t" (y) : "cc", "st", "st(1)"); \
++	__result; })
++
++#   define islessequal(x, y) \
++     ({ register char __result;						      \
++	__asm__ ("fucompp; fnstsw; testb $0x05, %%ah; setz %%al"	      \
++		 : "=a" (__result) : "u" (x), "t" (y) : "cc", "st", "st(1)"); \
++	__result; })
++
++#   define islessgreater(x, y) \
++     ({ register char __result;						      \
++	__asm__ ("fucompp; fnstsw; testb $0x44, %%ah; setz %%al"	      \
++		 : "=a" (__result) : "u" (y), "t" (x) : "cc", "st", "st(1)"); \
++	__result; })
++
++#   define isunordered(x, y) \
++     ({ register char __result;						      \
++	__asm__ ("fucompp; fnstsw; sahf; setp %%al"			      \
++		 : "=a" (__result) : "u" (y), "t" (x) : "cc", "st", "st(1)"); \
++	__result; })
++#  endif /* __i686__ */
++# endif	/* __WORDSIZE == 32 && GCC 2.97 */
++
++/* The gcc, version 2.7 or below, has problems with all this inlining
++   code.  So disable it for this version of the compiler.  */
++# if __GNUC_PREREQ (2, 8)
+ /* Test for negative number.  Used in the signbit() macro.  */
+ __MATH_INLINE int
+ __NTH (__signbitf (float __x))
+@@ -64,4 +157,630 @@
+   __extension__ union { long double __l; int __i[3]; } __u = { __l: __x };
+   return (__u.__i[2] & 0x8000) != 0;
+ }
++# endif
++#endif
++
++
++/* The gcc, version 2.7 or below, has problems with all this inlining
++   code.  So disable it for this version of the compiler.  */
++#if __WORDSIZE == 32 && __GNUC_PREREQ (2, 8)
++
++#if ((!defined __NO_MATH_INLINES || defined __LIBC_INTERNAL_MATH_INLINES) \
++     && defined __OPTIMIZE__)
++
++/* The inline functions do not set errno or raise necessarily the
++   correct exceptions.  */
++# undef math_errhandling
++
++/* A macro to define float, double, and long double versions of various
++   math functions for the ix87 FPU.  FUNC is the function name (which will
++   be suffixed with f and l for the float and long double version,
++   respectively).  OP is the name of the FPU operation.
++   We define two sets of macros.  The set with the additional NP
++   doesn't add a prototype declaration.  */
++
++#if defined __USE_MISC || defined __USE_ISOC99
++# define __inline_mathop(func, op) \
++  __inline_mathop_ (double, func, op)					      \
++  __inline_mathop_ (float, __CONCAT(func,f), op)			      \
++  __inline_mathop_ (long double, __CONCAT(func,l), op)
++# define __inline_mathopNP(func, op) \
++  __inline_mathopNP_ (double, func, op)					      \
++  __inline_mathopNP_ (float, __CONCAT(func,f), op)			      \
++  __inline_mathopNP_ (long double, __CONCAT(func,l), op)
++#else
++# define __inline_mathop(func, op) \
++  __inline_mathop_ (double, func, op)
++# define __inline_mathopNP(func, op) \
++  __inline_mathopNP_ (double, func, op)
++#endif
++
++#define __inline_mathop_(float_type, func, op) \
++  __inline_mathop_decl_ (float_type, func, op, "0" (__x))
++#define __inline_mathopNP_(float_type, func, op) \
++  __inline_mathop_declNP_ (float_type, func, op, "0" (__x))
++
++
++#if defined __USE_MISC || defined __USE_ISOC99
++# define __inline_mathop_decl(func, op, params...) \
++  __inline_mathop_decl_ (double, func, op, params)			      \
++  __inline_mathop_decl_ (float, __CONCAT(func,f), op, params)		      \
++  __inline_mathop_decl_ (long double, __CONCAT(func,l), op, params)
++# define __inline_mathop_declNP(func, op, params...) \
++  __inline_mathop_declNP_ (double, func, op, params)			      \
++  __inline_mathop_declNP_ (float, __CONCAT(func,f), op, params)		      \
++  __inline_mathop_declNP_ (long double, __CONCAT(func,l), op, params)
++#else
++# define __inline_mathop_decl(func, op, params...) \
++  __inline_mathop_decl_ (double, func, op, params)
++# define __inline_mathop_declNP(func, op, params...) \
++  __inline_mathop_declNP_ (double, func, op, params)
++#endif
++
++#define __inline_mathop_decl_(float_type, func, op, params...) \
++  __MATH_INLINE float_type func (float_type) __THROW;			      \
++  __inline_mathop_declNP_ (float_type, func, op, params)
++
++#define __inline_mathop_declNP_(float_type, func, op, params...) \
++  __MATH_INLINE float_type __NTH (func (float_type __x))		      \
++  {									      \
++    register float_type __result;					      \
++    __asm __volatile__ (op : "=t" (__result) : params);			      \
++    return __result;							      \
++  }
++
++
++#if defined __USE_MISC || defined __USE_ISOC99
++# define __inline_mathcode(func, arg, code) \
++  __inline_mathcode_ (double, func, arg, code)				      \
++  __inline_mathcode_ (float, __CONCAT(func,f), arg, code)		      \
++  __inline_mathcode_ (long double, __CONCAT(func,l), arg, code)
++# define __inline_mathcodeNP(func, arg, code) \
++  __inline_mathcodeNP_ (double, func, arg, code)			      \
++  __inline_mathcodeNP_ (float, __CONCAT(func,f), arg, code)		      \
++  __inline_mathcodeNP_ (long double, __CONCAT(func,l), arg, code)
++# define __inline_mathcode2(func, arg1, arg2, code) \
++  __inline_mathcode2_ (double, func, arg1, arg2, code)			      \
++  __inline_mathcode2_ (float, __CONCAT(func,f), arg1, arg2, code)	      \
++  __inline_mathcode2_ (long double, __CONCAT(func,l), arg1, arg2, code)
++# define __inline_mathcodeNP2(func, arg1, arg2, code) \
++  __inline_mathcodeNP2_ (double, func, arg1, arg2, code)		      \
++  __inline_mathcodeNP2_ (float, __CONCAT(func,f), arg1, arg2, code)	      \
++  __inline_mathcodeNP2_ (long double, __CONCAT(func,l), arg1, arg2, code)
++# define __inline_mathcode3(func, arg1, arg2, arg3, code) \
++  __inline_mathcode3_ (double, func, arg1, arg2, arg3, code)		      \
++  __inline_mathcode3_ (float, __CONCAT(func,f), arg1, arg2, arg3, code)	      \
++  __inline_mathcode3_ (long double, __CONCAT(func,l), arg1, arg2, arg3, code)
++# define __inline_mathcodeNP3(func, arg1, arg2, arg3, code) \
++  __inline_mathcodeNP3_ (double, func, arg1, arg2, arg3, code)		      \
++  __inline_mathcodeNP3_ (float, __CONCAT(func,f), arg1, arg2, arg3, code)     \
++  __inline_mathcodeNP3_ (long double, __CONCAT(func,l), arg1, arg2, arg3, code)
++#else
++# define __inline_mathcode(func, arg, code) \
++  __inline_mathcode_ (double, func, (arg), code)
++# define __inline_mathcodeNP(func, arg, code) \
++  __inline_mathcodeNP_ (double, func, (arg), code)
++# define __inline_mathcode2(func, arg1, arg2, code) \
++  __inline_mathcode2_ (double, func, arg1, arg2, code)
++# define __inline_mathcodeNP2(func, arg1, arg2, code) \
++  __inline_mathcodeNP2_ (double, func, arg1, arg2, code)
++# define __inline_mathcode3(func, arg1, arg2, arg3, code) \
++  __inline_mathcode3_ (double, func, arg1, arg2, arg3, code)
++# define __inline_mathcodeNP3(func, arg1, arg2, arg3, code) \
++  __inline_mathcodeNP3_ (double, func, arg1, arg2, arg3, code)
++#endif
++
++#define __inline_mathcode_(float_type, func, arg, code) \
++  __MATH_INLINE float_type func (float_type) __THROW;			      \
++  __inline_mathcodeNP_(float_type, func, arg, code)
++
++#define __inline_mathcodeNP_(float_type, func, arg, code) \
++  __MATH_INLINE float_type __NTH (func (float_type arg))		      \
++  {									      \
++    code;								      \
++  }
++
++
++#define __inline_mathcode2_(float_type, func, arg1, arg2, code) \
++  __MATH_INLINE float_type func (float_type, float_type) __THROW;	      \
++  __inline_mathcodeNP2_ (float_type, func, arg1, arg2, code)
++
++#define __inline_mathcodeNP2_(float_type, func, arg1, arg2, code) \
++  __MATH_INLINE float_type __NTH (func (float_type arg1, float_type arg2))    \
++  {									      \
++    code;								      \
++  }
++
++#define __inline_mathcode3_(float_type, func, arg1, arg2, arg3, code) \
++  __MATH_INLINE float_type func (float_type, float_type, float_type) __THROW; \
++  __inline_mathcodeNP3_(float_type, func, arg1, arg2, arg3, code)
++
++#define __inline_mathcodeNP3_(float_type, func, arg1, arg2, arg3, code) \
++  __MATH_INLINE float_type __NTH (func (float_type arg1, float_type arg2,     \
++					float_type arg3))		      \
++  {									      \
++    code;								      \
++  }
++#endif
++
++
++#if !defined __NO_MATH_INLINES && defined __OPTIMIZE__
++/* Miscellaneous functions */
++
++__inline_mathcode (__sgn, __x, \
++  return __x == 0.0 ? 0.0 : (__x > 0.0 ? 1.0 : -1.0))
++
++/* __FAST_MATH__ is defined by gcc -ffast-math.  */
++#ifdef __FAST_MATH__
++__inline_mathcode (__pow2, __x, \
++  register long double __value;						      \
++  register long double __exponent;					      \
++  __extension__ long long int __p = (long long int) __x;		      \
++  if (__x == (long double) __p)						      \
++    {									      \
++      __asm __volatile__						      \
++	("fscale"							      \
++	 : "=t" (__value) : "0" (1.0), "u" (__x));			      \
++      return __value;							      \
++    }									      \
++  __asm __volatile__							      \
++    ("fld	%%st(0)\n\t"						      \
++     "frndint			# int(x)\n\t"				      \
++     "fxch\n\t"								      \
++     "fsub	%%st(1)		# fract(x)\n\t"				      \
++     "f2xm1			# 2^(fract(x)) - 1\n\t"			      \
++     : "=t" (__value), "=u" (__exponent) : "0" (__x));			      \
++  __value += 1.0;							      \
++  __asm __volatile__							      \
++    ("fscale"								      \
++     : "=t" (__value) : "0" (__value), "u" (__exponent));		      \
++  return __value)
++
++# ifdef __USE_GNU
++#  define __sincos_code \
++  register long double __cosr;						      \
++  register long double __sinr;						      \
++  __asm __volatile__							      \
++    ("fsincos\n\t"							      \
++     "fnstsw	%%ax\n\t"						      \
++     "testl	$0x400, %%eax\n\t"					      \
++     "jz	1f\n\t"							      \
++     "fldpi\n\t"							      \
++     "fadd	%%st(0)\n\t"						      \
++     "fxch	%%st(1)\n\t"						      \
++     "2: fprem1\n\t"							      \
++     "fnstsw	%%ax\n\t"						      \
++     "testl	$0x400, %%eax\n\t"					      \
++     "jnz	2b\n\t"							      \
++     "fstp	%%st(1)\n\t"						      \
++     "fsincos\n\t"							      \
++     "1:"								      \
++     : "=t" (__cosr), "=u" (__sinr) : "0" (__x));			      \
++  *__sinx = __sinr;							      \
++  *__cosx = __cosr
++
++__MATH_INLINE void
++__NTH (__sincos (double __x, double *__sinx, double *__cosx))
++{
++  __sincos_code;
++}
++
++__MATH_INLINE void
++__NTH (__sincosf (float __x, float *__sinx, float *__cosx))
++{
++  __sincos_code;
++}
++
++__MATH_INLINE void
++__NTH (__sincosl (long double __x, long double *__sinx, long double *__cosx))
++{
++  __sincos_code;
++}
++# endif
++
++
++/* Optimized inline implementation, sometimes with reduced precision
++   and/or argument range.  */
++
++# if __GNUC_PREREQ (3, 5)
++#  define __expm1_code \
++  register long double __temp;						      \
++  __temp = __builtin_expm1l (__x);					      \
++  return __temp ? __temp : __x
++# else
++#  define __expm1_code \
++  register long double __value;						      \
++  register long double __exponent;					      \
++  register long double __temp;						      \
++  __asm __volatile__							      \
++    ("fldl2e			# e^x - 1 = 2^(x * log2(e)) - 1\n\t"	      \
++     "fmul	%%st(1)		# x * log2(e)\n\t"			      \
++     "fst	%%st(1)\n\t"						      \
++     "frndint			# int(x * log2(e))\n\t"			      \
++     "fxch\n\t"								      \
++     "fsub	%%st(1)		# fract(x * log2(e))\n\t"		      \
++     "f2xm1			# 2^(fract(x * log2(e))) - 1\n\t"	      \
++     "fscale			# 2^(x * log2(e)) - 2^(int(x * log2(e)))\n\t" \
++     : "=t" (__value), "=u" (__exponent) : "0" (__x));			      \
++  __asm __volatile__							      \
++    ("fscale			# 2^int(x * log2(e))\n\t"		      \
++     : "=t" (__temp) : "0" (1.0), "u" (__exponent));			      \
++  __temp -= 1.0;							      \
++  __temp += __value;							      \
++  return __temp ? __temp : __x
++# endif
++__inline_mathcodeNP_ (long double, __expm1l, __x, __expm1_code)
++
++# if __GNUC_PREREQ (3, 4)
++__inline_mathcodeNP_ (long double, __expl, __x, return __builtin_expl (__x))
++# else
++#  define __exp_code \
++  register long double __value;						      \
++  register long double __exponent;					      \
++  __asm __volatile__							      \
++    ("fldl2e			# e^x = 2^(x * log2(e))\n\t"		      \
++     "fmul	%%st(1)		# x * log2(e)\n\t"			      \
++     "fst	%%st(1)\n\t"						      \
++     "frndint			# int(x * log2(e))\n\t"			      \
++     "fxch\n\t"								      \
++     "fsub	%%st(1)		# fract(x * log2(e))\n\t"		      \
++     "f2xm1			# 2^(fract(x * log2(e))) - 1\n\t"	      \
++     : "=t" (__value), "=u" (__exponent) : "0" (__x));			      \
++  __value += 1.0;							      \
++  __asm __volatile__							      \
++    ("fscale"								      \
++     : "=t" (__value) : "0" (__value), "u" (__exponent));		      \
++  return __value
++__inline_mathcodeNP (exp, __x, __exp_code)
++__inline_mathcodeNP_ (long double, __expl, __x, __exp_code)
++# endif
++
++
++# if !__GNUC_PREREQ (3, 5)
++__inline_mathcodeNP (tan, __x, \
++  register long double __value;						      \
++  register long double __value2 __attribute__ ((__unused__));		      \
++  __asm __volatile__							      \
++    ("fptan"								      \
++     : "=t" (__value2), "=u" (__value) : "0" (__x));			      \
++  return __value)
++# endif
++#endif /* __FAST_MATH__ */
++
++
++#if __GNUC_PREREQ (3, 4)
++__inline_mathcodeNP2_ (long double, __atan2l, __y, __x,
++		       return __builtin_atan2l (__y, __x))
++#else
++# define __atan2_code \
++  register long double __value;						      \
++  __asm __volatile__							      \
++    ("fpatan"								      \
++     : "=t" (__value) : "0" (__x), "u" (__y) : "st(1)");		      \
++  return __value
++# ifdef __FAST_MATH__
++__inline_mathcodeNP2 (atan2, __y, __x, __atan2_code)
++# endif
++__inline_mathcodeNP2_ (long double, __atan2l, __y, __x, __atan2_code)
++#endif
++
++
++#if defined __FAST_MATH__ && !__GNUC_PREREQ (3, 5)
++__inline_mathcodeNP2 (fmod, __x, __y, \
++  register long double __value;						      \
++  __asm __volatile__							      \
++    ("1:	fprem\n\t"						      \
++     "fnstsw	%%ax\n\t"						      \
++     "sahf\n\t"								      \
++     "jp	1b"							      \
++     : "=t" (__value) : "0" (__x), "u" (__y) : "ax", "cc");		      \
++  return __value)
++#endif
++
++
++#ifdef __FAST_MATH__
++# if !__GNUC_PREREQ (3,3)
++__inline_mathopNP (sqrt, "fsqrt")
++__inline_mathopNP_ (long double, __sqrtl, "fsqrt")
++#  define __libc_sqrtl(n) __sqrtl (n)
++# else
++#  define __libc_sqrtl(n) __builtin_sqrtl (n)
++# endif
++#endif
++
++#if __GNUC_PREREQ (2, 8)
++__inline_mathcodeNP_ (double, fabs, __x, return __builtin_fabs (__x))
++# if defined __USE_MISC || defined __USE_ISOC99
++__inline_mathcodeNP_ (float, fabsf, __x, return __builtin_fabsf (__x))
++__inline_mathcodeNP_ (long double, fabsl, __x, return __builtin_fabsl (__x))
++# endif
++__inline_mathcodeNP_ (long double, __fabsl, __x, return __builtin_fabsl (__x))
++#else
++__inline_mathop (fabs, "fabs")
++__inline_mathop_ (long double, __fabsl, "fabs")
++#endif
++
++#ifdef __FAST_MATH__
++# if !__GNUC_PREREQ (3, 4)
++/* The argument range of this inline version is reduced.  */
++__inline_mathopNP (sin, "fsin")
++/* The argument range of this inline version is reduced.  */
++__inline_mathopNP (cos, "fcos")
++
++__inline_mathop_declNP (log, "fldln2; fxch; fyl2x", "0" (__x) : "st(1)")
++# endif
++
++# if !__GNUC_PREREQ (3, 5)
++__inline_mathop_declNP (log10, "fldlg2; fxch; fyl2x", "0" (__x) : "st(1)")
++
++__inline_mathcodeNP (asin, __x, return __atan2l (__x, __libc_sqrtl (1.0 - __x * __x)))
++__inline_mathcodeNP (acos, __x, return __atan2l (__libc_sqrtl (1.0 - __x * __x), __x))
++# endif
++
++# if !__GNUC_PREREQ (3, 4)
++__inline_mathop_declNP (atan, "fld1; fpatan", "0" (__x) : "st(1)")
++# endif
++#endif /* __FAST_MATH__ */
++
++__inline_mathcode_ (long double, __sgn1l, __x, \
++  __extension__ union { long double __xld; unsigned int __xi[3]; } __n =      \
++    { __xld: __x };							      \
++  __n.__xi[2] = (__n.__xi[2] & 0x8000) | 0x3fff;			      \
++  __n.__xi[1] = 0x80000000;						      \
++  __n.__xi[0] = 0;							      \
++  return __n.__xld)
++
++
++#ifdef __FAST_MATH__
++/* The argument range of the inline version of sinhl is slightly reduced.  */
++__inline_mathcodeNP (sinh, __x, \
++  register long double __exm1 = __expm1l (__fabsl (__x));		      \
++  return 0.5 * (__exm1 / (__exm1 + 1.0) + __exm1) * __sgn1l (__x))
++
++__inline_mathcodeNP (cosh, __x, \
++  register long double __ex = __expl (__x);				      \
++  return 0.5 * (__ex + 1.0 / __ex))
++
++__inline_mathcodeNP (tanh, __x, \
++  register long double __exm1 = __expm1l (-__fabsl (__x + __x));	      \
++  return __exm1 / (__exm1 + 2.0) * __sgn1l (-__x))
++#endif
++
++__inline_mathcodeNP (floor, __x, \
++  register long double __value;						      \
++  register int __ignore;						      \
++  unsigned short int __cw;						      \
++  unsigned short int __cwtmp;						      \
++  __asm __volatile ("fnstcw %3\n\t"					      \
++		    "movzwl %3, %1\n\t"					      \
++		    "andl $0xf3ff, %1\n\t"				      \
++		    "orl $0x0400, %1\n\t"	/* rounding down */	      \
++		    "movw %w1, %2\n\t"					      \
++		    "fldcw %2\n\t"					      \
++		    "frndint\n\t"					      \
++		    "fldcw %3"						      \
++		    : "=t" (__value), "=&q" (__ignore), "=m" (__cwtmp),	      \
++		      "=m" (__cw)					      \
++		    : "0" (__x));					      \
++  return __value)
++
++__inline_mathcodeNP (ceil, __x, \
++  register long double __value;						      \
++  register int __ignore;						      \
++  unsigned short int __cw;						      \
++  unsigned short int __cwtmp;						      \
++  __asm __volatile ("fnstcw %3\n\t"					      \
++		    "movzwl %3, %1\n\t"					      \
++		    "andl $0xf3ff, %1\n\t"				      \
++		    "orl $0x0800, %1\n\t"	/* rounding up */	      \
++		    "movw %w1, %2\n\t"					      \
++		    "fldcw %2\n\t"					      \
++		    "frndint\n\t"					      \
++		    "fldcw %3"						      \
++		    : "=t" (__value), "=&q" (__ignore), "=m" (__cwtmp),	      \
++		      "=m" (__cw)					      \
++		    : "0" (__x));					      \
++  return __value)
++
++#ifdef __FAST_MATH__
++# define __ldexp_code \
++  register long double __value;						      \
++  __asm __volatile__							      \
++    ("fscale"								      \
++     : "=t" (__value) : "0" (__x), "u" ((long double) __y));		      \
++  return __value
++
++__MATH_INLINE double
++__NTH (ldexp (double __x, int __y))
++{
++  __ldexp_code;
++}
++#endif
++
++
++/* Optimized versions for some non-standardized functions.  */
++#if defined __USE_ISOC99 || defined __USE_MISC
++
++# ifdef __FAST_MATH__
++__inline_mathcodeNP (expm1, __x, __expm1_code)
++
++/* We cannot rely on M_SQRT being defined.  So we do it for ourself
++   here.  */
++#  define __M_SQRT2	1.41421356237309504880L	/* sqrt(2) */
++
++#  if !__GNUC_PREREQ (3, 5)
++__inline_mathcodeNP (log1p, __x, \
++  register long double __value;						      \
++  if (__fabsl (__x) >= 1.0 - 0.5 * __M_SQRT2)				      \
++    __value = logl (1.0 + __x);						      \
++  else									      \
++    __asm __volatile__							      \
++      ("fldln2\n\t"							      \
++       "fxch\n\t"							      \
++       "fyl2xp1"							      \
++       : "=t" (__value) : "0" (__x) : "st(1)");				      \
++  return __value)
++#  endif
++
++
++/* The argument range of the inline version of asinhl is slightly reduced.  */
++__inline_mathcodeNP (asinh, __x, \
++  register long double  __y = __fabsl (__x);				      \
++  return (log1pl (__y * __y / (__libc_sqrtl (__y * __y + 1.0) + 1.0) + __y)   \
++	  * __sgn1l (__x)))
++
++__inline_mathcodeNP (acosh, __x, \
++  return logl (__x + __libc_sqrtl (__x - 1.0) * __libc_sqrtl (__x + 1.0)))
++
++__inline_mathcodeNP (atanh, __x, \
++  register long double __y = __fabsl (__x);				      \
++  return -0.5 * log1pl (-(__y + __y) / (1.0 + __y)) * __sgn1l (__x))
++
++/* The argument range of the inline version of hypotl is slightly reduced.  */
++__inline_mathcodeNP2 (hypot, __x, __y,
++		      return __libc_sqrtl (__x * __x + __y * __y))
++
++#  if !__GNUC_PREREQ (3, 5)
++__inline_mathcodeNP(logb, __x, \
++  register long double __value;						      \
++  register long double __junk;						      \
++  __asm __volatile__							      \
++    ("fxtract\n\t"							      \
++     : "=t" (__junk), "=u" (__value) : "0" (__x));			      \
++  return __value)
++#  endif
++
++# endif
+ #endif
++
++#ifdef __USE_ISOC99
++# ifdef __FAST_MATH__
++
++#  if !__GNUC_PREREQ (3, 5)
++__inline_mathop_declNP (log2, "fld1; fxch; fyl2x", "0" (__x) : "st(1)")
++#  endif
++
++__MATH_INLINE float
++__NTH (ldexpf (float __x, int __y))
++{
++  __ldexp_code;
++}
++
++__MATH_INLINE long double
++__NTH (ldexpl (long double __x, int __y))
++{
++  __ldexp_code;
++}
++
++__inline_mathopNP (rint, "frndint")
++# endif /* __FAST_MATH__ */
++
++# define __lrint_code \
++  long int __lrintres;							      \
++  __asm__ __volatile__							      \
++    ("fistpl %0"							      \
++     : "=m" (__lrintres) : "t" (__x) : "st");				      \
++  return __lrintres
++__MATH_INLINE long int
++__NTH (lrintf (float __x))
++{
++  __lrint_code;
++}
++__MATH_INLINE long int
++__NTH (lrint (double __x))
++{
++  __lrint_code;
++}
++__MATH_INLINE long int
++__NTH (lrintl (long double __x))
++{
++  __lrint_code;
++}
++# undef __lrint_code
++
++# define __llrint_code \
++  long long int __llrintres;						      \
++  __asm__ __volatile__							      \
++    ("fistpll %0"							      \
++     : "=m" (__llrintres) : "t" (__x) : "st");				      \
++  return __llrintres
++__MATH_INLINE long long int
++__NTH (llrintf (float __x))
++{
++  __llrint_code;
++}
++__MATH_INLINE long long int
++__NTH (llrint (double __x))
++{
++  __llrint_code;
++}
++__MATH_INLINE long long int
++__NTH (llrintl (long double __x))
++{
++  __llrint_code;
++}
++# undef __llrint_code
++
++#endif
++
++
++#ifdef __USE_MISC
++
++# if defined __FAST_MATH__ && !__GNUC_PREREQ (3, 5)
++__inline_mathcodeNP2 (drem, __x, __y, \
++  register double __value;						      \
++  register int __clobbered;						      \
++  __asm __volatile__							      \
++    ("1:	fprem1\n\t"						      \
++     "fstsw	%%ax\n\t"						      \
++     "sahf\n\t"								      \
++     "jp	1b"							      \
++     : "=t" (__value), "=&a" (__clobbered) : "0" (__x), "u" (__y) : "cc");    \
++  return __value)
++# endif
++
++
++/* This function is used in the `isfinite' macro.  */
++__MATH_INLINE int
++__NTH (__finite (double __x))
++{
++  return (__extension__
++	  (((((union { double __d; int __i[2]; }) {__d: __x}).__i[1]
++	     | 0x800fffffu) + 1) >> 31));
++}
++
++/* Miscellaneous functions */
++# ifdef __FAST_MATH__
++__inline_mathcode (__coshm1, __x, \
++  register long double __exm1 = __expm1l (__fabsl (__x));		      \
++  return 0.5 * (__exm1 / (__exm1 + 1.0)) * __exm1)
++
++__inline_mathcode (__acosh1p, __x, \
++  return log1pl (__x + __libc_sqrtl (__x) * __libc_sqrtl (__x + 2.0)))
++
++# endif /* __FAST_MATH__ */
++#endif /* __USE_MISC  */
++
++/* Undefine some of the large macros which are not used anymore.  */
++#undef __atan2_code
++#ifdef __FAST_MATH__
++# undef __expm1_code
++# undef __exp_code
++# undef __sincos_code
++#endif /* __FAST_MATH__ */
++
++#endif /* __NO_MATH_INLINES  */
++
++
++/* This code is used internally in the GNU libc.  */
++#ifdef __LIBC_INTERNAL_MATH_INLINES
++__inline_mathop (__ieee754_sqrt, "fsqrt")
++__inline_mathcode2 (__ieee754_atan2, __y, __x,
++		    register long double __value;
++		    __asm __volatile__ ("fpatan\n\t"
++					: "=t" (__value)
++					: "0" (__x), "u" (__y) : "st(1)");
++		    return __value;)
++#endif
++
++#endif /* WORDSIZE == 32 && __GNUC__  */
+diff -urN libc.org/sysdeps/x86_64/fpu_control.h libc/sysdeps/x86_64/fpu_control.h
+--- libc.org/sysdeps/x86_64/fpu_control.h	2011-05-06 23:45:50.000000000 -0500
++++ libc/sysdeps/x86_64/fpu_control.h	2011-07-14 18:34:47.868885828 -0500
+@@ -1,5 +1,5 @@
+-/* FPU control word bits.  x86-64 version.
+-   Copyright (C) 1993,1995,1996,1997,1998,2000,2001,2002 Free Software Foundation, Inc.
++/* FPU control word bits.  i387/x86_64 version.
++   Copyright (C) 1993,1995-1998,2000,2001,2002,2003 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Olaf Flebbe.
+ 
+@@ -21,9 +21,6 @@
+ #ifndef _FPU_CONTROL_H
+ #define _FPU_CONTROL_H	1
+ 
+-/* Note that this file sets on x86-64 only the x87 FPU, it does not
+-   touch the SSE unit.  */
+-
+ /* Here is the dirty part. Set up your 387 through the control word
+  * (cw) register.
+  *
+@@ -91,9 +88,13 @@
+ /* Type of the control word.  */
+ typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__HI__)));
+ 
+-/* Macros for accessing the hardware control word.  */
+-#define _FPU_GETCW(cw) __asm__ ("fnstcw %0" : "=m" (*&cw))
+-#define _FPU_SETCW(cw) __asm__ ("fldcw %0" : : "m" (*&cw))
++/* Macros for accessing the hardware control word.
++
++   Note that the use of these macros is no sufficient anymore with
++   recent hardware.  Some floating point operations are executed in
++   the SSE/SSE2 engines which have their own control and status register.  */
++#define _FPU_GETCW(cw) __asm__ __volatile__ ("fnstcw %0" : "=m" (*&cw))
++#define _FPU_SETCW(cw) __asm__ __volatile__ ("fldcw %0" : : "m" (*&cw))
+ 
+ /* Default control word set at startup.  */
+ extern fpu_control_t __fpu_control;
diff --git a/meta/recipes-core/eglibc/eglibc-package.inc b/meta/recipes-core/eglibc/eglibc-package.inc
index 9e71150..a995f4f 100644
--- a/meta/recipes-core/eglibc/eglibc-package.inc
+++ b/meta/recipes-core/eglibc/eglibc-package.inc
@@ -86,10 +86,12 @@ SUMMARY_eglibc-utils = "Miscellaneous utilities provided by eglibc"
 DESCRIPTION_eglibc-utils = "Miscellaneous utilities including getconf, iconf, locale, gencat, tzselect, zic, rpcinfo, ..."
 DESCRIPTION_libsotruss = "Library to support sotruss which traces calls through PLTs"
 
-inherit libc-common
+inherit libc-common multilib_header
 
 do_install_append () {
 	rm -f ${D}${sysconfdir}/localtime
+
+	oe_multilib_header bits/syscall.h
 }
 
 do_install_locale () {
diff --git a/meta/recipes-core/eglibc/eglibc_2.13.bb b/meta/recipes-core/eglibc/eglibc_2.13.bb
index 6076ab9..ffc4496 100644
--- a/meta/recipes-core/eglibc/eglibc_2.13.bb
+++ b/meta/recipes-core/eglibc/eglibc_2.13.bb
@@ -17,6 +17,7 @@ SRC_URI = "svn://www.eglibc.org/svn/branches/;module=${EGLIBC_BRANCH};proto=http
            file://etc/ld.so.conf \
            file://generate-supported.mk \
            file://glibc_bug_fix_12454.patch \
+           file://arch-ia32.patch \
 	   "
 LIC_FILES_CHKSUM = "file://LICENSES;md5=98a1128c4b58120182cbea3b1752d8b9 \
       file://COPYING;md5=393a5ca445f6965873eca0259a17f833 \
-- 
1.7.4.1





More information about the Openembedded-core mailing list