summary refs log tree commit diff
path: root/sysdeps/i386/i486
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/i386/i486')
-rw-r--r--sysdeps/i386/i486/bits/string.h19
1 files changed, 19 insertions, 0 deletions
diff --git a/sysdeps/i386/i486/bits/string.h b/sysdeps/i386/i486/bits/string.h
index d4c2eaf715..921c66498e 100644
--- a/sysdeps/i386/i486/bits/string.h
+++ b/sysdeps/i386/i486/bits/string.h
@@ -1567,6 +1567,25 @@ __strstr_g (__const char *__haystack, __const char *__needle)
 #endif
 
 
+/* Bit find functions.  We define only the i686 version since for the other
+   processors gcc generates good code.  */
+#if defined __USE_BSD || defined __USE_XOPEN_EXTENDED
+# ifdef __i686__
+#  define _HAVE_STRING_ARCH_ffs 1
+#  define ffs(word) (__builtin_constant_p (word)			      \
+		     ? __builtin_ffs (word)				      \
+		     : ({ int __cnt, __tmp;				      \
+			  __asm__ __volatile__				      \
+			    ("bsfl %2,%0\n\t"				      \
+			     "cmovel %1,%0"				      \
+			     : "=&r" (__cnt), "=r" (__tmp)		      \
+			     : "rm" (word), "1" (-1));			      \
+			  __cnt + 1; }))
+
+#  define ffsl(word) ffs(word)
+# endif	/* i686 */
+#endif	/* BSD || X/Open */
+
 #undef __STRING_INLINE
 
 #endif	/* use string inlines && GNU CC */