diff options
Diffstat (limited to 'sysdeps')
42 files changed, 481 insertions, 121 deletions
diff --git a/sysdeps/generic/bits/errno.h b/sysdeps/generic/bits/errno.h index 622c2c9de4..d1cb464b41 100644 --- a/sysdeps/generic/bits/errno.h +++ b/sysdeps/generic/bits/errno.h @@ -23,6 +23,7 @@ #define __Emath_defined 1 # define EDOM XXX <--- fill in what is actually needed +# define EILSEQ XXX <--- fill in what is actually needed # define ERANGE XXX <--- fill in what is actually needed #endif diff --git a/sysdeps/generic/setenv.c b/sysdeps/generic/setenv.c index f58c65b7f6..d4c5c87b15 100644 --- a/sysdeps/generic/setenv.c +++ b/sysdeps/generic/setenv.c @@ -91,7 +91,6 @@ setenv (name, value, replace) if (__environ == NULL || *ep == NULL) { char **new_environ; - char *tmp; if (__environ == last_environ && __environ != NULL) /* We allocated this space; we can extend it. */ @@ -120,9 +119,11 @@ setenv (name, value, replace) size * sizeof (char *)); #ifdef _LIBC - tmp = __mempcpy (new_environ[size], name, namelen); - *tmp++ = '='; - __mempcpy (tmp, value, vallen); + { + char *tmp = __mempcpy (new_environ[size], name, namelen); + *tmp++ = '='; + __mempcpy (tmp, value, vallen); + } #else memcpy (new_environ[size], name, namelen); new_environ[size][namelen] = '='; diff --git a/sysdeps/i386/i586/memcpy.S b/sysdeps/i386/i586/memcpy.S new file mode 100644 index 0000000000..9116c8d741 --- /dev/null +++ b/sysdeps/i386/i586/memcpy.S @@ -0,0 +1,108 @@ +/* Highly optimized version for i586. + Copyright (C) 1997 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 Library General Public License as + published by the Free Software Foundation; either version 2 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <sysdep.h> +#include "asm-syntax.h" + +/* + INPUT PARAMETERS: + dst (sp + 4) + src (sp + 8) + len (sp + 12) +*/ + + + .text +ENTRY (memcpy) + pushl %edi + pushl %esi + + movl 12(%esp), %edi /* dst */ + movl 16(%esp), %esi /* src */ + movl 20(%esp), %ecx /* len */ + movl %edi, %eax + + /* We need this in any case. */ + cld + + /* Cutoff for the big loop is a size of 32 bytes since otherwise + the loop will never be entered. */ + cmpl $32, %ecx + jbe L(1) + + negl %eax + andl $3, %eax + subl %eax, %ecx + xchgl %eax, %ecx + + rep; movsb + + movl %eax, %ecx + subl $32, %ecx + js L(2) + + /* Read ahead to make sure we write in the cache since the stupid + i586 designers haven't implemented read-on-write-miss. */ + movl (%edi), %eax +L(3): movl 28(%edi), %edx + + /* Now correct the loop counter. Please note that in the following + code the flags are not changed anymore. */ + subl $32, %ecx + + movl (%esi), %eax + movl 4(%esi), %edx + movl %eax, (%edi) + movl %edx, 4(%edi) + movl 8(%esi), %eax + movl 12(%esi), %edx + movl %eax, 8(%edi) + movl %edx, 12(%edi) + movl 16(%esi), %eax + movl 20(%esi), %edx + movl %eax, 16(%edi) + movl %edx, 20(%edi) + movl 24(%esi), %eax + movl 28(%esi), %edx + movl %eax, 24(%edi) + movl %edx, 28(%edi) + + leal 32(%esi), %esi + leal 32(%edi), %edi + + jns L(3) + + /* Correct extra loop counter modification. */ +L(2): addl $32, %ecx +#ifndef memcpy + movl 12(%esp), %eax /* dst */ +#endif + +L(1): rep; movsb + +#ifdef memcpy + movl %edi, %eax +#endif + + popl %esi + popl %edi + + ret +END (memcpy) diff --git a/sysdeps/i386/i586/mempcpy.S b/sysdeps/i386/i586/mempcpy.S new file mode 100644 index 0000000000..03dc0789da --- /dev/null +++ b/sysdeps/i386/i586/mempcpy.S @@ -0,0 +1,4 @@ +#define memcpy __mempcpy +#include <sysdeps/i386/i586/memcpy.S> + +weak_alias (__mempcpy, mempcpy) diff --git a/sysdeps/i386/i586/memset.S b/sysdeps/i386/i586/memset.S index fb96a369b9..01bed35534 100644 --- a/sysdeps/i386/i586/memset.S +++ b/sysdeps/i386/i586/memset.S @@ -1,5 +1,5 @@ /* memset/bzero -- set memory area to CH/0 - Highly optimized version for ix85, x>=5. + Highly optimized version for ix86, x>=5. Copyright (C) 1996, 1997 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Torbjorn Granlund, <tege@matematik.su.se> diff --git a/sysdeps/libm-ieee754/e_asin.c b/sysdeps/libm-ieee754/e_asin.c index b62a1c9914..09d06a9158 100644 --- a/sysdeps/libm-ieee754/e_asin.c +++ b/sysdeps/libm-ieee754/e_asin.c @@ -5,7 +5,7 @@ * * Developed at SunPro, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice + * software is freely granted, provided that this notice * is preserved. * ==================================================== */ @@ -15,12 +15,12 @@ static char rcsid[] = "$NetBSD: e_asin.c,v 1.9 1995/05/12 04:57:22 jtc Exp $"; #endif /* __ieee754_asin(x) - * Method : + * Method : * Since asin(x) = x + x^3/6 + x^5*3/40 + x^7*15/336 + ... * we approximate asin(x) on [0,0.5] by * asin(x) = x + x*x^2*R(x^2) * where - * R(x^2) is a rational approximation of (asin(x)-x)/x^3 + * R(x^2) is a rational approximation of (asin(x)-x)/x^3 * and its remez error is bounded by * |(asin(x)-x)/x^3 - R(x^2)| < 2^(-58.75) * @@ -49,9 +49,9 @@ static char rcsid[] = "$NetBSD: e_asin.c,v 1.9 1995/05/12 04:57:22 jtc Exp $"; #include "math_private.h" #ifdef __STDC__ -static const double +static const double #else -static double +static double #endif one = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */ huge = 1.000e+300, @@ -86,17 +86,18 @@ qS4 = 7.70381505559019352791e-02; /* 0x3FB3B8C5, 0xB12E9282 */ GET_LOW_WORD(lx,x); if(((ix-0x3ff00000)|lx)==0) /* asin(1)=+-pi/2 with inexact */ - return x*pio2_hi+x*pio2_lo; - return (x-x)/(x-x); /* asin(|x|>1) is NaN */ + return x*pio2_hi+x*pio2_lo; + return (x-x)/(x-x); /* asin(|x|>1) is NaN */ } else if (ix<0x3fe00000) { /* |x|<0.5 */ if(ix<0x3e400000) { /* if |x| < 2**-27 */ if(huge+x>one) return x;/* return x with inexact if x!=0*/ - } else + } else { t = x*x; p = t*(pS0+t*(pS1+t*(pS2+t*(pS3+t*(pS4+t*pS5))))); q = one+t*(qS1+t*(qS2+t*(qS3+t*qS4))); w = p/q; return x+x*w; + } } /* 1> |x|>= 0.5 */ w = one-fabs(x); @@ -115,6 +116,6 @@ qS4 = 7.70381505559019352791e-02; /* 0x3FB3B8C5, 0xB12E9282 */ p = 2.0*s*r-(pio2_lo-2.0*c); q = pio4_hi-2.0*w; t = pio4_hi-(p-q); - } - if(hx>0) return t; else return -t; + } + if(hx>0) return t; else return -t; } diff --git a/sysdeps/libm-ieee754/e_asinf.c b/sysdeps/libm-ieee754/e_asinf.c index 21157d84e1..5270f31144 100644 --- a/sysdeps/libm-ieee754/e_asinf.c +++ b/sysdeps/libm-ieee754/e_asinf.c @@ -8,7 +8,7 @@ * * Developed at SunPro, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice + * software is freely granted, provided that this notice * is preserved. * ==================================================== */ @@ -21,9 +21,9 @@ static char rcsid[] = "$NetBSD: e_asinf.c,v 1.5 1995/05/12 04:57:25 jtc Exp $"; #include "math_private.h" #ifdef __STDC__ -static const float +static const float #else -static float +static float #endif one = 1.0000000000e+00, /* 0x3F800000 */ huge = 1.000e+30, @@ -55,18 +55,19 @@ qS4 = 7.7038154006e-02; /* 0x3d9dc62e */ ix = hx&0x7fffffff; if(ix==0x3f800000) { /* asin(1)=+-pi/2 with inexact */ - return x*pio2_hi+x*pio2_lo; + return x*pio2_hi+x*pio2_lo; } else if(ix> 0x3f800000) { /* |x|>= 1 */ - return (x-x)/(x-x); /* asin(|x|>1) is NaN */ + return (x-x)/(x-x); /* asin(|x|>1) is NaN */ } else if (ix<0x3f000000) { /* |x|<0.5 */ if(ix<0x32000000) { /* if |x| < 2**-27 */ if(huge+x>one) return x;/* return x with inexact if x!=0*/ - } else + } else { t = x*x; p = t*(pS0+t*(pS1+t*(pS2+t*(pS3+t*(pS4+t*pS5))))); q = one+t*(qS1+t*(qS2+t*(qS3+t*qS4))); w = p/q; return x+x*w; + } } /* 1> |x|>= 0.5 */ w = one-fabsf(x); @@ -87,6 +88,6 @@ qS4 = 7.7038154006e-02; /* 0x3d9dc62e */ p = (float)2.0*s*r-(pio2_lo-(float)2.0*c); q = pio4_hi-(float)2.0*w; t = pio4_hi-(p-q); - } - if(hx>0) return t; else return -t; + } + if(hx>0) return t; else return -t; } diff --git a/sysdeps/libm-ieee754/e_atan2l.c b/sysdeps/libm-ieee754/e_atan2l.c index 72d3eac172..aff7a3d976 100644 --- a/sysdeps/libm-ieee754/e_atan2l.c +++ b/sysdeps/libm-ieee754/e_atan2l.c @@ -71,10 +71,10 @@ pi_lo = -5.01655761266833202345176e-20L;/* 0xBFBE, 0xECE675D1, 0xFC8F8CBB */ int32_t k,m,hx,hy,ix,iy; u_int32_t sx,sy,lx,ly; - EXTRACT_LDOUBLE_WORDS(sx,hx,lx,x); + GET_LDOUBLE_WORDS(sx,hx,lx,x); ix = sx&0x7fff; lx |= hx & 0x7fffffff; - EXTRACT_LDOUBLE_WORDS(sy,hy,ly,y); + GET_LDOUBLE_WORDS(sy,hy,ly,y); iy = sy&0x7fff; ly |= hy & 0x7fffffff; if(((2*ix|((lx|-lx)>>31))>0xfffe)|| diff --git a/sysdeps/libm-ieee754/e_remainderl.c b/sysdeps/libm-ieee754/e_remainderl.c index 3b2cd7c5e5..e721a6e8cd 100644 --- a/sysdeps/libm-ieee754/e_remainderl.c +++ b/sysdeps/libm-ieee754/e_remainderl.c @@ -47,8 +47,8 @@ static long double zero = 0.0; u_int32_t sx,sex,sep,x0,x1,p0,p1; long double p_half; - EXTRACT_LDOUBLE_WORDS(sex,x0,x1,x); - EXTRACT_LDOUBLE_WORDS(sep,p0,p1,p); + GET_LDOUBLE_WORDS(sex,x0,x1,x); + GET_LDOUBLE_WORDS(sep,p0,p1,p); sx = sex&0x8000; sep &= 0x7fff; sex &= 0x7fff; diff --git a/sysdeps/libm-ieee754/s_ceill.c b/sysdeps/libm-ieee754/s_ceill.c index 773be32995..d53f3954ba 100644 --- a/sysdeps/libm-ieee754/s_ceill.c +++ b/sysdeps/libm-ieee754/s_ceill.c @@ -51,8 +51,8 @@ static long double huge = 1.0e4930; if(j0<31) { if(j0<0) { /* raise inexact if x != 0 */ if(huge+x>0.0) {/* return 0*sign(x) if |x|<1 */ - if(sx) {es=0x8000;i0=0;i1=0;} - else if((i0|i1)!=0) { es=0x3fff;i0=0;i1=0;} + if(sx) {se=0x8000;i0=0;i1=0;} + else if((i0|i1)!=0) { se=0x3fff;i0=0;i1=0;} } } else { i = (0x7fffffff)>>j0; diff --git a/sysdeps/libm-ieee754/s_floorl.c b/sysdeps/libm-ieee754/s_floorl.c index 0eb0bec9b8..fb0c37e801 100644 --- a/sysdeps/libm-ieee754/s_floorl.c +++ b/sysdeps/libm-ieee754/s_floorl.c @@ -53,7 +53,7 @@ static long double huge = 1.0e4930; if(huge+x>0.0) {/* return 0*sign(x) if |x|<1 */ if(sx==0) {se=0;i0=i1=0;} else if(((se&0x7fff)|i0|i1)!=0) - { se=0xbfff;i0;i1=0;} + { se=0xbfff;i0=i1=0;} } } else { i = (0x7fffffff)>>j0; @@ -62,6 +62,7 @@ static long double huge = 1.0e4930; if(sx) { if (j0>0) i0 += (0x80000000)>>j0; else ++se; + } i0 &= (~i); i1=0; } } diff --git a/sysdeps/libm-ieee754/s_llrint.c b/sysdeps/libm-ieee754/s_llrint.c index a50ba96952..8e70bcff36 100644 --- a/sysdeps/libm-ieee754/s_llrint.c +++ b/sysdeps/libm-ieee754/s_llrint.c @@ -55,27 +55,27 @@ __llrint (double x) w = two52[sx] + x; t = w - two52[sx]; EXTRACT_WORDS (i0, i1, t); - i0 = i & 0xfffff; - i0 |= 0x100000; j0 = ((i0 >> 20) & 0x7ff) - 0x3ff; + i0 &= 0xfffff; + i0 |= 0x100000; result = i0 >> (20 - j0); } } - else if (j0 < (int32_t) (8 * sizeof (long long int))) + else if (j0 < (int32_t) (8 * sizeof (long long int)) - 1) { if (j0 >= 52) - result = ((long long int) i0 << (j0 - 20)) | (i1 << (j0 - 52)); + result = (((long long int) i0 << 32) | i1) << (j0 - 52); else { w = two52[sx] + x; t = w - two52[sx]; EXTRACT_WORDS (i0, i1, t); - i0 = i & 0xfffff; - i0 |= 0x100000; j0 = ((i0 >> 20) & 0x7ff) - 0x3ff; + i0 &= 0xfffff; + i0 |= 0x100000; - result = ((long long int) i0 << (j0 - 20)) | (j >> (52 - j0)); + result = ((long long int) i0 << (j0 - 20)) | (i1 >> (52 - j0)); } } else diff --git a/sysdeps/libm-ieee754/s_llrintf.c b/sysdeps/libm-ieee754/s_llrintf.c index f73afd0fd2..83cb7fdd37 100644 --- a/sysdeps/libm-ieee754/s_llrintf.c +++ b/sysdeps/libm-ieee754/s_llrintf.c @@ -47,7 +47,7 @@ __llrintf (float x) i0 = i & 0x7fffff; i0 |= 0x800000; - if (j0 < (int32_t) (sizeof (long long int) * 8)) + if (j0 < (int32_t) (sizeof (long long int) * 8) - 1) { if (j0 < -1) return 0; diff --git a/sysdeps/libm-ieee754/s_llrintl.c b/sysdeps/libm-ieee754/s_llrintl.c index d3b9b12d76..2aeaa1e102 100644 --- a/sysdeps/libm-ieee754/s_llrintl.c +++ b/sysdeps/libm-ieee754/s_llrintl.c @@ -45,12 +45,12 @@ __llrintl (long double x) sx = (se >> 15) & 1; j0 = (se & 0x7fff) - 0x3fff; - if (j0 < (int32_t) (8 * sizeof (long long int))) + if (j0 < (int32_t) (8 * sizeof (long long int)) - 1) { if (j0 < -1) return 0; else if (j0 >= 63) - result = ((long long int) i0 << (j0 - 31)) | (i1 << (j0 - 63)); + result = (((long long int) i0 << 32) | i1) << (j0 - 63); else { w = two63[sx] + x; diff --git a/sysdeps/libm-ieee754/s_llround.c b/sysdeps/libm-ieee754/s_llround.c index 1deb630e96..92ce10fc42 100644 --- a/sysdeps/libm-ieee754/s_llround.c +++ b/sysdeps/libm-ieee754/s_llround.c @@ -48,17 +48,20 @@ __llround (double x) result = i0 >> (20 - j0); } } - else if (j0 < (int32_t) (8 * sizeof (long long int))) + else if (j0 < (int32_t) (8 * sizeof (long long int)) - 1) { if (j0 >= 52) - result = ((long long int) i0 << (j0 - 20)) | (i1 << (j0 - 52)); + result = (((long long int) i0 << 32) | i1) << (j0 - 52); else { u_int32_t j = i1 + (0x80000000 >> (j0 - 20)); if (j < i1) ++i0; - result = ((long long int) i0 << (j0 - 20)) | (j >> (52 - j0)); + if (j0 == 20) + result = (long long int) i0; + else + result = ((long long int) i0 << (j0 - 20)) | (j >> (52 - j0)); } } else diff --git a/sysdeps/libm-ieee754/s_llroundf.c b/sysdeps/libm-ieee754/s_llroundf.c index 87ed1a3117..9aad81fd45 100644 --- a/sysdeps/libm-ieee754/s_llroundf.c +++ b/sysdeps/libm-ieee754/s_llroundf.c @@ -37,12 +37,12 @@ __llroundf (float x) i &= 0x7fffff; i |= 0x800000; - if (j0 < (int32_t) (8 * sizeof (long long int))) + if (j0 < (int32_t) (8 * sizeof (long long int)) - 1) { if (j0 < 0) return j0 < -1 ? 0 : sign; else if (j0 >= 23) - result = (long int) i << (j0 - 23); + result = (long long int) i << (j0 - 23); else { i += 0x400000 >> j0; diff --git a/sysdeps/libm-ieee754/s_llroundl.c b/sysdeps/libm-ieee754/s_llroundl.c index 959b1e3fe9..4a537c871e 100644 --- a/sysdeps/libm-ieee754/s_llroundl.c +++ b/sysdeps/libm-ieee754/s_llroundl.c @@ -52,17 +52,20 @@ __llroundl (long double x) result = j >> (31 - j0); } } - else if (j0 < (int32_t) (8 * sizeof (long long int))) + else if (j0 < (int32_t) (8 * sizeof (long long int)) - 1) { if (j0 >= 63) - result = ((long long int) i0 << (j0 - 31)) | (i1 << (j0 - 63)); + result = (((long long int) i0 << 32) | i1) << (j0 - 63); else { u_int32_t j = i1 + (0x80000000 >> (j0 - 31)); if (j < i1) ++i0; - result = ((long long int) i0 << (j0 - 31)) | (j >> (63 - j0)); + if (j0 == 31) + result = (long long int) i0; + else + result = ((long long int) i0 << (j0 - 31)) | (j >> (63 - j0)); } } else diff --git a/sysdeps/libm-ieee754/s_lrint.c b/sysdeps/libm-ieee754/s_lrint.c index 0ccd06a061..8fe7d24e14 100644 --- a/sysdeps/libm-ieee754/s_lrint.c +++ b/sysdeps/libm-ieee754/s_lrint.c @@ -62,7 +62,7 @@ __lrint (double x) result = i0 >> (20 - j0); } } - else if (j0 < (int32_t) (8 * sizeof (long int))) + else if (j0 < (int32_t) (8 * sizeof (long int)) - 1) { if (j0 >= 52) result = ((long int) i0 << (j0 - 20)) | (i1 << (j0 - 52)); @@ -75,7 +75,7 @@ __lrint (double x) i0 |= 0x100000; j0 = ((i0 >> 20) & 0x7ff) - 0x3ff; - result = ((long int) i0 << (j0 - 20)) | (j >> (52 - j0)); + result = ((long int) i0 << (j0 - 20)) | (i1 >> (52 - j0)); } } else diff --git a/sysdeps/libm-ieee754/s_lrintf.c b/sysdeps/libm-ieee754/s_lrintf.c index 6d74b362f5..d80d81a718 100644 --- a/sysdeps/libm-ieee754/s_lrintf.c +++ b/sysdeps/libm-ieee754/s_lrintf.c @@ -47,7 +47,7 @@ __lrintf (float x) i0 = i & 0x7fffff; i0 |= 0x800000; - if (j0 < (int32_t) (sizeof (long int) * 8)) + if (j0 < (int32_t) (sizeof (long int) * 8) - 1) { if (j0 < -1) return 0; diff --git a/sysdeps/libm-ieee754/s_lrintl.c b/sysdeps/libm-ieee754/s_lrintl.c index 5a41427f72..673cf3d9db 100644 --- a/sysdeps/libm-ieee754/s_lrintl.c +++ b/sysdeps/libm-ieee754/s_lrintl.c @@ -59,7 +59,7 @@ __lrintl (long double x) result = i0 >> (31 - j0); } } - else if (j0 < (int32_t) (8 * sizeof (long int))) + else if (j0 < (int32_t) (8 * sizeof (long int)) - 1) { if (j0 >= 63) result = ((long int) i0 << (j0 - 31)) | (i1 << (j0 - 63)); diff --git a/sysdeps/libm-ieee754/s_lround.c b/sysdeps/libm-ieee754/s_lround.c index a6468ba78a..49be12f03b 100644 --- a/sysdeps/libm-ieee754/s_lround.c +++ b/sysdeps/libm-ieee754/s_lround.c @@ -48,7 +48,7 @@ __lround (double x) result = i0 >> (20 - j0); } } - else if (j0 < (int32_t) (8 * sizeof (long int))) + else if (j0 < (int32_t) (8 * sizeof (long int)) - 1) { if (j0 >= 52) result = ((long int) i0 << (j0 - 20)) | (i1 << (j0 - 52)); diff --git a/sysdeps/libm-ieee754/s_lroundf.c b/sysdeps/libm-ieee754/s_lroundf.c index 0d3889c24a..df1d242e2a 100644 --- a/sysdeps/libm-ieee754/s_lroundf.c +++ b/sysdeps/libm-ieee754/s_lroundf.c @@ -37,7 +37,7 @@ __lroundf (float x) i &= 0x7fffff; i |= 0x800000; - if (j0 < (int32_t) (8 * sizeof (long int))) + if (j0 < (int32_t) (8 * sizeof (long int)) - 1) { if (j0 < 0) return j0 < -1 ? 0 : sign; diff --git a/sysdeps/libm-ieee754/s_lroundl.c b/sysdeps/libm-ieee754/s_lroundl.c index d8b7db4b5c..3bdac830b4 100644 --- a/sysdeps/libm-ieee754/s_lroundl.c +++ b/sysdeps/libm-ieee754/s_lroundl.c @@ -52,7 +52,7 @@ __lroundl (long double x) result = j >> (31 - j0); } } - else if (j0 < (int32_t) (8 * sizeof (long int))) + else if (j0 < (int32_t) (8 * sizeof (long int)) - 1) { if (j0 >= 63) result = ((long int) i0 << (j0 - 31)) | (i1 << (j0 - 63)); diff --git a/sysdeps/libm-ieee754/s_scalblnl.c b/sysdeps/libm-ieee754/s_scalblnl.c index aafb73e688..b885fbcadb 100644 --- a/sysdeps/libm-ieee754/s_scalblnl.c +++ b/sysdeps/libm-ieee754/s_scalblnl.c @@ -34,7 +34,7 @@ static const long double static long double #endif two63 = 4.50359962737049600000e+15, -twom63 = 1.08420217248550443400e-19; +twom63 = 1.08420217248550443400e-19, huge = 1.0e+4900L, tiny = 1.0e-4900L; diff --git a/sysdeps/libm-ieee754/s_scalbnl.c b/sysdeps/libm-ieee754/s_scalbnl.c index 4e1d08ef90..32e4fb8cea 100644 --- a/sysdeps/libm-ieee754/s_scalbnl.c +++ b/sysdeps/libm-ieee754/s_scalbnl.c @@ -34,7 +34,7 @@ static const long double static long double #endif two63 = 4.50359962737049600000e+15, -twom63 = 1.08420217248550443400e-19; +twom63 = 1.08420217248550443400e-19, huge = 1.0e+4900L, tiny = 1.0e-4900L; diff --git a/sysdeps/libm-ieee754/s_sincosl.c b/sysdeps/libm-ieee754/s_sincosl.c index 7cadf88a40..78c78d5619 100644 --- a/sysdeps/libm-ieee754/s_sincosl.c +++ b/sysdeps/libm-ieee754/s_sincosl.c @@ -38,7 +38,7 @@ __sincosl (long double x, long double *sinx, long double *cosx) *sinx = __kernel_sinl (x, 0.0, 0); *cosx = __kernel_cosl (x, 0.0); } - else if (ix == 0x7fff) + else if (se == 0x7fff) { /* sin(Inf or NaN) is NaN */ *sinx = *cosx = x - x; diff --git a/sysdeps/libm-ieee754/s_tanl.c b/sysdeps/libm-ieee754/s_tanl.c index bce6d07f3d..97a0b27f32 100644 --- a/sysdeps/libm-ieee754/s_tanl.c +++ b/sysdeps/libm-ieee754/s_tanl.c @@ -66,7 +66,7 @@ static char rcsid[] = "$NetBSD: $"; /* |x| ~< pi/4 */ se &= 0x7fff; - if(ix <= 0x3ffe) return __kernel_tanl(x,z,1); + if(se <= 0x3ffe) return __kernel_tanl(x,z,1); /* tan(Inf or NaN) is NaN */ else if (se==0x7fff) return x-x; /* NaN */ diff --git a/sysdeps/m68k/fpu/s_llrint.c b/sysdeps/m68k/fpu/s_llrint.c index f5d0d51122..9dfee644ed 100644 --- a/sysdeps/m68k/fpu/s_llrint.c +++ b/sysdeps/m68k/fpu/s_llrint.c @@ -24,36 +24,50 @@ #include "math_private.h" long long int -__llrint (long double x) +__llrint (double x) { - int32_t se, sx; - u_int32_t h, l; + int32_t e; + u_int32_t h, l, s; long long int result; - x = __m81_u(__rintl) (x); + x = __m81_u(__rint) (x); /* We could use __fixxfdi from libgcc, but here we can take advantage of the known floating point format. */ - GET_LDOUBLE_WORDS (se, h, l, x); + EXTRACT_WORDS (h, l, x); - sx = se & (1 << 15); - se = (se ^ sx) - 0x3fff; + e = ((h >> 20) & 0x7ff) - 0x3ff; + if (e < 0) + return 0; + s = h; + h &= 0xfffff; + h |= 0x100000; - if (se < 64) + if (e < 63) { - if (se > 31) - result = (((long long int) (h >> (63 - se)) << 32) - | (l >> (63 - se)) | (h << (se - 31))); + if (e > 52) + { + h <<= e - 52; + h |= l >> (84 - e); + l <<= e - 52; + result = ((long long int) h << 32) | l; + } + else if (e > 20) + { + l >>= 52 - e; + l |= h << (e - 20); + h >>= 52 - e; + result = ((long long int) h << 32) | l; + } else - result = h >> (31 - se); - if (sx) + result = h >> (20 - e); + if (s & 0x80000000) result = -result; } else - /* Too large. The number is either +-inf or NaN or it is too - large to be effected by rounding. The standard leaves it - undefined what to return when the number is too large to fit in - a `long long int'. */ + /* The number is too large or not finite. The standard leaves it + undefined what to return when the number is too large to fit in a + `long long int'. */ result = -1LL; return result; diff --git a/sysdeps/m68k/fpu/s_llrintf.c b/sysdeps/m68k/fpu/s_llrintf.c new file mode 100644 index 0000000000..3c8528c4e8 --- /dev/null +++ b/sysdeps/m68k/fpu/s_llrintf.c @@ -0,0 +1,66 @@ +/* Round argument to nearest integral value according to current rounding + direction. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#define __LIBC_M81_MATH_INLINES +#include <math.h> +#include "math_private.h" + +long long int +__llrintf (float x) +{ + int32_t e; + u_int32_t i, s; + long long int result; + + x = __m81_u(__rintf) (x); + + GET_FLOAT_WORD (i, x); + + e = ((i >> 23) & 0xff) - 0x7f; + if (e < 0) + return 0; + s = i; + i &= 0x7fffff; + i |= 0x800000; + + if (e < 63) + { + if (e > 55) + result = (long long int) (i << (e - 55)) << 32; + else if (e > 31) + result = (((long long int) (i >> (55 - e)) << 32) | (i << (e - 23))); + else if (e > 23) + result = i << (e - 23); + else + result = i >> (23 - e); + if (s & 0x80000000) + result = -result; + } + else + /* The number is too large or not finite. The standard leaves it + undefined what to return when the number is too large to fit in a + `long long int'. */ + result = -1LL; + + return result; +} + +weak_alias (__llrintf, llrintf) diff --git a/sysdeps/m68k/fpu/s_llrintl.c b/sysdeps/m68k/fpu/s_llrintl.c new file mode 100644 index 0000000000..55190b9eb3 --- /dev/null +++ b/sysdeps/m68k/fpu/s_llrintl.c @@ -0,0 +1,65 @@ +/* Round argument to nearest integral value according to current rounding + direction. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#define __LIBC_M81_MATH_INLINES +#include <math.h> +#include "math_private.h" + +long long int +__llrintl (long double x) +{ + int32_t e, s; + u_int32_t h, l; + long long int result; + + x = __m81_u(__rintl) (x); + + GET_LDOUBLE_WORDS (e, h, l, x); + + s = e; + e = (e & 0x7fff) - 0x3fff; + if (e < 0) + return 0; + + if (e < 63) + { + if (e > 31) + { + l >>= 63 - e; + l |= h << (e - 31); + h >>= 63 - e; + result = ((long long int) h << 32) | l; + } + else + result = h >> (31 - e); + if (s & 0x8000) + result = -result; + } + else + /* The number is too large or not finite. The standard leaves it + undefined what to return when the number is too large to fit in a + `long long int'. */ + result = -1LL; + + return result; +} + +weak_alias (__llrintl, llrintl) diff --git a/sysdeps/mach/hurd/bits/errno.h b/sysdeps/mach/hurd/bits/errno.h index beb35ecd9a..c17130d6fd 100644 --- a/sysdeps/mach/hurd/bits/errno.h +++ b/sysdeps/mach/hurd/bits/errno.h @@ -2,7 +2,7 @@ /* The Hurd uses Mach error system 0x10, currently only subsystem 0. */ #ifndef _HURD_ERRNO -#define _HURD_ERRNO(n) ((0x10 << 26) | ((n) & 0x3fff)) +# define _HURD_ERRNO(n) ((0x10 << 26) | ((n) & 0x3fff)) #endif #ifdef _ERRNO_H @@ -293,24 +293,25 @@ enum __error_t_codes }; -#define _HURD_ERRNOS 118 +# define _HURD_ERRNOS 118 /* User-visible type of error codes. It is ok to use `int' or `kern_return_t' for these, but with `error_t' the debugger prints symbolic values. */ -#ifdef __USE_GNU +# ifdef __USE_GNU typedef enum __error_t_codes error_t; -#define __error_t_defined 1 -#endif +# define __error_t_defined 1 +# endif /* errno is a per-thread variable. */ -#include <hurd/threadvar.h> -#define errno (*__hurd_errno_location ()) -#define __set_errno(val) errno = (val) +# include <hurd/threadvar.h> +# define errno (*__hurd_errno_location ()) +# define __set_errno(val) errno = (val) #endif /* <errno.h> included. */ -#if !defined (_ERRNO_H) && defined (__need_Emath) -#define EDOM _HURD_ERRNO (33)/* Numerical argument out of domain */ -#define ERANGE _HURD_ERRNO (34)/* Numerical result out of range */ +#if !defined _ERRNO_H && defined __need_Emath +# define EDOM _HURD_ERRNO (33)/* Numerical argument out of domain */ +# define EILSEQ _HURD_ERRNO (106)/* Invalid or incomplete multibyte or wide character */ +# define ERANGE _HURD_ERRNO (34)/* Numerical result out of range */ #endif /* <errno.h> not included and need math error codes. */ diff --git a/sysdeps/posix/getcwd.c b/sysdeps/posix/getcwd.c index 01f86ef47f..2ae3c1e897 100644 --- a/sysdeps/posix/getcwd.c +++ b/sysdeps/posix/getcwd.c @@ -135,6 +135,11 @@ extern void free (); # define memmove memcpy #endif /* Not ANSI_STRING. */ +#ifdef _LIBC +# define mempcpy __mempcpy +# define HAVE_MEMPCPY 1 +#endif + #if !defined __alloca && !defined __GNU_LIBRARY__ # ifdef __GNUC__ @@ -277,10 +282,10 @@ __getcwd (buf, size) dotp = &new[dotsize]; } #ifdef HAVE_MEMPCPY - *((char *) mempcpy (dotp, new, dotsize)) = '\0'; + *((char *) mempcpy ((char *) dotp, new, dotsize)) = '\0'; dotsize *= 2; #else - memcpy (dotp, new, dotsize); + memcpy ((char *) dotp, new, dotsize); dotsize *= 2; new[dotsize] = '\0'; #endif diff --git a/sysdeps/posix/system.c b/sysdeps/posix/system.c index 2b8f9cb590..1111646bbd 100644 --- a/sysdeps/posix/system.c +++ b/sysdeps/posix/system.c @@ -44,6 +44,7 @@ __libc_system (const char *line) #endif if (line == NULL) + /* This signals that we have a command processor available. */ return 1; sa.sa_handler = SIG_IGN; diff --git a/sysdeps/standalone/bits/errno.h b/sysdeps/standalone/bits/errno.h index 30eec4308d..d4030b7f44 100644 --- a/sysdeps/standalone/bits/errno.h +++ b/sysdeps/standalone/bits/errno.h @@ -23,6 +23,7 @@ #define __Emath_defined 1 # define EDOM 1 +# define EILSEQ 17 # define ERANGE 2 #endif @@ -41,7 +42,6 @@ # define ENOMSG 14 # define E2BIG 15 # define EINTR 16 -# define EILSEQ 17 # define ENOEXEC 18 # define ENOENT 19 # define EPROTOTYPE 20 diff --git a/sysdeps/unix/sysv/i386/i686/time.S b/sysdeps/unix/sysv/i386/i686/time.S deleted file mode 100644 index c5d27635c9..0000000000 --- a/sysdeps/unix/sysv/i386/i686/time.S +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright (C) 1991, 1992, 1996, 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include <sysdep.h> -#include <asm-syntax.h> - -SYSCALL (time, 1) - movl 4(%esp), %edx /* Put passed pointer in %edx. */ - testl %edx, %edx /* Is it non-nil? */ - cmovnel %eax, (%edx) /* Yes; store the time there. */ - ret -PSEUDO_END (time) diff --git a/sysdeps/unix/sysv/linux/Dist b/sysdeps/unix/sysv/linux/Dist index cfe5202ba1..2896953cb7 100644 --- a/sysdeps/unix/sysv/linux/Dist +++ b/sysdeps/unix/sysv/linux/Dist @@ -38,6 +38,7 @@ sys/klog.h sys/module.h sys/mount.h sys/mtio.h +sys/prctl.h sys/procfs.h sys/quota.h sys/socketvar.h diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile index 8db8094dc1..005278068a 100644 --- a/sysdeps/unix/sysv/linux/Makefile +++ b/sysdeps/unix/sysv/linux/Makefile @@ -13,7 +13,7 @@ sysdep_routines += sysctl clone llseek sysdep_headers += sys/mount.h sys/acct.h sys/sysctl.h sys/mtio.h \ sys/module.h sys/io.h sys/klog.h sys/kdaemon.h \ - sys/user.h sys/sysmacros.h sys/procfs.h \ + sys/user.h sys/sysmacros.h sys/procfs.h sys/prctl.h \ sys/debugreg.h sys/kd.h sys/soundcard.h sys/vt.h \ sys/quota.h sys/fsuid.h bits/mman.h \ scsi/sg.h diff --git a/sysdeps/unix/sysv/linux/alpha/xstatconv.c b/sysdeps/unix/sysv/linux/alpha/xstatconv.c index d1005e7302..cb0269b8af 100644 --- a/sysdeps/unix/sysv/linux/alpha/xstatconv.c +++ b/sysdeps/unix/sysv/linux/alpha/xstatconv.c @@ -29,7 +29,7 @@ xstat_conv (int vers, struct kernel_stat *kbuf, void *ubuf) /* Nothing to do. The struct is in the form the kernel expects. We should have short-circuted before we got here, but for completeness... */ - memcpy ((struct kernel_stat *) ubuf, kbuf, sizeof (*kbuf)); + *(struct kernel_stat *) ubuf = *kbuf; break; case _STAT_VER_GLIBC2: diff --git a/sysdeps/unix/sysv/linux/bits/errno.h b/sysdeps/unix/sysv/linux/bits/errno.h index f676d35e49..abcbd9b801 100644 --- a/sysdeps/unix/sysv/linux/bits/errno.h +++ b/sysdeps/unix/sysv/linux/bits/errno.h @@ -50,10 +50,11 @@ __set_errno (int __err) # endif /* !__ASSEMBLER__ */ #endif /* _ERRNO_H */ -#if !defined (_ERRNO_H) && defined (__need_Emath) +#if !defined _ERRNO_H && defined __need_Emath /* This is ugly but the kernel header is not clean enough. We must define only the values EDOM and ERANGE in case __need_Emath is defined. The value is the same for all Linux ports. */ # define EDOM 33 /* Math argument out of domain of function. */ +# define EILSEQ 84 /* Illegal byte sequence. */ # define ERANGE 34 /* Math result not representable. */ #endif /* !_ERRNO_H && __need_Emath */ diff --git a/sysdeps/unix/sysv/linux/xstatconv.c b/sysdeps/unix/sysv/linux/xstatconv.c index 06a28cce30..fcf2f3b9f6 100644 --- a/sysdeps/unix/sysv/linux/xstatconv.c +++ b/sysdeps/unix/sysv/linux/xstatconv.c @@ -29,7 +29,7 @@ xstat_conv (int vers, struct kernel_stat *kbuf, void *ubuf) /* Nothing to do. The struct is in the form the kernel expects. We should have short-circuted before we got here, but for completeness... */ - memcpy ((struct kernel_stat *) ubuf, kbuf, sizeof (*kbuf)); + *(struct kernel_stat *) ubuf = *kbuf; break; case _STAT_VER_LINUX: diff --git a/sysdeps/wordsize-32/inttypes.h b/sysdeps/wordsize-32/inttypes.h index c0582c1876..7bb8cbd5bc 100644 --- a/sysdeps/wordsize-32/inttypes.h +++ b/sysdeps/wordsize-32/inttypes.h @@ -25,6 +25,9 @@ #define _INTTYPES_H 1 #include <features.h> +#define __need_wchar_t +#include <stddef.h> + /* Exact integral types. */ /* Signed. */ @@ -342,6 +345,31 @@ typedef unsigned long long int uint_fast64_t; #define SCNxPTR "x" +/* Limits of other integer types. */ + +/* Limits of `ptrdiff_t' type. */ +#define PTRDIFF_MIN (-2147483647-1) +#define PTRDIFF_MAX (2147483647) + +/* Limits of `sig_atomic_t'. */ +#define SIG_ATOMIC_MIN (-2147483647-1) +#define SIG_ATOMIC_MAX (-2147483647-1) + +/* Limit of `size_t' type. */ +#define SIZE_MAX (4294967295U) + +/* Limits of `wchar_t'. */ +#ifndef WCHAR_MIN +/* These constants might also be defined in <wchar.h>. */ +# define WCHAR_MIN (-2147483647-1) +# define WCHAR_MAX (2147483647) +#endif + +/* Limits of `wint_t'. */ +#define WINT_MIN (0) +#define WINT_MAX (4294967295U) + + /* Macros for string conversion. */ /* Like `strtol' but convert to `intmax_t'. */ @@ -370,4 +398,32 @@ extern unsigned long long int __strtoull_internal __P ((__const char * # define __strtoull_internal_defined 1 #endif + +/* Like `wcstol' but convert to `intmax_t'. */ +#define wcstoimax(nptr, endptr, base) \ + __wcstoll_internal (nptr, endptr, base, 0) + +#ifndef __wcstoll_internal_defined +extern long long int __wcstoll_internal __P ((__const wchar_t * + __restrict __nptr, + wchar_t **__restrict __endptr, + int __base, int __group)); +# define __wcstoll_internal_defined 1 +#endif + + +/* Like `wcstoul' but convert to `uintmax_t'. */ +#define wcstoumax(nptr, endptr, base) \ + __wcstoull_internal (nptr, endptr, base, 0) + +#ifndef __wcstoull_internal_defined +extern unsigned long long int __wcstoull_internal __P ((__const wchar_t * + __restrict __nptr, + wchar_t ** + __restrict __endptr, + int __base, + int __group)); +# define __wcstoull_internal_defined 1 +#endif + #endif /* inttypes.h */ diff --git a/sysdeps/wordsize-64/inttypes.h b/sysdeps/wordsize-64/inttypes.h index 2a2628428d..9967fc0844 100644 --- a/sysdeps/wordsize-64/inttypes.h +++ b/sysdeps/wordsize-64/inttypes.h @@ -25,6 +25,9 @@ #define _INTTYPES_H 1 #include <features.h> +#define __need_wchar_t +#include <stddef.h> + /* Exact integral types. */ /* Signed. */ @@ -342,6 +345,31 @@ typedef unsigned long int uint_fast64_t; #define SCNxPTR "lx" +/* Limits of other integer types. */ + +/* Limits of `ptrdiff_t' type. */ +#define PTRDIFF_MIN (-9223372036854775807L-1) +#define PTRDIFF_MAX (9223372036854775807L) + +/* Limits of `sig_atomic_t'. */ +#define SIG_ATOMIC_MIN (-2147483647-1) +#define SIG_ATOMIC_MAX (-2147483647-1) + +/* Limit of `size_t' type. */ +#define SIZE_MAX (18446744073709551615uL) + +/* Limits of `wchar_t'. */ +#ifndef WCHAR_MIN +/* These constants might also be defined in <wchar.h>. */ +# define WCHAR_MIN (-2147483647-1) +# define WCHAR_MAX (2147483647) +#endif + +/* Limits of `wint_t'. */ +#define WINT_MIN (0) +#define WINT_MAX (4294967295U) + + /* Macros for string conversion. */ /* Like `strtol' but convert to `intmax_t'. */ @@ -368,4 +396,30 @@ extern unsigned long int __strtoul_internal __P ((__const char * # define __strtoul_internal_defined 1 #endif + +/* Like `wcstol' but convert to `intmax_t'. */ +#define wcstoimax(nptr, endptr, base) \ + __wcstol_internal (nptr, endptr, base, 0) + +#ifndef __wcstol_internal_defined +extern long int __wcstol_internal __P ((__const wchar_t *__restrict __nptr, + wchar_t **__restrict __endptr, + int __base, int __group)); +# define __wcstol_internal_defined 1 +#endif + + +/* Like `wcstoul' but convert to `uintmax_t'. */ +#define wcstoumax(nptr, endptr, base) \ + __wcstoul_internal (nptr, endptr, base, 0) + +#ifndef __wcstoul_internal_defined +extern unsigned long int __wcstoul_internal __P ((__const wchar_t * + __restrict __nptr, + wchar_t ** + __restrict __endptr, + int __base, int __group)); +# define __wcstoul_internal_defined 1 +#endif + #endif /* inttypes.h */ |