diff options
30 files changed, 409 insertions, 70 deletions
@@ -9,6 +9,62 @@ Sun Jan 14 17:51:09 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund. memory_error): Add cast to void to avoid gcc warning. (vfscanf): Rewrite character class parsing to make it more efficient. + * misc/efgcvt_r.c (ecvt_r): Handle negative values. + + * stdlib/stdlib.h: Replace __CONSTVALUE by attribute. + * stdlib/abs.c, stdlib/div.c, stdlib/labs.c, stdlib/ldiv.c, + sysdeps/generic/hypot.c: Remove obsolete __CONSTVALUE. + + * stdio-common/printf_fp.c (__printf_fp): Fix parameter + declaration. + + * sysdeps/generic/putenv.c (putenv): Fix second argument of + setenv. + + * sysdeps/ieee754/hypot.c: New file, extracted out of cabs.c. + * sysdeps/ieee754/cabs.c: Don't define hypot here. + + * sysdeps/ieee754/ieee754.h (union ieee854_long_double): Fix + definition of ieee_nan alternative. + + * sysdeps/m68k/__longjmp.c, sysdeps/m68k/setjmp.c: Add register + prefix spec. + + * sysdeps/m68k/ffs.c (ffs): Fix register constraint. + + * sysdeps/m68k/fpu/__math.h: Include <errno.h>. Replace obsolete + __CONSTVALUE by attribute. + (floor): Round to negative infinity. + (rint, expm1) [__NO_MATH_INLINES]: Don't define, to avoid type + clash when compiling source. + (pow): Handle x == 0 and x < 0. + (ceil, __isinf, __isnan): Fix register constraints. + (__isinfl, __isnanl): Added. + * sysdeps/m68k/fpu/acos.c, sysdeps/m68k/fpu/atan2.c, + sysdeps/m68k/fpu/fmod.c, sysdeps/m68k/fpu/ldexp.c, + sysdeps/m68k/fpu/pow.c: Remove obsolete __CONSTVALUE. + + * sysdeps/m68k/bsd-_setjmp.S, sysdeps/m68k/bsd-setjmp.S: Fix + assembler syntax. + + * sysdeps/unix/bsd/bsd4.4/fchdir.S (fchdir): Take only one + argument. + + * sysdeps/unix/bsd/clock.c (timeval_to_clock_t): Fix timeval to + clock_t conversion. + (clock): Don't multiply by CLOCKS_PER_SEC. + + * sysdeps/unix/bsd/poll.c (poll): Fix msec to timeval conversion. + + * sysdeps/unix/bsd/sun/m68k/brk.S (brk): Compare with address of + __end. + + * sysdeps/unix/bsd/sun/m68k/vfork.S: Fix assembler syntax. + + * sysdeps/unix/bsd/ualarm.c (ualarm): Fix timeval calculation. + + * sysdeps/unix/bsd/vax/vfork.S: Remove duplicate label. + Sun Jan 14 01:01:10 1996 Ulrich Drepper <drepper@ipd.info.uni-karlsruhe.de> * stdlib/strtol.c: Return correct pointer for strings diff --git a/misc/efgcvt_r.c b/misc/efgcvt_r.c index 099b349414..2da5e55b0b 100644 --- a/misc/efgcvt_r.c +++ b/misc/efgcvt_r.c @@ -66,7 +66,7 @@ ecvt_r (value, ndigit, decpt, sign, buf, len) char *buf; size_t len; { - ndigit -= (int) floor (log10 (value)); + ndigit -= (int) floor (log10 (value < 0.0 ? -value : value)); if (ndigit < 0) ndigit = 0; return fcvt_r (value, ndigit, decpt, sign, buf, len); diff --git a/stdio-common/printf_fp.c b/stdio-common/printf_fp.c index 44f501f206..05bfd493ee 100644 --- a/stdio-common/printf_fp.c +++ b/stdio-common/printf_fp.c @@ -131,7 +131,7 @@ int __printf_fp (fp, info, args) FILE *fp; const struct printf_info *info; - const **const args; + const *const *args; { /* The floating-point value to output. */ union diff --git a/stdlib/abs.c b/stdlib/abs.c index b8db100b41..01cb7b331c 100644 --- a/stdlib/abs.c +++ b/stdlib/abs.c @@ -22,7 +22,6 @@ Cambridge, MA 02139, USA. */ #undef abs /* Return the absolute value of I. */ -__CONSTVALUE int DEFUN(abs, (i), int i) { diff --git a/stdlib/div.c b/stdlib/div.c index 5a0ee7da38..51f5e35e71 100644 --- a/stdlib/div.c +++ b/stdlib/div.c @@ -57,7 +57,6 @@ Cambridge, MA 02139, USA. */ /* Return the `div_t' representation of NUMER over DENOM. */ -__CONSTVALUE div_t DEFUN(div, (numer, denom), int numer AND int denom) { diff --git a/stdlib/labs.c b/stdlib/labs.c index c54339f02b..3fcef26df9 100644 --- a/stdlib/labs.c +++ b/stdlib/labs.c @@ -23,7 +23,6 @@ Cambridge, MA 02139, USA. */ /* Return the absolute value of I. */ -__CONSTVALUE long int DEFUN(labs, (i), long int i) { diff --git a/stdlib/ldiv.c b/stdlib/ldiv.c index 661f1bdbcd..b2029032e3 100644 --- a/stdlib/ldiv.c +++ b/stdlib/ldiv.c @@ -57,7 +57,6 @@ Cambridge, MA 02139, USA. */ /* Return the `ldiv_t' representation of NUMER over DENOM. */ -__CONSTVALUE ldiv_t DEFUN(ldiv, (numer, denom), long int numer AND long int denom) { diff --git a/stdlib/stdlib.h b/stdlib/stdlib.h index be778edfe4..09418afb28 100644 --- a/stdlib/stdlib.h +++ b/stdlib/stdlib.h @@ -368,26 +368,16 @@ extern void qsort __P ((__ptr_t __base, size_t __nmemb, size_t __size, __compar_fn_t __compar)); -#ifndef __CONSTVALUE -#ifdef __GNUC__ -/* The `const' keyword tells GCC that a function's return value is - based solely on its arguments, and there are no side-effects. */ -#define __CONSTVALUE __const -#else -#define __CONSTVALUE -#endif /* GCC. */ -#endif /* __CONSTVALUE not defined. */ - /* Return the absolute value of X. */ -extern __CONSTVALUE int abs __P ((int __x)); -extern __CONSTVALUE long int labs __P ((long int __x)); +extern int abs __P ((int __x)) __attribute__ ((__const__)); +extern long int labs __P ((long int __x)) __attribute__ ((__const__)); /* Return the `div_t' or `ldiv_t' representation of the value of NUMER over DENOM. */ /* GCC may have built-ins for these someday. */ -extern __CONSTVALUE div_t div __P ((int __numer, int __denom)); -extern __CONSTVALUE ldiv_t ldiv __P ((long int __numer, long int __denom)); +extern div_t div __P ((int __numer, int __denom)) __attribute__ ((__const__)); +extern ldiv_t ldiv __P ((long int __numer, long int __denom)) __attribute__ ((__const__)); #ifdef __USE_SVID diff --git a/sysdeps/generic/hypot.c b/sysdeps/generic/hypot.c index a0ea8e11ea..5abae58674 100644 --- a/sysdeps/generic/hypot.c +++ b/sysdeps/generic/hypot.c @@ -20,7 +20,7 @@ Cambridge, MA 02139, USA. */ #include <math.h> /* Return `sqrt(x*x + y*y)'. */ -__CONSTVALUE double +double DEFUN(hypot, (x, y), double x AND double y) { return sqrt(x*x + y*y); diff --git a/sysdeps/generic/putenv.c b/sysdeps/generic/putenv.c index 06a195d06b..d8258cf270 100644 --- a/sysdeps/generic/putenv.c +++ b/sysdeps/generic/putenv.c @@ -61,7 +61,7 @@ putenv (string) char *name = alloca (name_end - string + 1); memcpy (name, string, name_end - string); name[name_end - string] = '\0'; - return setenv (name, string + 1, 1); + return setenv (name, name_end + 1, 1); } unsetenv (string); diff --git a/sysdeps/ieee754/cabs.c b/sysdeps/ieee754/cabs.c index 6b0d4c4cde..eed81ece58 100644 --- a/sysdeps/ieee754/cabs.c +++ b/sysdeps/ieee754/cabs.c @@ -89,6 +89,8 @@ static char sccsid[] = "@(#)cabs.c 5.6 (Berkeley) 10/9/90"; */ #include "mathimpl.h" +#if 0 /* Moved to separate file. */ + vc(r2p1hi, 2.4142135623730950345E0 ,8279,411a,ef32,99fc, 2, .9A827999FCEF32) vc(r2p1lo, 1.4349369327986523769E-17 ,597d,2484,754b,89b3, -55, .84597D89B3754B) vc(sqrt2, 1.4142135623730950622E0 ,04f3,40b5,de65,33f9, 1, .B504F333F9DE65) @@ -157,6 +159,8 @@ double x, y; else return(copysign(y,one)); /* y is INF */ } +#endif /* 0 */ + /* CABS(Z) * RETURN THE ABSOLUTE VALUE OF THE COMPLEX NUMBER Z = X + iY * DOUBLE PRECISION (VAX D format 56 bits, IEEE DOUBLE 53 BITS) diff --git a/sysdeps/ieee754/hypot.c b/sysdeps/ieee754/hypot.c new file mode 100644 index 0000000000..cdc2ed02b9 --- /dev/null +++ b/sysdeps/ieee754/hypot.c @@ -0,0 +1,197 @@ +/* + * Copyright (c) 1985 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* HYPOT(X,Y) + * RETURN THE SQUARE ROOT OF X^2 + Y^2 WHERE Z=X+iY + * DOUBLE PRECISION (VAX D format 56 bits, IEEE DOUBLE 53 BITS) + * CODED IN C BY K.C. NG, 11/28/84; + * REVISED BY K.C. NG, 7/12/85. + * + * Required system supported functions : + * copysign(x,y) + * finite(x) + * scalb(x,N) + * sqrt(x) + * + * Method : + * 1. replace x by |x| and y by |y|, and swap x and + * y if y > x (hence x is never smaller than y). + * 2. Hypot(x,y) is computed by: + * Case I, x/y > 2 + * + * y + * hypot = x + ----------------------------- + * 2 + * sqrt ( 1 + [x/y] ) + x/y + * + * Case II, x/y <= 2 + * y + * hypot = x + -------------------------------------------------- + * 2 + * [x/y] - 2 + * (sqrt(2)+1) + (x-y)/y + ----------------------------- + * 2 + * sqrt ( 1 + [x/y] ) + sqrt(2) + * + * + * + * Special cases: + * hypot(x,y) is INF if x or y is +INF or -INF; else + * hypot(x,y) is NAN if x or y is NAN. + * + * Accuracy: + * hypot(x,y) returns the sqrt(x^2+y^2) with error less than 1 ulps (units + * in the last place). See Kahan's "Interval Arithmetic Options in the + * Proposed IEEE Floating Point Arithmetic Standard", Interval Mathematics + * 1980, Edited by Karl L.E. Nickel, pp 99-128. (A faster but less accurate + * code follows in comments.) In a test run with 500,000 random arguments + * on a VAX, the maximum observed error was .959 ulps. + * + * Constants: + * The hexadecimal values are the intended ones for the following constants. + * The decimal values may be used, provided that the compiler will convert + * from decimal to binary accurately enough to produce the hexadecimal values + * shown. + */ +#include "mathimpl.h" + +vc(r2p1hi, 2.4142135623730950345E0 ,8279,411a,ef32,99fc, 2, .9A827999FCEF32) +vc(r2p1lo, 1.4349369327986523769E-17 ,597d,2484,754b,89b3, -55, .84597D89B3754B) +vc(sqrt2, 1.4142135623730950622E0 ,04f3,40b5,de65,33f9, 1, .B504F333F9DE65) + +ic(r2p1hi, 2.4142135623730949234E0 , 1, 1.3504F333F9DE6) +ic(r2p1lo, 1.2537167179050217666E-16 , -53, 1.21165F626CDD5) +ic(sqrt2, 1.4142135623730951455E0 , 0, 1.6A09E667F3BCD) + +#ifdef vccast +#define r2p1hi vccast(r2p1hi) +#define r2p1lo vccast(r2p1lo) +#define sqrt2 vccast(sqrt2) +#endif + +double +hypot(x,y) +double x, y; +{ + static const double zero=0, one=1, + small=1.0E-18; /* fl(1+small)==1 */ + static const ibig=30; /* fl(1+2**(2*ibig))==1 */ + double t,r; + int exp; + + if(finite(x)) + if(finite(y)) + { + x=copysign(x,one); + y=copysign(y,one); + if(y > x) + { t=x; x=y; y=t; } + if(x == zero) return(zero); + if(y == zero) return(x); + exp= logb(x); + if(exp-(int)logb(y) > ibig ) + /* raise inexact flag and return |x| */ + { one+small; return(x); } + + /* start computing sqrt(x^2 + y^2) */ + r=x-y; + if(r>y) { /* x/y > 2 */ + r=x/y; + r=r+sqrt(one+r*r); } + else { /* 1 <= x/y <= 2 */ + r/=y; t=r*(r+2.0); + r+=t/(sqrt2+sqrt(2.0+t)); + r+=r2p1lo; r+=r2p1hi; } + + r=y/r; + return(x+r); + + } + + else if(y==y) /* y is +-INF */ + return(copysign(y,one)); + else + return(y); /* y is NaN and x is finite */ + + else if(x==x) /* x is +-INF */ + return (copysign(x,one)); + else if(finite(y)) + return(x); /* x is NaN, y is finite */ +#if !defined(vax)&&!defined(tahoe) + else if(y!=y) return(y); /* x and y is NaN */ +#endif /* !defined(vax)&&!defined(tahoe) */ + else return(copysign(y,one)); /* y is INF */ +} + +/* A faster but less accurate version of cabs(x,y) */ +#if 0 +double hypot(x,y) +double x, y; +{ + static const double zero=0, one=1; + small=1.0E-18; /* fl(1+small)==1 */ + static const ibig=30; /* fl(1+2**(2*ibig))==1 */ + double temp; + int exp; + + if(finite(x)) + if(finite(y)) + { + x=copysign(x,one); + y=copysign(y,one); + if(y > x) + { temp=x; x=y; y=temp; } + if(x == zero) return(zero); + if(y == zero) return(x); + exp= logb(x); + x=scalb(x,-exp); + if(exp-(int)logb(y) > ibig ) + /* raise inexact flag and return |x| */ + { one+small; return(scalb(x,exp)); } + else y=scalb(y,-exp); + return(scalb(sqrt(x*x+y*y),exp)); + } + + else if(y==y) /* y is +-INF */ + return(copysign(y,one)); + else + return(y); /* y is NaN and x is finite */ + + else if(x==x) /* x is +-INF */ + return (copysign(x,one)); + else if(finite(y)) + return(x); /* x is NaN, y is finite */ + else if(y!=y) return(y); /* x and y is NaN */ + else return(copysign(y,one)); /* y is INF */ +} +#endif diff --git a/sysdeps/ieee754/ieee754.h b/sysdeps/ieee754/ieee754.h index 9cc6f14707..632564e330 100644 --- a/sysdeps/ieee754/ieee754.h +++ b/sysdeps/ieee754/ieee754.h @@ -135,14 +135,16 @@ union ieee854_long_double unsigned int negative:1; unsigned int exponent:15; unsigned int empty:16; + unsigned int one:1; unsigned int quiet_nan:1; - unsigned int mantissa0:31; + unsigned int mantissa0:30; unsigned int mantissa1:32; #endif #if __BYTE_ORDER == __LITTLE_ENDIAN unsigned int mantissa1:32; - unsigned int mantissa0:31; + unsigned int mantissa0:30; unsigned int quiet_nan:1; + unsigned int one:1 unsigned int exponent:15; unsigned int negative:1; unsigned int empty:16; diff --git a/sysdeps/m68k/__longjmp.c b/sysdeps/m68k/__longjmp.c index 4fc61084a0..92dd803c17 100644 --- a/sysdeps/m68k/__longjmp.c +++ b/sysdeps/m68k/__longjmp.c @@ -29,22 +29,21 @@ __longjmp (__jmp_buf env, int val) #if defined(__HAVE_68881__) || defined(__HAVE_FPU__) /* Restore the floating-point registers. */ - asm volatile("fmovem%.x %0, fp0-fp7" : - /* No outputs. */ : "g" (env[0].__fpregs[0]) : - "fp0", "fp1", "fp2", "fp3", "fp4", "fp5", "fp6", "fp7"); + asm volatile("fmovem%.x %0, %/fp0-%/fp7" : + /* No outputs. */ : "g" (env[0].__fpregs[0])); #endif /* Put VAL in D0. */ - asm volatile("move%.l %0, d0" : /* No outputs. */ : + asm volatile("move%.l %0, %/d0" : /* No outputs. */ : "g" (val == 0 ? 1 : val) : "d0"); asm volatile(/* Restore the data and address registers. */ - "movem%.l %0, d1-d7/a0-a7\n" + "movem%.l %0, %/d1-%/d7/%/a0-%/a7\n" /* Return to setjmp's caller. */ #ifdef __motorola__ - "jmp (a0)" + "jmp (%/a0)" #else - "jmp a0@" + "jm |
