update from main archive 960910
authordrepper <drepper>
Wed, 11 Sep 1996 01:52:45 +0000 (01:52 +0000)
committerdrepper <drepper>
Wed, 11 Sep 1996 01:52:45 +0000 (01:52 +0000)
sysdeps/i386/i586/strchr.S
sysdeps/i386/i586/strlen.S

index 30de6b0..100cbbc 100644 (file)
@@ -1,6 +1,6 @@
 /* strchr -- find character CH in a NUL terminated string.
 Highly optimized version for ix85, x>=5.
-Copyright (C) 1995 Free Software Foundation, Inc.
+Copyright (C) 1995, 1996 Free Software Foundation, Inc.
 This file is part of the GNU C Library.
 Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>.
 
@@ -68,9 +68,10 @@ ENTRY (strchr)
        andl $3, %edi           /* mask alignment bits */
 
        jz L11                  /* alignment is 0 => start loop */
+       jp L0                   /* exactly two bits set */
 
        movb (%eax), %cl        /* load single byte */
-       cmpb %cl, %dl           /* is byte == C? */
+       cmpb (%eax), %dl        /* is byte == C? */
 
        je L2                   /* aligned => return pointer */
 
@@ -78,26 +79,21 @@ ENTRY (strchr)
        je L3                   /* yes => return NULL */
 
        incl %eax               /* increment pointer */
-       cmp $3, %edi            /* was alignment == 3? */
+       xorl $3, %edi           /* was alignment == 3? */
 
+L0:    movb (%eax), %cl        /* load single byte */
        je L11                  /* yes => start loop */
 
-       movb (%eax), %cl        /* load single byte */
        cmpb %cl, %dl           /* is byte == C? */
-
        je L2                   /* aligned => return pointer */
 
        cmpb $0, %cl            /* is byte NUL? */
        je L3                   /* yes => return NULL */
 
+       movb 1(%eax), %cl       /* load single byte */
        incl %eax               /* increment pointer */
-       cmp $2, %edi            /* was alignment == 2? */
 
-       je L11                  /* yes => start loop */
-
-       movb (%eax), %cl        /* load single byte */
        cmpb %cl, %dl           /* is byte == C? */
-
        je L2                   /* aligned => return pointer */
 
        cmpb $0, %cl            /* is byte NUL? */
index 15d0194..1e17131 100644 (file)
@@ -42,32 +42,31 @@ Boston, MA 02111-1307, USA.  */
        .text
 ENTRY(strlen)
        movl 4(%esp), %eax      /* get string pointer */
+       movl $3, %edx           /* load mask (= 3) */
 
-       movl %eax, %ecx         /* duplicate it */
-       andl $3, %ecx           /* mask alignment bits */
+       andl %eax, %edx         /* separate last two bits of address */
 
-       jz L11                  /* aligned => start loop */
+       jz L1                   /* aligned => start loop */
+       jp L0                   /* exactly two bits set */
 
-       cmpb %ch, (%eax)        /* is byte NUL? */
+       cmpb %dh, (%eax)        /* is byte NUL? */
        je L2                   /* yes => return */
 
        incl %eax               /* increment pointer */
-       cmpl $3, %ecx           /* was alignment = 3? */
+       xorl $3, %edx           /* was alignment = 3? */
 
-       je L11                  /* yes => now it is aligned and start loop */
+       jz L1                   /* yes => now it is aligned and start loop */
 
-       cmpb %ch, (%eax)        /* is byte NUL? */
+L0:    cmpb %dh, (%eax)        /* is byte NUL? */
        je L2                   /* yes => return */
 
        incl %eax               /* increment pointer */
-       cmpl $2, %ecx           /* was alignment = 2? */
 
-       je L11                  /* yes => now it is aligned and start loop */
-
-       cmpb %ch, (%eax)        /* is byte NUL? */
+       cmpb %dh, (%eax)        /* is byte NUL? */
        je L2                   /* yes => return */
 
        incl %eax               /* increment pointer */
+       xorl %edx, %edx         /* We need %edx == 0 for later */
 
       /* We exit the loop if adding MAGIC_BITS to LONGWORD fails to
         change any of the hole bits of LONGWORD.
@@ -88,8 +87,9 @@ ENTRY(strlen)
         into bit 16.  Similarly, there will be a carry into bit
         24.  If one of bits 24-31 is set, there will be a carry
         into bit 32 (=carry flag), so all of the hole bits will
-        be changed.  */
-L11:   xorl %edx, %edx         /* We need %edx == 0 for later */
+        be changed.
+
+        Note: %edx == 0 in any case here.  */
 
 L1:
        movl (%eax), %ecx       /* get word (= 4 bytes) in question */