diff options
Diffstat (limited to 'sysdeps')
28 files changed, 554 insertions, 252 deletions
diff --git a/sysdeps/gnu/errlist.awk b/sysdeps/gnu/errlist.awk index a640fe5a11..87444db8d3 100644 --- a/sysdeps/gnu/errlist.awk +++ b/sysdeps/gnu/errlist.awk @@ -16,7 +16,7 @@ # not, write to the Free Software Foundation, Inc., 675 Mass Ave, # Cambridge, MA 02139, USA. -# errno.texinfo contains lines like: +# errno.texi contains lines like: # @comment errno.h # @comment POSIX.1: Function not implemented # @deftypevr Macro int ENOSYS diff --git a/sysdeps/gnu/errlist.c b/sysdeps/gnu/errlist.c index 700b69f58f..f998747848 100644 --- a/sysdeps/gnu/errlist.c +++ b/sysdeps/gnu/errlist.c @@ -797,6 +797,14 @@ TRANS This error code has no purpose. */ /* */ [EREMOTEIO] = N_("Remote I/O error"), #endif +#ifdef ENOMEDIUM +/* */ + [ENOMEDIUM] = N_("No medium found"), +#endif +#ifdef EMEDIUMTYPE +/* */ + [EMEDIUMTYPE] = N_("Wrong medium type"), +#endif }; const int _sys_nerr = sizeof _sys_errlist / sizeof _sys_errlist[0]; diff --git a/sysdeps/i386/memset.c b/sysdeps/i386/memset.c index e1e12fb742..454c7385af 100644 --- a/sysdeps/i386/memset.c +++ b/sysdeps/i386/memset.c @@ -23,7 +23,7 @@ #ifdef __GNUC__ -vod * +void * memset (void *dstpp, int c, size_t len) { unsigned long int dstp = (unsigned long int) dstpp; diff --git a/sysdeps/libm-ieee754/s_asinhl.c b/sysdeps/libm-ieee754/s_asinhl.c index d5b307753e..6eb434c44b 100644 --- a/sysdeps/libm-ieee754/s_asinhl.c +++ b/sysdeps/libm-ieee754/s_asinhl.c @@ -65,6 +65,6 @@ huge= 1.000000000000000000e+4900L; t = x*x; w =__log1pl(fabsl(x)+t/(one+__ieee754_sqrtl(one+t))); } - if(hx>0x8000) return -w; else return w; + if(hx&0x8000) return -w; else return w; } weak_alias (__asinhl, asinhl) diff --git a/sysdeps/libm-ieee754/s_log2f.c b/sysdeps/libm-ieee754/s_log2f.c index c204e2266a..6415c37f53 100644 --- a/sysdeps/libm-ieee754/s_log2f.c +++ b/sysdeps/libm-ieee754/s_log2f.c @@ -69,7 +69,7 @@ static float zero = 0.0; if((0x007fffff&(15+ix))<16) { /* |f| < 2**-20 */ if(f==zero) return dk; R = f*f*((float)0.5-(float)0.33333333333333333*f); - return dk-(R-f);} + return dk-(R-f); } s = f/((float)2.0+f); z = s*s; diff --git a/sysdeps/libm-ieee754/s_nan.c b/sysdeps/libm-ieee754/s_nan.c index 0d065d5c72..35d92646c0 100644 --- a/sysdeps/libm-ieee754/s_nan.c +++ b/sysdeps/libm-ieee754/s_nan.c @@ -18,31 +18,25 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* XXX The ISO C 9X standard mentions a `n-char-sequence' which is provided - as the argument to this function but I have no clue what this means. - Perhaps it is a description of the bits set in the mantissa. */ #include <math.h> -#ifdef HANDLE_TAGP -# include <stdlib.h> -# include <string.h> -#else -# include <ieee754.h> -#endif +#include <stdlib.h> +#include <string.h> +#include <ieee754.h> double __nan (const char *tagp) { -#ifdef HANDLE_TAGP - /* If we ever should have use of the TAGP parameter we will use the - strtod function to analyze it. */ - char buf[6 + strlen (tagp)]; - sprintf (buf, "NAN(%s)", tagp); - return strtod (buf, NULL); -#else static const union ieee754_double nan_value = - { ieee: { mantissa1: 0x1, mantissa0: 0x0, exponent: 0x7ff, negative: 0 } }; + { ieee: { mantissa1: 0, mantissa0: 0x80000, exponent: 0x7ff, negative: 0 } }; + + if (tagp[0] != '\0') + { + char buf[6 + strlen (tagp)]; + sprintf (buf, "NAN(%s)", tagp); + return strtod (buf, NULL); + } + return nan_value.d; -#endif } weak_alias (__nan, nan) diff --git a/sysdeps/libm-ieee754/s_nanf.c b/sysdeps/libm-ieee754/s_nanf.c index 660f30daf3..8e6e3fc1fd 100644 --- a/sysdeps/libm-ieee754/s_nanf.c +++ b/sysdeps/libm-ieee754/s_nanf.c @@ -18,31 +18,25 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* XXX The ISO C 9X standard mentions a `n-char-sequence' which is provided - as the argument to this function but I have no clue what this means. - Perhaps it is a description of the bits set in the mantissa. */ #include <math.h> -#ifdef HANDLE_TAGP -# include <stdlib.h> -# include <string.h> -#else -# include <ieee754.h> -#endif +#include <stdlib.h> +#include <string.h> +#include <ieee754.h> float __nanf (const char *tagp) { -#ifdef HANDLE_TAGP - /* If we ever should have use of the TAGP parameter we will use the - strtod function to analyze it. */ - char buf[6 + strlen (tagp)]; - sprintf (buf, "NAN(%s)", tagp); - return strtof (buf, NULL); -#else static const union ieee754_float nan_value = - { ieee: { mantissa: 0x1, exponent: 0xff, negative: 0 } }; + { ieee: { mantissa: 0x400000, exponent: 0xff, negative: 0 } }; + + if (tagp[0] != '\0') + { + char buf[6 + strlen (tagp)]; + sprintf (buf, "NAN(%s)", tagp); + return strtof (buf, NULL); + } + return nan_value.f; -#endif } weak_alias (__nanf, nanf) diff --git a/sysdeps/libm-ieee754/s_nanl.c b/sysdeps/libm-ieee754/s_nanl.c index 4ade80424f..1cd026e00c 100644 --- a/sysdeps/libm-ieee754/s_nanl.c +++ b/sysdeps/libm-ieee754/s_nanl.c @@ -18,32 +18,26 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* XXX The ISO C 9X standard mentions a `n-char-sequence' which is provided - as the argument to this function but I have no clue what this means. - Perhaps it is a description of the bits set in the mantissa. */ #include <math.h> -#ifdef HANDLE_TAGP -# include <stdlib.h> -# include <string.h> -#else -# include <ieee754.h> -#endif +#include <stdlib.h> +#include <string.h> +#include <ieee754.h> long double __nanl (const char *tagp) { -#ifdef HANDLE_TAGP - /* If we ever should have use of the TAGP parameter we will use the - strtod function to analyze it. */ - char buf[6 + strlen (tagp)]; - sprintf (buf, "NAN(%s)", tagp); - return strtold (buf, NULL); -#else static const union ieee854_long_double nan_value = - { ieee: { mantissa1: 0x1, mantissa0: 0x80000000, + { ieee: { mantissa1: 0, mantissa0: 0xc0000000, exponent: 0x7fff, negative: 0 } }; + + if (tagp[0] != '\0') + { + char buf[6 + strlen (tagp)]; + sprintf (buf, "NAN(%s)", tagp); + return strtold (buf, NULL); + } + return nan_value.d; -#endif } weak_alias (__nanl, nanl) diff --git a/sysdeps/m68k/Makefile b/sysdeps/m68k/Makefile index fc79d36804..0f811bc62e 100644 --- a/sysdeps/m68k/Makefile +++ b/sysdeps/m68k/Makefile @@ -34,3 +34,8 @@ long-double-fcts = yes ifeq ($(subdir),elf) CFLAGS-rtld.c += -Wno-uninitialized -Wno-unused endif + +ifeq ($(subdir),math) +# Avoid a bug in gcc +CFLAGS-s_copysignl.c += -mnobitfield +endif diff --git a/sysdeps/m68k/fpu/__math.h b/sysdeps/m68k/fpu/__math.h index d6187015ea..9b52b32d0c 100644 --- a/sysdeps/m68k/fpu/__math.h +++ b/sysdeps/m68k/fpu/__math.h @@ -89,6 +89,7 @@ __inline_mathop(__significand, getman) __inline_mathop(__log2, log2) __inline_mathop(__exp2, twotox) +__inline_mathop(__trunc, intrz) #if !defined __NO_MATH_INLINES && defined __OPTIMIZE__ @@ -111,6 +112,7 @@ __inline_mathop(significand, getman) #ifdef __USE_ISOC9X __inline_mathop(log2, log2) __inline_mathop(exp2, twotox) +__inline_mathop(trunc, intrz) #endif #endif /* !__NO_MATH_INLINES && __OPTIMIZE__ */ @@ -155,108 +157,123 @@ __internal_inline_functions (long double,l) /* The rest of the functions are available to the user. */ -#define __inline_functions(float_type, s) \ -__m81_inline float_type \ -__m81_u(__CONCAT(__frexp,s))(float_type __value, int *__expptr) \ -{ \ - float_type __mantissa, __exponent; \ - int __iexponent; \ - if (__value == 0.0) \ - { \ - *__expptr = 0; \ - return __value; \ - } \ - __asm("fgetexp%.x %1, %0" : "=f" (__exponent) : "f" (__value)); \ - __iexponent = (int) __exponent + 1; \ - *__expptr = __iexponent; \ - __asm("fscale%.l %2, %0" : "=f" (__mantissa) \ - : "0" (__value), "dmi" (-__iexponent)); \ - return __mantissa; \ -} \ - \ -__m81_defun (float_type, __CONCAT(__floor,s), (float_type __x)) \ -{ \ - float_type __result; \ - unsigned long int __ctrl_reg; \ - __asm __volatile__ ("fmove%.l %!, %0" : "=dm" (__ctrl_reg)); \ - /* Set rounding towards negative infinity. */ \ - __asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */ \ - : "dmi" ((__ctrl_reg & ~0x10) | 0x20)); \ - /* Convert X to an integer, using -Inf rounding. */ \ - __asm __volatile__ ("fint%.x %1, %0" : "=f" (__result) : "f" (__x)); \ - /* Restore the previous rounding mode. */ \ - __asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */ \ - : "dmi" (__ctrl_reg)); \ - return __result; \ -} \ - \ -__m81_defun (float_type, __CONCAT(__ceil,s), (float_type __x)) \ -{ \ - float_type __result; \ - unsigned long int __ctrl_reg; \ - __asm __volatile__ ("fmove%.l %!, %0" : "=dm" (__ctrl_reg)); \ - /* Set rounding towards positive infinity. */ \ - __asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */ \ - : "dmi" (__ctrl_reg | 0x30)); \ - /* Convert X to an integer, using +Inf rounding. */ \ - __asm __volatile__ ("fint%.x %1, %0" : "=f" (__result) : "f" (__x)); \ - /* Restore the previous rounding mode. */ \ - __asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */ \ - : "dmi" (__ctrl_reg)); \ - return __result; \ -} \ - \ -__m81_inline float_type \ -__m81_u(__CONCAT(__modf,s))(float_type __value, float_type *__iptr) \ -{ \ - float_type __modf_int; \ - __asm ("fintrz%.x %1, %0" : "=f" (__modf_int) : "f" (__value)); \ - *__iptr = __modf_int; \ - return __value - __modf_int; \ -} \ - \ -__m81_defun (int, __CONCAT(__isinf,s), (float_type __value)) \ -{ \ - /* There is no branch-condition for infinity, \ - so we must extract and examine the condition codes manually. */ \ - unsigned long int __fpsr; \ - __asm("ftst%.x %1\n" \ - "fmove%.l %/fpsr, %0" : "=dm" (__fpsr) : "f" (__value)); \ - return (__fpsr & (2 << 24)) ? (__fpsr & (8 << 24) ? -1 : 1) : 0; \ -} \ - \ -__m81_defun (int, __CONCAT(__isnan,s), (float_type __value)) \ -{ \ - char __result; \ - __asm("ftst%.x %1\n" \ - "fsun %0" : "=dm" (__result) : "f" (__value)); \ - return __result; \ -} \ - \ -__m81_defun (int, __CONCAT(__finite,s), (float_type __value)) \ -{ \ - /* There is no branch-condition for infinity, so we must extract and \ - examine the condition codes manually. */ \ - unsigned long int __fpsr; \ - __asm ("ftst%.x %1\n" \ - "fmove%.l %/fpsr, %0" : "=dm" (__fpsr) : "f" (__value)); \ - return (__fpsr & (3 << 24)) == 0; \ -} \ - \ -__m81_defun (int, __CONCAT(__ilogb,s), (float_type __x)) \ -{ \ - float_type __result; \ - if (__x == 0.0) \ - return 0x80000001; \ - __asm("fgetexp%.x %1, %0" : "=f" (__result) : "f" (__x)); \ - return (int) __result; \ -} \ - \ -__m81_defun (float_type, __CONCAT(__scalbn,s), (float_type __x, int __n)) \ -{ \ - float_type __result; \ - __asm ("fscale%.l %1, %0" : "=f" (__result) : "dmi" (__n), "0" (__x)); \ - return __result; \ +#define __inline_functions(float_type, s) \ +__m81_inline float_type \ +__m81_u(__CONCAT(__frexp,s))(float_type __value, int *__expptr) \ +{ \ + float_type __mantissa, __exponent; \ + int __iexponent; \ + if (__value == 0.0) \ + { \ + *__expptr = 0; \ + return __value; \ + } \ + __asm("fgetexp%.x %1, %0" : "=f" (__exponent) : "f" (__value)); \ + __iexponent = (int) __exponent + 1; \ + *__expptr = __iexponent; \ + __asm("fscale%.l %2, %0" : "=f" (__mantissa) \ + : "0" (__value), "dmi" (-__iexponent)); \ + return __mantissa; \ +} \ + \ +__m81_defun (float_type, __CONCAT(__floor,s), (float_type __x)) \ +{ \ + float_type __result; \ + unsigned long int __ctrl_reg; \ + __asm __volatile__ ("fmove%.l %!, %0" : "=dm" (__ctrl_reg)); \ + /* Set rounding towards negative infinity. */ \ + __asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */ \ + : "dmi" ((__ctrl_reg & ~0x10) | 0x20)); \ + /* Convert X to an integer, using -Inf rounding. */ \ + __asm __volatile__ ("fint%.x %1, %0" : "=f" (__result) : "f" (__x)); \ + /* Restore the previous rounding mode. */ \ + __asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */ \ + : "dmi" (__ctrl_reg)); \ + return __result; \ +} \ + \ +__m81_defun (float_type, __CONCAT(__ceil,s), (float_type __x)) \ +{ \ + float_type __result; \ + unsigned long int __ctrl_reg; \ + __asm __volatile__ ("fmove%.l %!, %0" : "=dm" (__ctrl_reg)); \ + /* Set rounding towards positive infinity. */ \ + __asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */ \ + : "dmi" (__ctrl_reg | 0x30)); \ + /* Convert X to an integer, using +Inf rounding. */ \ + __asm __volatile__ ("fint%.x %1, %0" : "=f" (__result) : "f" (__x)); \ + /* Restore the previous rounding mode. */ \ + __asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */ \ + : "dmi" (__ctrl_reg)); \ + return __result; \ +} \ + \ +__m81_defun (int, __CONCAT(__isinf,s), (float_type __value)) \ +{ \ + /* There is no branch-condition for infinity, \ + so we must extract and examine the condition codes manually. */ \ + unsigned long int __fpsr; \ + __asm("ftst%.x %1\n" \ + "fmove%.l %/fpsr, %0" : "=dm" (__fpsr) : "f" (__value)); \ + return (__fpsr & (2 << 24)) ? (__fpsr & (8 << 24) ? -1 : 1) : 0; \ +} \ + \ +__m81_defun (int, __CONCAT(__isnan,s), (float_type __value)) \ +{ \ + char __result; \ + __asm("ftst%.x %1\n" \ + "fsun %0" : "=dm" (__result) : "f" (__value)); \ + return __result; \ +} \ + \ +__m81_defun (int, __CONCAT(__finite,s), (float_type __value)) \ +{ \ + /* There is no branch-condition for infinity, so we must extract and \ + examine the condition codes manually. */ \ + unsigned long int __fpsr; \ + __asm ("ftst%.x %1\n" \ + "fmove%.l %/fpsr, %0" : "=dm" (__fpsr) : "f" (__value)); \ + return (__fpsr & (3 << 24)) == 0; \ +} \ + \ +__m81_defun (int, __CONCAT(__signbit,s), (float_type __value)) \ +{ \ + /* There is no branch-condition for the sign bit, so we must extract \ + and examine the condition codes manually. */ \ + unsigned long int __fpsr; \ + __asm ("ftst%.x %1\n" \ + "fmove%.l %/fpsr, %0" : "=dm" (__fpsr) : "f" (__value)); \ + return (__fpsr >> 27) & 1; \ +} \ + \ +__m81_defun (int, __CONCAT(__ilogb,s), (float_type __x)) \ +{ \ + float_type __result; \ + if (__x == 0.0) \ + return 0x80000001; \ + __asm("fgetexp%.x %1, %0" : "=f" (__result) : "f" (__x)); \ + return (int) __result; \ +} \ + \ +__m81_defun (float_type, __CONCAT(__scalbn,s), (float_type __x, int __n)) \ +{ \ + float_type __result; \ + __asm ("fscale%.l %1, %0" : "=f" (__result) : "dmi" (__n), "0" (__x)); \ + return __result; \ +} \ + \ +__m81_defun (float_type, __CONCAT(__nearbyint,s), (float_type __x)) \ +{ \ + float_type __result; \ + unsigned long int __ctrl_reg; \ + __asm __volatile__ ("fmove%.l %!, %0" : "=dm" (__ctrl_reg)); \ + /* Temporarily disable the inexact exception. */ \ + __asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */ \ + : "dmi" (__ctrl_reg & ~0x200)); \ + __asm __volatile__ ("fint%.x %1, %0" : "=f" (__result) : "f" (__x)); \ + __asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */ \ + : "dmi" (__ctrl_reg)); \ + return __result; \ } /* This defines the three variants of the inline functions. */ @@ -286,8 +303,6 @@ __inline_forward(double,frexp, (double __value, int *__expptr), (__value, __expptr)) __inline_forward_c(double,floor, (double __x), (__x)) __inline_forward_c(double,ceil, (double __x), (__x)) -__inline_forward(double,modf, (double __value, double *__iptr), - (__value, __iptr)) #ifdef __USE_MISC __inline_forward_c(int,isinf, (double __value), (__value)) __inline_forward_c(int,finite, (double __value), (__value)) @@ -299,6 +314,9 @@ __inline_forward_c(int,isnan, (double __value), (__value)) #endif __inline_forward_c(int,ilogb, (double __value), (__value)) #endif +#ifdef __USE_ISOC9X +__inline_forward_c(double,nearbyint, (double __value), (__value)) +#endif #if defined __USE_MISC || defined __USE_ISOC9X @@ -306,8 +324,6 @@ __inline_forward(float,frexpf, (float __value, int *__expptr), (__value, __expptr)) __inline_forward_c(float,floorf, (float __x), (__x)) __inline_forward_c(float,ceilf, (float __x), (__x)) -__inline_forward(float,modff, (float __value, float *__iptr), - (__value, __iptr)) #ifdef __USE_MISC __inline_forward_c(int,isinff, (float __value), (__value)) __inline_forward_c(int,finitef, (float __value), (__value)) @@ -315,14 +331,14 @@ __inline_forward_c(float,scalbnf, (float __x, int __n), (__x, __n)) __inline_forward_c(int,isnanf, (float __value), (__value)) __inline_forward_c(int,ilogbf, (float __value), (__value)) #endif +#ifdef __USE_ISOC9X +__inline_forward_c(float,nearbyintf, (float __value), (__value)) +#endif __inline_forward(long double,frexpl, (long double __value, int *__expptr), (__value, __expptr)) __inline_forward_c(long double,floorl, (long double __x), (__x)) __inline_forward_c(long double,ceill, (long double __x), (__x)) -__inline_forward(long double,modfl, - (long double __value, long double *__iptr), - (__value, __iptr)) #ifdef __USE_MISC __inline_forward_c(int,isinfl, (long double __value), (__value)) __inline_forward_c(int,finitel, (long double __value), (__value)) @@ -331,6 +347,9 @@ __inline_forward_c(long double,scalbnl, (long double __x, int __n), __inline_forward_c(int,isnanl, (long double __value), (__value)) __inline_forward_c(int,ilogbl, (long double __value), (__value)) #endif +#ifdef __USE_ISOC9X +__inline_forward_c(long double,nearbyintl, (long double __value), (__value)) +#endif #endif /* Use misc or ISO C9X */ diff --git a/sysdeps/m68k/fpu/e_atan2.c b/sysdeps/m68k/fpu/e_atan2.c index 58d7555f41..c012070a93 100644 --- a/sysdeps/m68k/fpu/e_atan2.c +++ b/sysdeps/m68k/fpu/e_atan2.c @@ -27,10 +27,12 @@ #define float_type double #endif -#define __CONCATX(a,b) __CONCAT(a,b) +#define CONCATX(a,b) __CONCAT(a,b) +#define s(name) CONCATX(name,SUFF) +#define m81(func) __m81_u(s(func)) float_type -__CONCATX(__ieee754_atan2,SUFF) (float_type y, float_type x) +s(__ieee754_atan2) (float_type y, float_type x) { float_type pi, pi_2, z; @@ -40,41 +42,41 @@ __CONCATX(__ieee754_atan2,SUFF) (float_type y, float_type x) z = x + y; else if (y == 0) { - if (signbit (x)) - z = signbit (y) ? -pi : pi; + if (m81(__signbit) (x)) + z = m81(__signbit) (y) ? -pi : pi; else z = y; } - else if (__m81_u(__CONCATX(__isinf,SUFF)) (x)) + else if (m81(__isinf) (x)) { - if (__m81_u(__CONCATX(__isinf,SUFF)) (y)) + if (m81(__isinf) (y)) { float_type pi_4; - __asm ("fscale%.w %#-1, %0" : "=f" (pi_4) : "0" (pi_2)); + __asm ("fscale%.w %#-2, %0" : "=f" (pi_4) : "0" (pi)); z = x > 0 ? pi_4 : 3 * pi_4; } else z = x > 0 ? 0 : pi; - if (signbit (y)) + if (m81(__signbit) (y)) z = -z; } - else if (__m81_u(__CONCATX(__isinf,SUFF)) (y)) + else if (m81(__isinf) (y)) z = y > 0 ? pi_2 : -pi_2; else if (x > 0) { if (y > 0) { if (x > y) - z = __m81_u(__CONCATX(__atan,SUFF)) (y / x); + z = m81(__atan) (y / x); else - z = pi_2 - __m81_u(__CONCATX(__atan,SUFF)) (x / y); + z = pi_2 - m81(__atan) (x / y); } else { if (x > -y) - z = __m81_u(__CONCATX(__atan,SUFF)) (y / x); + z = m81(__atan) (y / x); else - z = -pi_2 - __m81_u(__CONCATX(__atan,SUFF)) (x / y); + z = -pi_2 - m81(__atan) (x / y); } } else @@ -82,16 +84,16 @@ __CONCATX(__ieee754_atan2,SUFF) (float_type y, float_type x) if (y < 0) { if (-x > y) - z = -pi + __m81_u(__CONCATX(__atan,SUFF)) (y / x); + z = -pi + m81(__atan) (y / x); else - z = -pi_2 - __m81_u(__CONCATX(__atan,SUFF)) (x / y); + z = -pi_2 - m81(__atan) (x / y); } else { if (-x > y) - z = pi + __m81_u(__CONCATX(__atan,SUFF)) (y / x); + z = pi + m81(__atan) (y / x); else - z = pi_2 - __m81_u(__CONCATX(__atan,SUFF)) (x / y); + z = pi_2 - m81(__atan) (x / y); } } return z; diff --git a/sysdeps/m68k/fpu/e_pow.c b/sysdeps/m68k/fpu/e_pow.c index 970e8b821b..284f1bf294 100644 --- a/sysdeps/m68k/fpu/e_pow.c +++ b/sysdeps/m68k/fpu/e_pow.c @@ -27,10 +27,12 @@ #define float_type double #endif -#define __CONCATX(a,b) __CONCAT(a,b) +#define CONCATX(a,b) __CONCAT(a,b) +#define s(name) CONCATX(name,SUFF) +#define m81(func) __m81_u(s(func)) float_type -__CONCATX(__ieee754_pow,SUFF) (float_type x, float_type y) +s(__ieee754_pow) (float_type x, float_type y) { float_type z; float_type ax; @@ -40,24 +42,24 @@ __CONCATX(__ieee754_pow,SUFF) (float_type x, float_type y) if (x != x || y != y) return x + y; - if (__m81_u(__CONCATX(__isinf,SUFF)) (y)) + if (m81(__isinf) (y)) { - ax = __CONCATX(fabs,SUFF) (x); + ax = s(fabs) (x); if (ax == 1) - return y - y; + return 0.0/0.0; if (ax > 1) return y > 0 ? y : 0; else return y < 0 ? -y : 0; } - if (__CONCATX(fabs,SUFF) (y) == 1) + if (s(fabs) (y) == 1) return y > 0 ? x : 1 / x; if (y == 2) return x * x; - if (y == 0 && x >= 0) - return __m81_u(__CONCATX(__ieee754_sqrt,SUFF)) (x); + if (y == 0.5 && x >= 0) + return m81(__ieee754_sqrt) (x); if (x == 10.0) { @@ -70,19 +72,19 @@ __CONCATX(__ieee754_pow,SUFF) (float_type x, float_type y) return z; } - ax = __CONCATX(fabs,SUFF) (x); - if (__m81_u(__CONCATX(__isinf,SUFF)) (x) || x == 0 || ax == 1) + ax = s(fabs) (x); + if (m81(__isinf) (x) || x == 0 || ax == 1) { z = ax; if (y < 0) z = 1 / z; - if (signbit (x)) + if (m81(__signbit) (x)) { - float_type temp = __m81_u (__CONCATX(__rint,SUFF)) (y); + float_type temp = m81(__rint) (y); if (y != temp) { if (x == -1) - z = (z - z) / (z - z); + z = 0.0/0.0; } else { @@ -105,12 +107,11 @@ __CONCATX(__ieee754_pow,SUFF) (float_type x, float_type y) if (x < 0.0) { - float_type temp = __m81_u (__CONCATX(__rint,SUFF)) (y); + float_type temp = m81(__rint) (y); if (y == temp) { long long i = (long long) y; - z = (__m81_u(__CONCATX(__ieee754_exp,SUFF)) - (y * __m81_u(__CONCATX(__ieee754_log,SUFF)) (-x))); + z = m81(__ieee754_exp) (y * m81(__ieee754_log) (-x)); if (sizeof (float_type) == sizeof (float)) { long i = (long) y; @@ -126,10 +127,9 @@ __CONCATX(__ieee754_pow,SUFF) (float_type x, float_type y) } } else - z = (x - x) / (x - x); + z = 0.0/0.0; } else - z = (__m81_u(__CONCATX(__ieee754_exp,SUFF)) - (y * __m81_u(__CONCATX(__ieee754_log,SUFF)) (x))); + z = m81(__ieee754_exp) (y * m81(__ieee754_log) (x)); return z; } diff --git a/sysdeps/m68k/fpu/s_cexp.c b/sysdeps/m68k/fpu/s_cexp.c new file mode 100644 index 0000000000..d5c76453e8 --- /dev/null +++ b/sysdeps/m68k/fpu/s_cexp.c @@ -0,0 +1,92 @@ +/* Complex exponential function. m68k fpu version + 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 <complex.h> +#include <math.h> + +#ifndef SUFF +#define SUFF +#endif +#ifndef huge_val +#define huge_val HUGE_VAL +#endif +#ifndef float_type +#define float_type double +#endif + +#define CONCATX(a,b) __CONCAT(a,b) +#define s(name) CONCATX(name,SUFF) +#define m81(func) __m81_u(s(func)) + +__complex__ float_type +s(__cexp) (__complex__ float_type x) +{ + __complex__ float_type retval; + float_type sin_ix, cos_ix; + + if (m81(__finite) (__real__ x)) + { + if (m81(__finite) (__imag__ x)) + { + float_type exp_val = s(__exp) (__real__ x); + + __asm ("fsincos%.x %2,%1:%0" : "=f" (sin_ix), "=f" (cos_ix) + : "f" (__imag__ x)); + __real__ retval = exp_val * cos_ix; + __imag__ retval = exp_val * sin_ix; + } + else + /* If the imaginary part is +-inf or NaN and the real part is + not +-inf the result is NaN + iNaN. */ + __real__ retval = __imag__ retval = 0.0/0.0; + } + else if (m81(__isinf) (__real__ x)) + { + if (m81(__finite) (__imag__ x)) + { + if (m81(__signbit) (__real__ x) == 0 && __imag__ x == 0.0) + retval = huge_val; + else + { + float_type value = m81(__signbit) (__real__ x) ? 0.0 : huge_val; + + __asm ("fsincos%.x %2,%1:%0" : "=f" (sin_ix), "=f" (cos_ix) + : "f" (__imag__ x)); + __real__ retval = value * cos_ix; + __imag__ retval = value * sin_ix; + } + } + else if (m81(__signbit) (__real__ x) == 0) + { + __real__ retval = huge_val; + __imag__ retval = 0.0/0.0; + } + else + retval = 0.0; + } + else + /* If the real part is NaN the result is NaN + iNaN. */ + __real__ retval = __imag__ retval = 0.0/0.0; + + return retval; +} +#define weak_aliasx(a,b) weak_alias(a,b) +weak_aliasx (s(__cexp), s(cexp)) diff --git a/sysdeps/m68k/fpu/s_cexpf.c b/sysdeps/m68k/fpu/s_cexpf.c new file mode 100644 index 0000000000..db9f174546 --- /dev/null +++ b/sysdeps/m68k/fpu/s_cexpf.c @@ -0,0 +1,4 @@ +#define SUFF f +#define huge_val HUGE_VALF +#define float_type float +#include <s_cexp.c> diff --git a/sysdeps/m68k/fpu/s_cexpl.c b/sysdeps/m68k/fpu/s_cexpl.c new file mode 100644 index 0000000000..7367070548 --- /dev/null +++ b/sysdeps/m68k/fpu/s_cexpl.c @@ -0,0 +1,4 @@ +#define SUFF l +#define huge_val HUGE_VALL +#define float_type long double +#include <s_cexp.c> diff --git a/sysdeps/m68k/fpu/s_modf.c b/sysdeps/m68k/fpu/s_modf.c index 6428afc3be..ad0334faaa 100644 --- a/sysdeps/m68k/fpu/s_modf.c +++ b/sysdeps/m68k/fpu/s_modf.c @@ -19,22 +19,35 @@ #define __LIBC_M81_MATH_INLINES #include <math.h> -#ifndef FUNC -#define FUNC modf +#ifndef SUFF +#define SUFF #endif #ifndef float_type #define float_type double #endif -#define __CONCATX(a,b) __CONCAT(a,b) +#define CONCATX(a,b) __CONCAT(a,b) +#define s(name) CONCATX(name,SUFF) +#define m81(func) __m81_u(s(func)) float_type -__CONCATX(__,FUNC) (x, iptr) - float_type x; - float_type *iptr; +s(__modf) (float_type x, float_type *iptr) { - return __m81_u(__CONCATX(__,FUNC))(x, iptr); + float_type x_int, result; + __asm ("fintrz%.x %1, %0" : "=f" (x_int) : "f" (x)); + *iptr = x_int; + if (m81(__isinf) (x)) + { + result = 0; + if (x < 0) + result = -result; + } + else if (x == 0) + result = x; + else + result = x - x_int; + return result; } #define weak_aliasx(a,b) weak_alias(a,b) -weak_aliasx(__CONCATX(__,FUNC), FUNC) +weak_aliasx(s(__modf), s(modf)) diff --git a/sysdeps/m68k/fpu/s_modff.c b/sysdeps/m68k/fpu/s_modff.c index 37bff0022f..0c44d7c0ab 100644 --- a/sysdeps/m68k/fpu/s_modff.c +++ b/sysdeps/m68k/fpu/s_modff.c @@ -1,3 +1,3 @@ -#define FUNC modff +#define SUFF f #define float_type float #include <s_modf.c> diff --git a/sysdeps/m68k/fpu/s_modfl.c b/sysdeps/m68k/fpu/s_modfl.c index 51327dd1aa..c7075b3ba9 100644 --- a/sysdeps/m68k/fpu/s_modfl.c +++ b/sysdeps/m68k/fpu/s_modfl.c @@ -1,3 +1,3 @@ -#define FUNC modfl +#define SUFF l #define float_type long double #include <s_modf.c> diff --git a/sysdeps/m68k/fpu/s_nearbyint.c b/sysdeps/m68k/fpu/s_nearbyint.c new file mode 100644 index 0000000000..b87f5e2160 --- /dev/null +++ b/sysdeps/m68k/fpu/s_nearbyint.c @@ -0,0 +1,2 @@ +#define FUNC nearbyint +#include <s_atan.c> diff --git a/sysdeps/m68k/fpu/s_nearbyintf.c b/sysdeps/m68k/fpu/s_nearbyintf.c new file mode 100644 index 0000000000..70d08ab44c --- /dev/null +++ b/sysdeps/m68k/fpu/s_nearbyintf.c @@ -0,0 +1,2 @@ +#define FUNC nearbyintf +#include <s_atanf.c> diff --git a/sysdeps/m68k/fpu/s_nearbyintl.c b/sysdeps/m68k/fpu/s_nearbyintl.c new file mode 100644 index 0000000000..230cd7784c --- /dev/null +++ b/sysdeps/m68k/fpu/s_nearbyintl.c @@ -0,0 +1,2 @@ +#define FUNC nearbyintl +#include <s_atanl.c> diff --git a/sysdeps/m68k/fpu/s_trunc.c b/sysdeps/m68k/fpu/s_trunc.c new file mode 100644 index 0000000000..96f29a776c --- /dev/null +++ b/sysdeps/m68k/fpu/s_trunc.c @@ -0,0 +1,2 @@ +#define FUNC trunc +#include <s_atan.c> diff --git a/sysdeps/m68k/fpu/s_truncf.c b/sysdeps/m68k/fpu/s_truncf.c new file mode 100644 index 0000000000..44dca748ca --- /dev/null +++ b/sysdeps/m68k/fpu/s_truncf.c @@ -0,0 +1,2 @@ +#define FUNC truncf +#include <s_atanf.c> diff --git a/sysdeps/m68k/fpu/s_truncl.c b/sysdeps/m68k/fpu/s_truncl.c new file mode 100644 index 0000000000..8d35777aed --- /dev/null +++ b/sysdeps/m68k/fpu/s_truncl.c @@ -0,0 +1,2 @@ +#define FUNC truncl +#include <s_atanl.c> diff --git a/sysdeps/powerpc/strlen.s b/sysdeps/powerpc/strlen.s new file mode 100644 index 0000000000..eb6a88e2b8 --- /dev/null +++ b/sysdeps/powerpc/strlen.s @@ -0,0 +1,145 @@ + # Optimized strlen implementation for PowerPC. + # Copyright (C) 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. + + # The algorithm here uses the following techniques: + # + # 1) Given a word 'x', we can test to see if it contains any 0 bytes + # by subtracting 0x01010101, and seeing if any of the high bits of each + # byte changed from 0 to 1. This works because the least significant + # 0 byte must have had no incoming carry (otherwise it's not the least + # significant), so it is 0x00 - 0x01 == 0xff. For all other + # byte values, either they have the high bit set initially, or when + # 1 is subtracted you get a value in the range 0x00-0x7f, none of which + # have their high bit set. The expression here is + # (x + 0xfefefeff) & ~(x | 0x7f7f7f7f), which gives 0x00000000 when + # there were no 0x00 bytes in the word. + # + # 2) Given a word 'x', we can test to see _which_ byte was zero by + # calculating ~(((x & 0x7f7f7f7f) + 0x7f7f7f7f) | x | 0x7f7f7f7f). + # This produces 0x80 in each byte that was zero, and 0x00 in all + # the other bytes. The '| 0x7f7f7f7f' clears the low 7 bits in each + # byte, and the '| x' part ensures that bytes with the high bit set + # produce 0x00. The addition will carry into the high bit of each byte + # iff that byte had one of its low 7 bits set. We can then just see + # which was the most significant bit set and divide by 8 to find how + # many to add to the index. + # This is from the book 'The PowerPC Compiler Writer's Guide', + # by Steve Hoxey, Faraydon Karim, Bill Hay and Hank Warren. + # + # We deal with strings not aligned to a word boundary by taking the + # first word and ensuring that bytes not part of the string + # are treated as nonzero. To allow for memory latency, we unroll the + # loop a few times, being careful to ensure that we do not read ahead + # across cache line boundaries. + # + # Questions to answer: + # 1) How long are strings passed to strlen? If they're often really long, + # we should probably use cache management instructions and/or unroll the + # loop more. If they're often quite short, it might be better to use + # fact (2) in the inner loop than have to recalculate it. + # 2) How popular are bytes with the high bit set? If they are very rare, + # on some processors it might be useful to use the simpler expression + # ~((x - 0x01010101) | 0x7f7f7f7f) (that is, on processors with only one + # ALU), but this fails when any character has its high bit set. + + # Some notes on register usage: Under the SVR4 ABI, we can use registers + # 0 and 3 through 12 (so long as we don't call any procedures) without + # saving them. We can also use registers 14 through 31 if we save them. + # We can't use r1 (it's the stack pointer), nor r2 or r13 because the user + # program may expect them to be hold their usual value if we get sent + # a signal. Integer parameters are passed in r3 through r10. + # We can use condition registers cr0, cr1, cr5, cr6, and cr7 without saving + # them, the others we must save. + + .section ".text" + .align 3 + .globl strlen + .type strlen,@function +strlen: + # On entry, r3 points to the string, and it's left that way. + # We use r6 to store 0x01010101, and r7 to store 0x7f7f7f7f. + # r4 is used to keep the current index into the string; r5 holds + # the number of padding bits we prepend to the string to make it + # start at a word boundary. r8 holds the 'current' word. + # r9-12 are temporaries. r0 is used as a temporary and for discarded + # results. + clrrwi 4,3,2 + lis 6,0xfeff + lis 7,0x7f7f + rlwinm 10,3,0,29,29 + lwz 8,0(4) + addi 7,7,0x7f7f + rlwinm 5,3,3,27,28 + cmpwi 1,10,0 + li 9,-1 + # That's the setup done, now do the first pair of words. + # We make an exception and use method (2) on the first two words, to reduce + # overhead. + srw 9,9,5 + and 0,7,8 + or 10,7,8 + add 0,0,7 + nor 0,10,0 + and. 8,0,9 + bne done0 + # Handle second word of pair. Put addi between branches to avoid hurting + # branch prediction. + addi 6,6,0xfffffeff + + bne 1,loop + lwzu 8,4(4) + and 0,7,8 + or 10,7,8 + add 0,0,7 + nor. 0,10,0 + bne done0 + + # The loop. + +loop: lwz 8,4(4) + lwzu 9,8(4) + add 0,6,8 + nor 10,7,8 + and. 0,0,10 + add 11,6,9 + nor 12,7,9 + bne done1 + and. 0,11,12 + beq loop + + and 0,7,9 + or 10,7,9 + b done2 + +done1: addi 4,4,-4 + and 0,7,9 + or 10,7,9 +done2: add 0,0,7 + nor 0,10,0 + + # When we get to here, r4 points to the first word in the string that + # contains a zero byte, and the most significant set bit in r8 is in that + # byte. +done0: cntlzw 11,8 + subf 0,3,4 + srwi 11,11,3 + add 3,0,11 + blr +0: + .size strlen,0b-strlen diff --git a/sysdeps/stub/fchdir.c b/sysdeps/stub/fchdir.c index 8eb7700361..b18dcc7986 100644 --- a/sysdeps/stub/fchdir.c +++ b/sysdeps/stub/fchdir.c @@ -1,20 +1,20 @@ -/* Copyright (C) 1991, 1995, 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. +/* Copyright (C) 1991, 1995, 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 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. + 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., 675 Mass Ave, -Cambridge, MA 02139, USA. */ + 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 <errno.h> #include <stddef.h> @@ -25,7 +25,7 @@ int fchdir (fd) int fd; { - __set_errno (ENOSYS(; + __set_errno (ENOSYS); return -1; } diff --git a/sysdeps/stub/fchmod.c b/sysdeps/stub/fchmod.c index f8c5c80214..eba768fce7 100644 --- a/sysdeps/stub/fchmod.c +++ b/sysdeps/stub/fchmod.c @@ -1,20 +1,20 @@ -/* Copyright (C) 1991, 1992, 1995, 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. +/* Copyright (C) 1991, 1992, 1995, 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 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. + 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., 675 Mass Ave, -Cambridge, MA 02139, USA. */ + 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 <errno.h> #include <stddef.h> @@ -29,7 +29,7 @@ __fchmod (fd, mode) { if (fd < 0) { - __set_errno (EINVAL(; + __set_errno (EINVAL); return -1; } diff --git a/sysdeps/unix/sysv/linux/net/route.h b/sysdeps/unix/sysv/linux/net/route.h index d60a3cabb5..3518dc5fc9 100644 --- a/sysdeps/unix/sysv/linux/net/route.h +++ b/sysdeps/unix/sysv/linux/net/route.h @@ -25,6 +25,7 @@ #include <sys/socket.h> #include <sys/types.h> +#include <netinet/in.h> /* This structure gets passed by the SIOCADDRT and SIOCDELRT calls. */ @@ -50,6 +51,21 @@ struct rtentry #define rt_mss rt_mtu +struct in6_rtmsg + { + struct in6_addr rtmsg_dst; + struct in6_addr rtmsg_src; + struct in6_addr rtmsg_gateway; + unsigned long int rtmsg_type; + unsigned short int rtmsg_dst_len; + unsigned short int rtmsg_src_len; + unsigned long int rtmsg_metric; + unsigned long int rtmsg_info; + unsigned long int rtmsg_flags; + int rtmsg_ifindex; + }; + + #define RTF_UP 0x0001 /* Route usable. */ #define RTF_GATEWAY 0x0002 /* Destination is a gateway. */ @@ -68,17 +84,17 @@ struct rtentry #define RTF_THROW 0x2000 /* Go to next class. */ #define RTF_NOPMTUDISC 0x4000 /* Do not send packets with DF. */ -/* Bad idea. IPv6 should not use broken IPv4 interface. */ - -#define RTF_ADDRCONF 0x0800 /* Announced on link prefix. */ -#define RTF_INVALID 0x1000 -#define RTF_DCACHE 0x2000 -#define RTF_DEFAULT 0x4000 /* Route is a default route. */ -#define RTF_NEXTHOP 0x8000 /* Non gateway route with nexthop. */ +/* for IPv6 */ +#define RTF_DEFAULT 0x00010000 /* default - learned via ND */ +#define RTF_ALLONLINK 0x00020000 /* fallback, no routers on link */ +#define RTF_ADDRCONF 0x00040000 /* addrconf route - RA */ +#define RTF_LINKRT 0x00100000 /* link specific - device match */ +#define RTF_NONEXTHOP 0x00200000 /* route with no nexthop */ -#define RTF_MAGIC 0x10000 /* Route added/deleted automatically, - when interface changes its state. */ +#define RTF_CACHE 0x01000000 /* cache entry */ +#define RTF_FLOW 0x02000000 /* flow significant route */ +#define RTF_POLICY 0x04000000 /* policy route */ #define RTCF_VALVE 0x00200000 #define RTCF_MASQ 0x00400000 |