]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/sparc/sparc64/stpncpy.S
Update copyright dates with scripts/update-copyrights.
[thirdparty/glibc.git] / sysdeps / sparc / sparc64 / stpncpy.S
CommitLineData
9c84384c 1/* stpncpy(DST, SRC, COUNT) - Copy no more than N characters of
ae6b8730
RH
2 SRC to DEST, returning the address of the terminating '\0' in
3 DEST, if any, or else DEST + N.
4 For SPARC v9.
04277e02 5 Copyright (C) 1998-2019 Free Software Foundation, Inc.
ae6b8730
RH
6 This file is part of the GNU C Library.
7 Contributed by Jakub Jelinek <jj@ultra.linux.cz> and
8 Jan Vondrak <jvon4518@ss1000.ms.mff.cuni.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(__stpncpy)
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
60 or %g1, %lo(0x01010101), %g1 /* IEU1 */
61 andcc %o0, 7, %g0 /* IEU1 Group */
62
63 sllx %g1, 32, %g2 /* IEU0 */
64 bne,pn %icc, 26f /* CTI */
65 or %g1, %g2, %g1 /* IEU0 Group */
66 andcc %o1, 7, %g3 /* IEU1 */
67
68 bne,pn %icc, 28f /* CTI */
69 sllx %g1, 7, %g2 /* IEU0 Group */
70 ldx [%o1], %o3 /* Load */
711: add %o1, 8, %o1 /* IEU1 */
72
732: subcc %o2, 8, %o2 /* IEU1 Group */
74 bl,pn %XCC, 18f /* CTI */
75 sub %o3, %g1, %o4 /* IEU0 */
76 add %o0, 8, %o0 /* IEU0 Group */
77
78#ifdef EIGHTBIT_NOT_MORE
79 andn %o4, %o3, %o4 /* IEU1 */
80#endif
81 mov %o3, %g3 /* IEU1 */
82 ldxa [%o1] ASI_PNF, %o3 /* Load */
83 add %o1, 8, %o1 /* IEU0 Group */
84 andcc %o4, %g2, %g0 /* IEU1 */
85
86 be,a,pt %xcc, 2b /* CTI */
87 stx %g3, [%o0-8] /* Store Group */
88 srlx %g3, 56, %g5 /* IEU0 Group */
89 andcc %g5, 0xff, %g0 /* IEU1 Group */
90
91 be,pn %icc, 16f /* CTI */
92 srlx %g3, 48, %g4 /* IEU0 */
93 andcc %g4, 0xff, %g0 /* IEU1 Group */
94 be,pn %icc, 15f /* CTI */
95
96 srlx %g3, 40, %g5 /* IEU0 */
97 andcc %g5, 0xff, %g0 /* IEU1 Group */
98 be,pn %icc, 14f /* CTI */
99 srlx %g3, 32, %g4 /* IEU0 */
100
101 andcc %g4, 0xff, %g0 /* IEU1 Group */
102 be,pn %icc, 13f /* CTI */
103 srlx %g3, 24, %g5 /* IEU0 */
104 andcc %g5, 0xff, %g0 /* IEU1 Group */
105
106 be,pn %icc, 12f /* CTI */
107 srlx %g3, 16, %g4 /* IEU0 */
108 andcc %g4, 0xff, %g0 /* IEU1 Group */
109 be,pn %icc, 11f /* CTI */
110
111 srlx %g3, 8, %g5 /* IEU0 */
112 andcc %g5, 0xff, %g0 /* IEU1 Group */
113 be,pn %icc, 10f /* CTI */
62f29da7 114 sub %o0, 1, %g6 /* IEU0 */
ae6b8730
RH
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
UD
158 mov %g6, %o0 /* IEU0 */
15910: subcc %o0, 2, %g6 /* IEU1 Group */
ae6b8730
RH
160
161 ba,pt %xcc, 3b /* CTI */
162 sllx %g5, 8, %g3 /* IEU0 */
62f29da7 16311: subcc %o0, 3, %g6 /* IEU1 Group */
ae6b8730
RH
164 ba,pt %xcc, 3b /* CTI */
165
166 sllx %g4, 16, %g3 /* IEU0 */
62f29da7 16712: subcc %o0, 4, %g6 /* IEU1 Group */
ae6b8730
RH
168 ba,pt %xcc, 3b /* CTI */
169 sllx %g5, 24, %g3 /* IEU0 */
170
62f29da7 17113: subcc %o0, 5, %g6 /* IEU1 Group */
ae6b8730
RH
172 ba,pt %xcc, 3b /* CTI */
173 sllx %g4, 32, %g3 /* IEU0 */
62f29da7 17414: subcc %o0, 6, %g6 /* IEU1 Group */
ae6b8730
RH
175
176 ba,pt %xcc, 3b /* CTI */
177 sllx %g5, 40, %g3 /* IEU0 */
62f29da7 17815: subcc %o0, 7, %g6 /* IEU1 Group */
ae6b8730
RH
179 ba,pt %xcc, 3b /* CTI */
180
181 sllx %g4, 48, %g3 /* IEU0 */
62f29da7 18216: subcc %o0, 8, %g6 /* IEU1 Group */
ae6b8730
RH
183 ba,pt %xcc, 3b /* CTI */
184 clr %g3 /* IEU0 */
185
186 .align 16
18717: or %o3, %o4, %o3 /* IEU0 Group */
188 sub %o3, %g1, %o4 /* IEU1 */
18918: addcc %o2, 8, %o2 /* IEU1 Group */
190 be,pn %XCC, 19f /* CTI */
191
192 andcc %o4, %g2, %g0 /* IEU1 Group */
193 be,pt %xcc, 21f /* CTI */
194 srlx %o3, 56, %g5 /* IEU0 */
195 andcc %g5, 0xff, %g0 /* IEU1 Group */
196
197 be,pn %icc, 20f /* CTI */
198 stb %g5, [%o0] /* Store */
199 add %o0, 1, %o0 /* IEU0 Group */
200 subcc %o2, 1, %o2 /* IEU1 */
201
202 be,pn %XCC, 19f /* CTI */
203 srlx %o3, 48, %g5 /* IEU0 Group */
204 andcc %g5, 0xff, %g0 /* IEU1 Group */
205 be,pn %icc, 20f /* CTI */
206
207 stb %g5, [%o0] /* Store */
208 add %o0, 1, %o0 /* IEU0 Group */
209 subcc %o2, 1, %o2 /* IEU1 */
210 be,pn %XCC, 19f /* CTI */
211
212 srlx %o3, 40, %g5 /* IEU0 Group */
213 andcc %g5, 0xff, %g0 /* IEU1 Group */
214 be,pn %icc, 20f /* CTI */
215 stb %g5, [%o0] /* Store */
216
217 add %o0, 1, %o0 /* IEU0 Group */
218 subcc %o2, 1, %o2 /* IEU1 */
219 be,pn %XCC, 19f /* CTI */
220 srlx %o3, 32, %g5 /* IEU0 Group */
221
222 andcc %g5, 0xff, %g0 /* IEU1 Group */
223 be,pn %icc, 20f /* CTI */
224 stb %g5, [%o0] /* Store */
225 add %o0, 1, %o0 /* IEU0 Group */
226
227 subcc %o2, 1, %o2 /* IEU1 */
228 be,pn %XCC, 19f /* CTI */
229 srlx %o3, 24, %g5 /* IEU0 Group */
230 andcc %g5, 0xff, %g0 /* IEU1 Group */
231
232 be,pn %icc, 20f /* CTI */
233 stb %g5, [%o0] /* Store */
234 add %o0, 1, %o0 /* IEU0 Group */
235 subcc %o2, 1, %o2 /* IEU1 */
236
237 be,pn %XCC, 19f /* CTI */
238 srlx %o3, 16, %g5 /* IEU0 Group */
239 andcc %g5, 0xff, %g0 /* IEU1 Group */
240 be,pn %icc, 20f /* CTI */
241
242 stb %g5, [%o0] /* Store */
243 add %o0, 1, %o0 /* IEU0 Group */
244 subcc %o2, 1, %o2 /* IEU1 */
245 be,pn %XCC, 19f /* CTI */
246
247 srlx %o3, 8, %o3 /* IEU0 Group */
9c84384c 248 stb %o3, [%o0] /* Store */
ae6b8730
RH
24959: add %o0, 1, %o2 /* IEU1 */
250 andcc %o3, 0xff, %g0 /* IEU1 Group */
251
252 retl /* CTI+IEU1 Group */
253 movne %icc, %o2, %o0 /* Single Group */
25419: retl /* CTI+IEU1 Group */
255 nop /* IEU0 */
256
62f29da7 25720: mov %o0, %g6 /* IEU0 Group */
ae6b8730
RH
258 subcc %o2, 1, %o2 /* IEU1 */
259 be,pn %XCC, 51f /* CTI */
260 add %o0, 1, %o0 /* IEU0 Group */
261
26250: stb %g0, [%o0] /* Store Group */
263 subcc %o2, 1, %o2 /* IEU1 Group */
264 bne,pt %XCC, 50b /* CTI */
265 add %o0, 1, %o0 /* IEU0 */
266
26751: retl /* CTI+IEU1 Group */
62f29da7 268 mov %g6, %o0 /* IEU0 */
ae6b8730
RH
269
270 .align 16
27121: andcc %o2, 4, %g0 /* IEU1 Group */
272 be,pn %icc, 22f /* CTI */
273 srlx %o3, 32, %g5 /* IEU0 */
274 stw %g5, [%o0] /* Store Group */
275
276 add %o0, 4, %o0 /* IEU0 */
277 mov %o3, %g5 /* IEU1 */
27822: andcc %o2, 2, %g0 /* IEU1 Group */
279 be,pn %icc, 23f /* CTI */
280
281 srlx %g5, 16, %g4 /* IEU0 */
282 sth %g4, [%o0] /* Store Group */
283 add %o0, 2, %o0 /* IEU0 */
284 mov %g5, %g4 /* IEU1 */
285
28623: srlx %g4, 8, %g4 /* IEU0 Group */
287 andcc %o2, 1, %g0 /* IEU1 */
288 bne,a,pn %icc, 24f /* CTI */
289 stb %g4, [%o0] /* Store Group */
290
291 retl /* CTI+IEU1 Group */
292 nop /* IEU0 */
29324: retl /* CTI+IEU1 Group */
294 add %o0, 1, %o0 /* IEU0 */
295
296 .align 16
62f29da7 29755: sub %o0, 1, %g6 /* IEU0 Group */
ae6b8730
RH
29825: andcc %o0, 7, %g0 /* IEU1 */
299 be,a,pn %icc, 4b /* CTI */
300 andncc %o2, 31, %g3 /* IEU1 Group */
301
302 stb %g0, [%o0] /* Store Group */
303 subcc %o2, 1, %o2 /* IEU1 */
304 bne,pt %XCC, 25b /* CTI */
305 add %o0, 1, %o0 /* IEU0 Group */
306
307 retl /* CTI+IEU1 Group */
62f29da7 308 mov %g6, %o0 /* IEU0 */
ae6b8730
RH
309
310 .align 16
31126: ldub [%o1], %o3 /* Load */
312 sllx %g1, 7, %g2 /* IEU0 Group */
313 stb %o3, [%o0] /* Store */
31427: subcc %o2, 1, %o2 /* IEU1 */
315
316 be,pn %XCC, 59b /* CTI */
317 add %o1, 1, %o1 /* IEU0 Group */
318 add %o0, 1, %o0 /* IEU1 */
319 andcc %o3, 0xff, %g0 /* IEU1 Group */
320
321 be,pn %icc, 55b /* CTI */
322 lduba [%o1] ASI_PNF, %o3 /* Load */
323 andcc %o0, 7, %g0 /* IEU1 Group */
324 bne,a,pt %icc, 27b /* CTI */
325
326 stb %o3, [%o0] /* Store */
327 andcc %o1, 7, %g3 /* IEU1 Group */
328 be,a,pt %icc, 1b /* CTI */
329 ldx [%o1], %o3 /* Load */
330
33128: orcc %g0, 64, %g4 /* IEU1 Group */
332 sllx %g3, 3, %g5 /* IEU0 */
333 sub %g4, %g5, %g4 /* IEU0 Group */
334 sub %o1, %g3, %o1 /* IEU1 */
335 /* %g1 = 0101010101010101
336 %g2 = 8080808080808080
337 %g3 = source alignment
338 %g5 = number of bits to shift left
339 %g4 = number of bits to shift right */
340
341 ldxa [%o1] ASI_PNF, %o5 /* Load Group */
342 addcc %o1, 8, %o1 /* IEU1 */
34329: sllx %o5, %g5, %o3 /* IEU0 Group */
344 ldxa [%o1] ASI_PNF, %o5 /* Load */
345
346 subcc %o2, 8, %o2 /* IEU1 */
347 bl,pn %XCC, 17b /* CTI */
348 srlx %o5, %g4, %o4 /* IEU0 Group */
349 add %o1, 8, %o1 /* IEU1 */
350
351 or %o3, %o4, %o3 /* IEU0 Group */
352 add %o0, 8, %o0 /* IEU1 */
353 sub %o3, %g1, %o4 /* IEU0 Group */
354#ifdef EIGHTBIT_NOT_RARE
355 andn %o4, %o3, %o4 /* IEU0 Group */
356#endif
357 andcc %o4, %g2, %g0 /* IEU1 Group */
358
359 be,a,pt %xcc, 29b /* CTI */
360 stx %o3, [%o0-8] /* Store */
361 srlx %o3, 56, %o4 /* IEU0 Group */
362 andcc %o4, 0xff, %g0 /* IEU1 Group */
363
364 be,pn %icc, 36f /* CTI */
62f29da7
UD
365 srlx %o3, 48, %g6 /* IEU0 */
366 andcc %g6, 0xff, %g0 /* IEU1 Group */
ae6b8730
RH
367 be,pn %icc, 35f /* CTI */
368
369 srlx %o3, 40, %o4 /* IEU0 */
370 andcc %o4, 0xff, %g0 /* IEU1 Group */
371 be,pn %icc, 34f /* CTI */
62f29da7 372 srlx %o3, 32, %g6 /* IEU0 */
ae6b8730 373
62f29da7 374 andcc %g6, 0xff, %g0 /* IEU1 Group */
ae6b8730
RH
375 be,pn %icc, 33f /* CTI */
376 srlx %o3, 24, %o4 /* IEU0 */
377 andcc %o4, 0xff, %g0 /* IEU1 Group */
378
379 be,pn %icc, 32f /* CTI */
62f29da7
UD
380 srlx %o3, 16, %g6 /* IEU0 */
381 andcc %g6, 0xff, %g0 /* IEU1 Group */
ae6b8730
RH
382 be,pn %icc, 31f /* CTI */
383
384 srlx %o3, 8, %o4 /* IEU0 */
385 andcc %o4, 0xff, %g0 /* IEU1 Group */
386 be,pn %icc, 30f /* CTI */
387 andcc %o3, 0xff, %g0 /* IEU1 Group */
388
389 bne,pn %icc, 29b /* CTI */
390 stx %o3, [%o0-8] /* Store */
62f29da7 391 sub %o0, 1, %g6 /* IEU0 Group */
ae6b8730
RH
392 ba,pt %xcc, 4b /* CTI */
393
394 andncc %o2, 31, %g3 /* IEU1 */
62f29da7 39530: subcc %o0, 2, %g6 /* IEU0 */
ae6b8730
RH
396 ba,pt %xcc, 3b /* CTI */
397 sllx %o4, 8, %g3 /* IEU0 Group */
398
62f29da7 39931: sllx %g6, 16, %g3 /* IEU0 Group */
ae6b8730 400 ba,pt %xcc, 3b /* CTI */
62f29da7
UD
401 sub %o0, 3, %g6 /* IEU1 */
40232: subcc %o0, 4, %g6 /* IEU1 Group */
ae6b8730
RH
403
404 ba,pt %xcc, 3b /* CTI */
405 sllx %o4, 24, %g3 /* IEU0 */
62f29da7 40633: sllx %g6, 32, %g3 /* IEU0 Group */
ae6b8730
RH
407 ba,pt %xcc, 3b /* CTI */
408
62f29da7
UD
409 sub %o0, 5, %g6 /* IEU1 */
41034: subcc %o0, 6, %g6 /* IEU1 Group */
ae6b8730
RH
411 ba,pt %xcc, 3b /* CTI */
412 sllx %o4, 40, %g3 /* IEU0 */
413
62f29da7 41435: sllx %g6, 48, %g3 /* IEU0 Group */
ae6b8730 415 ba,pt %xcc, 3b /* CTI */
62f29da7
UD
416 sub %o0, 7, %g6 /* IEU1 */
41736: subcc %o0, 8, %g6 /* IEU1 Group */
ae6b8730
RH
418
419 ba,pt %xcc, 3b /* CTI */
420 sllx %o4, 56, %g3 /* IEU0 */
421END(__stpncpy)
422
37ba7d66
UD
423libc_hidden_def (__stpncpy)
424weak_alias (__stpncpy, stpncpy)