(getsourcefilter): Free memory if socket level value cannot be retrieved.
[kopensolaris-gnu/glibc.git] / sysdeps / ia64 / memcmp.S
index ae283a2..2eed49a 100644 (file)
@@ -1,25 +1,37 @@
-/*
- *
- * Optimized version of the standard memcmp() function
- *
- * Contributed by Dan Pop <Dan.Pop@cern.ch>
- *
- * Return: the result of the comparison
- *
- * Inputs:
- *      in0:    dest (aka s1)
- *      in1:    src  (aka s2)
- *      in2:    byte count
- *
- * In this form, it assumes little endian mode.  For big endian mode, the
- * the two shifts in .l2 must be inverted:
- *
- *     shl     tmp1[0] = r[1 + MEMLAT], sh1   // tmp1 = w0 << sh1
- *     shr.u   tmp2[0] = r[0 + MEMLAT], sh2   // tmp2 = w1 >> sh2
- *
- * and all the mux1 instructions should be replaced by plain mov's.
- *
- */
+/* Optimized version of the standard memcmp() function.
+   This file is part of the GNU C Library.
+   Copyright (C) 2000, 2001, 2004 Free Software Foundation, Inc.
+   Contributed by Dan Pop <Dan.Pop@cern.ch>.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   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
+   Lesser General Public License for more details.
+
+   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.  */
+
+/* Return: the result of the comparison
+
+   Inputs:
+        in0:    dest (aka s1)
+        in1:    src  (aka s2)
+        in2:    byte count
+
+   In this form, it assumes little endian mode.  For big endian mode, the
+   the two shifts in .l2 must be inverted:
+
+       shl     tmp1[0] = r[1 + MEMLAT], sh1   // tmp1 = w0 << sh1
+       shr.u   tmp2[0] = r[0 + MEMLAT], sh2   // tmp2 = w1 >> sh2
+
+   and all the mux1 instructions should be replaced by plain mov's.  */
 
 #include <sysdep.h>
 #undef ret
@@ -28,7 +40,6 @@
 #define OPSIZ          8
 #define MEMLAT         2
 
-#define saved_pfs      r14
 #define start          r15
 #define saved_pr       r17
 #define saved_lc       r18
 #define loopcnt                r30
 
 ENTRY(memcmp)
-       alloc   saved_pfs = ar.pfs, 3, 37, 0, 40
+       .prologue
+       alloc   r2 = ar.pfs, 3, 37, 0, 40
 
        .rotr   r[MEMLAT + 2], q[MEMLAT + 5], tmp1[4], tmp2[4], val[2]
        .rotp   p[MEMLAT + 4 + 1]
 
        mov     ret0 = r0               // by default return value = 0
+       .save pr, saved_pr
        mov     saved_pr = pr           // save the predicate registers
+       .save ar.lc, saved_lc
         mov    saved_lc = ar.lc        // save the loop counter
+       .body
        mov     dest = in0              // dest
        mov     src = in1               // src
        mov     len = in2               // len
@@ -73,7 +88,7 @@ ENTRY(memcmp)
        ;;
        cmp.ne  p6, p0 = value1, value2
 (p6)   br.cond.spnt .done
-       br.cloop.dptk .l1       
+       br.cloop.dptk .l1
 .dest_aligned:
        and     sh1 = 7, src            // sh1 = src % 8
        and     tmp = -8, len           // tmp = len & -OPSIZ
@@ -94,7 +109,7 @@ ENTRY(memcmp)
 
 // We enter this loop with p6 cleared by the above comparison
 
-.l2:                                   
+.l2:
 (p[0])         ld8     r[0] = [asrc], 8                // r[0] = w1
 (p[0])         ld8     q[0] = [dest], 8
 (p[MEMLAT])    shr.u   tmp1[0] = r[1 + MEMLAT], sh1    // tmp1 = w0 >> sh1
@@ -114,7 +129,6 @@ ENTRY(memcmp)
        cmp.ltu p6, p7 = value2, value1 ;;
 (p6)   mov     ret0 = -1
 (p7)   mov     ret0 = 1
-       mov     ar.pfs = saved_pfs      // restore the PFS
        mov     pr = saved_pr, -1       // restore the predicate registers
        mov     ar.lc = saved_lc        // restore the loop counter
        br.ret.sptk.many b0
@@ -142,10 +156,10 @@ ENTRY(memcmp)
 .done:
 (p6)   sub     ret0 = value2, value1   // don't execute it if falling thru
 .restore_and_exit:
-       mov     ar.pfs = saved_pfs      // restore the PFS
        mov     pr = saved_pr, -1       // restore the predicate registers
        mov     ar.lc = saved_lc        // restore the loop counter
        br.ret.sptk.many b0
 END(memcmp)
 
 weak_alias (memcmp, bcmp)
+libc_hidden_builtin_def (memcmp)