Interpret numeric parameter correctly.
[kopensolaris-gnu/glibc.git] / sysdeps / alpha / alphaev67 / strncat.S
1 /* Copyright (C) 2000 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
5    This file is part of the GNU C Library.
6
7    The GNU C Library is free software; you can redistribute it and/or
8    modify it under the terms of the GNU Library General Public License as
9    published by the Free Software Foundation; either version 2 of the
10    License, or (at your option) any later version.
11
12    The GNU C Library is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15    Library General Public License for more details.
16
17    You should have received a copy of the GNU Library General Public
18    License along with the GNU C Library; see the file COPYING.LIB.  If not,
19    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20    Boston, MA 02111-1307, USA.  */
21
22 /* Append no more than COUNT characters from the null-terminated string SRC
23    to the null-terminated string DST.  Always null-terminate the new DST.  */
24
25 #include <sysdep.h>
26
27         .arch ev6
28         .set noreorder
29         .text
30
31 ENTRY(strncat)
32         ldgp    gp, 0(pv)
33 #ifdef PROF
34         .set noat
35         lda     AT, _mcount
36         jsr     AT, (AT), _mcount
37         .set at
38 #endif
39         .prologue 1
40
41         mov     a0, v0          # set up return value
42         beq     a2, $zerocount  # U :
43         /* Find the end of the string.  */
44         ldq_u   t0, 0(a0)       # L : load first quadword (a0 may be misaligned)
45         lda     t1, -1          # E :
46
47         insqh   t1, v0, t1      # U :
48         andnot  a0, 7, a0       # E :
49         nop                     # E :
50         or      t1, t0, t0      # E :
51
52         nop                     # E :
53         nop                     # E :
54         cmpbge  zero, t0, t1    # E : bits set iff byte == 0
55         bne     t1, $found      # U :
56
57 $loop:  ldq     t0, 8(a0)       # L :
58         addq    a0, 8, a0       # E :
59         cmpbge  zero, t0, t1    # E :
60         beq     t1, $loop       # U :
61
62 $found: cttz    t1, t2          # U0 :
63         addq    a0, t2, a0      # E :
64         jsr     t9, __stxncpy   # L0 : Now do the append.
65
66         /* Worry about the null termination.  */
67
68         cttz    t10, t2         # U0: byte offset of end-of-count.
69         nop                     # E :
70         zapnot  t0, t8, t1      # U : was last byte a null?
71         nop                     # E :
72
73         bne     t1, 0f          # U :
74         nop                     # E :
75         nop                     # E :
76         ret                     # L0 :
77
78 0:      addq    t2, a0, a0      # E : address of end-of-count
79         stb     zero, 1(a0)     # L :
80         nop                     # E :
81         ret                     # L0 :
82
83 $zerocount:
84         nop                     # E :
85         nop                     # E :
86         nop                     # E :
87         ret                     # L0 :
88
89         END(strncat)