2.9
[glibc/nacl-glibc.git] / sysdeps / s390 / s390-32 / strncpy.S
blobfdd81348baa987f9150f537c12b8a8ff6b93a255
1 /* strncpy - copy at most n characters from a string from source to
2    destination.  For IBM S390
3    This file is part of the GNU C Library.
4    Copyright (C) 2000, 2001, 2003 Free Software Foundation, Inc.
5    Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
7    The GNU C Library is free software; you can redistribute it and/or
8    modify it under the terms of the GNU Lesser General Public
9    License as published by the Free Software Foundation; either
10    version 2.1 of the License, or (at your option) any later version.
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    Lesser General Public License for more details.
17    You should have received a copy of the GNU Lesser General Public
18    License along with the GNU C Library; if not, write to the Free
19    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
20    02111-1307 USA.  */
23  * R2 = address of destination (dst)
24  * R3 = address of source (src)
25  * R4 = max of bytes to copy
26  */
28 #include "sysdep.h"
29 #include "asm-syntax.h"
31 ENTRY(strncpy)
32         .text
33         st    %r2,24(%r15)          # save dst pointer
34         slr   %r2,%r3               # %r3 points to src, %r2+%r3 to dst
35         lhi   %r1,3
36         nr    %r1,%r4               # last 2 bits of # bytes
37         srl   %r4,2
38         ltr   %r4,%r4               # less than 4 bytes to copy ?
39         jz    .L1
40         bras  %r5,.L0               # enter loop & load address of a 0
41         .long 0
42 .L0:    icm   %r0,8,0(%r3)          # first byte
43         jz    .L3
44         icm   %r0,4,1(%r3)          # second byte
45         jz    .L4
46         icm   %r0,2,2(%r3)          # third byte
47         jz    .L5
48         icm   %r0,1,3(%r3)          # fourth byte
49         jz    .L6
50         st    %r0,0(%r2,%r3)        # store all four to dest.
51         la    %r3,4(%r3)
52         brct  %r4,.L0
53 .L1:    ltr   %r1,%r1
54         jz    .Lexit
55 .L2:    icm   %r0,1,0(%r3)
56         stc   %r0,0(%r2,%r3)
57         la    %r3,1(%r3)
58         jz    .L7
59         brct  %r1,.L2
60         j     .Lexit
61 .L3:    icm   %r0,4,0(%r5)
62 .L4:    icm   %r0,2,0(%r5)
63 .L5:    icm   %r0,1,0(%r5)
64 .L6:    st    %r0,0(%r2,%r3)
65         la    %r3,4(%r3)
66         ahi   %r4,-1
67         j     .L8
68 .L7:    ahi   %r1,-1
69 .L8:    sll   %r4,2
70         alr   %r4,%r1
71         alr   %r2,%r3               # start of dst area to be zeroed
72         lr    %r3,%r4
73         slr   %r4,%r4
74         slr   %r5,%r5
75 .L9:    mvcle %r2,%r4,0             # pad dst with zeroes
76         jo    .L9
77 .Lexit: l     %r2,24(%r15)          # return dst pointer
78         br    %r14
79 END(strncpy)
80 libc_hidden_builtin_def (strncpy)