about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--sysdeps/i386/bits/string.h8
-rw-r--r--sysdeps/i386/i486/bits/string.h36
3 files changed, 50 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index a28865fe72..e9f4a79f4d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+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.
+
 1999-10-04  Roland McGrath  <roland@baalperazim.frob.com>
 
 	* misc/Versions (GLIBC_2.2): Add getloadavg.
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);