diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-12-23 10:46:57 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-12-23 10:46:57 +0000 |
commit | 1e0c4ca7448cf41bd38742ae885c9da6f4e48d97 (patch) | |
tree | 3908c0720db2470fefbc4c0824401dbf45862f83 /libc/string/i386/strchr.c | |
parent | 7bca85d261904a0a67f2e514b6c4972128561156 (diff) | |
download | uClibc-alpine-1e0c4ca7448cf41bd38742ae885c9da6f4e48d97.tar.bz2 uClibc-alpine-1e0c4ca7448cf41bd38742ae885c9da6f4e48d97.tar.xz |
sync with trunk. Compile tested on i386
Diffstat (limited to 'libc/string/i386/strchr.c')
-rw-r--r-- | libc/string/i386/strchr.c | 32 |
1 files changed, 17 insertions, 15 deletions
diff --git a/libc/string/i386/strchr.c b/libc/string/i386/strchr.c index 46b1dfb6e..93cc9583e 100644 --- a/libc/string/i386/strchr.c +++ b/libc/string/i386/strchr.c @@ -32,23 +32,25 @@ #include <string.h> -/* Experimentally off - libc_hidden_proto(strchr) */ +#undef strchr char *strchr(const char *s, int c) { - int d0; - register char * __res; - __asm__ __volatile__( - "movb %%al,%%ah\n" - "1:\tlodsb\n\t" - "cmpb %%ah,%%al\n\t" - "je 2f\n\t" - "testb %%al,%%al\n\t" - "jne 1b\n\t" - "movl $1,%1\n" - "2:\tmovl %1,%0\n\t" - "decl %0" - :"=a" (__res), "=&S" (d0) : "1" (s),"0" (c)); - return __res; + int esi; + register char * eax; + __asm__ __volatile__( + " movb %%al, %%ah\n" + "1: lodsb\n" + " cmpb %%ah, %%al\n" + " je 2f\n" + " testb %%al, %%al\n" + " jnz 1b\n" + " movl $1, %%esi\n" /* can use shorter xor + inc */ + "2: leal -1(%%esi), %%eax\n" + : "=a" (eax), "=&S" (esi) + : "0" (c), "1" (s) + /* no clobbers */ + ); + return eax; } libc_hidden_def(strchr) #ifdef __UCLIBC_SUSV3_LEGACY__ |