[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[commits] r8868 - in /fsf/trunk/libc: ./ math/ nptl/ posix/ sysdeps/i386/fpu/bits/ sysdeps/ieee754/dbl-64/wordsize-64/ sysdeps/unix/ s...



Author: eglibc
Date: Tue Aug 25 00:04:32 2009
New Revision: 8868

Log:
Import glibc-mainline for 2009-08-25

Added:
    fsf/trunk/libc/sysdeps/ieee754/dbl-64/wordsize-64/
    fsf/trunk/libc/sysdeps/ieee754/dbl-64/wordsize-64/s_ceil.c
    fsf/trunk/libc/sysdeps/unix/syscall-template.S
Modified:
    fsf/trunk/libc/ChangeLog
    fsf/trunk/libc/math/math.h
    fsf/trunk/libc/math/math_private.h
    fsf/trunk/libc/math/s_fdim.c
    fsf/trunk/libc/math/s_fdimf.c
    fsf/trunk/libc/math/s_fdiml.c
    fsf/trunk/libc/nptl/ChangeLog
    fsf/trunk/libc/nptl/pthread_create.c
    fsf/trunk/libc/posix/bug-regex29.c
    fsf/trunk/libc/sysdeps/i386/fpu/bits/mathinline.h
    fsf/trunk/libc/sysdeps/unix/Makefile
    fsf/trunk/libc/sysdeps/unix/make-syscalls.sh
    fsf/trunk/libc/sysdeps/x86_64/fpu/bits/mathinline.h
    fsf/trunk/libc/sysdeps/x86_64/fpu/math_private.h

Modified: fsf/trunk/libc/ChangeLog
==============================================================================
--- fsf/trunk/libc/ChangeLog (original)
+++ fsf/trunk/libc/ChangeLog Tue Aug 25 00:04:32 2009
@@ -1,3 +1,37 @@
+2009-08-24  Ulrich Drepper  <drepper@xxxxxxxxxx>
+
+	* math/math_private.h (ieee_double_shape_type): Add uint64_t word to
+	union.
+	(EXTRACT_WORDS64, INSERT_WORDS64): Define.
+	* sysdeps/x86_64/fpu/math_private.h (EXTRACT_WORDS64, INSERT_WORDS64):
+	Redefine.
+	* sysdeps/ieee754/dbl-64/wordsize-64/s_ceil.c: New file.
+
+	* sysdeps/x86_64/fpu/math_private.h: Add specialized GET_FLOAT_WORD
+	and SET_FLOAT_WORD definitions.
+
+2009-08-24  Roland McGrath  <roland@xxxxxxxxxx>
+
+	* sysdeps/unix/syscall-template.S: New file.
+	* sysdeps/unix/make-syscalls.sh: Generate rules to use it.
+	* sysdeps/unix/Makefile (omit-deps): Do not omit syscall stubs' deps.
+	(compile-syscall): Pass mkdep and -g options as normal.
+	(s-proto.d, s-proto-cancel.d): Don't "-include" these.
+	(common-generated): Don't add them here.
+
+2009-08-24  Ulrich Drepper  <drepper@xxxxxxxxxx>
+
+	* math/s_fdim.c: In case of overflows set errno.
+	* math/s_fdimf.c: Likewise.
+	* math/s_fdiml.c: Likewise.
+
+	* math/math.h: Define math_errhandling of __FAST_MATH__ is not defined.
+	* sysdeps/i386/fpu/bits/mathinline.h: Undefine math_errhandling if we
+	are using the inline optimizations.
+
+	* sysdeps/x86_64/fpu/bits/mathinline.h (__signbit): Optimize.
+	(__signbitf): Likewise.
+
 2009-08-23  Ulrich Drepper  <drepper@xxxxxxxxxx>
 
 	* posix/regcomp.c (parse_dup_op): Verify the expression is correctly

Modified: fsf/trunk/libc/math/math.h
==============================================================================
--- fsf/trunk/libc/math/math.h (original)
+++ fsf/trunk/libc/math/math.h Tue Aug 25 00:04:32 2009
@@ -1,5 +1,5 @@
 /* Declarations for math functions.
-   Copyright (C) 1991-1993, 1995-1999, 2001, 2002, 2004, 2006
+   Copyright (C) 1991-1993, 1995-1999, 2001, 2002, 2004, 2006, 2009
    Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
@@ -101,7 +101,7 @@
      && (!defined __NO_LONG_DOUBLE_MATH || defined __LDBL_COMPAT)
 #  ifdef __LDBL_COMPAT
 
-#   ifdef __USE_ISOC99 
+#   ifdef __USE_ISOC99
 extern float __nldbl_nexttowardf (float __x, long double __y)
 				  __THROW __attribute__ ((__const__));
 #    ifdef __REDIRECT_NTH
@@ -276,6 +276,13 @@
 /* Bitmasks for the math_errhandling macro.  */
 # define MATH_ERRNO	1	/* errno set by math functions.  */
 # define MATH_ERREXCEPT	2	/* Exceptions raised by math functions.  */
+
+/* By default all functions support both errno and exception handling.
+   In gcc's fast math mode and if inline functions are defined this
+   might not be true.  */
+# ifndef __FAST_MATH__
+#  define math_errhandling	(MATH_ERRNO | MATH_ERREXCEPT)
+# endif
 
 #endif /* Use ISO C99.  */
 

Modified: fsf/trunk/libc/math/math_private.h
==============================================================================
--- fsf/trunk/libc/math/math_private.h (original)
+++ fsf/trunk/libc/math/math_private.h Tue Aug 25 00:04:32 2009
@@ -17,6 +17,7 @@
 #define _MATH_PRIVATE_H_
 
 #include <endian.h>
+#include <stdint.h>
 #include <sys/types.h>
 
 /* The original fdlibm code used statements like:
@@ -43,6 +44,7 @@
     u_int32_t msw;
     u_int32_t lsw;
   } parts;
+  uint64_t word;
 } ieee_double_shape_type;
 
 #endif
@@ -57,6 +59,7 @@
     u_int32_t lsw;
     u_int32_t msw;
   } parts;
+  uint64_t word;
 } ieee_double_shape_type;
 
 #endif
@@ -89,6 +92,14 @@
   (i) = gl_u.parts.lsw;						\
 } while (0)
 
+/* Get all in one, efficient on 64-bit machines.  */
+#define EXTRACT_WORDS64(i,d)					\
+do {								\
+  ieee_double_shape_type gh_u;					\
+  gh_u.value = (d);						\
+  (i) = gh_u.word;						\
+} while (0)
+
 /* Set a double from two 32 bit ints.  */
 
 #define INSERT_WORDS(d,ix0,ix1)					\
@@ -96,6 +107,14 @@
   ieee_double_shape_type iw_u;					\
   iw_u.parts.msw = (ix0);					\
   iw_u.parts.lsw = (ix1);					\
+  (d) = iw_u.value;						\
+} while (0)
+
+/* Get all in one, efficient on 64-bit machines.  */
+#define INSERT_WORDS64(i,d)					\
+do {								\
+  ieee_double_shape_type iw_u;					\
+  iw_u.word = (i);						\
   (d) = iw_u.value;						\
 } while (0)
 

