Update.
[glibc.git] / sysdeps / ia64 / strcat.S
blobdd2c6b8a40dee05b5ce90ccc1215cec6c32682f3
1 /* IA-64 assembly version of the standard strcat() function.  
2    This file is part of the GNU C Library.
3    Copyright (C) 2000, 2001, 2003 Free Software Foundation, Inc.
4    Contributed by Dan Pop <Dan.Pop@cern.ch>.
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 /* Return: dest
23    Inputs:
24         in0:    dest
25         in1:    src
27    A straightforword implementation: strcpy(dest + strlen(dest), src).
29    Could be marginally optimised by inlining the code of strcpy() and
30    strlen(), to avoid the two function calls.  OTOH, by not doing that,
31    we avoid L1I cache pollution (code using strcat() is likely to also
32    use strcpy() and strlen(), so we already have a copy of these functions
33    in the cache).  */
35 #include <sysdep.h>
36 #undef ret
38 #define src     in1
39 #define dest    in0
40 #define save_b0 loc0
41 #define save_pfs loc1
42 #define tmp     loc2
43 #define rc      ret0
45 ENTRY(strcat)
46         .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(2)
47         alloc   save_pfs = ar.pfs, 2, 3, 2, 0
48         mov     save_b0 = b0
49         .body
50         mov     out0 = dest
51         mov     tmp = gp ;;
52         br.call.sptk.many b0 = strlen# ;; // rc = strlen(dest);
53         mov     gp = tmp
54         add     out0 = dest, rc
55         mov     out1 = src
56         br.call.sptk.many b0 = strcpy# ;; // strcpy(dest + strlen(dest), src)
57         mov     gp = tmp
58         mov     rc = dest
59         mov     b0 = save_b0
60         mov     ar.pfs = save_pfs
61         br.ret.sptk.many b0
62 END(strcat)
63 libc_hidden_builtin_def (strcat)