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.
5 Copyright (C) 1998, 1999, 2003 Free Software Foundation, Inc.
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>.
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, write to the Free
22 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
30 .register %g2, #scratch
31 .register %g3, #scratch
32 .register %g6, #scratch
35 /* Normally, this uses
36 ((xword - 0x0101010101010101) & 0x8080808080808080) test
37 to find out if any byte in xword could be zero. This is fast, but
38 also gives false alarm for any byte in range 0x81-0xff. It does
39 not matter for correctness, as if this test tells us there could
40 be some zero byte, we check it byte by byte, but if bytes with
41 high bits set are common in the strings, then this will give poor
42 performance. You can #define EIGHTBIT_NOT_RARE and the algorithm
43 will use one tick slower, but more precise test
44 ((xword - 0x0101010101010101) & (~xword) & 0x8080808080808080),
45 which does not give any false alarms (but if some bits are set,
46 one cannot assume from it which bytes are zero and which are not).
47 It is yet to be measured, what is the correct default for glibc
48 in these days for an average user.
54 sethi %hi(0x01010101), %g1 /* IEU0 Group */
56 brz,pn %o2, 19f /* CTI+IEU1 */
59 be,pn %XCC, 19f /* CTI */
61 mov %o0, %g6 /* IEU0 Group */
62 or %g1, %lo(0x01010101), %g1 /* IEU1 */
64 andcc %o0, 7, %g0 /* IEU1 Group */
65 sllx %g1, 32, %g2 /* IEU0 */
66 bne,pn %icc, 26f /* CTI */
67 or %g1, %g2, %g1 /* IEU0 Group */
69 andcc %o1, 7, %g3 /* IEU1 */
70 bne,pn %icc, 28f /* CTI */
71 sllx %g1, 7, %g2 /* IEU0 Group */
72 ldx [%o1], %o3 /* Load */
74 1: add %o1, 8, %o1 /* IEU1 */
75 2: subcc %o2, 8, %o2 /* IEU1 Group */
76 bl,pn %XCC, 18f /* CTI */
77 sub %o3, %g1, %o4 /* IEU0 */
79 add %o0, 8, %o0 /* IEU0 Group */
80 #ifdef EIGHTBIT_NOT_MORE
81 andn %o4, %o3, %o4 /* IEU1 */
83 mov %o3, %g3 /* IEU1 */
84 ldxa [%o1] ASI_PNF, %o3 /* Load */
85 add %o1, 8, %o1 /* IEU0 Group */
87 andcc %o4, %g2, %g0 /* IEU1 */
88 be,a,pt %xcc, 2b /* CTI */
89 stx %g3, [%o0-8] /* Store Group */
90 srlx %g3, 56, %g5 /* IEU0 Group */
92 andcc %g5, 0xff, %g0 /* IEU1 Group */
93 be,pn %icc, 16f /* CTI */
94 srlx %g3, 48, %g4 /* IEU0 */
95 andcc %g4, 0xff, %g0 /* IEU1 Group */
97 be,pn %icc, 15f /* CTI */
98 srlx %g3, 40, %g5 /* IEU0 */
99 andcc %g5, 0xff, %g0 /* IEU1 Group */
100 be,pn %icc, 14f /* CTI */
102 srlx %g3, 32, %g4 /* IEU0 */
103 andcc %g4, 0xff, %g0 /* IEU1 Group */
104 be,pn %icc, 13f /* CTI */
105 srlx %g3, 24, %g5 /* IEU0 */
107 andcc %g5, 0xff, %g0 /* IEU1 Group */
108 be,pn %icc, 12f /* CTI */
109 srlx %g3, 16, %g4 /* IEU0 */
110 andcc %g4, 0xff, %g0 /* IEU1 Group */
112 be,pn %icc, 11f /* CTI */
113 srlx %g3, 8, %g5 /* IEU0 */
114 andcc %g5, 0xff, %g0 /* IEU1 Group */
115 be,pn %icc, 10f /* CTI */
117 andcc %g3, 0xff, %g0 /* IEU1 Group */
118 bne,pt %icc, 2b /* CTI */
119 3: stx %g3, [%o0-8] /* Store */
120 andncc %o2, 31, %g3 /* IEU1 Group */
122 4: be,pn %XCC, 41f /* CTI */
123 and %o2, 31, %o2 /* IEU1 Group */
124 40: stx %g0, [%o0] /* Store */
125 stx %g0, [%o0 + 8] /* Store Group */
127 subcc %g3, 32, %g3 /* IEU1 */
128 stx %g0, [%o0 + 16] /* Store Group */
129 stx %g0, [%o0 + 24] /* Store Group */
130 bne,pt %XCC, 40b /* CTI */
132 add %o0, 32, %o0 /* IEU0 */
133 41: subcc %o2, 8, %o2 /* IEU1 Group */
134 bl,a,pn %XCC, 6f /* CTI */
135 andcc %o2, 4, %g0 /* IEU1 Group */
137 5: stx %g0, [%o0] /* Store */
138 subcc %o2, 8, %o2 /* IEU1 Group */
139 bge,pt %XCC, 5b /* CTI */
140 add %o0, 8, %o0 /* IEU0 */
142 andcc %o2, 4, %g0 /* IEU1 Group */
143 6: be,a,pn %icc, 7f /* CTI */
144 andcc %o2, 2, %g0 /* IEU1 Group */
145 stw %g0, [%o0] /* Store */
147 add %o0, 4, %o0 /* IEU0 */
148 andcc %o2, 2, %g0 /* IEU1 Group */
149 7: be,a,pn %icc, 8f /* CTI */
150 andcc %o2, 1, %g0 /* IEU1 Group */
152 sth %g0, [%o0] /* Store */
153 add %o0, 2, %o0 /* IEU0 */
154 andcc %o2, 1, %g0 /* IEU1 Group */
155 8: bne,a,pn %icc, 9f /* CTI */
157 stb %g0, [%o0] /* Store */
158 9: retl /* CTI+IEU1 Group */
159 mov %g6, %o0 /* IEU0 */
162 10: ba,pt %xcc, 3b /* CTI */
163 sllx %g5, 8, %g3 /* IEU0 */
164 11: ba,pt %xcc, 3b /* CTI Group */
165 sllx %g4, 16, %g3 /* IEU0 */
167 12: ba,pt %xcc, 3b /* CTI Group */
168 sllx %g5, 24, %g3 /* IEU0 */
169 13: ba,pt %xcc, 3b /* CTI Group */
170 sllx %g4, 32, %g3 /* IEU0 */
172 14: ba,pt %xcc, 3b /* CTI Group */
173 sllx %g5, 40, %g3 /* IEU0 */
174 15: ba,pt %xcc, 3b /* CTI Group */
175 sllx %g4, 48, %g3 /* IEU0 */
177 16: ba,pt %xcc, 3b /* CTI */
178 sllx %g5, 56, %g3 /* IEU0 */
179 17: or %o3, %o4, %o3 /* IEU0 Group */
180 sub %o3, %g1, %o4 /* IEU1 */
182 18: addcc %o2, 8, %o2 /* IEU1 Group */
183 be,pn %XCC, 19f /* CTI */
184 andcc %o4, %g2, %g0 /* IEU1 Group */
185 be,pt %xcc, 21f /* CTI */
187 srlx %o3, 56, %g5 /* IEU0 */
188 andcc %g5, 0xff, %g0 /* IEU1 Group */
189 be,pn %icc, 20f /* CTI */
190 stb %g5, [%o0] /* Store */
192 add %o0, 1, %o0 /* IEU0 Group */
193 subcc %o2, 1, %o2 /* IEU1 */
194 be,pn %XCC, 19f /* CTI */
195 srlx %o3, 48, %g5 /* IEU0 Group */
197 andcc %g5, 0xff, %g0 /* IEU1 Group */
198 be,pn %icc, 20f /* CTI */
199 stb %g5, [%o0] /* Store */
200 add %o0, 1, %o0 /* IEU0 Group */
202 subcc %o2, 1, %o2 /* IEU1 */
203 be,pn %XCC, 19f /* CTI */
204 srlx %o3, 40, %g5 /* IEU0 Group */
205 andcc %g5, 0xff, %g0 /* IEU1 Group */
207 be,pn %icc, 20f /* CTI */
208 stb %g5, [%o0] /* Store */
209 add %o0, 1, %o0 /* IEU0 Group */
210 subcc %o2, 1, %o2 /* IEU1 */
212 be,pn %XCC, 19f /* CTI */
213 srlx %o3, 32, %g5 /* IEU0 Group */
214 andcc %g5, 0xff, %g0 /* IEU1 Group */
215 be,pn %icc, 20f /* CTI */
217 stb %g5, [%o0] /* Store */
218 add %o0, 1, %o0 /* IEU0 Group */
219 subcc %o2, 1, %o2 /* IEU1 */
220 be,pn %XCC, 19f /* CTI */
222 srlx %o3, 24, %g5 /* IEU0 Group */
223 andcc %g5, 0xff, %g0 /* IEU1 Group */
224 be,pn %icc, 20f /* CTI */
225 stb %g5, [%o0] /* Store */
227 add %o0, 1, %o0 /* IEU0 Group */
228 subcc %o2, 1, %o2 /* IEU1 */
229 be,pn %XCC, 19f /* CTI */
230 srlx %o3, 16, %g5 /* IEU0 Group */
232 andcc %g5, 0xff, %g0 /* IEU1 Group */
233 be,pn %icc, 20f /* CTI */
234 stb %g5, [%o0] /* Store */
235 add %o0, 1, %o0 /* IEU0 Group */
237 subcc %o2, 1, %o2 /* IEU1 */
238 be,pn %XCC, 19f /* CTI */
239 srlx %o3, 8, %g5 /* IEU0 Group */
240 stb %g5, [%o0] /* Store */
242 19: retl /* CTI+IEU1 Group */
243 mov %g6, %o0 /* IEU0 */
244 50: stb %g0, [%o0] /* Store Group */
245 20: subcc %o2, 1, %o2 /* IEU1 Group */
247 bne,pt %XCC, 50b /* CTI */
248 add %o0, 1, %o0 /* IEU0 */
249 retl /* CTI+IEU1 Group */
250 mov %g6, %o0 /* IEU0 */
252 21: andcc %o2, 4, %g0 /* IEU1 Group */
253 be,pn %icc, 22f /* CTI */
254 srlx %o3, 32, %g5 /* IEU0 */
255 stw %g5, [%o0] /* Store Group */
257 add %o0, 4, %o0 /* IEU0 */
258 mov %o3, %g5 /* IEU1 */
259 22: andcc %o2, 2, %g0 /* IEU1 Group */
260 be,pn %icc, 23f /* CTI */
262 srlx %g5, 16, %g4 /* IEU0 */
263 sth %g4, [%o0] /* Store Group */
264 add %o0, 2, %o0 /* IEU0 */
265 mov %g5, %g4 /* IEU1 */
267 23: srlx %g4, 8, %g4 /* IEU0 Group */
268 andcc %o2, 1, %g0 /* IEU1 */
269 bne,a,pn %icc, 24f /* CTI */
270 stb %g4, [%o0] /* Store Group */
272 24: retl /* CTI+IEU1 Group */
273 mov %g6, %o0 /* IEU0 */
274 25: andcc %o0, 7, %g0 /* IEU1 Group */
275 be,a,pn %icc, 4b /* CTI */
277 andncc %o2, 31, %g3 /* IEU1 Group */
278 stb %g0, [%o0] /* Store Group */
279 subcc %o2, 1, %o2 /* IEU1 */
280 bne,pt %XCC, 25b /* CTI */
282 add %o0, 1, %o0 /* IEU0 Group */
283 retl /* CTI+IEU1 Group */
284 mov %g6, %o0 /* IEU0 */
287 26: ldub [%o1], %o3 /* Load */
288 sllx %g1, 7, %g2 /* IEU0 Group */
289 stb %o3, [%o0] /* Store */
290 27: subcc %o2, 1, %o2 /* IEU1 */
292 be,pn %XCC, 9b /* CTI */
293 add %o1, 1, %o1 /* IEU0 Group */
294 add %o0, 1, %o0 /* IEU1 */
295 andcc %o3, 0xff, %g0 /* IEU1 Group */
297 be,pn %icc, 25b /* CTI */
298 lduba [%o1] ASI_PNF, %o3 /* Load */
299 andcc %o0, 7, %g0 /* IEU1 Group */
300 bne,a,pt %icc, 27b /* CTI */
302 stb %o3, [%o0] /* Store */
303 andcc %o1, 7, %g3 /* IEU1 Group */
304 be,a,pt %icc, 1b /* CTI */
305 ldx [%o1], %o3 /* Load */
307 28: orcc %g0, 64, %g4 /* IEU1 Group */
308 sllx %g3, 3, %g5 /* IEU0 */
309 sub %g4, %g5, %g4 /* IEU0 Group */
310 sub %o1, %g3, %o1 /* IEU1 */
311 /* %g1 = 0101010101010101
312 %g2 = 8080808080808080
313 %g3 = source alignment
314 %g5 = number of bits to shift left
315 %g4 = number of bits to shift right */
317 ldxa [%o1] ASI_PNF, %o5 /* Load Group */
318 addcc %o1, 8, %o1 /* IEU1 */
320 29: sllx %o5, %g5, %o3 /* IEU0 Group */
321 ldxa [%o1] ASI_PNF, %o5 /* Load */
322 subcc %o2, 8, %o2 /* IEU1 */
323 bl,pn %XCC, 17b /* CTI */
325 srlx %o5, %g4, %o4 /* IEU0 Group */
326 add %o1, 8, %o1 /* IEU1 */
327 or %o3, %o4, %o3 /* IEU0 Group */
328 add %o0, 8, %o0 /* IEU1 */
330 sub %o3, %g1, %o4 /* IEU0 Group */
331 #ifdef EIGHTBIT_NOT_RARE
332 andn %o4, %o3, %o4 /* IEU0 Group */
334 andcc %o4, %g2, %g0 /* IEU1 Group */
335 be,a,pt %xcc, 29b /* CTI */
336 stx %o3, [%o0-8] /* Store */
338 srlx %o3, 56, %o4 /* IEU0 Group */
339 andcc %o4, 0xff, %g0 /* IEU1 Group */
340 be,pn %icc, 36f /* CTI */
341 srlx %o3, 48, %o4 /* IEU0 */
343 andcc %o4, 0xff, %g0 /* IEU1 Group */
344 be,pn %icc, 35f /* CTI */
345 srlx %o3, 40, %o4 /* IEU0 */
346 andcc %o4, 0xff, %g0 /* IEU1 Group */
348 be,pn %icc, 34f /* CTI */
349 srlx %o3, 32, %o4 /* IEU0 */
350 andcc %o4, 0xff, %g0 /* IEU1 Group */
351 be,pn %icc, 33f /* CTI */
353 srlx %o3, 24, %o4 /* IEU0 */
354 andcc %o4, 0xff, %g0 /* IEU1 Group */
355 be,pn %icc, 32f /* CTI */
356 srlx %o3, 16, %o4 /* IEU0 */
358 andcc %o4, 0xff, %g0 /* IEU1 Group */
359 be,pn %icc, 31f /* CTI */
360 srlx %o3, 8, %o4 /* IEU0 */
361 andcc %o4, 0xff, %g0 /* IEU1 Group */
363 be,pn %icc, 30f /* CTI */
364 andcc %o3, 0xff, %g0 /* IEU1 Group */
365 bne,pn %icc, 29b /* CTI */
366 stx %o3, [%o0-8] /* Store */
368 ba,pt %xcc, 4b /* CTI Group */
369 andncc %o2, 31, %g3 /* IEU1 */
370 30: srlx %o3, 8, %o4 /* IEU0 */
371 ba,pt %xcc, 3b /* CTI */
373 sllx %o4, 8, %g3 /* IEU0 Group */
374 31: srlx %o3, 16, %o4 /* IEU0 Group */
375 ba,pt %xcc, 3b /* CTI */
376 sllx %o4, 16, %g3 /* IEU0 Group */
378 32: srlx %o3, 24, %o4 /* IEU0 Group */
379 ba,pt %xcc, 3b /* CTI */
380 sllx %o4, 24, %g3 /* IEU0 Group */
381 33: srlx %o3, 32, %o4 /* IEU0 Group */
383 ba,pt %xcc, 3b /* CTI */
384 sllx %o4, 32, %g3 /* IEU0 Group */
385 34: srlx %o3, 40, %o4 /* IEU0 Group */
386 ba,pt %xcc, 3b /* CTI */
388 sllx %o4, 40, %g3 /* IEU0 Group */
389 35: srlx %o3, 48, %o4 /* IEU0 Group */
390 ba,pt %xcc, 3b /* CTI */
391 sllx %o4, 48, %g3 /* IEU0 Group */
393 36: srlx %o3, 56, %o4 /* IEU0 Group */
394 ba,pt %xcc, 3b /* CTI */
395 sllx %o4, 56, %g3 /* IEU0 Group */
397 libc_hidden_builtin_def (strncpy)