Define __bzero as well.
[kopensolaris-gnu/glibc.git] / sysdeps / ia64 / bzero.S
1 /* Optimized version of the standard bzero() function.
2    This file is part of the GNU C Library.
3    Copyright (C) 2000, 2001, 2002 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 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.
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    Lesser General Public License for more details.
15
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.  */
20
21 /* Return: dest
22
23    Inputs:
24         in0:    dest
25         in1:    count
26
27    The algorithm is fairly straightforward: set byte by byte until we
28    we get to a word aligned address, then set word by word as much as
29    possible; the remaining few bytes are set one by one.  */
30
31 #include <sysdep.h>
32 #undef ret
33
34 #define dest            in0
35 #define cnt             in1
36
37 #define save_pfs        loc0
38 #define ptr1            loc1
39 #define ptr2            loc2
40 #define tmp             loc3
41 #define loopcnt         loc4
42 #define save_lc         loc5
43
44 ENTRY(__bzero)
45         .prologue
46         alloc   save_pfs = ar.pfs, 2, 6, 0, 0
47         .save ar.lc, save_lc
48         mov     save_lc = ar.lc
49         .body
50         mov     ret0 = dest
51         and     tmp = 7, dest
52         cmp.eq  p6, p0 = cnt, r0
53 (p6)    br.cond.spnt .restore_and_exit ;;
54         mov     ptr1 = dest
55         sub     loopcnt = 8, tmp
56         cmp.gt  p6, p0 = 16, cnt
57 (p6)    br.cond.spnt .set_few;;
58         cmp.eq  p6, p0 = tmp, r0
59 (p6)    br.cond.sptk .dest_aligned
60         sub     cnt = cnt, loopcnt
61         adds    loopcnt = -1, loopcnt;;
62         mov     ar.lc = loopcnt;;
63 .l1:
64         st1     [ptr1] = r0, 1
65         br.cloop.dptk   .l1 ;;
66 .dest_aligned:
67         adds    ptr2 = 8, ptr1
68         shr.u   loopcnt = cnt, 4 ;;     // loopcnt = cnt / 16
69         cmp.eq  p6, p0 = loopcnt, r0
70 (p6)    br.cond.spnt    .one_more
71         and     cnt = 0xf, cnt          // compute the remaining cnt
72         adds    loopcnt = -1, loopcnt;;
73         mov     ar.lc = loopcnt;;
74 .l2:
75         st8     [ptr1] = r0, 16
76         st8     [ptr2] = r0, 16
77         br.cloop.dptk .l2
78         cmp.le  p6, p0 = 8, cnt ;;
79 .one_more:
80 (p6)    st8     [ptr1] = r0, 8
81 (p6)    adds    cnt = -8, cnt ;;
82         cmp.eq  p6, p0 = cnt, r0
83 (p6)    br.cond.spnt    .restore_and_exit
84 .set_few:
85         adds    loopcnt = -1, cnt;;
86         mov     ar.lc = loopcnt;;
87 .l3:
88         st1     [ptr1] = r0, 1
89         br.cloop.dptk   .l3 ;;
90 .restore_and_exit:
91         mov     ar.lc = save_lc
92         mov     ar.pfs = save_pfs
93         br.ret.sptk.many b0
94 END(__bzero)
95 weak_alias (__bzero, bzero)