Modified: fsf/trunk/libc/math/s_fdim.c
==============================================================================
--- fsf/trunk/libc/math/s_fdim.c (original)
+++ fsf/trunk/libc/math/s_fdim.c Tue Aug 25 00:04:32 2009
@@ -1,5 +1,5 @@
 /* Return positive difference between arguments.
-   Copyright (C) 1997, 2004 Free Software Foundation, Inc.
+   Copyright (C) 1997, 2004, 2009 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@xxxxxxxxxx>, 1997.
 
@@ -18,6 +18,7 @@
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
+#include <errno.h>
 #include <math.h>
 
 double
@@ -31,7 +32,14 @@
     /* Raise invalid flag.  */
     return x - y;
 
-  return x <= y ? 0 : x - y;
+  if (x <= y)
+    return 0.0;
+
+  double r = x - y;
+  if (fpclassify (r) == FP_INFINITE)
+    __set_errno (ERANGE);
+
+  return r;
 }
 weak_alias (__fdim, fdim)
 #ifdef NO_LONG_DOUBLE

Modified: fsf/trunk/libc/math/s_fdimf.c
==============================================================================
--- fsf/trunk/libc/math/s_fdimf.c (original)
+++ fsf/trunk/libc/math/s_fdimf.c Tue Aug 25 00:04:32 2009
@@ -1,5 +1,5 @@
 /* Return positive difference between arguments.
-   Copyright (C) 1997, 2004 Free Software Foundation, Inc.
+   Copyright (C) 1997, 2004, 2009 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@xxxxxxxxxx>, 1997.
 
@@ -18,6 +18,7 @@
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
+#include <errno.h>
 #include <math.h>
 
 float
@@ -31,6 +32,13 @@
     /* Raise invalid flag.  */
     return x - y;
 
