Update to LGPL v2.1.
[jlayton/glibc.git] / sysdeps / sparc / sparc64 / memset.S
1 /* Set a block of memory to some byte value.
2    For UltraSPARC.
3    Copyright (C) 1996, 97, 98, 99 Free Software Foundation, Inc.
4    This file is part of the GNU C Library.
5    Contributed by David S. Miller (davem@caip.rutgers.edu) and
6                   Jakub Jelinek (jj@ultra.linux.cz).
7
8    The GNU C Library is free software; you can redistribute it and/or
9    modify it under the terms of the GNU Lesser General Public
10    License as published by the Free Software Foundation; either
11    version 2.1 of the License, or (at your option) any later version.
12
13    The GNU C Library is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16    Lesser General Public License for more details.
17
18    You should have received a copy of the GNU Lesser General Public
19    License along with the GNU C Library; if not, write to the Free
20    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
21    02111-1307 USA.  */
22
23 #include <sysdep.h>
24 #include <asm/asi.h>
25 #ifndef XCC
26 #define XCC xcc
27 #define USE_BPR
28 #endif
29 #define FPRS_FEF        4
30
31 #define SET_BLOCKS(base, offset, source)                \
32         stx             source, [base - offset - 0x18]; \
33         stx             source, [base - offset - 0x10]; \
34         stx             source, [base - offset - 0x08]; \
35         stx             source, [base - offset - 0x00];
36
37         /* Well, memset is a lot easier to get right than bcopy... */
38         .text
39         .align          32
40 ENTRY(memset)
41         andcc           %o1, 0xff, %o1
42         mov             %o0, %o5
43         be,a,pt         %icc, 50f
44 #ifndef USE_BPR
45          srl            %o2, 0, %o1
46 #else
47          mov            %o2, %o1
48 #endif
49         cmp             %o2, 7
50 #ifndef USE_BPR
51         srl             %o2, 0, %o2
52 #endif
53         bleu,pn         %XCC, 17f
54          andcc          %o0, 3, %g5
55         be,pt           %xcc, 4f
56          and            %o1, 0xff, %o1
57         cmp             %g5, 3
58         be,pn           %xcc, 2f
59          stb            %o1, [%o0 + 0x00]
60         cmp             %g5, 2
61         be,pt           %xcc, 2f
62          stb            %o1, [%o0 + 0x01]
63         stb             %o1, [%o0 + 0x02]
64 2:      sub             %g5, 4, %g5
65         sub             %o0, %g5, %o0
66         add             %o2, %g5, %o2
67 4:      sllx            %o1, 8, %g1
68         andcc           %o0, 4, %g0
69         or              %o1, %g1, %o1
70         sllx            %o1, 16, %g1
71         or              %o1, %g1, %o1
72         be,pt           %xcc, 2f
73          sllx           %o1, 32, %g1
74         stw             %o1, [%o0]
75         sub             %o2, 4, %o2
76         add             %o0, 4, %o0
77 2:      cmp             %o2, 128
78         or              %o1, %g1, %o1
79         blu,pn          %xcc, 9f
80          andcc          %o0, 0x38, %g5
81         be,pn           %icc, 6f
82          mov            64, %o4
83         andcc           %o0, 8, %g0
84         be,pn           %icc, 1f
85          sub            %o4, %g5, %o4
86         stx             %o1, [%o0]
87         add             %o0, 8, %o0
88 1:      andcc           %o4, 16, %g0
89         be,pn           %icc, 1f
90          sub            %o2, %o4, %o2
91         stx             %o1, [%o0]
92         stx             %o1, [%o0 + 8]
93         add             %o0, 16, %o0
94 1:      andcc           %o4, 32, %g0
95         be,pn           %icc, 7f
96          andncc         %o2, 0x3f, %o3
97         stw             %o1, [%o0]
98         stw             %o1, [%o0 + 4]
99         stw             %o1, [%o0 + 8]
100         stw             %o1, [%o0 + 12]
101         stw             %o1, [%o0 + 16]
102         stw             %o1, [%o0 + 20]
103         stw             %o1, [%o0 + 24]
104         stw             %o1, [%o0 + 28]
105         add             %o0, 32, %o0
106 7:      be,pn           %xcc, 9f
107          nop
108         ldd             [%o0 - 8], %f0
109 18:     wr              %g0, ASI_BLK_P, %asi
110         membar          #StoreStore | #LoadStore
111         andcc           %o3, 0xc0, %g5
112         and             %o2, 0x3f, %o2
113         fmovd           %f0, %f2
114         fmovd           %f0, %f4
115         andn            %o3, 0xff, %o3
116         fmovd           %f0, %f6
117         cmp             %g5, 64
118         fmovd           %f0, %f8
119         fmovd           %f0, %f10
120         fmovd           %f0, %f12
121         brz,pn          %g5, 10f
122          fmovd          %f0, %f14
123         be,pn           %icc, 2f
124          stda           %f0, [%o0 + 0x00] %asi
125         cmp             %g5, 128
126         be,pn           %icc, 2f
127          stda           %f0, [%o0 + 0x40] %asi
128         stda            %f0, [%o0 + 0x80] %asi
129 2:      brz,pn          %o3, 12f
130          add            %o0, %g5, %o0
131 10:     stda            %f0, [%o0 + 0x00] %asi
132         stda            %f0, [%o0 + 0x40] %asi
133         stda            %f0, [%o0 + 0x80] %asi
134         stda            %f0, [%o0 + 0xc0] %asi
135 11:     subcc           %o3, 256, %o3
136         bne,pt          %xcc, 10b
137          add            %o0, 256, %o0
138 12:     wr              %g0, FPRS_FEF, %fprs
139         membar          #StoreLoad | #StoreStore
140 9:      andcc           %o2, 0x78, %g5
141         be,pn           %xcc, 13f
142          andcc          %o2, 7, %o2
143 14:     rd              %pc, %o4
144         srl             %g5, 1, %o3
145         sub             %o4, %o3, %o4
146         jmpl            %o4 + (13f - 14b), %g0
147          add            %o0, %g5, %o0
148 12:     SET_BLOCKS      (%o0, 0x68, %o1)
149         SET_BLOCKS      (%o0, 0x48, %o1)
150         SET_BLOCKS      (%o0, 0x28, %o1)
151         SET_BLOCKS      (%o0, 0x08, %o1)
152 13:     be,pn           %xcc, 8f
153          andcc          %o2, 4, %g0
154         be,pn           %xcc, 1f
155          andcc          %o2, 2, %g0
156         stw             %o1, [%o0]
157         add             %o0, 4, %o0
158 1:      be,pn           %xcc, 1f
159          andcc          %o2, 1, %g0
160         sth             %o1, [%o0]
161         add             %o0, 2, %o0
162 1:      bne,a,pn        %xcc, 8f
163          stb            %o1, [%o0]
164 8:      retl
165          mov            %o5, %o0
166 17:     brz,pn          %o2, 0f
167 8:       add            %o0, 1, %o0
168         subcc           %o2, 1, %o2
169         bne,pt          %xcc, 8b
170          stb            %o1, [%o0 - 1]
171 0:      retl
172          mov            %o5, %o0
173
174 6:      stx             %o1, [%o0]
175         andncc          %o2, 0x3f, %o3
176         be,pn           %xcc, 9b
177          nop
178         ba,pt           %xcc, 18b
179          ldd            [%o0], %f0
180 END(memset)
181
182 #define ZERO_BLOCKS(base, offset, source)               \
183         stx             source, [base - offset - 0x38]; \
184         stx             source, [base - offset - 0x30]; \
185         stx             source, [base - offset - 0x28]; \
186         stx             source, [base - offset - 0x20]; \
187         stx             source, [base - offset - 0x18]; \
188         stx             source, [base - offset - 0x10]; \
189         stx             source, [base - offset - 0x08]; \
190         stx             source, [base - offset - 0x00];
191
192         .text
193         .align          32
194 ENTRY(__bzero)
195 #ifndef USE_BPR
196         srl             %o1, 0, %o1
197 #endif
198         mov             %o0, %o5
199 50:     cmp             %o1, 7
200         bleu,pn         %xcc, 17f
201          andcc          %o0, 3, %o2
202         be,a,pt         %xcc, 4f
203          andcc          %o0, 4, %g0
204         cmp             %o2, 3
205         be,pn           %xcc, 2f
206          stb            %g0, [%o0 + 0x00]
207         cmp             %o2, 2
208         be,pt           %xcc, 2f
209          stb            %g0, [%o0 + 0x01]
210         stb             %g0, [%o0 + 0x02]
211 2:      sub             %o2, 4, %o2
212         sub             %o0, %o2, %o0
213         add             %o1, %o2, %o1
214         andcc           %o0, 4, %g0
215 4:      be,pt           %xcc, 2f
216          cmp            %o1, 128
217         stw             %g0, [%o0]
218         sub             %o1, 4, %o1
219         add             %o0, 4, %o0
220 2:      blu,pn          %xcc, 9f
221          andcc          %o0, 0x38, %o2
222         be,pn           %icc, 6f
223          mov            64, %o4
224         andcc           %o0, 8, %g0
225         be,pn           %icc, 1f
226          sub            %o4, %o2, %o4
227         stx             %g0, [%o0]
228         add             %o0, 8, %o0
229 1:      andcc           %o4, 16, %g0
230         be,pn           %icc, 1f
231          sub            %o1, %o4, %o1
232         stx             %g0, [%o0]
233         stx             %g0, [%o0 + 8]
234         add             %o0, 16, %o0
235 1:      andcc           %o4, 32, %g0
236         be,pn           %icc, 7f
237          andncc         %o1, 0x3f, %o3
238         stx             %g0, [%o0]
239         stx             %g0, [%o0 + 8]
240         stx             %g0, [%o0 + 16]
241         stx             %g0, [%o0 + 24]
242         add             %o0, 32, %o0
243 6:      andncc          %o1, 0x3f, %o3
244 7:      be,pn           %xcc, 9f
245          wr             %g0, ASI_BLK_P, %asi
246         membar          #StoreLoad | #StoreStore | #LoadStore
247         fzero           %f0
248         andcc           %o3, 0xc0, %o2
249         and             %o1, 0x3f, %o1
250         fzero           %f2
251         andn            %o3, 0xff, %o3
252         faddd           %f0, %f2, %f4
253         fmuld           %f0, %f2, %f6
254         cmp             %o2, 64
255         faddd           %f0, %f2, %f8
256         fmuld           %f0, %f2, %f10
257         faddd           %f0, %f2, %f12
258         brz,pn          %o2, 10f
259          fmuld          %f0, %f2, %f14
260         be,pn           %icc, 2f
261          stda           %f0, [%o0 + 0x00] %asi
262         cmp             %o2, 128
263         be,pn           %icc, 2f
264          stda           %f0, [%o0 + 0x40] %asi
265         stda            %f0, [%o0 + 0x80] %asi
266 2:      brz,pn          %o3, 12f
267          add            %o0, %o2, %o0
268 10:     stda            %f0, [%o0 + 0x00] %asi
269         stda            %f0, [%o0 + 0x40] %asi
270         stda            %f0, [%o0 + 0x80] %asi
271         stda            %f0, [%o0 + 0xc0] %asi
272 11:     subcc           %o3, 256, %o3
273         bne,pt          %xcc, 10b
274          add            %o0, 256, %o0
275 12:     wr              %g0, FPRS_FEF, %fprs
276         membar          #StoreLoad | #StoreStore
277 9:      andcc           %o1, 0xf8, %o2
278         be,pn           %xcc, 13f
279          andcc          %o1, 7, %o1
280 14:     rd              %pc, %o4
281         srl             %o2, 1, %o3
282         sub             %o4, %o3, %o4
283         jmpl            %o4 + (13f - 14b), %g0
284          add            %o0, %o2, %o0
285 12:     ZERO_BLOCKS     (%o0, 0xc8, %g0)
286         ZERO_BLOCKS     (%o0, 0x88, %g0)
287         ZERO_BLOCKS     (%o0, 0x48, %g0)
288         ZERO_BLOCKS     (%o0, 0x08, %g0)
289 13:     be,pn           %xcc, 8f
290          andcc          %o1, 4, %g0
291         be,pn           %xcc, 1f
292          andcc          %o1, 2, %g0
293         stw             %g0, [%o0]
294         add             %o0, 4, %o0
295 1:      be,pn           %xcc, 1f
296          andcc          %o1, 1, %g0
297         sth             %g0, [%o0]
298         add             %o0, 2, %o0
299 1:      bne,a,pn        %xcc, 8f
300          stb            %g0, [%o0]
301 8:      retl
302          mov            %o5, %o0
303 17:     be,pn           %xcc, 13b
304          orcc           %o1, 0, %g0
305         be,pn           %xcc, 0f
306 8:       add            %o0, 1, %o0
307         subcc           %o1, 1, %o1
308         bne,pt          %xcc, 8b
309          stb            %g0, [%o0 - 1]
310 0:      retl
311          mov            %o5, %o0
312 END(__bzero)
313
314 weak_alias(__bzero, bzero)