]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/sparc/sparc64/strncpy.S
Update copyright notices with scripts/update-copyrights
[thirdparty/glibc.git] / sysdeps / sparc / sparc64 / strncpy.S
CommitLineData
ae6b8730
RH
1/* strncpy(DST, SRC, COUNT) - Copy no more than COUNT bytes of the
2 null-terminated string from SRC to DST. If SRC does not cover all of
3 COUNT, the balance is zeroed.
4 For SPARC v9.
d4697bc9 5 Copyright (C) 1998-2014 Free Software Foundation, Inc.
ae6b8730
RH
6 This file is part of the GNU C Library.
7 Contributed by Jan Vondrak <jvon4518@ss1000.ms.mff.cuni.cz> and
8 Jakub Jelinek <jj@ultra.linux.cz>.
9
10 The GNU C Library is free software; you can redistribute it and/or
41bdb6e2
AJ
11 modify it under the terms of the GNU Lesser General Public
12 License as published by the Free Software Foundation; either
13 version 2.1 of the License, or (at your option) any later version.
ae6b8730
RH
14
15 The GNU C Library is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
41bdb6e2 18 Lesser General Public License for more details.
ae6b8730 19
41bdb6e2 20 You should have received a copy of the GNU Lesser General Public
59ba27a6
PE
21 License along with the GNU C Library; if not, see
22 <http://www.gnu.org/licenses/>. */
ae6b8730
RH
23
24#include <sysdep.h>
25#include <asm/asi.h>
26#ifndef XCC
27#define XCC xcc
28#define USE_BPR
8cb079d4
UD
29 .register %g2, #scratch
30 .register %g3, #scratch
62f29da7 31 .register %g6, #scratch
ae6b8730
RH
32#endif
33
34 /* Normally, this uses
35 ((xword - 0x0101010101010101) & 0x8080808080808080) test
36 to find out if any byte in xword could be zero. This is fast, but
37 also gives false alarm for any byte in range 0x81-0xff. It does
38 not matter for correctness, as if this test tells us there could
39 be some zero byte, we check it byte by byte, but if bytes with
40 high bits set are common in the strings, then this will give poor
41 performance. You can #define EIGHTBIT_NOT_RARE and the algorithm
42 will use one tick slower, but more precise test
43 ((xword - 0x0101010101010101) & (~xword) & 0x8080808080808080),
44 which does not give any false alarms (but if some bits are set,
45 one cannot assume from it which bytes are zero and which are not).
46 It is yet to be measured, what is the correct default for glibc
47 in these days for an average user.
48 */
49
50 .text
51 .align 32
52ENTRY(strncpy)
53 sethi %hi(0x01010101), %g1 /* IEU0 Group */
54#ifdef USE_BPR
55 brz,pn %o2, 19f /* CTI+IEU1 */
56#else
57 tst %o2 /* IEU1 */
58 be,pn %XCC, 19f /* CTI */
59#endif
62f29da7 60 mov %o0, %g6 /* IEU0 Group */
ae6b8730
RH
61 or %g1, %lo(0x01010101), %g1 /* IEU1 */
62
63 andcc %o0, 7, %g0 /* IEU1 Group */
64 sllx %g1, 32, %g2 /* IEU0 */
65 bne,pn %icc, 26f /* CTI */
66 or %g1, %g2, %g1 /* IEU0 Group */
67
68 andcc %o1, 7, %g3 /* IEU1 */
69 bne,pn %icc, 28f /* CTI */
70 sllx %g1, 7, %g2 /* IEU0 Group */
71 ldx [%o1], %o3 /* Load */
72
731: add %o1, 8, %o1 /* IEU1 */
742: subcc %o2, 8, %o2 /* IEU1 Group */
75 bl,pn %XCC, 18f /* CTI */
76 sub %o3, %g1, %o4 /* IEU0 */
77
78 add %o0, 8, %o0 /* IEU0 Group */
79#ifdef EIGHTBIT_NOT_MORE
80 andn %o4, %o3, %o4 /* IEU1 */
81#endif
82 mov %o3, %g3 /* IEU1 */
83 ldxa [%o1] ASI_PNF, %o3 /* Load */
84 add %o1, 8, %o1 /* IEU0 Group */
85
86 andcc %o4, %g2, %g0 /* IEU1 */
87 be,a,pt %xcc, 2b /* CTI */
88 stx %g3, [%o0-8] /* Store Group */
89 srlx %g3, 56, %g5 /* IEU0 Group */
90
91 andcc %g5, 0xff, %g0 /* IEU1 Group */
92 be,pn %icc, 16f /* CTI */
93 srlx %g3, 48, %g4 /* IEU0 */
94 andcc %g4, 0xff, %g0 /* IEU1 Group */
95
96 be,pn %icc, 15f /* CTI */
97 srlx %g3, 40, %g5 /* IEU0 */
98 andcc %g5, 0xff, %g0 /* IEU1 Group */
99 be,pn %icc, 14f /* CTI */
100
101 srlx %g3, 32, %g4 /* IEU0 */
102 andcc %g4, 0xff, %g0 /* IEU1 Group */
103 be,pn %icc, 13f /* CTI */
104 srlx %g3, 24, %g5 /* IEU0 */
105
106 andcc %g5, 0xff, %g0 /* IEU1 Group */
107 be,pn %icc, 12f /* CTI */
108 srlx %g3, 16, %g4 /* IEU0 */
109 andcc %g4, 0xff, %g0 /* IEU1 Group */
110
111 be,pn %icc, 11f /* CTI */
112 srlx %g3, 8, %g5 /* IEU0 */
113 andcc %g5, 0xff, %g0 /* IEU1 Group */
114 be,pn %icc, 10f /* CTI */
115
116 andcc %g3, 0xff, %g0 /* IEU1 Group */
117 bne,pt %icc, 2b /* CTI */
1183: stx %g3, [%o0-8] /* Store */
119 andncc %o2, 31, %g3 /* IEU1 Group */
120
1214: be,pn %XCC, 41f /* CTI */
122 and %o2, 31, %o2 /* IEU1 Group */
12340: stx %g0, [%o0] /* Store */
124 stx %g0, [%o0 + 8] /* Store Group */
125
126 subcc %g3, 32, %g3 /* IEU1 */
127 stx %g0, [%o0 + 16] /* Store Group */
128 stx %g0, [%o0 + 24] /* Store Group */
129 bne,pt %XCC, 40b /* CTI */
130
131 add %o0, 32, %o0 /* IEU0 */
13241: subcc %o2, 8, %o2 /* IEU1 Group */
133 bl,a,pn %XCC, 6f /* CTI */
134 andcc %o2, 4, %g0 /* IEU1 Group */
135
1365: stx %g0, [%o0] /* Store */
137 subcc %o2, 8, %o2 /* IEU1 Group */
138 bge,pt %XCC, 5b /* CTI */
139 add %o0, 8, %o0 /* IEU0 */
140
141 andcc %o2, 4, %g0 /* IEU1 Group */
1426: be,a,pn %icc, 7f /* CTI */
143 andcc %o2, 2, %g0 /* IEU1 Group */
144 stw %g0, [%o0] /* Store */
145
146 add %o0, 4, %o0 /* IEU0 */
147 andcc %o2, 2, %g0 /* IEU1 Group */
1487: be,a,pn %icc, 8f /* CTI */
149 andcc %o2, 1, %g0 /* IEU1 Group */
150
151 sth %g0, [%o0] /* Store */
152 add %o0, 2, %o0 /* IEU0 */
153 andcc %o2, 1, %g0 /* IEU1 Group */
1548: bne,a,pn %icc, 9f /* CTI */
155
156 stb %g0, [%o0] /* Store */
1579: retl /* CTI+IEU1 Group */
62f29da7 158 mov %g6, %o0 /* IEU0 */
ae6b8730
RH
159
160 .align 16
16110: ba,pt %xcc, 3b /* CTI */
162 sllx %g5, 8, %g3 /* IEU0 */
16311: ba,pt %xcc, 3b /* CTI Group */
164 sllx %g4, 16, %g3 /* IEU0 */
165
16612: ba,pt %xcc, 3b /* CTI Group */
167 sllx %g5, 24, %g3 /* IEU0 */
16813: ba,pt %xcc, 3b /* CTI Group */
169 sllx %g4, 32, %g3 /* IEU0 */
170
17114: ba,pt %xcc, 3b /* CTI Group */
172 sllx %g5, 40, %g3 /* IEU0 */
17315: ba,pt %xcc, 3b /* CTI Group */
174 sllx %g4, 48, %g3 /* IEU0 */
175
17616: ba,pt %xcc, 3b /* CTI */
177 sllx %g5, 56, %g3 /* IEU0 */
17817: or %o3, %o4, %o3 /* IEU0 Group */
179 sub %o3, %g1, %o4 /* IEU1 */
180
18118: addcc %o2, 8, %o2 /* IEU1 Group */
182 be,pn %XCC, 19f /* CTI */
183 andcc %o4, %g2, %g0 /* IEU1 Group */
184 be,pt %xcc, 21f /* CTI */
185
186 srlx %o3, 56, %g5 /* IEU0 */
187 andcc %g5, 0xff, %g0 /* IEU1 Group */
188 be,pn %icc, 20f /* CTI */
189 stb %g5, [%o0] /* Store */
190
191 add %o0, 1, %o0 /* IEU0 Group */
192 subcc %o2, 1, %o2 /* IEU1 */
193 be,pn %XCC, 19f /* CTI */
194 srlx %o3, 48, %g5 /* IEU0 Group */
195
196 andcc %g5, 0xff, %g0 /* IEU1 Group */
197 be,pn %icc, 20f /* CTI */
198 stb %g5, [%o0] /* Store */
199 add %o0, 1, %o0 /* IEU0 Group */
200
201 subcc %o2, 1, %o2 /* IEU1 */
202 be,pn %XCC, 19f /* CTI */
203 srlx %o3, 40, %g5 /* IEU0 Group */
204 andcc %g5, 0xff, %g0 /* IEU1 Group */
205
206 be,pn %icc, 20f /* CTI */
207 stb %g5, [%o0] /* Store */
208 add %o0, 1, %o0 /* IEU0 Group */
209 subcc %o2, 1, %o2 /* IEU1 */
210
211 be,pn %XCC, 19f /* CTI */
212 srlx %o3, 32, %g5 /* IEU0 Group */
213 andcc %g5, 0xff, %g0 /* IEU1 Group */
214 be,pn %icc, 20f /* CTI */
215
216 stb %g5, [%o0] /* Store */
217 add %o0, 1, %o0 /* IEU0 Group */
218 subcc %o2, 1, %o2 /* IEU1 */
219 be,pn %XCC, 19f /* CTI */
220
221 srlx %o3, 24, %g5 /* IEU0 Group */
222 andcc %g5, 0xff, %g0 /* IEU1 Group */
223 be,pn %icc, 20f /* CTI */
224 stb %g5, [%o0] /* Store */
225
226 add %o0, 1, %o0 /* IEU0 Group */
227 subcc %o2, 1, %o2 /* IEU1 */
228 be,pn %XCC, 19f /* CTI */
229 srlx %o3, 16, %g5 /* IEU0 Group */
9c84384c 230
ae6b8730
RH
231 andcc %g5, 0xff, %g0 /* IEU1 Group */
232 be,pn %icc, 20f /* CTI */
233 stb %g5, [%o0] /* Store */
234 add %o0, 1, %o0 /* IEU0 Group */
235
236 subcc %o2, 1, %o2 /* IEU1 */
237 be,pn %XCC, 19f /* CTI */
238 srlx %o3, 8, %g5 /* IEU0 Group */
9c84384c 239 stb %g5, [%o0] /* Store */
ae6b8730
RH
240
24119: retl /* CTI+IEU1 Group */
62f29da7 242 mov %g6, %o0 /* IEU0 */
ae6b8730
RH
24350: stb %g0, [%o0] /* Store Group */
24420: subcc %o2, 1, %o2 /* IEU1 Group */
245
246 bne,pt %XCC, 50b /* CTI */
247 add %o0, 1, %o0 /* IEU0 */
248 retl /* CTI+IEU1 Group */
62f29da7 249 mov %g6, %o0 /* IEU0 */
ae6b8730
RH
250
25121: andcc %o2, 4, %g0 /* IEU1 Group */
252 be,pn %icc, 22f /* CTI */
253 srlx %o3, 32, %g5 /* IEU0 */
254 stw %g5, [%o0] /* Store Group */
255
256 add %o0, 4, %o0 /* IEU0 */
257 mov %o3, %g5 /* IEU1 */
25822: andcc %o2, 2, %g0 /* IEU1 Group */
259 be,pn %icc, 23f /* CTI */
260
261 srlx %g5, 16, %g4 /* IEU0 */
262 sth %g4, [%o0] /* Store Group */
263 add %o0, 2, %o0 /* IEU0 */
264 mov %g5, %g4 /* IEU1 */
265
26623: srlx %g4, 8, %g4 /* IEU0 Group */
267 andcc %o2, 1, %g0 /* IEU1 */
268 bne,a,pn %icc, 24f /* CTI */
269 stb %g4, [%o0] /* Store Group */
270
27124: retl /* CTI+IEU1 Group */
62f29da7 272 mov %g6, %o0 /* IEU0 */
ae6b8730
RH
27325: andcc %o0, 7, %g0 /* IEU1 Group */
274 be,a,pn %icc, 4b /* CTI */
275
276 andncc %o2, 31, %g3 /* IEU1 Group */
277 stb %g0, [%o0] /* Store Group */
278 subcc %o2, 1, %o2 /* IEU1 */
279 bne,pt %XCC, 25b /* CTI */
280
281 add %o0, 1, %o0 /* IEU0 Group */
282 retl /* CTI+IEU1 Group */
62f29da7 283 mov %g6, %o0 /* IEU0 */
ae6b8730
RH
284
285 .align 16
28626: ldub [%o1], %o3 /* Load */
287 sllx %g1, 7, %g2 /* IEU0 Group */
288 stb %o3, [%o0] /* Store */
28927: subcc %o2, 1, %o2 /* IEU1 */
290
291 be,pn %XCC, 9b /* CTI */
292 add %o1, 1, %o1 /* IEU0 Group */
293 add %o0, 1, %o0 /* IEU1 */
294 andcc %o3, 0xff, %g0 /* IEU1 Group */
295
296 be,pn %icc, 25b /* CTI */
297 lduba [%o1] ASI_PNF, %o3 /* Load */
298 andcc %o0, 7, %g0 /* IEU1 Group */
299 bne,a,pt %icc, 27b /* CTI */
300
301 stb %o3, [%o0] /* Store */
302 andcc %o1, 7, %g3 /* IEU1 Group */
303 be,a,pt %icc, 1b /* CTI */
304 ldx [%o1], %o3 /* Load */
305
30628: orcc %g0, 64, %g4 /* IEU1 Group */
307 sllx %g3, 3, %g5 /* IEU0 */
308 sub %g4, %g5, %g4 /* IEU0 Group */
309 sub %o1, %g3, %o1 /* IEU1 */
310 /* %g1 = 0101010101010101
311 %g2 = 8080808080808080
312 %g3 = source alignment
313 %g5 = number of bits to shift left
314 %g4 = number of bits to shift right */
315
316 ldxa [%o1] ASI_PNF, %o5 /* Load Group */
317 addcc %o1, 8, %o1 /* IEU1 */
318
31929: sllx %o5, %g5, %o3 /* IEU0 Group */
320 ldxa [%o1] ASI_PNF, %o5 /* Load */
321 subcc %o2, 8, %o2 /* IEU1 */
322 bl,pn %XCC, 17b /* CTI */
323
324 srlx %o5, %g4, %o4 /* IEU0 Group */
325 add %o1, 8, %o1 /* IEU1 */
326 or %o3, %o4, %o3 /* IEU0 Group */
327 add %o0, 8, %o0 /* IEU1 */
328
329 sub %o3, %g1, %o4 /* IEU0 Group */
330#ifdef EIGHTBIT_NOT_RARE
331 andn %o4, %o3, %o4 /* IEU0 Group */
332#endif
333 andcc %o4, %g2, %g0 /* IEU1 Group */
334 be,a,pt %xcc, 29b /* CTI */
335 stx %o3, [%o0-8] /* Store */
336
337 srlx %o3, 56, %o4 /* IEU0 Group */
338 andcc %o4, 0xff, %g0 /* IEU1 Group */
339 be,pn %icc, 36f /* CTI */
340 srlx %o3, 48, %o4 /* IEU0 */
341
342 andcc %o4, 0xff, %g0 /* IEU1 Group */
343 be,pn %icc, 35f /* CTI */
344 srlx %o3, 40, %o4 /* IEU0 */
345 andcc %o4, 0xff, %g0 /* IEU1 Group */
346
347 be,pn %icc, 34f /* CTI */
348 srlx %o3, 32, %o4 /* IEU0 */
349 andcc %o4, 0xff, %g0 /* IEU1 Group */
350 be,pn %icc, 33f /* CTI */
351
352 srlx %o3, 24, %o4 /* IEU0 */
353 andcc %o4, 0xff, %g0 /* IEU1 Group */
354 be,pn %icc, 32f /* CTI */
355 srlx %o3, 16, %o4 /* IEU0 */
356
357 andcc %o4, 0xff, %g0 /* IEU1 Group */
358 be,pn %icc, 31f /* CTI */
359 srlx %o3, 8, %o4 /* IEU0 */
360 andcc %o4, 0xff, %g0 /* IEU1 Group */
361
362 be,pn %icc, 30f /* CTI */
363 andcc %o3, 0xff, %g0 /* IEU1 Group */
364 bne,pn %icc, 29b /* CTI */
365 stx %o3, [%o0-8] /* Store */
366
367 ba,pt %xcc, 4b /* CTI Group */
368 andncc %o2, 31, %g3 /* IEU1 */
36930: srlx %o3, 8, %o4 /* IEU0 */
370 ba,pt %xcc, 3b /* CTI */
371
372 sllx %o4, 8, %g3 /* IEU0 Group */
37331: srlx %o3, 16, %o4 /* IEU0 Group */
374 ba,pt %xcc, 3b /* CTI */
375 sllx %o4, 16, %g3 /* IEU0 Group */
376
37732: srlx %o3, 24, %o4 /* IEU0 Group */
378 ba,pt %xcc, 3b /* CTI */
379 sllx %o4, 24, %g3 /* IEU0 Group */
38033: srlx %o3, 32, %o4 /* IEU0 Group */
381
382 ba,pt %xcc, 3b /* CTI */
383 sllx %o4, 32, %g3 /* IEU0 Group */
38434: srlx %o3, 40, %o4 /* IEU0 Group */
385 ba,pt %xcc, 3b /* CTI */
386
387 sllx %o4, 40, %g3 /* IEU0 Group */
38835: srlx %o3, 48, %o4 /* IEU0 Group */
389 ba,pt %xcc, 3b /* CTI */
390 sllx %o4, 48, %g3 /* IEU0 Group */
391
39236: srlx %o3, 56, %o4 /* IEU0 Group */
393 ba,pt %xcc, 3b /* CTI */
394 sllx %o4, 56, %g3 /* IEU0 Group */
395END(strncpy)
85dd1003 396libc_hidden_builtin_def (strncpy)