-  return x <= y ? 0 : x - y;
+  if (x <= y)
+    return 0.0f;
+
+  float r = x - y;
+  if (fpclassify (r) == FP_INFINITE)
+    __set_errno (ERANGE);
+
+  return r;
 }
 weak_alias (__fdimf, fdimf)

Modified: fsf/trunk/libc/math/s_fdiml.c
==============================================================================
--- fsf/trunk/libc/math/s_fdiml.c (original)
+++ fsf/trunk/libc/math/s_fdiml.c Tue Aug 25 00:04:32 2009
@@ -1,5 +1,5 @@
 /* Return positive difference between arguments.
-   Copyright (C) 1997, 2004 Free Software Foundation, Inc.
+   Copyright (C) 1997, 2004, 2009 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@xxxxxxxxxx>, 1997.
 
@@ -18,19 +18,27 @@
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
+#include <errno.h>
 #include <math.h>
 
 long double
 __fdiml (long double x, long double y)
 {
-  int clsx = fpclassify (x);
-  int clsy = fpclassify (y);
+  int clsx = fpclassifyl (x);
+  int clsy = fpclassifyl (y);
 
   if (clsx == FP_NAN || clsy == FP_NAN
       || (y < 0 && clsx == FP_INFINITE && clsy == FP_INFINITE))
     /* Raise invalid flag.  */
     return x - y;
 
-  return x <= y ? 0 : x - y;
+  if (x <= y)
+    return 0.0f;
+
+  long double r = x - y;
+  if (fpclassify (r) == FP_INFINITE)
+    __set_errno (ERANGE);
+
+  return r;
 }
 weak_alias (__fdiml, fdiml)

Modified: fsf/trunk/libc/nptl/ChangeLog
==============================================================================
--- fsf/trunk/libc/nptl/ChangeLog (original)
+++ fsf/trunk/libc/nptl/ChangeLog Tue Aug 25 00:04:32 2009
@@ -1,3 +1,9 @@
+2009-08-24  Ulrich Drepper  <drepper@xxxxxxxxxx>
+
+	* pthread_create.c (start_thread): Hint to the kernel that memory for
+	the stack can be reused.  We do not mark all the memory.  The part
+	still in use and some reserve are kept.
+
 2009-08-23  Ulrich Drepper  <drepper@xxxxxxxxxx>
 
 	* sysdeps/unix/sysv/linux/bits/posix_opt.h: Clean up namespace.
@@ -1847,9 +1853,9 @@
 	* sysdeps/unix/sysv/linux/sh/bits/pthreadtypes.h: Include endian.h.
 	Split __flags into __flags, __shared, __pad1 and __pad2.
 	* sysdeps/unix/sysv/linux/sh/libc-lowlevellock.S: Use private
-        futexes if they are available.
+	futexes if they are available.
 	* sysdeps/unix/sysv/linux/sh/lowlevellock.S: Adjust so that change
-        in libc-lowlevellock.S allow using private futexes.
+	in libc-lowlevellock.S allow using private futexes.
 	* sysdeps/unix/sysv/linux/sh/lowlevellock.h: Define
 	FUTEX_PRIVATE_FLAG.  Add additional parameter to lll_futex_wait,
 	lll_futex_timed_wait and lll_futex_wake.  Change lll_futex_wait
@@ -1857,12 +1863,12 @@
 	lll_private_futex_timed_wait and lll_private_futex_wake.
 	(lll_robust_mutex_unlock): Fix typo.
 	* sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S: Use private
-        field in futex command setup.
+	field in futex command setup.
 	* sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S: Use
 	COND_NWAITERS_SHIFT instead of COND_CLOCK_BITS.
 	* sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S: Likewise.
 	* sysdeps/unix/sysv/linux/sh/pthread_once.S: Use private futexes
-        if they are available.  Remove clear_once_control.
+	if they are available.  Remove clear_once_control.
 	* sysdeps/unix/sysv/linux/sh/pthread_rwlock_rdlock.S: Use private
 	futexes if they are available.
 	* sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedrdlock.S: Likewise.
