aboutsummaryrefslogtreecommitdiff
path: root/sysdeps
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1999-10-04 07:30:05 +0000
committerUlrich Drepper <drepper@redhat.com>1999-10-04 07:30:05 +0000
commitfbda91b119b7673a4d448f0dce31766eaa65112e (patch)
tree432f48a3043ee1216216e6b93547017b954cde9c /sysdeps
parentba60c6d921580bd4b1adf24506bcebfd8efdea34 (diff)
downloadglibc-fbda91b119b7673a4d448f0dce31766eaa65112e.zip
glibc-fbda91b119b7673a4d448f0dce31766eaa65112e.tar.gz
glibc-fbda91b119b7673a4d448f0dce31766eaa65112e.tar.bz2
Update.
1999-10-04 Ulrich Drepper <drepper@cygnus.com> * include/string.h: Add __memrchr declaration. * string/string.h: Moce __memrchr declaration to include/string.h. 1999-10-03 Ulrich Drepper <drepper@cygnus.com> * string/Makefile (routines): Add memrchr. * sysdeps/generic/memrchr.c: Don't undef memchr, undef memrchr. Correct order of tests for matching bytes. * string/tester.c: Add tests for memrchr. * sysdeps/i386/i486/bits/string.h (__memrchr): Correct implementation. Start from the last character and take decrement not increment into account for correction in return line. Add memrchr alias. * sysdeps/i386/bits/string.h: Likewise.
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/generic/memrchr.c30
-rw-r--r--sysdeps/i386/bits/string.h9
-rw-r--r--sysdeps/i386/i486/bits/string.h21
3 files changed, 34 insertions, 26 deletions
diff --git a/sysdeps/generic/memrchr.c b/sysdeps/generic/memrchr.c
index c866257..874caf1 100644
--- a/sysdeps/generic/memrchr.c
+++ b/sysdeps/generic/memrchr.c
@@ -51,6 +51,8 @@
#include <sys/types.h>
+#undef memrchr
+
/* Search no more than N bytes of S for C. */
__ptr_t
@@ -163,24 +165,24 @@ __memrchr (s, c_in, n)
const unsigned char *cp = (const unsigned char *) longword_ptr;
- if (cp[0] == c)
- return (__ptr_t) cp;
- if (cp[1] == c)
- return (__ptr_t) &cp[1];
- if (cp[2] == c)
- return (__ptr_t) &cp[2];
- if (cp[3] == c)
- return (__ptr_t) &cp[3];
#if LONG_MAX > 2147483647
- if (cp[4] == c)
- return (__ptr_t) &cp[4];
- if (cp[5] == c)
- return (__ptr_t) &cp[5];
- if (cp[6] == c)
- return (__ptr_t) &cp[6];
if (cp[7] == c)
return (__ptr_t) &cp[7];
+ if (cp[6] == c)
+ return (__ptr_t) &cp[6];
+ if (cp[5] == c)
+ return (__ptr_t) &cp[5];
+ if (cp[4] == c)
+ return (__ptr_t) &cp[4];
#endif
+ if (cp[3] == c)
+ return (__ptr_t) &cp[3];
+ if (cp[2] == c)
+ return (__ptr_t) &cp[2];
+ if (cp[1] == c)
+ return (__ptr_t) &cp[1];
+ if (cp[0] == c)
+ return (__ptr_t) cp;
}
n -= sizeof (longword);
diff --git a/sysdeps/i386/bits/string.h b/sysdeps/i386/bits/string.h
index 01c17db..b727e2b 100644
--- a/sysdeps/i386/bits/string.h
+++ b/sysdeps/i386/bits/string.h
@@ -319,13 +319,16 @@ __memrchr (__const void *__s, int __c, size_t __n)
("std\n\t"
"repne; scasb\n\t"
"je 1f\n\t"
- "movl $1,%0\n"
+ "orl $-1,%0\n"
"1:\tcld"
: "=D" (__res), "=&c" (__d0)
- : "a" (__c), "0" (__s), "1" (__n)
+ : "a" (__c), "0" (__s + __n - 1), "1" (__n)
: "cc");
- return __res - 1;
+ return __res + 1;
}
+# ifdef __USE_GNU
+# define memrchr(s, c, n) __memrchr (s, c, n)
+# endif
#endif
/* Return the length of S. */
diff --git a/sysdeps/i386/i486/bits/string.h b/sysdeps/i386/i486/bits/string.h
index 9b37f58..54e5ac4 100644
--- a/sysdeps/i386/i486/bits/string.h
+++ b/sysdeps/i386/i486/bits/string.h
@@ -452,34 +452,37 @@ __STRING_INLINE void *
__memrchr (__const void *__s, int __c, size_t __n)
{
register unsigned long int __d0;
-#ifdef __i686__
+# ifdef __i686__
register unsigned long int __d1;
-#endif
+# endif
register void *__res;
if (__n == 0)
return NULL;
-#ifdef __i686__
+# ifdef __i686__
__asm__ __volatile__
("std\n\t"
"repne; scasb\n\t"
"cmovne %2,%0\n\t"
"cld"
: "=D" (__res), "=&c" (__d0), "=&r" (__d1)
- : "a" (__c), "0" (__s), "1" (__n), "2" (1)
+ : "a" (__c), "0" (__s + __n - 1), "1" (__n), "2" (-1)
: "cc");
-#else
+# else
__asm__ __volatile__
("std\n\t"
"repne; scasb\n\t"
"je 1f\n\t"
- "movl $1,%0\n"
+ "orl $-1,%0\n"
"1:\tcld"
: "=D" (__res), "=&c" (__d0)
- : "a" (__c), "0" (__s), "1" (__n)
+ : "a" (__c), "0" (__s + __n - 1), "1" (__n)
: "cc");
-#endif
- return __res - 1;
+# endif
+ return __res + 1;
}
+# ifdef __USE_GNU
+# define memrchr(s, c, n) __memrchr (s, c, n)
+# endif
#endif
/* Return pointer to C in S. */