Update.
[glibc.git] / sysdeps / alpha / strncpy.S
blob91bf9285425e565989f2ca34083a348a5937f3fd
1 /* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
2    Contributed by Richard Henderson (rth@tamu.edu)
3    This file is part of the GNU C Library.
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Library General Public License as
7    published by the Free Software Foundation; either version 2 of the
8    License, or (at your option) any later version.
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Library General Public License for more details.
15    You should have received a copy of the GNU Library General Public
16    License along with the GNU C Library; see the file COPYING.LIB.  If not,
17    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18    Boston, MA 02111-1307, USA.  */
20 /* Copy no more than COUNT bytes of the null-terminated string from
21    SRC to DST.  If SRC does not cover all of COUNT, the balance is
22    zeroed.  */
24 #include <sysdep.h>
26         .set noat
27         .set noreorder
29         .text
31 ENTRY(strncpy)
32         ldgp    gp, 0(pv)
33 #ifdef PROF
34         lda     AT, _mcount
35         jsr     AT, (AT), _mcount
36 #endif
37         .prologue 1
39         mov     a0, v0          # set return value now
40         beq     a2, $zerocount
41         jsr     t9, __stxncpy   # do the work of the copy
43         bne     a2, $multiword  # do we have full words left?
45         .align 3
46         subq    t8, 1, t2       # e0    : guess not
47         subq    t10, 1, t3      # .. e1 :
48         or      t2, t8, t2      # e0    : clear the bits between the last
49         or      t3, t10, t3     # .. e1 : written byte and the last byte in
50         andnot  t3, t2, t3      # e0    : COUNT
51         zap     t0, t3, t0      # e1    :
52         stq_u   t0, 0(a0)       # e0    :
53         ret                     # .. e1 :
55 $multiword:
57         subq    t8, 1, t7       # e0    : clear the final bits in the prev
58         or      t7, t8, t7      # e1    : word
59         zapnot  t0, t7, t0      # e0    :
60         subq    a2, 1, a2       # .. e1 :
61         stq_u   t0, 0(a0)       # e0    :
62         addq    a0, 8, a0       # .. e1 :
64         beq     a2, 1f          # e1    :
65         blbc    a2, 0f          # e1    :
67         stq_u   zero, 0(a0)     # e0    : zero one word
68         subq    a2, 1, a2       # .. e1 :
69         addq    a0, 8, a0       # e0    :
70         beq     a2, 1f          # .. e1 :
72 0:      stq_u   zero, 0(a0)     # e0    : zero two words
73         subq    a2, 2, a2       # .. e1 :
74         stq_u   zero, 8(a0)     # e0    :
75         addq    a0, 16, a0      # .. e1 :
76         bne     a2, 0b          # e1    :
77         unop
79 1:      ldq_u   t0, 0(a0)       # e0    : clear the leading bits in the final
80         subq    t10, 1, t7      # .. e1 : word
81         or      t7, t10, t7     # e0    :
82         zap     t0, t7, t0      # e1 (stall)
83         stq_u   t0, 0(a0)       # e0    :
85 $zerocount:
86         ret                     # .. e1 :
88         END(strncpy)