@@ -1873,7 +1879,7 @@
 	Wake only when there are waiters.
 	* sysdeps/unix/sysv/linux/sh/sem_wait.S: Add private futex
 	support.  Indicate that there are waiters.  Remove unnecessary
-        extra cancellation test.
+	extra cancellation test.
 	* sysdeps/unix/sysv/linux/sh/sem_timedwait.S: Likewise.  Removed
 	left-over duplication of __sem_wait_cleanup.
 
@@ -2587,14 +2593,14 @@
 	* tst-cancel25.c: New file.
 
 2006-09-05  Jakub Jelinek  <jakub@xxxxxxxxxx>
-            Ulrich Drepper  <drepper@xxxxxxxxxx>
+	    Ulrich Drepper  <drepper@xxxxxxxxxx>
 
 	* sysdeps/pthread/gai_misc.h (GAI_MISC_NOTIFY): Don't decrement
 	counterp if it is already zero.
 	* sysdeps/pthread/aio_misc.h (AIO_MISC_NOTIFY): Likewise..
 
 2006-03-04  Jakub Jelinek  <jakub@xxxxxxxxxx>
-            Roland McGrath  <roland@xxxxxxxxxx>
+	    Roland McGrath  <roland@xxxxxxxxxx>
 
 	* sysdeps/unix/sysv/linux/i386/lowlevellock.h
 	(LLL_STUB_UNWIND_INFO_START, LLL_STUB_UNWIND_INFO_END,
@@ -2608,7 +2614,7 @@
 	* sysdeps/unix/sysv/linux/i386/i486/lowlevelrobustlock.S: Likewise.
 
 2006-03-03  Jakub Jelinek  <jakub@xxxxxxxxxx>
-            Roland McGrath  <roland@xxxxxxxxxx>
+	    Roland McGrath  <roland@xxxxxxxxxx>
 
 	* sysdeps/unix/sysv/linux/x86_64/lowlevellock.h
 	(LLL_STUB_UNWIND_INFO_START, LLL_STUB_UNWIND_INFO_END,
@@ -3181,7 +3187,7 @@
 	* sysdeps/pthread/pthread.h: Adjust mutex initializers.
 
 	* sysdeps/unix/sysv/linux/i386/not-cancel.h: Define openat_not_cancel,
-        openat_not_cancel_3, openat64_not_cancel, and openat64_not_cancel_3.
+	openat_not_cancel_3, openat64_not_cancel, and openat64_not_cancel_3.
 
 2006-02-08  Jakub Jelinek  <jakub@xxxxxxxxxx>
 
@@ -3603,7 +3609,7 @@
 	* Makefile ($(test-modules)): Remove static pattern rule.
 
 2005-10-14  Jakub Jelinek  <jakub@xxxxxxxxxx>
-            Ulrich Drepper  <drepper@xxxxxxxxxx>
+	    Ulrich Drepper  <drepper@xxxxxxxxxx>
 
 	* sysdeps/unix/sysv/linux/x86_64/pthread_once.S: Fix stack
 	alignment in callback function.
@@ -3621,7 +3627,7 @@
 	atomic_compare_and_exchange_bool_acq.
 
 2005-10-01  Ulrich Drepper  <drepper@xxxxxxxxxx>
-            Jakub Jelinek  <jakub@xxxxxxxxxx>
+	    Jakub Jelinek  <jakub@xxxxxxxxxx>
 
 	* descr.h: Define SETXID_BIT and SETXID_BITMASK.  Adjust
 	CANCEL_RESTMASK.

Modified: fsf/trunk/libc/nptl/pthread_create.c
==============================================================================
--- fsf/trunk/libc/nptl/pthread_create.c (original)
+++ fsf/trunk/libc/nptl/pthread_create.c Tue Aug 25 00:04:32 2009
@@ -377,6 +377,19 @@
     }
 #endif
 
+  /* Mark the memory of the stack as usable to the kernel.  We free
+     everything except for the space used for the TCB itself.  */
+  size_t pagesize_m1 = __getpagesize () - 1;
+#ifdef _STACK_GROWS_DOWN
+  char *sp = CURRENT_STACK_FRAME;
+  size_t freesize = (sp - (char *) pd->stackblock) & ~pagesize_m1;
+#else
+# error "to do"
+#endif
+  assert (freesize < pd->stackblock_size);
+  if (freesize > PTHREAD_STACK_MIN)
+    madvise (pd->stackblock, freesize - PTHREAD_STACK_MIN, MADV_DONTNEED);
+
   /* If the thread is detached free the TCB.  */
   if (IS_DETACHED (pd))
     /* Free the TCB.  */

Modified: fsf/trunk/libc/posix/bug-regex29.c
==============================================================================
--- fsf/trunk/libc/posix/bug-regex29.c (original)
+++ fsf/trunk/libc/posix/bug-regex29.c Tue Aug 25 00:04:32 2009
@@ -8,7 +8,14 @@
   char buf[100];
   regerror(e, &r, buf, sizeof (buf));
   printf ("e = %d (%s)\n", e, buf);
-  return e != REG_BADBR;
+  int res = e != REG_BADBR;
+
+  e = regcomp(&r, "xy\\{4,5a\\}zabc", 0);
+  regerror(e, &r, buf, sizeof (buf));
+  printf ("e = %d (%s)\n", e, buf);
+  res |= e != REG_BADBR;
+
+  return res;
 }
 
 #define TEST_FUNCTION do_test ()

