update from main archive 961010
authordrepper <drepper>
Fri, 11 Oct 1996 03:11:57 +0000 (03:11 +0000)
committerdrepper <drepper>
Fri, 11 Oct 1996 03:11:57 +0000 (03:11 +0000)
sysdeps/alpha/strchr.c [deleted file]
sysdeps/alpha/stxcpy.S

diff --git a/sysdeps/alpha/strchr.c b/sysdeps/alpha/strchr.c
deleted file mode 100644 (file)
index 69afa4b..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-/* Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
-
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
-
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 675 Mass Ave,
-Cambridge, MA 02139, USA.  */
-
-#include <string.h>
-
-/* Return the length of the null-terminated string STR.  Scan for
-   the null terminator quickly by testing eight bytes at a time.  */
-
-char *
-strchr (const char *str, int c)
-{
-  const char *char_ptr;
-  const unsigned long int *longword_ptr;
-  unsigned long int charmask;
-
-  c = (unsigned char) c;
-
-  /* Handle the first few characters by reading one character at a time.
-     Do this until STR is aligned on a 8-byte border.  */
-  for (char_ptr = str; ((unsigned long int) char_ptr & 7) != 0; ++char_ptr)
-    if (*char_ptr == c)
-      return (char *) char_ptr;
-    else if (*char_ptr == '\0')
-      return NULL;
-
-  longword_ptr = (unsigned long int *) char_ptr;
-
-  /* Set up a longword, each of whose bytes is C.  */
-  charmask = c | (c << 8);
-  charmask |= charmask << 16;
-  charmask |= charmask << 32;
-
-  for (;;)
-    {
-      const unsigned long int longword = *longword_ptr++;
-      int ge, le, zero;
-
-      /* Set bits in ZERO if bytes in LONGWORD are zero.  */
-      asm ("cmpbge $31, %1, %0" : "=r" (zero) : "r" (longword));
-
-      /* Set bits in GE if bytes in CHARMASK are >= bytes in LONGWORD.  */
-      asm ("cmpbge %1, %2, %0" : "=r" (ge) : "r" (charmask), "r" (longword));
-
-      /* Set bits in LE if bytes in CHARMASK are <= bytes in LONGWORD.  */
-      asm ("cmpbge %2, %1, %0" : "=r" (le) : "r" (charmask), "r" (longword));
-
-      /* Bytes that are both <= and >= are == to C.  */
-      if (zero || (ge & le))
-       {
-         /* Which of the bytes was the C?  */
-
-         char *cp = (char *) (longword_ptr - 1);
-         int i;
-
-         for (i = 0; i < 8; i++)
-           {
-             if (cp[i] == c)
-               return &cp[i];
-             if (cp[i] == 0)
-               return NULL;
-           }
-         return NULL;
-       }
-    }
-}
-
-#ifdef weak_alias
-#undef index
-weak_alias (strchr, index)
-#endif
index e381b70..49dd8e5 100644 (file)
@@ -36,7 +36,7 @@ Cambridge, MA 02139, USA.  */
    Furthermore, v0, a3-a5, t11, and t12 are untouched.
 */
 
-/* This is generally scheduled for the EV5, but should still be pretty 
+/* This is generally scheduled for the EV5, but should still be pretty
    good for the EV4 too.  */
 
 #include <sysdep.h>
@@ -65,7 +65,7 @@ stxcpy_aligned:
        lda     t2, -1          # e1    : build a mask against false zero
        mskqh   t2, a1, t2      # e0    :   detection in the src word
        mskqh   t1, a1, t3      # e0    :
-       ornot   t1, t2, t2      # .. e1 : 
+       ornot   t1, t2, t2      # .. e1 :
        mskql   t0, a1, t0      # e0    : assemble the first output word
        cmpbge  zero, t2, t7    # .. e1 : bits set iff null found
        or      t0, t3, t1      # e0    :
@@ -99,9 +99,9 @@ $a_eos:
        /* We're doing a partial word store and so need to combine
           our source and original destination words.  */
        ldq_u   t0, 0(a0)       # e0    :
