summaryrefslogtreecommitdiff
path: root/sysdeps
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1997-04-02 14:47:34 +0000
committerUlrich Drepper <drepper@redhat.com>1997-04-02 14:47:34 +0000
commit22d57dd3690a0fe623de1a56036306a93fa9a945 (patch)
tree72d15a44833db599574dc62e78ea02e8d30567e3 /sysdeps
parent5929563ff20245bbaa1b3ca2f4bfcee623ac6fb5 (diff)
Update.
1997-04-02 16:28 Ulrich Drepper <drepper@cygnus.com> * grp/fgetgrent.c: Don't use fixed buffer length. Allow dynamic adjustment if the underlying function say it is too small. * pwd/fgetpwent.c: Likewise. * shadow/fgetspent.c: Likewise. * shadow/sgetspent.c: Likewise. * grp/fgetgrent_r.c (__fgetgrent_r): If `parse_result' returns -1 this means there was not enough room for the gr_mem array. * nss/nss_files/files-XXX.c: Leave loop and return error if `parse_result' returns -1. * nss/nss_files/files-parse.c (parse_line): Return -1 if parsing of trailing list fails because of low memory. (parse_list): Rewrite. The logic was completly incorrect since the checks for overflowing the array were not executed when needed. * shadow/sgetspent_r.c: Only a return value > 0 from parse_line signals success. * nss/getXXbyYY.c: Make sure NULL is returned if we ran out of memory. * nss/getXXent.c: Likewise. * stdlib/strtod.c (SET_MANTISSA): Make sure that at least one bit is set in mantissa. * stdlib/strtof.c: Likewise. * stdlib/strtold.c: Likewise. * wcsmbs/wcstof.c: Likewise. * wcsmbs/wcstold.c: Likewise. * sysdeps/libm-ieee754/s_nan.c: Use strtod is parameter is not empty string. * sysdeps/libm-ieee754/s_nanf.c: Likewise. * sysdeps/libm-ieee754/s_nanld.c: Likewise. 1997-04-02 13:56 Ulrich Drepper <drepper@cygnus.com> * manual/errno.texi: Add description of strerror_r. 1997-04-01 19:07 H.J. Lu (hjl@gnu.ai.mit.edu) * manual/errno.texi: Add ENOMEDIUM and EMEDIUMTYPE. 1997-04-02 13:55 Ulrich Drepper <drepper@cygnus.com> * sysdeps/gnu/errlist.awk: The Texinfo file is named errno.texi. 1997-03-30 10:59 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * sysdeps/m68k/fpu/s_cexp.c: New file. * sysdeps/m68k/fpu/s_cexpf.c: New file. * sysdeps/m68k/fpu/s_cexpl.c: New file. * sysdeps/m68k/fpu/s_nearbyint.c: New file. * sysdeps/m68k/fpu/s_nearbyintf.c: New file. * sysdeps/m68k/fpu/s_nearbyintl.c: New file. * sysdeps/m68k/fpu/s_trunc.c: New file. * sysdeps/m68k/fpu/s_truncf.c: New file. * sysdeps/m68k/fpu/s_truncl.c: New file. * sysdeps/m68k/fpu/s_modf.c: Rewritten. * sysdeps/m68k/fpu/s_modff.c: Adapted. * sysdeps/m68k/fpu/s_modfl.c: Likewise. * sysdeps/m68k/fpu/e_atan2.c: Use __signbit inline. * sysdeps/m68k/fpu/e_pow.c: Likewise. Write 0.0/0.0 for NaN. Fix typo in test for `y = 0.5'. * sysdeps/m68k/fpu/__math.h: Define __trunc, __signbit, __nearbyint. Remove __modf. * sysdeps/m68k/Makefile (CFLAGS-s_copysignl.c) [$(subdir)=math]: Define for gcc bug workaround. * math/libm-test.c (log2_test): Add epsilon for long double to "log2 (e)" and "log2 (16)". (modf_test): Fix test name. (sqrt_test): Add missing FUNC. 1997-03-29 16:24 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * sunrpc/Makefile (CFLAGS-xrquota.c): Fix typo in variable name. 1997-03-28 20:56 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * stdlib/stdlib.h: Declare __clearenv. 1997-03-28 18:03 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * sysdeps/libm-ieee754/s_asinhl.c: Fix Ulrich Dreppers mangling of the last change. 1997-03-28 17:55 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * configure.in: Call AC_CANONICAL_BUILD before referencing $build. Fix test for BUILD_CC. 1997-04-02 01:29 Philip Blundell <pjb27@cam.ac.uk> * sysdeps/libm-ieee754/s_log2f.c (__log2f): Fix typo. 1997-03-31 18:53 Philip Blundell <pjb27@cam.ac.uk> * sysdeps/unix/sysv/linux/net/route.h: Add new IPv6 definitions. 1997-04-01 14:08 Ulrich Drepper <drepper@cygnus.com> * sysdeps/i386/memset.c: Fix typo. * sysdeps/stub/fchmod.c: Fix typo. * sysdeps/stub/fchdir.c: Fix typo. Reported by Fila Kolodny <fila@ibi.com>.
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/gnu/errlist.awk2
-rw-r--r--sysdeps/gnu/errlist.c8
-rw-r--r--sysdeps/i386/memset.c2
-rw-r--r--sysdeps/libm-ieee754/s_asinhl.c2
-rw-r--r--sysdeps/libm-ieee754/s_log2f.c2
-rw-r--r--sysdeps/libm-ieee754/s_nan.c30
-rw-r--r--sysdeps/libm-ieee754/s_nanf.c30
-rw-r--r--sysdeps/libm-ieee754/s_nanl.c30
-rw-r--r--sysdeps/m68k/Makefile5
-rw-r--r--sysdeps/m68k/fpu/__math.h237
-rw-r--r--sysdeps/m68k/fpu/e_atan2.c36
-rw-r--r--sysdeps/m68k/fpu/e_pow.c38
-rw-r--r--sysdeps/m68k/fpu/s_cexp.c92
-rw-r--r--sysdeps/m68k/fpu/s_cexpf.c4
-rw-r--r--sysdeps/m68k/fpu/s_cexpl.c4
-rw-r--r--sysdeps/m68k/fpu/s_modf.c29
-rw-r--r--sysdeps/m68k/fpu/s_modff.c2
-rw-r--r--sysdeps/m68k/fpu/s_modfl.c2
-rw-r--r--sysdeps/m68k/fpu/s_nearbyint.c2
-rw-r--r--sysdeps/m68k/fpu/s_nearbyintf.c2
-rw-r--r--sysdeps/m68k/fpu/s_nearbyintl.c2
-rw-r--r--sysdeps/m68k/fpu/s_trunc.c2
-rw-r--r--sysdeps/m68k/fpu/s_truncf.c2
-rw-r--r--sysdeps/m68k/fpu/s_truncl.c2
-rw-r--r--sysdeps/powerpc/strlen.s145
-rw-r--r--sysdeps/stub/fchdir.c30
-rw-r--r--sysdeps/stub/fchmod.c30
-rw-r--r--sysdeps/unix/sysv/linux/net/route.h34
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