Modified: fsf/trunk/libc/sysdeps/i386/fpu/bits/mathinline.h
==============================================================================
--- fsf/trunk/libc/sysdeps/i386/fpu/bits/mathinline.h (original)
+++ fsf/trunk/libc/sysdeps/i386/fpu/bits/mathinline.h Tue Aug 25 00:04:32 2009
@@ -1,5 +1,5 @@
 /* Inline math functions for i387.
-   Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2003,2004,2006,2007
+   Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2003,2004,2006,2007,2009
    Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by John C. Bowman <bowman@xxxxxxxxxxxxxxxx>, 1995.
@@ -152,6 +152,10 @@
 
 #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

Added: fsf/trunk/libc/sysdeps/ieee754/dbl-64/wordsize-64/s_ceil.c
==============================================================================
--- fsf/trunk/libc/sysdeps/ieee754/dbl-64/wordsize-64/s_ceil.c (added)
+++ fsf/trunk/libc/sysdeps/ieee754/dbl-64/wordsize-64/s_ceil.c Tue Aug 25 00:04:32 2009
@@ -1,0 +1,67 @@
+/* @(#)s_ceil.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+/*
+ * ceil(x)
+ * Return x rounded toward -inf to integral value
+ * Method:
+ *	Bit twiddling.
+ * Exception:
+ *	Inexact flag raised if x not equal to ceil(x).
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+#ifdef __STDC__
+static const double huge = 1.0e300;
+#else
+static double huge = 1.0e300;
+#endif
+
+#ifdef __STDC__
+	double __ceil(double x)
+#else
+	double __ceil(x)
+	double x;
+#endif
+{
+	int64_t i0,i;
+	int32_t j0;
+	EXTRACT_WORDS64(i0,x);
+	j0 = ((i0>>52)&0x7ff)-0x3ff;
+	if(j0<=51) {
+	    if(j0<0) { 	/* raise inexact if x != 0 */
+		if(huge+x>0.0) {/* return 0*sign(x) if |x|<1 */
+		    if(i0<0) {i0=INT64_C(0x8000000000000000);}
+		    else if(i0!=0) { i0=INT64_C(0x3ff0000000000000);}
+		}
+	    } else {
+		i = INT64_C(0x000fffffffffffff)>>j0;
+		if((i0&i)==0) return x; /* x is integral */
+		if(huge+x>0.0) {	/* raise inexact flag */
+		    if(i0>0) i0 += UINT64_C(0x0010000000000000)>>j0;
+		    i0 &= (~i);
+		}
+	    }
+	} else {
+	    if(j0==0x400) return x+x;	/* inf or NaN */
+	    else return x;		/* x is integral */
+	}
+	INSERT_WORDS64(x,i0);
+	return x;
+}
+weak_alias (__ceil, ceil)
+#ifdef NO_LONG_DOUBLE
+strong_alias (__ceil, __ceill)
+weak_alias (__ceil, ceill)
+#endif

