2007-07-21 Samuel Thibault <samuel.thibault@ens-lyon.org>
[kopensolaris-gnu/glibc.git] / sysdeps / ia64 / strncpy.S
index f5c1c9d..6706ab7 100644 (file)
@@ -1,6 +1,6 @@
 /* Optimized version of the standard strncpy() function.
    This file is part of the GNU C Library.
-   Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+   Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
    Contributed by Dan Pop <Dan.Pop@cern.ch>
              and Jakub Jelinek <jakub@redhat.com>.
 
@@ -63,6 +63,8 @@ ENTRY(strncpy)
        mov     saved_pr = pr           // save the predicate registers
        .save ar.lc, saved_lc
        mov     saved_lc = ar.lc        // save the loop counter
+       mov     ar.ec = 0               // ec is not guaranteed to
+                                       // be zero upon function entry
        .body
        cmp.geu p6, p5 = 24, in2
 (p6)   br.cond.spnt .short_len
@@ -210,15 +212,21 @@ ENTRY(strncpy)
        mov     pr = saved_pr, -1       // restore the predicate registers
        br.ret.sptk.many b0
 .recovery2:
+       add     c = 8, len
        add     tmp = -8, asrc ;;
-       ld8     r[0] = [tmp]
+       cmp.gtu p8, p5 = c, thresh ;;
+(p8)   ld8     r[0] = [tmp]
+(p5)   mov     r[0] = r0
        br.cond.sptk .back2
 .recovery3:
-       add     tmp = -MEMLAT * 8, src ;;
+       add     tmp = -(MEMLAT + 1) * 8, src ;;
        ld8     r[MEMLAT] = [tmp]
        br.cond.sptk .back3
 .recovery4:
-       add     tmp = -(MEMLAT - 1) * 8, src ;;
-       ld8     r[MEMLAT - 1] = [tmp]
+       cmp.eq  p5, p6 = len, r0
+       add     tmp = -MEMLAT * 8, src ;;
+(p6)   ld8     r[MEMLAT - 1] = [tmp]
+(p5)   mov     r[MEMLAT - 1] = r0
        br.cond.sptk .back4
 END(strncpy)
+libc_hidden_builtin_def (strncpy)