Update copyright notices with scripts/update-copyrights
[glibc.git] / ports / sysdeps / alpha / alphaev67 / strncat.S
blob36b872103a9c3661e8bce70cd21f61fbc3d82d5b
1 /* Copyright (C) 2000-2014 Free Software Foundation, Inc.
2    Contributed by Richard Henderson <rth@tamu.edu>, 1996.
3    EV67 optimized by Rick Gorton <rick.gorton@alpha-processor.com>.
4    This file is part of the GNU C Library.
6    The GNU C Library is free software; you can redistribute it and/or
7    modify it under the terms of the GNU Lesser General Public
8    License as published by the Free Software Foundation; either
9    version 2.1 of the License, or (at your option) any later version.
11    The GNU C Library is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    Lesser General Public License for more details.
16    You should have received a copy of the GNU Lesser General Public
17    License along with the GNU C Library.  If not, see
18    <http://www.gnu.org/licenses/>.  */
20 /* Append no more than COUNT characters from the null-terminated string SRC
21    to the null-terminated string DST.  Always null-terminate the new DST.  */
23 #include <sysdep.h>
25         .arch ev6
26         .set noreorder
27         .text
29 ENTRY(strncat)
30         ldgp    gp, 0(pv)
31 #ifdef PROF
32         .set noat
33         lda     AT, _mcount
34         jsr     AT, (AT), _mcount
35         .set at
36 #endif
37         .prologue 1
39         mov     a0, v0          # set up return value
40         beq     a2, $zerocount  # U :
41         /* Find the end of the string.  */
42         ldq_u   t0, 0(a0)       # L : load first quadword (a0 may be misaligned)
43         lda     t1, -1          # E :
45         insqh   t1, v0, t1      # U :
46         andnot  a0, 7, a0       # E :
47         nop                     # E :
48         or      t1, t0, t0      # E :
50         nop                     # E :
51         nop                     # E :
52         cmpbge  zero, t0, t1    # E : bits set iff byte == 0
53         bne     t1, $found      # U :
55 $loop:  ldq     t0, 8(a0)       # L :
56         addq    a0, 8, a0       # E :
57         cmpbge  zero, t0, t1    # E :
58         beq     t1, $loop       # U :
60 $found: cttz    t1, t2          # U0 :
61         addq    a0, t2, a0      # E :
62         jsr     t9, __stxncpy   # L0 : Now do the append.
64         /* Worry about the null termination.  */
66         cttz    t10, t2         # U0: byte offset of end-of-count.
67         bic     a0, 7, a0       # E : word align the last write address.
68         zapnot  t0, t8, t1      # U : was last byte a null?
69         nop                     # E :
71         bne     t1, 0f          # U :
72         nop                     # E :
73         nop                     # E :
74         ret                     # L0 :
76 0:      addq    t2, a0, a0      # E : address of end-of-count
77         stb     zero, 1(a0)     # L :
78         nop                     # E :
79         ret                     # L0 :
81 $zerocount:
82         nop                     # E :
83         nop                     # E :
84         nop                     # E :
85         ret                     # L0 :
87         END(strncat)