diff options
author | Andreas Schwab <schwab@redhat.com> | 2009-08-26 12:04:34 +0200 |
---|---|---|
committer | Andreas Schwab <schwab@redhat.com> | 2009-08-26 12:04:34 +0200 |
commit | 19fe1be84e6f775e3a7f4cd03b093338d6a317bf (patch) | |
tree | 1d28740af54a3d9194373f7f561baf579c3a8f44 | |
parent | bc9dd948ffc9cf1992d3e77e753789ab897e3dc6 (diff) | |
parent | 2df4be8c3545f6158e468660a73f794573fb6f07 (diff) | |
download | glibc-19fe1be84e6f775e3a7f4cd03b093338d6a317bf.tar.gz glibc-19fe1be84e6f775e3a7f4cd03b093338d6a317bf.tar.xz glibc-19fe1be84e6f775e3a7f4cd03b093338d6a317bf.zip |
Merge commit 'origin/master' into fedora/master
32 files changed, 1006 insertions, 71 deletions
diff --git a/CONFORMANCE b/CONFORMANCE index 68723086cc..8275aba26c 100644 --- a/CONFORMANCE +++ b/CONFORMANCE @@ -125,7 +125,9 @@ C99 added %a as another scanf format specifier for floating point values. This conflicts with the glibc extension where %as, %a[ and %aS mean to allocate the string for the data read. A strictly conforming C99 program using %as, %a[ or %aS in a scanf format string -will misbehave under glibc. +will misbehave under glibc if it does not include <stdio.h> and +instead declares scanf itself; if it gets the declaration of scanf +from <stdio.h>, it will use a C99-conforming version. Compiler limitations @@ -144,29 +146,21 @@ GCC doesn't support the optional imaginary types. Nor does it understand the keyword _Complex before GCC 3.0. This has the corresponding impact on the relevant headers. -glibc's use of extern inline conflicts with C99: in C99, extern inline -means that an external definition is generated as well as possibly an -inline definition, but in GCC it means that no external definition is -generated. When GCC's C99 mode implements C99 inline semantics, this -will break the uses of extern inline in glibc's headers. (Actually, -glibc uses `extern __inline', which is beyond the scope of the -standard, but it would clearly be very confusing for `__inline' and -plain `inline' to have different meanings in C99 mode.) - glibc's <tgmath.h> implementation is arcane but thought to work correctly; a clean and comprehensible version requires compiler builtins. For most of the headers required of freestanding implementations, glibc relies on GCC to provide correct versions. (At present, glibc -provides <stdint.h>, and GCC doesn't.) - -Implementing MATH_ERRNO, MATH_ERREXCEPT and math_errhandling in -<math.h> needs compiler support: see - -http://sources.redhat.com/ml/libc-hacker/2000-06/msg00008.html -http://sources.redhat.com/ml/libc-hacker/2000-06/msg00014.html -http://sources.redhat.com/ml/libc-hacker/2000-06/msg00015.html +provides <stdint.h>, and GCC doesn't before version 4.5.) + +The definition of math_errhandling conforms so long as no translation +unit using math_errhandling is compiled with -fno-math-errno, +-fno-trapping-math or options such as -ffast-math that imply these +options. math_errhandling is only conditionally defined depending on +__FAST_MATH__; the compiler does not provide the information needed +for more exact definitions based on settings of -fno-math-errno and +-fno-trapping-math, possibly for only some source files in a program. Issues with headers diff --git a/ChangeLog b/ChangeLog index 1b11dd1678..69024ab20a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,74 @@ +2009-08-26 Ulrich Drepper <drepper@redhat.com> + + * sysdeps/ieee754/dbl-64/wordsize-64/s_isinf.c: New file. + + * sysdeps/ieee754/dbl-64/wordsize-64/s_isnan.c: New file. + +2009-08-25 Ulrich Drepper <drepper@redhat.com> + + * sysdeps/ieee754/dbl-64/wordsize-64/s_lround.c: Add llround aliases. + * sysdeps/ieee754/dbl-64/wordsize-64/s_llround.c: New file. + + * sysdeps/ieee754/dbl-64/wordsize-64/s_nearbyint.c: New file + + * sysdeps/ieee754/dbl-64/wordsize-64/s_rint.c: New file. + + * sysdeps/ieee754/dbl-64/wordsize-64/s_round.c: New file. + +2009-08-25 Joseph Myers <joseph@codesourcery.com> + + * math/s_fdiml.c (__fdiml): Use fpclassify instead of fpclassifyl. + +2009-08-25 Ulrich Drepper <drepper@redhat.com> + + * sysdeps/x86_64/fpu/s_scalbln.c: New file. + * sysdeps/x86_64/fpu/s_scalbn.c: New file. + + * sysdeps/ieee754/dbl-64/wordsize-64/s_scalbn.c: New file. + + * sysdeps/x86_64/fpu/s_signbit.S: New file. + * sysdeps/x86_64/fpu/s_signbitf.S: New file. + + * sysdeps/ieee754/dbl-64/wordsize-64/s_lround.c: New file. + * sysdeps/ieee754/dbl-64/wordsize-64/s_trunc.c: New file. + + * sysdeps/x86_64/dl-trampoline.S (_dl_runtime_profile): Remove + leftover YMM_SIZE definition. + +2009-08-24 Ulrich Drepper <drepper@redhat.com> + + * 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@redhat.com> + + * 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@redhat.com> + + * 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@redhat.com> * posix/regcomp.c (parse_dup_op): Verify the expression is correctly diff --git a/math/math.h b/math/math.h index c50b2e7b07..4e65678b8d 100644 --- a/math/math.h +++ b/math/math.h @@ -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 @@ __BEGIN_DECLS && (!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 @@ -277,6 +277,13 @@ enum # 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. */ #ifdef __USE_MISC diff --git a/math/math_private.h b/math/math_private.h index 129646f8c5..fade7e1181 100644 --- a/math/math_private.h +++ b/math/math_private.h @@ -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 @@ typedef union u_int32_t msw; u_int32_t lsw; } parts; + uint64_t word; } ieee_double_shape_type; #endif @@ -57,6 +59,7 @@ typedef union u_int32_t lsw; u_int32_t msw; } parts; + uint64_t word; } ieee_double_shape_type; #endif @@ -89,6 +92,14 @@ do { \ (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) \ @@ -99,6 +110,14 @@ do { \ (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) + /* Set the more significant 32 bits of a double from an int. */ #define SET_HIGH_WORD(d,v) \ diff --git a/math/s_fdim.c b/math/s_fdim.c index 5804e631c3..677fdcde1a 100644 --- a/math/s_fdim.c +++ b/math/s_fdim.c @@ -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@cygnus.com>, 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 @@ __fdim (double x, double y) /* 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 diff --git a/math/s_fdimf.c b/math/s_fdimf.c index 2f3ce303ae..737413a5f4 100644 --- a/math/s_fdimf.c +++ b/math/s_fdimf.c @@ -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@cygnus.com>, 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 @@ __fdimf (float x, float y) /* 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) diff --git a/math/s_fdiml.c b/math/s_fdiml.c index 70246bafbd..f3072b99a0 100644 --- a/math/s_fdiml.c +++ b/math/s_fdiml.c @@ -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@cygnus.com>, 1997. @@ -18,6 +18,7 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ +#include <errno.h> #include <math.h> long double @@ -31,6 +32,13 @@ __fdiml (long double x, long double y) /* 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) diff --git a/nptl/ChangeLog b/nptl/ChangeLog index 193756d45e..2f878d10fb 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,3 +1,16 @@ +2009-08-25 Ulrich Drepper <drepper@redhat.com> + + * sysdeps/x86_64/tls.h (RTLD_ENABLE_FOREIGN_CALL): Store old value + of the field in local variables. + (RTLD_FINALIZE_FOREIGN_CALL): Restore rtld_must_xmm_save from local + variable and don't unconditionally clear it. + +2009-08-24 Ulrich Drepper <drepper@redhat.com> + + * 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@redhat.com> * sysdeps/unix/sysv/linux/bits/posix_opt.h: Clean up namespace. @@ -1847,9 +1860,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 +1870,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 +1886,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 +2600,14 @@ * tst-cancel25.c: New file. 2006-09-05 Jakub Jelinek <jakub@redhat.com> - Ulrich Drepper <drepper@redhat.com> + Ulrich Drepper <drepper@redhat.com> * 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@redhat.com> - Roland McGrath <roland@redhat.com> + Roland McGrath <roland@redhat.com> * sysdeps/unix/sysv/linux/i386/lowlevellock.h (LLL_STUB_UNWIND_INFO_START, LLL_STUB_UNWIND_INFO_END, @@ -2608,7 +2621,7 @@ * sysdeps/unix/sysv/linux/i386/i486/lowlevelrobustlock.S: Likewise. 2006-03-03 Jakub Jelinek <jakub@redhat.com> - Roland McGrath <roland@redhat.com> + Roland McGrath <roland@redhat.com> * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h (LLL_STUB_UNWIND_INFO_START, LLL_STUB_UNWIND_INFO_END, @@ -3181,7 +3194,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@redhat.com> @@ -3603,7 +3616,7 @@ * Makefile ($(test-modules)): Remove static pattern rule. 2005-10-14 Jakub Jelinek <jakub@redhat.com> - Ulrich Drepper <drepper@redhat.com> + Ulrich Drepper <drepper@redhat.com> * sysdeps/unix/sysv/linux/x86_64/pthread_once.S: Fix stack alignment in callback function. @@ -3621,7 +3634,7 @@ atomic_compare_and_exchange_bool_acq. 2005-10-01 Ulrich Drepper <drepper@redhat.com> - Jakub Jelinek <jakub@redhat.com> + Jakub Jelinek <jakub@redhat.com> * descr.h: Define SETXID_BIT and SETXID_BITMASK. Adjust CANCEL_RESTMASK. diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c index c69397906f..89938b3fb8 100644 --- a/nptl/pthread_create.c +++ b/nptl/pthread_create.c @@ -377,6 +377,19 @@ start_thread (void *arg) } #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. */ diff --git a/nptl/sysdeps/x86_64/tls.h b/nptl/sysdeps/x86_64/tls.h index 4212038ab5..e39eb5f69d 100644 --- a/nptl/sysdeps/x86_64/tls.h +++ b/nptl/sysdeps/x86_64/tls.h @@ -188,7 +188,7 @@ typedef struct The contained asm must *not* be marked volatile since otherwise assignments like - pthread_descr self = thread_self(); + pthread_descr self = thread_self(); do not get optimized away. */ # define THREAD_SELF \ ({ struct pthread *__self; \ @@ -404,7 +404,12 @@ extern void _dl_x86_64_restore_sse (void); # define RTLD_CHECK_FOREIGN_CALL \ (THREAD_GETMEM (THREAD_SELF, header.rtld_must_xmm_save) != 0) +/* NB: Don't use the xchg operation because that would imply a lock + prefix which is expensive and unnecessary. The cache line is also + not contested at all. */ # define RTLD_ENABLE_FOREIGN_CALL \ + int old_rtld_must_xmm_save = THREAD_GETMEM (THREAD_SELF, \ + header.rtld_must_xmm_save); \ THREAD_SETMEM (THREAD_SELF, header.rtld_must_xmm_save, 1) # define RTLD_PREPARE_FOREIGN_CALL \ @@ -419,7 +424,8 @@ extern void _dl_x86_64_restore_sse (void); do { \ if (THREAD_GETMEM (THREAD_SELF, header.rtld_must_xmm_save) == 0) \ _dl_x86_64_restore_sse (); \ - THREAD_SETMEM (THREAD_SELF, header.rtld_must_xmm_save, 0); \ + THREAD_SETMEM (THREAD_SELF, header.rtld_must_xmm_save, \ + old_rtld_must_xmm_save); \ } while (0) # endif diff --git a/posix/bug-regex29.c b/posix/bug-regex29.c index 70a6c94cc6..bd796c6c2a 100644 --- a/posix/bug-regex29.c +++ b/posix/bug-regex29.c @@ -8,7 +8,14 @@ do_test (void) 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 () diff --git a/sysdeps/i386/fpu/bits/mathinline.h b/sysdeps/i386/fpu/bits/mathinline.h index a786cc69cd..8005997520 100644 --- a/sysdeps/i386/fpu/bits/mathinline.h +++ b/sysdeps/i386/fpu/bits/mathinline.h @@ -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@math.ualberta.ca>, 1995. @@ -153,6 +153,10 @@ __NTH (__signbitl (long double __x)) #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, diff --git a/sysdeps/ieee754/dbl-64/wordsize-64/s_ceil.c b/sysdeps/ieee754/dbl-64/wordsize-64/s_ceil.c new file mode 100644 index 0000000000..9123fdc7bd --- /dev/null +++ b/sysdeps/ieee754/dbl-64/wordsize-64/s_ceil.c @@ -0,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 diff --git a/sysdeps/ieee754/dbl-64/wordsize-64/s_isinf.c b/sysdeps/ieee754/dbl-64/wordsize-64/s_isinf.c new file mode 100644 index 0000000000..c48e979a84 --- /dev/null +++ b/sysdeps/ieee754/dbl-64/wordsize-64/s_isinf.c @@ -0,0 +1,30 @@ +/* + * Written by J.T. Conklin <jtc@netbsd.org>. + * Changed to return -1 for -Inf by Ulrich Drepper <drepper@cygnus.com>. + * Public domain. + */ + +/* + * isinf(x) returns 1 is x is inf, -1 if x is -inf, else 0; + * no branching! + */ + +#include "math.h" +#include "math_private.h" + +int +__isinf (double x) +{ + int64_t ix; + EXTRACT_WORDS64(ix,x); + int64_t t = ix & UINT64_C(0x7fffffffffffffff); + t ^= UINT64_C(0x7ff0000000000000); + t |= -t; + return ~(t >> 63) & (ix >> 62); +} +hidden_def (__isinf) +weak_alias (__isinf, isinf) +#ifdef NO_LONG_DOUBLE +strong_alias (__isinf, __isinfl) +weak_alias (__isinf, isinfl) +#endif diff --git a/sysdeps/ieee754/dbl-64/wordsize-64/s_isnan.c b/sysdeps/ieee754/dbl-64/wordsize-64/s_isnan.c new file mode 100644 index 0000000000..3b08c54dd4 --- /dev/null +++ b/sysdeps/ieee754/dbl-64/wordsize-64/s_isnan.c @@ -0,0 +1,39 @@ +/* @(#)s_isnan.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. + * ==================================================== + */ + +/* + * isnan(x) returns 1 is x is nan, else 0; + * no branching! + */ + +#include "math.h" +#include "math_private.h" + +#ifdef __STDC__ + int __isnan(double x) +#else + int __isnan(x) + double x; +#endif +{ + int64_t hx; + EXTRACT_WORDS64(hx,x); + hx &= UINT64_C(0x7fffffffffffffff); + hx = UINT64_C(0x7ff0000000000000) - hx; + return (int)(((uint64_t)hx)>>63); +} +hidden_def (__isnan) +weak_alias (__isnan, isnan) +#ifdef NO_LONG_DOUBLE +strong_alias (__isnan, __isnanl) +weak_alias (__isnan, isnanl) +#endif diff --git a/sysdeps/ieee754/dbl-64/wordsize-64/s_llround.c b/sysdeps/ieee754/dbl-64/wordsize-64/s_llround.c new file mode 100644 index 0000000000..f7c9ea568f --- /dev/null +++ b/sysdeps/ieee754/dbl-64/wordsize-64/s_llround.c @@ -0,0 +1 @@ +/* The code is the same as lround. Use an alias, see l_round.c. */ diff --git a/sysdeps/ieee754/dbl-64/wordsize-64/s_lround.c b/sysdeps/ieee754/dbl-64/wordsize-64/s_lround.c new file mode 100644 index 0000000000..30ea5db7cc --- /dev/null +++ b/sysdeps/ieee754/dbl-64/wordsize-64/s_lround.c @@ -0,0 +1,80 @@ +/* Round double value to long int. + Copyright (C) 1997, 2004, 2009 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#define llround __hidden_llround +#define __llround __hidden___llround + +#include <math.h> + +#include "math_private.h" + + +long int +__lround (double x) +{ + int32_t j0; + int64_t i0; + long int result; + int sign; + + EXTRACT_WORDS64 (i0, x); + j0 = ((i0 >> 52) & 0x7ff) - 0x3ff; + sign = i0 < 0 ? -1 : 1; + i0 &= UINT64_C(0xfffffffffffff); + i0 |= UINT64_C(0x10000000000000); + + if (j0 < (int32_t) (8 * sizeof (long int)) - 1) + { + if (j0 < 0) + return j0 < -1 ? 0 : sign; + else if (j0 >= 52) + result = i0 << (j0 - 52); + else + { + i0 += UINT64_C(0x8000000000000) >> j0; + + result = i0 >> (52 - j0); + } + } + else + { + /* The number is too large. It is left implementation defined + what happens. */ + return (long int) x; + } + + return sign * result; +} + +weak_alias (__lround, lround) +#ifdef NO_LONG_DOUBLE +strong_alias (__lround, __lroundl) +weak_alias (__lround, lroundl) +#endif + +/* long long has the same width as long on 64-bit machines. */ +#undef llround +#undef __llround +strong_alias (__lround, __llround) +weak_alias (__lround, llround) +#ifdef NO_LONG_DOUBLE +strong_alias (__lround, __llroundl) +weak_alias (__lround, llroundl) +#endif diff --git a/sysdeps/ieee754/dbl-64/wordsize-64/s_nearbyint.c b/sysdeps/ieee754/dbl-64/wordsize-64/s_nearbyint.c new file mode 100644 index 0000000000..cb49019ddb --- /dev/null +++ b/sysdeps/ieee754/dbl-64/wordsize-64/s_nearbyint.c @@ -0,0 +1,86 @@ +/* Adapted for use as nearbyint by Ulrich Drepper <drepper@cygnus.com>. */ +/* + * ==================================================== + * 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. + * ==================================================== + */ + +/* + * rint(x) + * Return x rounded to integral value according to the prevailing + * rounding mode. + * Method: + * Using floating addition. + * Exception: + * Inexact flag raised if x not equal to rint(x). + */ + +#include <fenv.h> +#include "math.h" +#include "math_private.h" + +#ifdef __STDC__ +static const double +#else +static double +#endif +TWO52[2]={ + 4.50359962737049600000e+15, /* 0x43300000, 0x00000000 */ + -4.50359962737049600000e+15, /* 0xC3300000, 0x00000000 */ +}; + +#ifdef __STDC__ + double __nearbyint(double x) +#else + double __nearbyint(x) + double x; +#endif +{ + fenv_t env; + int64_t i0,sx; + int32_t j0; + EXTRACT_WORDS64(i0,x); + sx = (i0>>63)&1; + j0 = ((i0>>52)&0x7ff)-0x3ff; + if(j0<52) { + if(j0<0) { + if((i0&UINT64_C(0x7fffffffffffffff))==0) return x; + uint64_t i = i0 & UINT64_C(0xfffffffffffff); + i0 &= UINT64_C(0xfffe000000000000); + i0 |= (((i|-i) >> 12) & UINT64_C(0x8000000000000)); + INSERT_WORDS64(x,i0); + feholdexcept (&env); + double w = TWO52[sx]+x; + double t = w-TWO52[sx]; + fesetenv (&env); + EXTRACT_WORDS64(i0,t); + INSERT_WORDS64(t,(i0&UINT64_C(0x7fffffffffffffff))|(sx<<63)); + return t; + } else { + uint64_t i = UINT64_C(0x000fffffffffffff)>>j0; + if((i0&i)==0) return x; /* x is integral */ + i>>=1; + if((i0&i)!=0) + i0 = (i0&(~i))|(UINT64_C(0x4000000000000)>>j0); + } + } else { + if(j0==0x400) return x+x; /* inf or NaN */ + else return x; /* x is integral */ + } + INSERT_WORDS64(x,i0); + feholdexcept (&env); + double w = TWO52[sx]+x; + double t = w-TWO52[sx]; + fesetenv (&env); + return t; +} +weak_alias (__nearbyint, nearbyint) +#ifdef NO_LONG_DOUBLE +strong_alias (__nearbyint, __nearbyintl) +weak_alias (__nearbyint, nearbyintl) +#endif diff --git a/sysdeps/ieee754/dbl-64/wordsize-64/s_rint.c b/sysdeps/ieee754/dbl-64/wordsize-64/s_rint.c new file mode 100644 index 0000000000..4a60aa3278 --- /dev/null +++ b/sysdeps/ieee754/dbl-64/wordsize-64/s_rint.c @@ -0,0 +1,79 @@ +/* @(#)s_rint.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. + * ==================================================== + */ + +/* + * rint(x) + * Return x rounded to integral value according to the prevailing + * rounding mode. + * Method: + * Using floating addition. + * Exception: + * Inexact flag raised if x not equal to rint(x). + */ + +#include "math.h" +#include "math_private.h" + +#ifdef __STDC__ +static const double +#else +static double +#endif +TWO52[2]={ + 4.50359962737049600000e+15, /* 0x43300000, 0x00000000 */ + -4.50359962737049600000e+15, /* 0xC3300000, 0x00000000 */ +}; + +#ifdef __STDC__ + double __rint(double x) +#else + double __rint(x) + double x; +#endif +{ + int64_t i0,sx; + int32_t j0; + EXTRACT_WORDS64(i0,x); + sx = (i0>>63)&1; + j0 = ((i0>>52)&0x7ff)-0x3ff; + if(j0<52) { + if(j0<0) { + if((i0 & UINT64_C(0x7fffffffffffffff))==0) return x; + uint64_t i = i0 & UINT64_C(0xfffffffffffff); + i0 &= UINT64_C(0xfffe000000000000); + i0 |= (((i|-i) >> 12) & UINT64_C(0x8000000000000)); + INSERT_WORDS64(x,i0); + double w = TWO52[sx]+x; + double t = w-TWO52[sx]; + EXTRACT_WORDS64(i0,t); + INSERT_WORDS64(t,(i0&UINT64_C(0x7fffffffffffffff))|(sx<<63)); + return t; + } else { + uint64_t i = UINT64_C(0x000fffffffffffff)>>j0; + if((i0&i)==0) return x; /* x is integral */ + i>>=1; + if((i0&i)!=0) + i0 = (i0&(~i))|(UINT64_C(0x4000000000000)>>j0); + } + } else { + if(j0==0x400) return x+x; /* inf or NaN */ + else return x; /* x is integral */ + } + INSERT_WORDS64(x,i0); + double w = TWO52[sx]+x; + return w-TWO52[sx]; +} +weak_alias (__rint, rint) +#ifdef NO_LONG_DOUBLE +strong_alias (__rint, __rintl) +weak_alias (__rint, rintl) +#endif diff --git a/sysdeps/ieee754/dbl-64/wordsize-64/s_round.c b/sysdeps/ieee754/dbl-64/wordsize-64/s_round.c new file mode 100644 index 0000000000..5bd857910c --- /dev/null +++ b/sysdeps/ieee754/dbl-64/wordsize-64/s_round.c @@ -0,0 +1,77 @@ +/* Round double to integer away from zero. + Copyright (C) 1997, 2009 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <math.h> + +#include "math_private.h" + + +static const double huge = 1.0e300; + + +double +__round (double x) +{ + int64_t i0, j0; + + EXTRACT_WORDS64 (i0, x); + j0 = ((i0 >> 52) & 0x7ff) - 0x3ff; + if (__builtin_expect (j0 < 52, 1)) + { + if (j0 < 0) + { + if (huge + x > 0.0) + { + i0 &= UINT64_C(0x8000000000000000); + if (j0 == -1) + i0 |= UINT64_C(0x3ff0000000000000); + } + } + else + { + uint64_t i = UINT64_C(0x000fffffffffffff) >> j0; + if ((i0 & i) == 0) + /* X is integral. */ + return x; + if (huge + x > 0.0) + { + /* Raise inexact if x != 0. */ + i0 += UINT64_C(0x0008000000000000) >> j0; + i0 &= ~i; + } + } + } + else + { + if (j0 == 0x400) + /* Inf or NaN. */ + return x + x; + else + return x; + } + + INSERT_WORDS64 (x, i0); + return x; +} +weak_alias (__round, round) +#ifdef NO_LONG_DOUBLE +strong_alias (__round, __roundl) +weak_alias (__round, roundl) +#endif diff --git a/sysdeps/ieee754/dbl-64/wordsize-64/s_scalbn.c b/sysdeps/ieee754/dbl-64/wordsize-64/s_scalbn.c new file mode 100644 index 0000000000..25cf3b1699 --- /dev/null +++ b/sysdeps/ieee754/dbl-64/wordsize-64/s_scalbn.c @@ -0,0 +1,68 @@ +/* @(#)s_scalbn.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. + * ==================================================== + */ + +/* + * scalbn (double x, int n) + * scalbn(x,n) returns x* 2**n computed by exponent + * manipulation rather than by actually performing an + * exponentiation or a multiplication. + */ + +#include "math.h" +#include "math_private.h" + +#ifdef __STDC__ +static const double +#else +static double +#endif +two54 = 1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */ +twom54 = 5.55111512312578270212e-17, /* 0x3C900000, 0x00000000 */ +huge = 1.0e+300, +tiny = 1.0e-300; + +#ifdef __STDC__ + double __scalbn (double x, int n) +#else + double __scalbn (x,n) + double x; int n; +#endif +{ + int64_t ix; + int64_t k; + EXTRACT_WORDS64(ix,x); + k = (ix >> 52) & 0x7ff; /* extract exponent */ + if (k==0) { /* 0 or subnormal x */ + if ((ix & UINT64_C(0xfffffffffffff))==0) return x; /* +-0 */ + x *= two54; + EXTRACT_WORDS64(ix,x); + k = ((ix >> 52) & 0x7ff) - 54; + } + if (k==0x7ff) return x+x; /* NaN or Inf */ + k = k+n; + if (n> 50000 || k > 0x7fe) + return huge*__copysign(huge,x); /* overflow */ + if (n< -50000) return tiny*__copysign(tiny,x); /*underflow*/ + if (k > 0) /* normal result */ + {INSERT_WORDS64(x,(ix&UINT64_C(0x800fffffffffffff))|(k<<52)); + return x;} + if (k <= -54) + return tiny*__copysign(tiny,x); /*underflow*/ + k += 54; /* subnormal result */ + INSERT_WORDS64(x,(ix&INT64_C(0x800fffffffffffff))|(k<<52)); + return x*twom54; +} +weak_alias (__scalbn, scalbn) +#ifdef NO_LONG_DOUBLE +strong_alias (__scalbn, __scalbnl) +weak_alias (__scalbn, scalbnl) +#endif diff --git a/sysdeps/ieee754/dbl-64/wordsize-64/s_trunc.c b/sysdeps/ieee754/dbl-64/wordsize-64/s_trunc.c new file mode 100644 index 0000000000..9add5ade71 --- /dev/null +++ b/sysdeps/ieee754/dbl-64/wordsize-64/s_trunc.c @@ -0,0 +1,56 @@ +/* Truncate argument to nearest integral value not larger than the argument. + Copyright (C) 1997, 1998, 2009 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <math.h> + +#include "math_private.h" + + +double +__trunc (double x) +{ + int64_t i0, j0; + int64_t sx; + + EXTRACT_WORDS64 (i0, x); + sx = i0 & UINT64_C(0x8000000000000000); + j0 = ((i0 >> 52) & 0x7ff) - 0x3ff; + if (j0 < 52) + { + if (j0 < 0) + /* The magnitude of the number is < 1 so the result is +-0. */ + INSERT_WORDS64 (x, sx); + else + INSERT_WORDS64 (x, sx | (i0 & ~(UINT64_C(0x000fffffffffffff) >> j0))); + } + else + { + if (j0 == 0x400) + /* x is inf or NaN. */ + return x + x; + } + + return x; +} +weak_alias (__trunc, trunc) +#ifdef NO_LONG_DOUBLE +strong_alias (__trunc, __truncl) +weak_alias (__trunc, truncl) +#endif diff --git a/sysdeps/unix/Makefile b/sysdeps/unix/Makefile index 2696e7fb62..f7140884a1 100644 --- a/sysdeps/unix/Makefile +++ b/sysdeps/unix/Makefile @@ -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 @@ ifndef inhibit-unix-syscalls # 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 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 @@ $(common-objpfx)sysd-syscalls: $(..)sysdeps/unix/make-syscalls.sh \ 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 @@ $(common-objpfx)s-%.d: $(..)sysdeps/unix/s-%.S \ $(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 diff --git a/sysdeps/unix/make-syscalls.sh b/sysdeps/unix/make-syscalls.sh index 8abb0349bf..a8b8a262a7 100644 --- a/sysdeps/unix/make-syscalls.sh +++ b/sysdeps/unix/make-syscalls.sh @@ -83,12 +83,13 @@ while read file srcfile caller syscall args strong weak; do ;; 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 @@ while read file srcfile caller syscall args strong weak; do 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 @@ shared-only-routines += $file ;; esac - echo " \$(common-objpfx)s-proto$cancellable.d" + echo " \$(..)sysdeps/unix/make-syscalls.sh" case x"$callnum" in x_) echo "\ @@ -161,11 +162,17 @@ shared-only-routines += $file 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 @@ shared-only-routines += $file 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/.//'` diff --git a/sysdeps/unix/syscall-template.S b/sysdeps/unix/syscall-template.S new file mode 100644 index 0000000000..66319f158b --- /dev/null +++ b/sysdeps/unix/syscall-template.S @@ -0,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) diff --git a/sysdeps/x86_64/dl-trampoline.S b/sysdeps/x86_64/dl-trampoline.S index f9c60ad5cf..5564a11af2 100644 --- a/sysdeps/x86_64/dl-trampoline.S +++ b/sysdeps/x86_64/dl-trampoline.S @@ -197,7 +197,6 @@ _dl_x86_64_save_sse: ret L(no_avx5): # endif -# define YMM_SIZE 16 movdqa %xmm0, %fs:RTLD_SAVESPACE_SSE+0*XMM_SIZE movdqa %xmm1, %fs:RTLD_SAVESPACE_SSE+1*XMM_SIZE movdqa %xmm2, %fs:RTLD_SAVESPACE_SSE+2*XMM_SIZE diff --git a/sysdeps/x86_64/fpu/bits/mathinline.h b/sysdeps/x86_64/fpu/bits/mathinline.h index e8a919fe92..8d4850dfc0 100644 --- a/sysdeps/x86_64/fpu/bits/mathinline.h +++ b/sysdeps/x86_64/fpu/bits/mathinline.h @@ -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@suse.de>, 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)) diff --git a/sysdeps/x86_64/fpu/math_private.h b/sysdeps/x86_64/fpu/math_private.h index 4febcbb5ec..4be753654a 100644 --- a/sysdeps/x86_64/fpu/math_private.h +++ b/sysdeps/x86_64/fpu/math_private.h @@ -18,4 +18,41 @@ do \ 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 diff --git a/sysdeps/x86_64/fpu/s_scalbln.c b/sysdeps/x86_64/fpu/s_scalbln.c new file mode 100644 index 0000000000..1009713fbc --- /dev/null +++ b/sysdeps/x86_64/fpu/s_scalbln.c @@ -0,0 +1,2 @@ +/* Nothing to do. This function is the same as scalbn. So we define an + alias. */ diff --git a/sysdeps/x86_64/fpu/s_scalbn.c b/sysdeps/x86_64/fpu/s_scalbn.c new file mode 100644 index 0000000000..74d34655ad --- /dev/null +++ b/sysdeps/x86_64/fpu/s_scalbn.c @@ -0,0 +1,9 @@ +#define scalbln __renamed_scalbln +#define __scalbln __renamed___scalbln + +#include <sysdeps/ieee754/dbl-64/wordsize-64/s_scalbn.c> + +#undef scalbln +#undef __scalbln +strong_alias (__scalbn, __scalbln) +weak_alias (__scalbn, scalbln) diff --git a/sysdeps/x86_64/fpu/s_signbit.S b/sysdeps/x86_64/fpu/s_signbit.S new file mode 100644 index 0000000000..0bfd62e30d --- /dev/null +++ b/sysdeps/x86_64/fpu/s_signbit.S @@ -0,0 +1,27 @@ +/* Return nonzero value if number is negative. + Copyright (C) 2009 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@redha.com>, 2009. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <sysdep.h> + +ENTRY(__signbit) + pmovmskb %xmm0, %eax + andl $0x80, %eax + ret +END(__signbit) diff --git a/sysdeps/x86_64/fpu/s_signbitf.S b/sysdeps/x86_64/fpu/s_signbitf.S new file mode 100644 index 0000000000..f0681d0124 --- /dev/null +++ b/sysdeps/x86_64/fpu/s_signbitf.S @@ -0,0 +1,27 @@ +/* Return nonzero value if number is negative. + Copyright (C) 2009 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@redha.com>, 2009. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <sysdep.h> + +ENTRY(__signbitf) + pmovmskb %xmm0, %eax + andl $0x8, %eax + ret +END(__signbitf) |