diff options
Diffstat (limited to 'newlib/libc/machine/i386/strchr.S')
-rw-r--r-- | newlib/libc/machine/i386/strchr.S | 113 |
1 files changed, 13 insertions, 100 deletions
diff --git a/newlib/libc/machine/i386/strchr.S b/newlib/libc/machine/i386/strchr.S index 1d98b8149..fe425d2d8 100644 --- a/newlib/libc/machine/i386/strchr.S +++ b/newlib/libc/machine/i386/strchr.S @@ -1,6 +1,6 @@ /* * ==================================================== - * Copyright (C) 1998, 2002, 2008 by Red Hat Inc. All rights reserved. + * Copyright (C) 1998, 2002 by Red Hat Inc. All rights reserved. * * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice @@ -9,7 +9,7 @@ */ #include "i386mach.h" - + .global SYM (strchr) SOTYPE_FUNCTION(strchr) @@ -21,45 +21,14 @@ SYM (strchr): pushl ebx xorl ebx,ebx movl 8(ebp),edi - addb 12(ebp),bl - -#ifndef __OPTIMIZE_SIZE__ -/* Special case strchr(p,0). */ - je L25 - -/* Do byte-wise checks until string is aligned. */ - test $3,edi - je L5 - movl edi,eax - movb (eax),cl - testb cl,cl - je L14 - cmpb bl,cl - je L19 - incl edi - - test $3,edi - je L5 - movl edi,eax - movb (eax),cl - testb cl,cl - je L14 - cmpb bl,cl - je L19 - incl edi + movb 12(ebp),bl +#ifndef __OPTIMIZE_SIZE__ +/* check if string is aligned, if not do check one byte at a time */ test $3,edi - je L5 - movl edi,eax - movb (eax),cl - testb cl,cl - je L14 - cmpb bl,cl - je L19 - incl edi + jne L9 /* create 4 byte mask which is just the desired byte repeated 4 times */ -L5: movl ebx,ecx sall $8,ebx subl $4,edi @@ -80,14 +49,15 @@ L10: testl $-2139062144,edx jne L9 - xorl ebx,ecx - leal -16843009(ecx),edx - notl ecx - andl ecx,edx + movl ebx,eax + xorl ecx,eax + leal -16843009(eax),edx + notl eax + andl eax,edx testl $-2139062144,edx je L10 #endif /* not __OPTIMIZE_SIZE__ */ - + /* loop while (*s && *s++ != c) */ L9: leal -1(edi),eax @@ -99,7 +69,7 @@ L15: je L14 cmpb bl,dl jne L15 - + L14: /* if (*s == c) return address otherwise return NULL */ cmpb bl,(eax) @@ -113,60 +83,3 @@ L19: leave ret -#ifndef __OPTIMIZE_SIZE__ -/* Special case strchr(p,0). */ -#if 0 - /* Hideous performance on modern machines. */ -L25: - cld - movl $-1,ecx - xor eax,eax - repnz - scasb - leal -1(edi),eax - jmp L19 -#endif -L25: -/* Do byte-wise checks until string is aligned. */ - test $3,edi - je L26 - movl edi,eax - movb (eax),cl - testb cl,cl - je L19 - incl edi - - test $3,edi - je L26 - movl edi,eax - movb (eax),cl - testb cl,cl - je L19 - incl edi - - test $3,edi - je L26 - movl edi,eax - movb (eax),cl - testb cl,cl - je L19 - incl edi - -L26: - subl $4,edi - -/* loop performing 4 byte mask checking for desired 0 byte */ - .p2align 4,,7 -L27: - addl $4,edi - movl (edi),ecx - leal -16843009(ecx),edx - movl ecx,eax - notl eax - andl eax,edx - testl $-2139062144,edx - je L27 - - jmp L9 - -#endif /* !__OPTIMIZE_SIZE__ */ |