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-2023 Free Software Foundation, Inc.
6 This file is part of the GNU C Library.
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.
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.
18 You should have received a copy of the GNU Lesser General Public
19 License along with the GNU C Library; if not, see
20 <https://www.gnu.org/licenses/>. */
27 .register %g2, #scratch
28 .register %g3, #scratch
29 .register %g6, #scratch
32 /* Normally, this uses
33 ((xword - 0x0101010101010101) & 0x8080808080808080) test
34 to find out if any byte in xword could be zero. This is fast, but
35 also gives false alarm for any byte in range 0x81-0xff. It does
36 not matter for correctness, as if this test tells us there could
37 be some zero byte, we check it byte by byte, but if bytes with
38 high bits set are common in the strings, then this will give poor
39 performance. You can #define EIGHTBIT_NOT_RARE and the algorithm
40 will use one tick slower, but more precise test
41 ((xword - 0x0101010101010101) & (~xword) & 0x8080808080808080),
42 which does not give any false alarms (but if some bits are set,
43 one cannot assume from it which bytes are zero and which are not).
44 It is yet to be measured, what is the correct default for glibc
45 in these days for an average user.
51 sethi %hi(0x01010101), %g1 /* IEU0 Group */
53 brz,pn %o2, 19f /* CTI+IEU1 */
56 be,pn %XCC, 19f /* CTI */
58 mov %o0, %g6 /* IEU0 Group */
59 or %g1, %lo(0x01010101), %g1 /* IEU1 */
61 andcc %o0, 7, %g0 /* IEU1 Group */
62 sllx %g1, 32, %g2 /* IEU0 */
63 bne,pn %icc, 26f /* CTI */
64 or %g1, %g2, %g1 /* IEU0 Group */
66 andcc %o1, 7, %g3 /* IEU1 */
67 bne,pn %icc, 28f /* CTI */
68 sllx %g1, 7, %g2 /* IEU0 Group */
69 ldx [%o1], %o3 /* Load */
71 1: add %o1, 8, %o1 /* IEU1 */
72 2: subcc %o2, 8, %o2 /* IEU1 Group */
73 bl,pn %XCC, 18f /* CTI */
74 sub %o3, %g1, %o4 /* IEU0 */
76 add %o0, 8, %o0 /* IEU0 Group */
77 #ifdef EIGHTBIT_NOT_MORE
78 andn %o4, %o3, %o4 /* IEU1 */
80 mov %o3, %g3 /* IEU1 */
81 ldxa [%o1] ASI_PNF, %o3 /* Load */
82 add %o1, 8, %o1 /* IEU0 Group */
84 andcc %o4, %g2, %g0 /* IEU1 */
85 be,a,pt %xcc, 2b /* CTI */
86 stx %g3, [%o0-8] /* Store Group */
87 srlx %g3, 56, %g5 /* IEU0 Group */
89 andcc %g5, 0xff, %g0 /* IEU1 Group */
90 be,pn %icc, 16f /* CTI */
91 srlx %g3, 48, %g4 /* IEU0 */
92 andcc %g4, 0xff, %g0 /* IEU1 Group */
94 be,pn %icc, 15f /* CTI */
95 srlx %g3, 40, %g5 /* IEU0 */
96 andcc %g5, 0xff, %g0 /* IEU1 Group */
97 be,pn %icc, 14f /* CTI */
99 srlx %g3, 32, %g4 /* IEU0 */
100 andcc %g4, 0xff, %g0 /* IEU1 Group */
101 be,pn %icc, 13f /* CTI */
102 srlx %g3, 24, %g5 /* IEU0 */
104 andcc %g5, 0xff, %g0 /* IEU1 Group */
105 be,pn %icc, 12f /* CTI */
106 srlx %g3, 16, %g4 /* IEU0 */
107 andcc %g4, 0xff, %g0 /* IEU1 Group */
109 be,pn %icc, 11f /* CTI */
110 srlx %g3, 8, %g5 /* IEU0 */
111 andcc %g5, 0xff, %g0 /* IEU1 Group */
112 be,pn %icc, 10f /* CTI */
114 andcc %g3, 0xff, %g0 /* IEU1 Group */
115 bne,pt %icc, 2b /* CTI */
116 3: stx %g3, [%o0-8] /* Store */
117 andncc %o2, 31, %g3 /* IEU1 Group */
119 4: be,pn %XCC, 41f /* CTI */
120 and %o2, 31, %o2 /* IEU1 Group */
121 40: stx %g0, [%o0] /* Store */
122 stx %g0, [%o0 + 8] /* Store Group */
124 subcc %g3, 32, %g3 /* IEU1 */
125 stx %g0, [%o0 + 16] /* Store Group */
126 stx %g0, [%o0 + 24] /* Store Group */
127 bne,pt %XCC, 40b /* CTI */
129 add %o0, 32, %o0 /* IEU0 */
130 41: subcc %o2, 8, %o2 /* IEU1 Group */
131 bl,a,pn %XCC, 6f /* CTI */
132 andcc %o2, 4, %g0 /* IEU1 Group */
134 5: stx %g0, [%o0] /* Store */
135 subcc %o2, 8, %o2 /* IEU1 Group */
136 bge,pt %XCC, 5b /* CTI */
137 add %o0, 8, %o0 /* IEU0 */
139 andcc %o2, 4, %g0 /* IEU1 Group */
140 6: be,a,pn %icc, 7f /* CTI */
141 andcc %o2, 2, %g0 /* IEU1 Group */
142 stw %g0, [%o0] /* Store */
144 add %o0, 4, %o0 /* IEU0 */
145 andcc %o2, 2, %g0 /* IEU1 Group */
146 7: be,a,pn %icc, 8f /* CTI */
147 andcc %o2, 1, %g0 /* IEU1 Group */
149 sth %g0, [%o0] /* Store */
150 add %o0, 2, %o0 /* IEU0 */
151 andcc %o2, 1, %g0 /* IEU1 Group */
152 8: bne,a,pn %icc, 9f /* CTI */
154 stb %g0, [%o0] /* Store */
155 9: retl /* CTI+IEU1 Group */
156 mov %g6, %o0 /* IEU0 */
159 10: ba,pt %xcc, 3b /* CTI */
160 sllx %g5, 8, %g3 /* IEU0 */
161 11: ba,pt %xcc, 3b /* CTI Group */
162 sllx %g4, 16, %g3 /* IEU0 */
164 12: ba,pt %xcc, 3b /* CTI Group */
165 sllx %g5, 24, %g3 /* IEU0 */
166 13: ba,pt %xcc, 3b /* CTI Group */
167 sllx %g4, 32, %g3 /* IEU0 */
169 14: ba,pt %xcc, 3b /* CTI Group */
170 sllx %g5, 40, %g3 /* IEU0 */
171 15: ba,pt %xcc, 3b /* CTI Group */
172 sllx %g4, 48, %g3 /* IEU0 */
174 16: ba,pt %xcc, 3b /* CTI */
175 sllx %g5, 56, %g3 /* IEU0 */
176 17: or %o3, %o4, %o3 /* IEU0 Group */
177 sub %o3, %g1, %o4 /* IEU1 */
179 18: addcc %o2, 8, %o2 /* IEU1 Group */
180 be,pn %XCC, 19f /* CTI */
181 andcc %o4, %g2, %g0 /* IEU1 Group */
182 be,pt %xcc, 21f /* CTI */
184 srlx %o3, 56, %g5 /* IEU0 */
185 andcc %g5, 0xff, %g0 /* IEU1 Group */
186 be,pn %icc, 20f /* CTI */
187 stb %g5, [%o0] /* Store */
189 add %o0, 1, %o0 /* IEU0 Group */
190 subcc %o2, 1, %o2 /* IEU1 */
191 be,pn %XCC, 19f /* CTI */
192 srlx %o3, 48, %g5 /* IEU0 Group */
194 andcc %g5, 0xff, %g0 /* IEU1 Group */
195 be,pn %icc, 20f /* CTI */
196 stb %g5, [%o0] /* Store */
197 add %o0, 1, %o0 /* IEU0 Group */
199 subcc %o2, 1, %o2 /* IEU1 */
200 be,pn %XCC, 19f /* CTI */
201 srlx %o3, 40, %g5 /* IEU0 Group */
202 andcc %g5, 0xff, %g0 /* IEU1 Group */
204 be,pn %icc, 20f /* CTI */
205 stb %g5, [%o0] /* Store */
206 add %o0, 1, %o0 /* IEU0 Group */
207 subcc %o2, 1, %o2 /* IEU1 */
209 be,pn %XCC, 19f /* CTI */
210 srlx %o3, 32, %g5 /* IEU0 Group */
211 andcc %g5, 0xff, %g0 /* IEU1 Group */
212 be,pn %icc, 20f /* CTI */
214 stb %g5, [%o0] /* Store */
215 add %o0, 1, %o0 /* IEU0 Group */
216 subcc %o2, 1, %o2 /* IEU1 */
217 be,pn %XCC, 19f /* CTI */
219 srlx %o3, 24, %g5 /* IEU0 Group */
220 andcc %g5, 0xff, %g0 /* IEU1 Group */
221 be,pn %icc, 20f /* CTI */
222 stb %g5, [%o0] /* Store */
224 add %o0, 1, %o0 /* IEU0 Group */
225 subcc %o2, 1, %o2 /* IEU1 */
226 be,pn %XCC, 19f /* CTI */
227 srlx %o3, 16, %g5 /* IEU0 Group */
229 andcc %g5, 0xff, %g0 /* IEU1 Group */
230 be,pn %icc, 20f /* CTI */
231 stb %g5, [%o0] /* Store */
232 add %o0, 1, %o0 /* IEU0 Group */
234 subcc %o2, 1, %o2 /* IEU1 */
235 be,pn %XCC, 19f /* CTI */
236 srlx %o3, 8, %g5 /* IEU0 Group */
237 stb %g5, [%o0] /* Store */
239 19: retl /* CTI+IEU1 Group */
240 mov %g6, %o0 /* IEU0 */
241 50: stb %g0, [%o0] /* Store Group */
242 20: subcc %o2, 1, %o2 /* IEU1 Group */
244 bne,pt %XCC, 50b /* CTI */
245 add %o0, 1, %o0 /* IEU0 */
246 retl /* CTI+IEU1 Group */
247 mov %g6, %o0 /* IEU0 */
249 21: andcc %o2, 4, %g0 /* IEU1 Group */
250 be,pn %icc, 22f /* CTI */
251 srlx %o3, 32, %g5 /* IEU0 */
252 stw %g5, [%o0] /* Store Group */
254 add %o0, 4, %o0 /* IEU0 */
255 mov %o3, %g5 /* IEU1 */
256 22: andcc %o2, 2, %g0 /* IEU1 Group */
257 be,pn %icc, 23f /* CTI */
259 srlx %g5, 16, %g4 /* IEU0 */
260 sth %g4, [%o0] /* Store Group */
261 add %o0, 2, %o0 /* IEU0 */
262 mov %g5, %g4 /* IEU1 */
264 23: srlx %g4, 8, %g4 /* IEU0 Group */
265 andcc %o2, 1, %g0 /* IEU1 */
266 bne,a,pn %icc, 24f /* CTI */
267 stb %g4, [%o0] /* Store Group */
269 24: retl /* CTI+IEU1 Group */
270 mov %g6, %o0 /* IEU0 */
271 25: andcc %o0, 7, %g0 /* IEU1 Group */
272 be,a,pn %icc, 4b /* CTI */
274 andncc %o2, 31, %g3 /* IEU1 Group */
275 stb %g0, [%o0] /* Store Group */
276 subcc %o2, 1, %o2 /* IEU1 */
277 bne,pt %XCC, 25b /* CTI */
279 add %o0, 1, %o0 /* IEU0 Group */
280 retl /* CTI+IEU1 Group */
281 mov %g6, %o0 /* IEU0 */
284 26: ldub [%o1], %o3 /* Load */
285 sllx %g1, 7, %g2 /* IEU0 Group */
286 stb %o3, [%o0] /* Store */
287 27: subcc %o2, 1, %o2 /* IEU1 */
289 be,pn %XCC, 9b /* CTI */
290 add %o1, 1, %o1 /* IEU0 Group */
291 add %o0, 1, %o0 /* IEU1 */
292 andcc %o3, 0xff, %g0 /* IEU1 Group */
294 be,pn %icc, 25b /* CTI */
295 lduba [%o1] ASI_PNF, %o3 /* Load */
296 andcc %o0, 7, %g0 /* IEU1 Group */
297 bne,a,pt %icc, 27b /* CTI */
299 stb %o3, [%o0] /* Store */
300 andcc %o1, 7, %g3 /* IEU1 Group */
301 be,a,pt %icc, 1b /* CTI */
302 ldx [%o1], %o3 /* Load */
304 28: orcc %g0, 64, %g4 /* IEU1 Group */
305 sllx %g3, 3, %g5 /* IEU0 */
306 sub %g4, %g5, %g4 /* IEU0 Group */
307 sub %o1, %g3, %o1 /* IEU1 */
308 /* %g1 = 0101010101010101
309 %g2 = 8080808080808080
310 %g3 = source alignment
311 %g5 = number of bits to shift left
312 %g4 = number of bits to shift right */
314 ldxa [%o1] ASI_PNF, %o5 /* Load Group */
315 addcc %o1, 8, %o1 /* IEU1 */
317 29: sllx %o5, %g5, %o3 /* IEU0 Group */
318 ldxa [%o1] ASI_PNF, %o5 /* Load */
319 subcc %o2, 8, %o2 /* IEU1 */
320 bl,pn %XCC, 17b /* CTI */
322 srlx %o5, %g4, %o4 /* IEU0 Group */
323 add %o1, 8, %o1 /* IEU1 */
324 or %o3, %o4, %o3 /* IEU0 Group */
325 add %o0, 8, %o0 /* IEU1 */
327 sub %o3, %g1, %o4 /* IEU0 Group */
328 #ifdef EIGHTBIT_NOT_RARE
329 andn %o4, %o3, %o4 /* IEU0 Group */
331 andcc %o4, %g2, %g0 /* IEU1 Group */
332 be,a,pt %xcc, 29b /* CTI */
333 stx %o3, [%o0-8] /* Store */
335 srlx %o3, 56, %o4 /* IEU0 Group */
336 andcc %o4, 0xff, %g0 /* IEU1 Group */
337 be,pn %icc, 36f /* CTI */
338 srlx %o3, 48, %o4 /* IEU0 */
340 andcc %o4, 0xff, %g0 /* IEU1 Group */
341 be,pn %icc, 35f /* CTI */
342 srlx %o3, 40, %o4 /* IEU0 */
343 andcc %o4, 0xff, %g0 /* IEU1 Group */
345 be,pn %icc, 34f /* CTI */
346 srlx %o3, 32, %o4 /* IEU0 */
347 andcc %o4, 0xff, %g0 /* IEU1 Group */
348 be,pn %icc, 33f /* CTI */
350 srlx %o3, 24, %o4 /* IEU0 */
351 andcc %o4, 0xff, %g0 /* IEU1 Group */
352 be,pn %icc, 32f /* CTI */
353 srlx %o3, 16, %o4 /* IEU0 */
355 andcc %o4, 0xff, %g0 /* IEU1 Group */
356 be,pn %icc, 31f /* CTI */
357 srlx %o3, 8, %o4 /* IEU0 */
358 andcc %o4, 0xff, %g0 /* IEU1 Group */
360 be,pn %icc, 30f /* CTI */
361 andcc %o3, 0xff, %g0 /* IEU1 Group */
362 bne,pn %icc, 29b /* CTI */
363 stx %o3, [%o0-8] /* Store */
365 ba,pt %xcc, 4b /* CTI Group */
366 andncc %o2, 31, %g3 /* IEU1 */
367 30: srlx %o3, 8, %o4 /* IEU0 */
368 ba,pt %xcc, 3b /* CTI */
370 sllx %o4, 8, %g3 /* IEU0 Group */
371 31: srlx %o3, 16, %o4 /* IEU0 Group */
372 ba,pt %xcc, 3b /* CTI */
373 sllx %o4, 16, %g3 /* IEU0 Group */
375 32: srlx %o3, 24, %o4 /* IEU0 Group */
376 ba,pt %xcc, 3b /* CTI */
377 sllx %o4, 24, %g3 /* IEU0 Group */
378 33: srlx %o3, 32, %o4 /* IEU0 Group */
380 ba,pt %xcc, 3b /* CTI */
381 sllx %o4, 32, %g3 /* IEU0 Group */
382 34: srlx %o3, 40, %o4 /* IEU0 Group */
383 ba,pt %xcc, 3b /* CTI */
385 sllx %o4, 40, %g3 /* IEU0 Group */
386 35: srlx %o3, 48, %o4 /* IEU0 Group */
387 ba,pt %xcc, 3b /* CTI */
388 sllx %o4, 48, %g3 /* IEU0 Group */
390 36: srlx %o3, 56, %o4 /* IEU0 Group */
391 ba,pt %xcc, 3b /* CTI */
392 sllx %o4, 56, %g3 /* IEU0 Group */
394 libc_hidden_builtin_def (strncpy)