Modified: fsf/trunk/libc/sysdeps/unix/Makefile
==============================================================================
--- fsf/trunk/libc/sysdeps/unix/Makefile (original)
+++ fsf/trunk/libc/sysdeps/unix/Makefile Tue Aug 25 00:04:32 2009
@@ -1,4 +1,4 @@
-# Copyright (C) 1991,1992,1993,1994,1995,1996,1997,1998,1999,2003, 2006, 2008
+# Copyright (C) 1991,1992,1993,1994,1995,1996,1997,1998,1999,2003,2006,2008,2009
 #	Free Software Foundation, Inc.
 # This file is part of the GNU C Library.
 
@@ -260,7 +260,6 @@
 # which specifies objects to be compiled as simple Unix system calls.
 
 -include $(common-objpfx)sysd-syscalls
-omit-deps += $(foreach t,$(sysd-rules-targets),$(unix-syscalls:%=$t))
 
 ifeq (misc,$(subdir))
 sysdep_routines += $(unix-extra-syscalls)
@@ -306,9 +305,9 @@
 endif
 
 # This is the end of the pipeline for compiling the syscall stubs.
-# The stdin in assembler with cpp using sysdep.h macros.
-# Be sure to disable debugging info since it would all just say "<stdin>".
-compile-syscall = $(filter-out -g%,$(COMPILE.S)) -x assembler-with-cpp -o $@ -
+# The stdin is assembler with cpp using sysdep.h macros.
+compile-syscall = $(COMPILE.S) -o $@ -x assembler-with-cpp - \
+			       $(compile-mkdep-flags)
 
 ifndef avoid-generated
 $(common-objpfx)sysd-syscalls: $(..)sysdeps/unix/make-syscalls.sh \
@@ -323,16 +322,13 @@
 	mv -f $@T $@
 endif
 
-# The syscall objects depend on s-proto.d or s-proto-cancel.d, which
-# are generated to specify dependencies generated syscalls have on
-# headers.
+# The $(bppfx)syscall.ob objects depend on s-proto-bp.d, which are
+# generated to specify dependencies generated BP stubs have on headers.
 # These deps use file names relative to a subdir, so don't
 # include them in the parent directory.
 ifneq (,$(filter $(unix-syscalls),$(routines) $(sysdep_routines) $(aux)))
 ifndef no_deps
--include $(common-objpfx)s-proto.d
 -include $(common-objpfx)s-proto-bp.d
--include $(common-objpfx)s-proto-cancel.d
 endif
 endif
 
@@ -340,7 +336,7 @@
 		       $(wildcard $(+sysdep_dirs:%=%/syscalls.list))
 	$(+make-deps)
 
-common-generated += s-proto.d s-proto-bp.d s-proto-cancel.d
+common-generated += s-proto-bp.d
 postclean-generated += sysd-syscalls
 
 endif

Modified: fsf/trunk/libc/sysdeps/unix/make-syscalls.sh
==============================================================================
--- fsf/trunk/libc/sysdeps/unix/make-syscalls.sh (original)
+++ fsf/trunk/libc/sysdeps/unix/make-syscalls.sh Tue Aug 25 00:04:32 2009
@@ -83,12 +83,13 @@
   ;;
   esac
 
-  cancellable=
-  noerrno=
+  cancellable=0
+  noerrno=0
+  errval=0
   case $args in
-  C*) cancellable=-cancel; args=`echo $args | sed 's/C:\?//'`;;
-  E*) noerrno=_NOERRNO; args=`echo $args | sed 's/E:\?//'`;;
-  V*) noerrno=_ERRVAL; args=`echo $args | sed 's/V:\?//'`;;
+  C*) cancellable=1; args=`echo $args | sed 's/C:\?//'`;;
+  E*) noerrno=1; args=`echo $args | sed 's/E:\?//'`;;
+  V*) errval=1; args=`echo $args | sed 's/V:\?//'`;;
   esac
 
   # Derive the number of arguments from the argument signature
@@ -115,7 +116,7 @@
  x--)
   # Undefined callnum for an extra syscall.
   if [ x$caller != x- ]; then
-    if [ x$noerrno != x ]; then
+    if [ $noerrno != 0 ]; then
       echo >&2 "$0: no number for $fileno, no-error syscall ($strong $weak)"
       exit 2
     fi
@@ -151,7 +152,7 @@
     ;;
   esac
 
-  echo "		\$(common-objpfx)s-proto$cancellable.d"
+  echo "		\$(..)sysdeps/unix/make-syscalls.sh"
   case x"$callnum" in
   x_)
   echo "\
@@ -161,11 +162,17 @@
   x*)
   echo "\
 	\$(make-target-directory)
