diff options
author | Ulrich Drepper <drepper@redhat.com> | 1999-10-04 07:30:05 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1999-10-04 07:30:05 +0000 |
commit | fbda91b119b7673a4d448f0dce31766eaa65112e (patch) | |
tree | 432f48a3043ee1216216e6b93547017b954cde9c /sysdeps | |
parent | ba60c6d921580bd4b1adf24506bcebfd8efdea34 (diff) | |
download | glibc-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.c | 30 | ||||
-rw-r--r-- | sysdeps/i386/bits/string.h | 9 | ||||
-rw-r--r-- | sysdeps/i386/i486/bits/string.h | 21 |
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. */ |