(getsourcefilter): Free memory if socket level value cannot be retrieved.
[kopensolaris-gnu/glibc.git] / sysdeps / ia64 / memcmp.S
index 2e4f2ec..2eed49a 100644 (file)
@@ -1,22 +1,22 @@
 /* Optimized version of the standard memcmp() function.
    This file is part of the GNU C Library.
-   Copyright (C) 2000 Free Software Foundation, Inc.
+   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 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., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, 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.  */
 
 /* Return: the result of the comparison
 
@@ -40,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
@@ -85,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
@@ -106,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
@@ -126,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
@@ -154,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)