diff options
author | Ulrich Drepper <drepper@redhat.com> | 1999-10-04 06:16:19 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1999-10-04 06:16:19 +0000 |
commit | 22baad3c3de66e418e402585d6bc6322cba68a87 (patch) | |
tree | b43b599e5935d5c81aa46c772a4e91224f46d487 /sysdeps | |
parent | 1d781d86c3c36d1dd363df62009a31ca528270f8 (diff) | |
download | glibc-22baad3c3de66e418e402585d6bc6322cba68a87.tar.gz glibc-22baad3c3de66e418e402585d6bc6322cba68a87.tar.xz glibc-22baad3c3de66e418e402585d6bc6322cba68a87.zip |
Update.
1999-10-03 Ulrich Drepper <drepper@cygnus.com> * sysdeps/i386/i486/bits/string.h (__memrchr): New function. * sysdeps/i386/bits/string.h (__memrchr): Add cld to comply to conventions. * string/Versions: Export memrchr.
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/i386/bits/string.h | 8 | ||||
-rw-r--r-- | sysdeps/i386/i486/bits/string.h | 36 |
2 files changed, 41 insertions, 3 deletions
diff --git a/sysdeps/i386/bits/string.h b/sysdeps/i386/bits/string.h index 6fc78b3799..01c17db68d 100644 --- a/sysdeps/i386/bits/string.h +++ b/sysdeps/i386/bits/string.h @@ -300,7 +300,8 @@ memchr (__const void *__s, int __c, size_t __n) "movl $1,%0\n" "1:" : "=D" (__res), "=&c" (__d0) - : "a" (__c), "0" (__s), "1" (__n)); + : "a" (__c), "0" (__s), "1" (__n) + : "cc"); return __res - 1; } #endif @@ -319,9 +320,10 @@ __memrchr (__const void *__s, int __c, size_t __n) "repne; scasb\n\t" "je 1f\n\t" "movl $1,%0\n" - "1:" + "1:\tcld" : "=D" (__res), "=&c" (__d0) - : "a" (__c), "0" (__s), "1" (__n)); + : "a" (__c), "0" (__s), "1" (__n) + : "cc"); return __res - 1; } #endif diff --git a/sysdeps/i386/i486/bits/string.h b/sysdeps/i386/i486/bits/string.h index 644967c895..9b37f5898e 100644 --- a/sysdeps/i386/i486/bits/string.h +++ b/sysdeps/i386/i486/bits/string.h @@ -446,6 +446,42 @@ memchr (__const void *__s, int __c, size_t __n) } #endif +#define _HAVE_STRING_ARCH_memrchr 1 +#ifndef _FORCE_INLINES +__STRING_INLINE void * +__memrchr (__const void *__s, int __c, size_t __n) +{ + register unsigned long int __d0; +#ifdef __i686__ + register unsigned long int __d1; +#endif + register void *__res; + if (__n == 0) + return NULL; +#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) + : "cc"); +#else + __asm__ __volatile__ + ("std\n\t" + "repne; scasb\n\t" + "je 1f\n\t" + "movl $1,%0\n" + "1:\tcld" + : "=D" (__res), "=&c" (__d0) + : "a" (__c), "0" (__s), "1" (__n) + : "cc"); +#endif + return __res - 1; +} +#endif + /* Return pointer to C in S. */ #define _HAVE_STRING_ARCH_rawmemchr 1 __STRING_INLINE void *__rawmemchr (const void *__s, int __c); |