-       subq    t8, 1, t6       # .. e1 : 
+       subq    t8, 1, t6       # .. e1 :
        zapnot  t1, t6, t1      # e0    : clear src bytes >= null
-       or      t8, t6, t7      # .. e1 : 
+       or      t8, t6, t7      # .. e1 :
        zap     t0, t7, t0      # e0    : clear dst bytes <= null
        or      t0, t1, t1      # e1    :
 
@@ -156,13 +156,13 @@ $u_head:
        or      t1, t4, t1      # .. e1 :
        mskqh   t1, a0, t1      # e0    :
        or      t0, t1, t1      # e1    :
-       
+
        or      t1, t6, t6      # e0    :
        cmpbge  zero, t6, t7    # .. e1 :
        lda     t6, -1          # e0    : for masking just below
        bne     t7, $u_final    # .. e1 :
 
-       mskql   t6, a1, t6              # e0    : mask out the bits we have 
+       mskql   t6, a1, t6              # e0    : mask out the bits we have
        or      t6, t2, t2              # e1    :   already extracted before
        cmpbge  zero, t2, t7            # e0    :   testing eos
        bne     t7, $u_late_head_exit   # .. e1 (zdb)
@@ -181,7 +181,7 @@ $u_head:
 
        /* Unaligned copy main loop.  In order to avoid reading too much,
           the loop is structured to detect zeros in aligned source words.
-          This has, unfortunately, effectively pulled half of a loop 
+          This has, unfortunately, effectively pulled half of a loop
           iteration out into the head and half into the tail, but it does
           prevent nastiness from accumulating in the very thing we want
           to run as fast as possible.
@@ -207,7 +207,7 @@ $u_loop:
 
        /* We've found a zero somewhere in the source word we just read.
           If it resides in the lower half, we have one (probably partial)
-          word to write out, and if it resides in the upper half, we 
+          word to write out, and if it resides in the upper half, we
           have one full and one partial word left to write out.
 
           On entry to this basic block:
@@ -234,7 +234,7 @@ $u_final:
        negq    t7, t6          # e0    : isolate low bit set
        and     t6, t7, t8      # e1    :
 
-       and     t8, 0x80, t6    # e0    : avoid dest word load if we can 
+       and     t8, 0x80, t6    # e0    : avoid dest word load if we can
        bne     t6, 1f          # .. e1 (zdb)
 
        ldq_u   t0, 0(a0)       # e0    :
@@ -256,7 +256,7 @@ $unaligned:
        and     a0, 7, t4       # .. e1 : find dest misalignment
        and     a1, 7, t5       # e0    : find src misalignment
 
-       /* Conditionally load the first destination word and a bytemask 
+       /* Conditionally load the first destination word and a bytemask
           with 0xff indicating that the destination byte is sacrosanct.  */
 
        mov     zero, t0        # .. e1 :
@@ -290,18 +290,19 @@ $unaligned:
 
        negq    t7, t6          # .. e1 : build bitmask of bytes <= zero
        and     t6, t7, t8      # e0    :
-       nop                     # .. e1 :
+       and     a1, 7, t5       # .. e1 :
        subq    t8, 1, t6       # e0    :
        or      t6, t8, t7      # e1    :
+       srl     t8, t5, t8      # e0    : adjust final null return value
 
-       zapnot  t2, t7, t2      # e0    : prepare source word; mirror changes
+       zapnot  t2, t7, t2      # .. e1 : prepare source word; mirror changes
        and     t1, t2, t1      # e1    : to source validity mask
-       extql   t2, a1, t2      # e0    :
+       extql   t2, a1, t2      # .. e0 :
        extql   t1, a1, t1      # e0    :
 
-       andnot  t0, t2, t0      # e0    : zero place for source to reside
+       andnot  t0, t2, t0      # .. e1 : zero place for source to reside
        or      t0, t1, t1      # e1    : and put it there
-       stq_u   t1, 0(a0)       # e0    :
-       ret     (t9)            # .. e1 :
+       stq_u   t1, 0(a0)       # .. e0 :
+       ret     (t9)
 
        .end __stxcpy