Various cleanups.
[kopensolaris-gnu/glibc.git] / sysdeps / ia64 / strncpy.S
1 /* Optimized version of the standard strncpy() function.
2    This file is part of the GNU C Library.
3    Copyright (C) 2000 Free Software Foundation, Inc.
4    Contributed by Dan Pop <Dan.Pop@cern.ch>.
5
6    The GNU C Library is free software; you can redistribute it and/or
7    modify it under the terms of the GNU Library General Public License as
8    published by the Free Software Foundation; either version 2 of the
9    License, or (at your option) any later version.
10
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    Library General Public License for more details.
15
16    You should have received a copy of the GNU Library General Public
17    License along with the GNU C Library; see the file COPYING.LIB.  If not,
18    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19    Boston, MA 02111-1307, USA.  */
20
21 /* Return: dest
22
23    Inputs:
24         in0:    dest
25         in1:    src
26         in2:    char count
27
28    If n >= 24, do a memcpy(dest, src, min(strlen(src)+1, n)), followed by a
29    memset(dest + strlen(src), 0, n - strlen(src) - 1) if necessary.
30
31    Otherwise, copy characters one by one and fill with nulls if necessary.  */
32
33 #include <sysdep.h>
34 #undef ret
35
36 #define saved_pfs       loc0
37 #define saved_b0        loc1
38 #define saved_pr        loc2
39 #define saved_lc        loc3
40 #define tmp             loc4
41 #define len             loc5
42
43 #define dest            in0
44 #define src             in1
45 #define n               in2
46
47 #define rc              ret0
48
49 ENTRY(strncpy)
50         alloc   saved_pfs = ar.pfs, 3, 6, 3, 0
51         mov     saved_b0 = b0
52         mov     saved_pr = pr
53         mov     saved_lc = ar.lc
54         cmp.gtu p6, p0 = 24, n
55 (p6)    br.cond.spnt .cpyfew
56         mov     out0 = src
57         mov     tmp = gp ;;
58         br.call.sptk.many b0 = strlen# ;;       // rc = strlen(src);
59         add     len = 1, rc                     // include the null in len
60         mov     gp = tmp
61         mov     out0 = dest ;;
62         cmp.ltu p4, p5 = len, n
63         mov     out1 = src ;;
64 (p4)    mov     out2 = len
65 (p5)    mov     out2 = n
66         br.call.sptk.many b0 = memcpy# ;;       // memcpy(dest, src, min(len, n));
67         mov     gp = tmp
68 (p4)    add     out0 = dest, len
69 (p4)    mov     out1 = r0
70 (p4)    sub     out2 = n, len
71 (p4)    br.call.sptk.many b0 = memset# ;;       // fill the rest with nulls
72 (p4)    mov     gp = tmp
73         mov     rc = dest
74         mov     b0 = saved_b0
75         mov     ar.pfs = saved_pfs
76         mov     pr = saved_pr, -1
77         br.ret.sptk.many b0
78 .cpyfew:
79         mov     rc = dest
80         cmp.eq  p6, p0 = n, r0          
81         adds    n = -1, n
82 (p6)    br.cond.spnt .restore_and_exit ;;       // do nothing if n == 0
83         mov     ar.lc = n
84         cmp.eq  p6, p0 = r0, r0 ;;              // set p6
85 .loop:
86 (p6)    ld1     tmp = [src],1 
87         ;;
88         st1     [dest] = tmp, 1
89 (p6)    cmp.ne  p6, p0 = tmp, r0        // clear p6 after encountering the
90         br.cloop.dptk .loop ;;          // null character in src
91 .restore_and_exit:
92         mov     ar.lc = saved_lc
93         mov     ar.pfs = saved_pfs
94         br.ret.sptk.many b0
95 END(strncpy)