2006-01-29 Daniel Jacobowitz <dan@codesourcery.com>
[glibc-ports.git] / sysdeps / alpha / alphaev67 / strncat.S
blobae3257ca42216fc3aa2b1d4cd04fc121af66db00
1 /* Copyright (C) 2000, 2001 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, write to the Free
18    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19    02111-1307 USA.  */
21 /* Append no more than COUNT characters from the null-terminated string SRC
22    to the null-terminated string DST.  Always null-terminate the new DST.  */
24 #include <sysdep.h>
26         .arch ev6
27         .set noreorder
28         .text
30 ENTRY(strncat)
31         ldgp    gp, 0(pv)
32 #ifdef PROF
33         .set noat
34         lda     AT, _mcount
35         jsr     AT, (AT), _mcount
36         .set at
37 #endif
38         .prologue 1
40         mov     a0, v0          # set up return value
41         beq     a2, $zerocount  # U :
42         /* Find the end of the string.  */
43         ldq_u   t0, 0(a0)       # L : load first quadword (a0 may be misaligned)
44         lda     t1, -1          # E :
46         insqh   t1, v0, t1      # U :
47         andnot  a0, 7, a0       # E :
48         nop                     # E :
49         or      t1, t0, t0      # E :
51         nop                     # E :
52         nop                     # E :
53         cmpbge  zero, t0, t1    # E : bits set iff byte == 0
54         bne     t1, $found      # U :
56 $loop:  ldq     t0, 8(a0)       # L :
57         addq    a0, 8, a0       # E :
58         cmpbge  zero, t0, t1    # E :
59         beq     t1, $loop       # U :
61 $found: cttz    t1, t2          # U0 :
62         addq    a0, t2, a0      # E :
63         jsr     t9, __stxncpy   # L0 : Now do the append.
65         /* Worry about the null termination.  */
67         cttz    t10, t2         # U0: byte offset of end-of-count.
68         bic     a0, 7, a0       # E : word align the last write address.
69         zapnot  t0, t8, t1      # U : was last byte a null?
70         nop                     # E :
72         bne     t1, 0f          # U :
73         nop                     # E :
74         nop                     # E :
75         ret                     # L0 :
77 0:      addq    t2, a0, a0      # E : address of end-of-count
78         stb     zero, 1(a0)     # L :
79         nop                     # E :
80         ret                     # L0 :
82 $zerocount:
83         nop                     # E :
84         nop                     # E :
85         nop                     # E :
86         ret                     # L0 :
88         END(strncat)