1 /* stpncpy(DST, SRC, COUNT) - Copy no more than N characters of
2 SRC to DEST, returning the address of the terminating '\0' in
3 DEST, if any, or else DEST + N.
5 Copyright (C) 1998, 1999, 2002, 2003 Free Software Foundation, Inc.
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>.
10 The GNU C Library is free software; you can redistribute it and/or
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.
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
18 Lesser General Public License for more details.
20 You should have received a copy of the GNU Lesser General Public
21 License along with the GNU C Library; if not, see
22 <http://www.gnu.org/licenses/>. */
29 .register %g2, #scratch
30 .register %g3, #scratch
31 .register %g6, #scratch
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.
53 sethi %hi(0x01010101), %g1 /* IEU0 Group */
55 brz,pn %o2, 19f /* CTI+IEU1 */
58 be,pn %XCC, 19f /* CTI */
60 or %g1, %lo(0x01010101), %g1 /* IEU1 */
61 andcc %o0, 7, %g0 /* IEU1 Group */
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 */
68 bne,pn %icc, 28f /* CTI */
69 sllx %g1, 7, %g2 /* IEU0 Group */
70 ldx [%o1], %o3 /* Load */
71 1: add %o1, 8, %o1 /* IEU1 */
73 2: 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 */
78 #ifdef EIGHTBIT_NOT_MORE
79 andn %o4, %o3, %o4 /* IEU1 */
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 */
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 */
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 */
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 */
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 */
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 */
111 srlx %g3, 8, %g5 /* IEU0 */
112 andcc %g5, 0xff, %g0 /* IEU1 Group */
113 be,pn %icc, 10f /* CTI */
114 sub %o0, 1, %g6 /* IEU0 */
116 andcc %g3, 0xff, %g0 /* IEU1 Group */
117 bne,pt %icc, 2b /* CTI */
118 3: stx %g3, [%o0-8] /* Store */
119 andncc %o2, 31, %g3 /* IEU1 Group */
121 4: be,pn %XCC, 41f /* CTI */
122 and %o2, 31, %o2 /* IEU1 Group */
123 40: stx %g0, [%o0] /* Store */
124 stx %g0, [%o0 + 8] /* Store Group */
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 */
131 add %o0, 32, %o0 /* IEU0 */
132 41: subcc %o2, 8, %o2 /* IEU1 Group */
133 bl,a,pn %XCC, 6f /* CTI */
134 andcc %o2, 4, %g0 /* IEU1 Group */
136 5: stx %g0, [%o0] /* Store */
137 subcc %o2, 8, %o2 /* IEU1 Group */
138 bge,pt %XCC, 5b /* CTI */
139 add %o0, 8, %o0 /* IEU0 */
141 andcc %o2, 4, %g0 /* IEU1 Group */
142 6: be,a,pn %icc, 7f /* CTI */
143 andcc %o2, 2, %g0 /* IEU1 Group */
144 stw %g0, [%o0] /* Store */
146 add %o0, 4, %o0 /* IEU0 */
147 andcc %o2, 2, %g0 /* IEU1 Group */
148 7: be,a,pn %icc, 8f /* CTI */
149 andcc %o2, 1, %g0 /* IEU1 Group */
151 sth %g0, [%o0] /* Store */
152 add %o0, 2, %o0 /* IEU0 */
153 andcc %o2, 1, %g0 /* IEU1 Group */
154 8: bne,a,pn %icc, 9f /* CTI */
156 stb %g0, [%o0] /* Store */
157 9: retl /* CTI+IEU1 Group */
158 mov %g6, %o0 /* IEU0 */
159 10: subcc %o0, 2, %g6 /* IEU1 Group */
161 ba,pt %xcc, 3b /* CTI */
162 sllx %g5, 8, %g3 /* IEU0 */
163 11: subcc %o0, 3, %g6 /* IEU1 Group */
164 ba,pt %xcc, 3b /* CTI */
166 sllx %g4, 16, %g3 /* IEU0 */
167 12: subcc %o0, 4, %g6 /* IEU1 Group */
168 ba,pt %xcc, 3b /* CTI */
169 sllx %g5, 24, %g3 /* IEU0 */
171 13: subcc %o0, 5, %g6 /* IEU1 Group */
172 ba,pt %xcc, 3b /* CTI */
173 sllx %g4, 32, %g3 /* IEU0 */
174 14: subcc %o0, 6, %g6 /* IEU1 Group */
176 ba,pt %xcc, 3b /* CTI */
177 sllx %g5, 40, %g3 /* IEU0 */
178 15: subcc %o0, 7, %g6 /* IEU1 Group */
179 ba,pt %xcc, 3b /* CTI */
181 sllx %g4, 48, %g3 /* IEU0 */
182 16: subcc %o0, 8, %g6 /* IEU1 Group */
183 ba,pt %xcc, 3b /* CTI */
187 17: or %o3, %o4, %o3 /* IEU0 Group */
188 sub %o3, %g1, %o4 /* IEU1 */
189 18: addcc %o2, 8, %o2 /* IEU1 Group */
190 be,pn %XCC, 19f /* CTI */
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 */
197 be,pn %icc, 20f /* CTI */
198 stb %g5, [%o0] /* Store */
199 add %o0, 1, %o0 /* IEU0 Group */
200 subcc %o2, 1, %o2 /* IEU1 */
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 */
207 stb %g5, [%o0] /* Store */
208 add %o0, 1, %o0 /* IEU0 Group */
209 subcc %o2, 1, %o2 /* IEU1 */
210 be,pn %XCC, 19f /* CTI */
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 */
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 */
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 */
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 */
232 be,pn %icc, 20f /* CTI */
233 stb %g5, [%o0] /* Store */
234 add %o0, 1, %o0 /* IEU0 Group */
235 subcc %o2, 1, %o2 /* IEU1 */
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 */
242 stb %g5, [%o0] /* Store */
243 add %o0, 1, %o0 /* IEU0 Group */
244 subcc %o2, 1, %o2 /* IEU1 */
245 be,pn %XCC, 19f /* CTI */
247 srlx %o3, 8, %o3 /* IEU0 Group */
248 stb %o3, [%o0] /* Store */
249 59: add %o0, 1, %o2 /* IEU1 */
250 andcc %o3, 0xff, %g0 /* IEU1 Group */
252 retl /* CTI+IEU1 Group */
253 movne %icc, %o2, %o0 /* Single Group */
254 19: retl /* CTI+IEU1 Group */
257 20: mov %o0, %g6 /* IEU0 Group */
258 subcc %o2, 1, %o2 /* IEU1 */
259 be,pn %XCC, 51f /* CTI */
260 add %o0, 1, %o0 /* IEU0 Group */
262 50: stb %g0, [%o0] /* Store Group */
263 subcc %o2, 1, %o2 /* IEU1 Group */
264 bne,pt %XCC, 50b /* CTI */
265 add %o0, 1, %o0 /* IEU0 */
267 51: retl /* CTI+IEU1 Group */
268 mov %g6, %o0 /* IEU0 */
271 21: andcc %o2, 4, %g0 /* IEU1 Group */
272 be,pn %icc, 22f /* CTI */
273 srlx %o3, 32, %g5 /* IEU0 */
274 stw %g5, [%o0] /* Store Group */
276 add %o0, 4, %o0 /* IEU0 */
277 mov %o3, %g5 /* IEU1 */
278 22: andcc %o2, 2, %g0 /* IEU1 Group */
279 be,pn %icc, 23f /* CTI */
281 srlx %g5, 16, %g4 /* IEU0 */
282 sth %g4, [%o0] /* Store Group */
283 add %o0, 2, %o0 /* IEU0 */
284 mov %g5, %g4 /* IEU1 */
286 23: 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 */
291 retl /* CTI+IEU1 Group */
293 24: retl /* CTI+IEU1 Group */
294 add %o0, 1, %o0 /* IEU0 */
297 55: sub %o0, 1, %g6 /* IEU0 Group */
298 25: andcc %o0, 7, %g0 /* IEU1 */
299 be,a,pn %icc, 4b /* CTI */
300 andncc %o2, 31, %g3 /* IEU1 Group */
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 */
307 retl /* CTI+IEU1 Group */
308 mov %g6, %o0 /* IEU0 */
311 26: ldub [%o1], %o3 /* Load */
312 sllx %g1, 7, %g2 /* IEU0 Group */
313 stb %o3, [%o0] /* Store */
314 27: subcc %o2, 1, %o2 /* IEU1 */
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 */
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 */
326 stb %o3, [%o0] /* Store */
327 andcc %o1, 7, %g3 /* IEU1 Group */
328 be,a,pt %icc, 1b /* CTI */
329 ldx [%o1], %o3 /* Load */
331 28: 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 */
341 ldxa [%o1] ASI_PNF, %o5 /* Load Group */
342 addcc %o1, 8, %o1 /* IEU1 */
343 29: sllx %o5, %g5, %o3 /* IEU0 Group */
344 ldxa [%o1] ASI_PNF, %o5 /* Load */
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 */
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 */
357 andcc %o4, %g2, %g0 /* IEU1 Group */
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 */
364 be,pn %icc, 36f /* CTI */
365 srlx %o3, 48, %g6 /* IEU0 */
366 andcc %g6, 0xff, %g0 /* IEU1 Group */
367 be,pn %icc, 35f /* CTI */
369 srlx %o3, 40, %o4 /* IEU0 */
370 andcc %o4, 0xff, %g0 /* IEU1 Group */
371 be,pn %icc, 34f /* CTI */
372 srlx %o3, 32, %g6 /* IEU0 */
374 andcc %g6, 0xff, %g0 /* IEU1 Group */
375 be,pn %icc, 33f /* CTI */
376 srlx %o3, 24, %o4 /* IEU0 */
377 andcc %o4, 0xff, %g0 /* IEU1 Group */
379 be,pn %icc, 32f /* CTI */
380 srlx %o3, 16, %g6 /* IEU0 */
381 andcc %g6, 0xff, %g0 /* IEU1 Group */
382 be,pn %icc, 31f /* CTI */
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 */
389 bne,pn %icc, 29b /* CTI */
390 stx %o3, [%o0-8] /* Store */
391 sub %o0, 1, %g6 /* IEU0 Group */
392 ba,pt %xcc, 4b /* CTI */
394 andncc %o2, 31, %g3 /* IEU1 */
395 30: subcc %o0, 2, %g6 /* IEU0 */
396 ba,pt %xcc, 3b /* CTI */
397 sllx %o4, 8, %g3 /* IEU0 Group */
399 31: sllx %g6, 16, %g3 /* IEU0 Group */
400 ba,pt %xcc, 3b /* CTI */
401 sub %o0, 3, %g6 /* IEU1 */
402 32: subcc %o0, 4, %g6 /* IEU1 Group */
404 ba,pt %xcc, 3b /* CTI */
405 sllx %o4, 24, %g3 /* IEU0 */
406 33: sllx %g6, 32, %g3 /* IEU0 Group */
407 ba,pt %xcc, 3b /* CTI */
409 sub %o0, 5, %g6 /* IEU1 */
410 34: subcc %o0, 6, %g6 /* IEU1 Group */
411 ba,pt %xcc, 3b /* CTI */
412 sllx %o4, 40, %g3 /* IEU0 */
414 35: sllx %g6, 48, %g3 /* IEU0 Group */
415 ba,pt %xcc, 3b /* CTI */
416 sub %o0, 7, %g6 /* IEU1 */
417 36: subcc %o0, 8, %g6 /* IEU1 Group */
419 ba,pt %xcc, 3b /* CTI */
420 sllx %o4, 56, %g3 /* IEU0 */
423 libc_hidden_def (__stpncpy)
424 weak_alias (__stpncpy, stpncpy)