Cleanup swapoff.c and swapon.c
[kopensolaris-gnu/glibc.git] / sysdeps / alpha / strncmp.S
index a6c6c61..ff199eb 100644 (file)
@@ -1,22 +1,21 @@
-/* Copyright (C) 1996 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997, 2003 Free Software Foundation, Inc.
    Contributed by Richard Henderson (rth@tamu.edu)
-
    This file is part of the GNU C Library.
 
    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.
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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.
+   Lesser 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.  */
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
 
 /* Bytewise compare two null-terminated strings of length no longer than N.  */
 
@@ -62,8 +61,10 @@ $aligned:
        ornot   t0, t3, t0      # .. e1 :
        cmpbge  zero, t1, t7    # e0    : bits set iff null found
        beq     a2, $eoc        # .. e1 : check end of count
-       subq    a2, 1, a2       # e0    :
+       unop                    # e0    :
        bne     t7, $eos        # .. e1 :
+       unop                    # e0    :
+       beq     t10, $ant_loop  # .. e1 :
 
        /* Aligned compare main loop.
           On entry to this basic block:
@@ -75,13 +76,30 @@ $a_loop:
        bne     t2, $wordcmp    # .. e1 (zdb)
        ldq_u   t1, 8(a1)       # e0    :
        ldq_u   t0, 8(a0)       # .. e1 :
+       subq    a2, 1, a2       # e0    :
+       addq    a1, 8, a1       # .. e1 :
+       addq    a0, 8, a0       # e0    :
+       beq     a2, $eoc        # .. e1 :
+       cmpbge  zero, t1, t7    # e0    :
+       beq     t7, $a_loop     # .. e1 :
+       unop                    # e0    :
+       br      $eos            # .. e1 :
+
+       /* Alternate aligned compare loop, for when there's no trailing
+          bytes on the count.  We have to avoid reading too much data.  */
+$ant_loop:
+       xor     t0, t1, t2      # e0    :
+       bne     t2, $wordcmp    # .. e1 (zdb)
+       subq    a2, 1, a2       # e0    :
+       beq     a2, $zerolength # .. e1 :
+       ldq_u   t1, 8(a1)       # e0    :
+       ldq_u   t0, 8(a0)       # .. e1 :
        addq    a1, 8, a1       # e0    :
        addq    a0, 8, a0       # .. e1 :
        cmpbge  zero, t1, t7    # e0    :
-       beq     a2, $eoc        # .. e1 :
-       subq    a2, 1, a2       # e0    :
-       beq     t7, $a_loop     # .. e1 :
-       br      $eos            # e1    :
+       beq     t7, $ant_loop   # .. e1 :
+       unop                    # e0    :
+       br      $eos            # .. e1 :
 
        /* The two strings are not co-aligned.  Align s1 and cope.  */
 $unaligned:
@@ -185,6 +203,8 @@ $u_final:
 $eoc:
        mskql   t0, t10, t0
        mskql   t1, t10, t1
+       unop
+       cmpbge  zero, t1, t7
 
        /* We've found a zero somewhere in a word we just read.
           On entry to this basic block:
@@ -203,7 +223,8 @@ $eos:
        beq     v0, $done       # .. e1 :
 
        /* Here we have two differing co-aligned words in t0 & t1.
-           Bytewise compare them and return (t0 > t1 ? 1 : -1).  */
+          Bytewise compare them and return (t0 > t1 ? 1 : -1).  */
+       .align 3
 $wordcmp:
        cmpbge  t0, t1, t2      # e0    : comparison yields bit mask of ge
        cmpbge  t1, t0, t3      # .. e1 :
@@ -217,8 +238,10 @@ $wordcmp:
 $done:
        ret                     # e1    :
 
+       .align 3
 $zerolength:
        clr     v0
        ret
 
        END(strncmp)
+libc_hidden_builtin_def (strncmp)