* string.h (strechr): Replace assembler by

C code.
       (ascii_strcasematch): Likewise.
       (ascii_strncasematch): Likwise.
This commit is contained in:
Kai Tietz 2012-10-26 20:00:12 +00:00
parent 54b302310e
commit 0222a24fe3
2 changed files with 35 additions and 58 deletions

View File

@ -1,3 +1,10 @@
2012-10-26 Kai Tietz <ktietz@redhat.com>
* string.h (strechr): Replace assembler by
C code.
(ascii_strcasematch): Likewise.
(ascii_strncasematch): Likwise.
2012-10-26 Corinna Vinschen <corinna@vinschen.de> 2012-10-26 Corinna Vinschen <corinna@vinschen.de>
* dir.cc (closedir): Fix syscall_printf. * dir.cc (closedir): Fix syscall_printf.

View File

@ -22,20 +22,9 @@ extern "C" {
static inline __stdcall char * static inline __stdcall char *
strechr (const char *s, int c) strechr (const char *s, int c)
{ {
register char * res; while (*s != (char) c && *s != 0)
__asm__ __volatile__ ("\ ++s;
movb %%al,%%ah\n\ return (char *) s;
1: movb (%1),%%al\n\
cmpb %%ah,%%al\n\
je 2f\n\
incl %1\n\
testb %%al,%%al\n\
jne 1b\n\
decl %1\n\
2: movl %1,%0\n\
":"=a" (res), "=r" (s)
:"0" (c), "1" (s));
return res;
} }
#ifdef __INSIDE_CYGWIN__ #ifdef __INSIDE_CYGWIN__
@ -45,57 +34,38 @@ extern const char isalpha_array[];
static inline int static inline int
ascii_strcasematch (const char *cs, const char *ct) ascii_strcasematch (const char *cs, const char *ct)
{ {
register int __res; register const unsigned char *us, *ut;
int d0, d1;
__asm__ ("\
.global _isalpha_array \n\
cld \n\
andl $0xff,%%eax \n\
1: lodsb \n\
scasb \n\
je 2f \n\
xorb _isalpha_array(%%eax),%%al \n\
cmpb -1(%%edi),%%al \n\
jne 3f \n\
2: testb %%al,%%al \n\
jnz 1b \n\
movl $1,%%eax \n\
jmp 4f \n\
3: xor %0,%0 \n\
4:"
:"=a" (__res), "=&S" (d0), "=&D" (d1)
: "1" (cs), "2" (ct));
return __res; us = (const unsigned char *) cs;
ut = (const unsigned char *) ct;
while (us[0] == ut[0] || (us[0] ^ isalpha_array[us[0]]) == ut[0])
{
if (us[0] == 0)
return 1;
++us, ++ut;
}
return 0;
} }
static inline int static inline int
ascii_strncasematch (const char *cs, const char *ct, size_t n) ascii_strncasematch (const char *cs, const char *ct, size_t n)
{ {
register int __res; register const unsigned char *us, *ut;
int d0, d1, d2;
__asm__ ("\
.global _isalpha_array; \n\
cld \n\
andl $0xff,%%eax \n\
1: decl %3 \n\
js 3f \n\
lodsb \n\
scasb \n\
je 2f \n\
xorb _isalpha_array(%%eax),%%al \n\
cmpb -1(%%edi),%%al \n\
jne 4f \n\
2: testb %%al,%%al \n\
jnz 1b \n\
3: movl $1,%%eax \n\
jmp 5f \n\
4: xor %0,%0 \n\
5:"
:"=a" (__res), "=&S" (d0), "=&D" (d1), "=&c" (d2)
:"1" (cs), "2" (ct), "3" (n));
return __res; if (!n)
return 1;
us = (const unsigned char *) cs;
ut = (const unsigned char *) ct;
while (us[0] == ut[0] || (us[0] ^ isalpha_array[us[0]]) == ut[0])
{
--n;
if (!n || us[0] == 0)
return 1;
++us, ++ut;
}
return 0;
} }
#undef strcasecmp #undef strcasecmp