-	(echo '#include <sysdep$cancellable.h>'; \\
-	 echo 'PSEUDO$noerrno ($strong, $syscall, $nargs)'; \\
-	 echo '	ret$noerrno'; \\
-	 echo 'PSEUDO_END$noerrno($strong)'; \\
-	 echo 'libc_hidden_def ($strong)'; \\"
+	(echo '#define SYSCALL_NAME $syscall'; \\
+	 echo '#define SYSCALL_NARGS $nargs'; \\
+	 echo '#define SYSCALL_SYMBOL $strong'; \\"
+  [ $cancellable = 0 ] || echo "\
+	 echo '#define SYSCALL_CANCELLABLE 1'; \\"
+  [ $noerrno = 0 ] || echo "\
+	 echo '#define SYSCALL_NOERRNO 1'; \\"
+  [ $errval = 0 ] || echo "\
+	 echo '#define SYSCALL_ERRVAL 1'; \\"
+  echo "\
+	 echo '#include <syscall-template.S>'; \\"
   ;;
   esac
 
@@ -201,7 +208,7 @@
 	  vcount=`expr $vcount + 1`
 	  echo "	 echo 'strong_alias ($strong, $source)'; \\"
 	fi
-	echo "	 echo 'symbol_version($source, $base, $ver)'; \\"
+	echo "	 echo 'symbol_version ($source, $base, $ver)'; \\"
 	;;
       !*)
 	name=`echo $name | sed 's/.//'`

Added: fsf/trunk/libc/sysdeps/unix/syscall-template.S
==============================================================================
--- fsf/trunk/libc/sysdeps/unix/syscall-template.S (added)
+++ fsf/trunk/libc/sysdeps/unix/syscall-template.S Tue Aug 25 00:04:32 2009
@@ -1,0 +1,88 @@
+/* Assembly code template for system call stubs.
+   Copyright (C) 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.  */
+
+/* The real guts of this work are in the macros defined in the
+   machine- and kernel-specific sysdep.h header file.  When we
+   are defining a cancellable system call, the sysdep-cancel.h
+   versions of those macros are what we really use.
+
+   Each system call's object is built by a rule in sysd-syscalls
+   generated by make-syscalls.sh that #include's this file after
+   defining a few macros:
+	SYSCALL_NAME		syscall name
+	SYSCALL_NARGS		number of arguments this call takes
+	SYSCALL_SYMBOL		primary symbol name
+	SYSCALL_CANCELLABLE	1 if the call is a cancelation point
+	SYSCALL_NOERRNO		1 to define a no-errno version (see below)
+	SYSCALL_ERRVAL		1 to define an error-value version (see below)
+
+   We used to simply pipe the correct three lines below through cpp into
+   the assembler.  The main reason to have this file instead is so that
+   stub objects can be assembled with -g and get source line information
+   that leads a user back to a source file and these fine comments.  The
+   average user otherwise has a hard time knowing which "syscall-like"
+   functions in libc are plain stubs and which have nontrivial C wrappers.
+   Some versions of the "plain" stub generation macros are more than a few
+   instructions long and the untrained eye might not distinguish them from
+   some compiled code that inexplicably lacks source line information.  */
+
+#if SYSCALL_CANCELLABLE
+# include <sysdep-cancel.h>
+#else
+# include <sysdep.h>
+#endif
+
+#define T_PSEUDO(SYMBOL, NAME, N)		PSEUDO (SYMBOL, NAME, N)
+#define T_PSEUDO_NOERRNO(SYMBOL, NAME, N)	PSEUDO_NOERRNO (SYMBOL, NAME, N)
+#define T_PSEUDO_ERRVAL(SYMBOL, NAME, N)	PSEUDO_ERRVAL (SYMBOL, NAME, N)
+#define T_PSEUDO_END(SYMBOL)			PSEUDO_END (SYMBOL)
+#define T_PSEUDO_END_NOERRNO(SYMBOL)		PSEUDO_END_NOERRNO (SYMBOL)
+#define T_PSEUDO_END_ERRVAL(SYMBOL)		PSEUDO_END_ERRVAL (SYMBOL)
+
+#if SYSCALL_NOERRNO
+
+/* This kind of system call stub never returns an error.
+   We return the return value register to the caller unexamined.  */
+
+T_PSEUDO_NOERRNO (SYSCALL_SYMBOL, SYSCALL_NAME, SYSCALL_NARGS)
+	ret_NOERRNO
+T_PSEUDO_END_NOERRNO (SYSCALL_SYMBOL)
+
+#elif SYSCALL_ERRVAL
+
+/* This kind of system call stub returns the errno code as its return
+   value, or zero for success.  We may massage the kernel's return value
+   to meet that ABI, but we never set errno here.  */
+
+T_PSEUDO_ERRVAL (SYSCALL_SYMBOL, SYSCALL_NAME, SYSCALL_NARGS)
+	ret_ERRVAL
+T_PSEUDO_END_ERRVAL (SYSCALL_SYMBOL)
+
+#else
+
+/* This is a "normal" system call stub: if there is an error,
+   it returns -1 and sets errno.  */
+
+T_PSEUDO (SYSCALL_SYMBOL, SYSCALL_NAME, SYSCALL_NARGS)
+	ret
+T_PSEUDO_END (SYSCALL_SYMBOL)
+
+#endif
+
+libc_hidden_def (SYSCALL_SYMBOL)

Modified: fsf/trunk/libc/sysdeps/x86_64/fpu/bits/mathinline.h
==============================================================================
--- fsf/trunk/libc/sysdeps/x86_64/fpu/bits/mathinline.h (original)
+++ fsf/trunk/libc/sysdeps/x86_64/fpu/bits/mathinline.h Tue Aug 25 00:04:32 2009
@@ -1,5 +1,5 @@
 /* Inline math functions for x86-64.
-   Copyright (C) 2002, 2003, 2004, 2007 Free Software Foundation, Inc.
+   Copyright (C) 2002, 2003, 2004, 2007, 2009 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Andreas Jaeger <aj@xxxxxxx>, 2002.
 
@@ -35,14 +35,16 @@
 __MATH_INLINE int
 __NTH (__signbitf (float __x))
 {
-  __extension__ union { float __f; int __i; } __u = { __f: __x };
-  return __u.__i < 0;
+  int __m;
+  asm ("pmovmskb %1, %0" : "=r" (__m) : "x" (__x));
+  return __m & 0x8;
 }
 __MATH_INLINE int
 __NTH (__signbit (double __x))
 {
-  __extension__ union { double __d; int __i[2]; } __u = { __d: __x };
-  return __u.__i[1] < 0;
+  int __m;
+  asm ("pmovmskb %1, %0" : "=r" (__m) : "x" (__x));
+  return __m & 0x80;
 }
 __MATH_INLINE int
 __NTH (__signbitl (long double __x))

Modified: fsf/trunk/libc/sysdeps/x86_64/fpu/math_private.h
==============================================================================
--- fsf/trunk/libc/sysdeps/x86_64/fpu/math_private.h (original)
+++ fsf/trunk/libc/sysdeps/x86_64/fpu/math_private.h Tue Aug 25 00:04:32 2009
@@ -18,4 +18,41 @@
 while (0)
 
 #include <math/math_private.h>
+
+/* We can do a few things better on x86-64.  */
+
+/* Direct movement of float into integer register.  */
+#undef EXTRACT_WORDS64
+#define EXTRACT_WORDS64(i,d)					\
+do {								\
+  long int i_;							\
+  asm ("movd %1, %0" : "=rm" (i_) : "x" (d));			\
+  (i) = i_;							\
+} while (0)
+
+/* And the reverse.  */
+#undef INSERT_WORDS64
+#define INSERT_WORDS64(d,i) \
+do {								\
+  long int i_ = i;						\
+  asm ("movd %1, %0" : "=x" (d) : "rm" (i_));			\
+} while (0)
+
+/* Direct movement of float into integer register.  */
+#undef GET_FLOAT_WORD
+#define GET_FLOAT_WORD(i,d) \
+do {								\
+  int i_;							\
+  asm ("movd %1, %0" : "=rm" (i_) : "x" (d));			\
+  (i) = i_;							\
+} while (0)
+
+/* And the reverse.  */
+#undef SET_FLOAT_WORD
+#define SET_FLOAT_WORD(d,i) \
+do {								\
+  int i_ = i;							\
+  asm ("movd %1, %0" : "=x" (d) : "rm" (i_));			\
+} while (0)
+
 #endif