blob: 25a48844db6acd68903eada66258f9a0ac30e0ca [file] [log] [blame]
yuezonghe824eb0c2024-06-27 02:32:26 -07001/* Copy SIZE bytes from SRC to DEST.
2 For SPARC v7.
3 Copyright (C) 1996, 1999, 2003 Free Software Foundation, Inc.
4 This file is part of the GNU C Library.
5 Contributed by David S. Miller <davem@caip.rutgers.edu>,
6 Eddie C. Dost <ecd@skynet.be> and
7 Jakub Jelinek <jj@ultra.linux.cz>.
8
9 The GNU C Library is free software; you can redistribute it and/or
10 modify it under the terms of the GNU Lesser General Public
11 License as published by the Free Software Foundation; either
12 version 2.1 of the License, or (at your option) any later version.
13
14 The GNU C Library is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 Lesser General Public License for more details.
18
19 You should have received a copy of the GNU Lesser General Public
20 License along with the GNU C Library; if not, write to the Free
21 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
22 02111-1307 USA. */
23
24#include <features.h>
25
26/* Both these macros have to start with exactly the same insn */
27#define MOVE_BIGCHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, t7) \
28 ldd [%src + offset + 0x00], %t0; \
29 ldd [%src + offset + 0x08], %t2; \
30 ldd [%src + offset + 0x10], %t4; \
31 ldd [%src + offset + 0x18], %t6; \
32 st %t0, [%dst + offset + 0x00]; \
33 st %t1, [%dst + offset + 0x04]; \
34 st %t2, [%dst + offset + 0x08]; \
35 st %t3, [%dst + offset + 0x0c]; \
36 st %t4, [%dst + offset + 0x10]; \
37 st %t5, [%dst + offset + 0x14]; \
38 st %t6, [%dst + offset + 0x18]; \
39 st %t7, [%dst + offset + 0x1c];
40
41#define MOVE_BIGALIGNCHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, t7) \
42 ldd [%src + offset + 0x00], %t0; \
43 ldd [%src + offset + 0x08], %t2; \
44 ldd [%src + offset + 0x10], %t4; \
45 ldd [%src + offset + 0x18], %t6; \
46 std %t0, [%dst + offset + 0x00]; \
47 std %t2, [%dst + offset + 0x08]; \
48 std %t4, [%dst + offset + 0x10]; \
49 std %t6, [%dst + offset + 0x18];
50
51#define MOVE_LASTCHUNK(src, dst, offset, t0, t1, t2, t3) \
52 ldd [%src - offset - 0x10], %t0; \
53 ldd [%src - offset - 0x08], %t2; \
54 st %t0, [%dst - offset - 0x10]; \
55 st %t1, [%dst - offset - 0x0c]; \
56 st %t2, [%dst - offset - 0x08]; \
57 st %t3, [%dst - offset - 0x04];
58
59#define MOVE_LASTALIGNCHUNK(src, dst, offset, t0, t1, t2, t3) \
60 ldd [%src - offset - 0x10], %t0; \
61 ldd [%src - offset - 0x08], %t2; \
62 std %t0, [%dst - offset - 0x10]; \
63 std %t2, [%dst - offset - 0x08];
64
65#define MOVE_SHORTCHUNK(src, dst, offset, t0, t1) \
66 ldub [%src - offset - 0x02], %t0; \
67 ldub [%src - offset - 0x01], %t1; \
68 stb %t0, [%dst - offset - 0x02]; \
69 stb %t1, [%dst - offset - 0x01];
70
71/* Both these macros have to start with exactly the same insn */
72#define RMOVE_BIGCHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, t7) \
73 ldd [%src - offset - 0x20], %t0; \
74 ldd [%src - offset - 0x18], %t2; \
75 ldd [%src - offset - 0x10], %t4; \
76 ldd [%src - offset - 0x08], %t6; \
77 st %t0, [%dst - offset - 0x20]; \
78 st %t1, [%dst - offset - 0x1c]; \
79 st %t2, [%dst - offset - 0x18]; \
80 st %t3, [%dst - offset - 0x14]; \
81 st %t4, [%dst - offset - 0x10]; \
82 st %t5, [%dst - offset - 0x0c]; \
83 st %t6, [%dst - offset - 0x08]; \
84 st %t7, [%dst - offset - 0x04];
85
86#define RMOVE_BIGALIGNCHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, t7) \
87 ldd [%src - offset - 0x20], %t0; \
88 ldd [%src - offset - 0x18], %t2; \
89 ldd [%src - offset - 0x10], %t4; \
90 ldd [%src - offset - 0x08], %t6; \
91 std %t0, [%dst - offset - 0x20]; \
92 std %t2, [%dst - offset - 0x18]; \
93 std %t4, [%dst - offset - 0x10]; \
94 std %t6, [%dst - offset - 0x08];
95
96#define RMOVE_LASTCHUNK(src, dst, offset, t0, t1, t2, t3) \
97 ldd [%src + offset + 0x00], %t0; \
98 ldd [%src + offset + 0x08], %t2; \
99 st %t0, [%dst + offset + 0x00]; \
100 st %t1, [%dst + offset + 0x04]; \
101 st %t2, [%dst + offset + 0x08]; \
102 st %t3, [%dst + offset + 0x0c];
103
104#define RMOVE_SHORTCHUNK(src, dst, offset, t0, t1) \
105 ldub [%src + offset + 0x00], %t0; \
106 ldub [%src + offset + 0x01], %t1; \
107 stb %t0, [%dst + offset + 0x00]; \
108 stb %t1, [%dst + offset + 0x01];
109
110#define SMOVE_CHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, prev, shil, shir, offset2) \
111 ldd [%src + offset + 0x00], %t0; \
112 ldd [%src + offset + 0x08], %t2; \
113 srl %t0, shir, %t5; \
114 srl %t1, shir, %t6; \
115 sll %t0, shil, %t0; \
116 or %t5, %prev, %t5; \
117 sll %t1, shil, %prev; \
118 or %t6, %t0, %t0; \
119 srl %t2, shir, %t1; \
120 srl %t3, shir, %t6; \
121 sll %t2, shil, %t2; \
122 or %t1, %prev, %t1; \
123 std %t4, [%dst + offset + offset2 - 0x04]; \
124 std %t0, [%dst + offset + offset2 + 0x04]; \
125 sll %t3, shil, %prev; \
126 or %t6, %t2, %t4;
127
128#define SMOVE_ALIGNCHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, prev, shil, shir, offset2) \
129 ldd [%src + offset + 0x00], %t0; \
130 ldd [%src + offset + 0x08], %t2; \
131 srl %t0, shir, %t4; \
132 srl %t1, shir, %t5; \
133 sll %t0, shil, %t6; \
134 or %t4, %prev, %t0; \
135 sll %t1, shil, %prev; \
136 or %t5, %t6, %t1; \
137 srl %t2, shir, %t4; \
138 srl %t3, shir, %t5; \
139 sll %t2, shil, %t6; \
140 or %t4, %prev, %t2; \
141 sll %t3, shil, %prev; \
142 or %t5, %t6, %t3; \
143 std %t0, [%dst + offset + offset2 + 0x00]; \
144 std %t2, [%dst + offset + offset2 + 0x08];
145
146 .text
147 .align 4
148
14970: andcc %o1, 1, %g0
150 be 4f
151 andcc %o1, 2, %g0
152
153 ldub [%o1 - 1], %g2
154 sub %o1, 1, %o1
155 stb %g2, [%o0 - 1]
156 sub %o2, 1, %o2
157 be 3f
158 sub %o0, 1, %o0
1594: lduh [%o1 - 2], %g2
160 sub %o1, 2, %o1
161 sth %g2, [%o0 - 2]
162 sub %o2, 2, %o2
163 b 3f
164 sub %o0, 2, %o0
165
166#ifdef __UCLIBC_SUSV3_LEGACY__
167ENTRY(bcopy)
168 mov %o0, %o3
169 mov %o1, %o0
170 mov %o3, %o1
171END(bcopy)
172#endif
173
174ENTRY(memmove)
175 cmp %o0, %o1
176 st %o0, [%sp + 64]
177 bleu 9f
178 sub %o0, %o1, %o4
179
180 add %o1, %o2, %o3
181 cmp %o3, %o0
182 bleu 0f
183 andcc %o4, 3, %o5
184
185 add %o1, %o2, %o1
186 add %o0, %o2, %o0
187 bne 77f
188 cmp %o2, 15
189 bleu 91f
190 andcc %o1, 3, %g0
191 bne 70b
1923: andcc %o1, 4, %g0
193
194 be 2f
195 mov %o2, %g1
196
197 ld [%o1 - 4], %o4
198 sub %g1, 4, %g1
199 st %o4, [%o0 - 4]
200 sub %o1, 4, %o1
201 sub %o0, 4, %o0
2022: andcc %g1, 0xffffff80, %g6
203 be 3f
204 andcc %o0, 4, %g0
205
206 be 74f + 4
2075: RMOVE_BIGCHUNK(o1, o0, 0x00, o2, o3, o4, o5, g2, g3, g4, g5)
208 RMOVE_BIGCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5)
209 RMOVE_BIGCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5)
210 RMOVE_BIGCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5)
211 subcc %g6, 128, %g6
212 sub %o1, 128, %o1
213 bne 5b
214 sub %o0, 128, %o0
215
2163: andcc %g1, 0x70, %g6
217 be 72f
218 andcc %g1, 8, %g0
219
220 srl %g6, 1, %o4
221 mov %o7, %g2
222 add %g6, %o4, %o4
223101: call 100f
224 sub %o1, %g6, %o1
225 mov %g2, %o7
226 jmpl %o5 + (72f - 101b), %g0
227 sub %o0, %g6, %o0
228
22971: RMOVE_LASTCHUNK(o1, o0, 0x60, g2, g3, g4, g5)
230 RMOVE_LASTCHUNK(o1, o0, 0x50, g2, g3, g4, g5)
231 RMOVE_LASTCHUNK(o1, o0, 0x40, g2, g3, g4, g5)
232 RMOVE_LASTCHUNK(o1, o0, 0x30, g2, g3, g4, g5)
233 RMOVE_LASTCHUNK(o1, o0, 0x20, g2, g3, g4, g5)
234 RMOVE_LASTCHUNK(o1, o0, 0x10, g2, g3, g4, g5)
235 RMOVE_LASTCHUNK(o1, o0, 0x00, g2, g3, g4, g5)
23672: be 73f
237 andcc %g1, 4, %g0
238
239 ldd [%o1 - 0x08], %g2
240 sub %o0, 8, %o0
241 sub %o1, 8, %o1
242 st %g2, [%o0]
243 st %g3, [%o0 + 0x04]
24473: be 1f
245 andcc %g1, 2, %g0
246
247 ld [%o1 - 4], %g2
248 sub %o1, 4, %o1
249 st %g2, [%o0 - 4]
250 sub %o0, 4, %o0
2511: be 1f
252 andcc %g1, 1, %g0
253
254 lduh [%o1 - 2], %g2
255 sub %o1, 2, %o1
256 sth %g2, [%o0 - 2]
257 sub %o0, 2, %o0
2581: be 1f
259 nop
260
261 ldub [%o1 - 1], %g2
262 stb %g2, [%o0 - 1]
2631: retl
264 ld [%sp + 64], %o0
265
26674: RMOVE_BIGALIGNCHUNK(o1, o0, 0x00, o2, o3, o4, o5, g2, g3, g4, g5)
267 RMOVE_BIGALIGNCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5)
268 RMOVE_BIGALIGNCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5)
269 RMOVE_BIGALIGNCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5)
270 subcc %g6, 128, %g6
271 sub %o1, 128, %o1
272 bne 74b
273 sub %o0, 128, %o0
274
275 andcc %g1, 0x70, %g6
276 be 72b
277 andcc %g1, 8, %g0
278
279 srl %g6, 1, %o4
280 mov %o7, %g2
281 add %g6, %o4, %o4
282102: call 100f
283 sub %o1, %g6, %o1
284 mov %g2, %o7
285 jmpl %o5 + (72b - 102b), %g0
286 sub %o0, %g6, %o0
287
28875: and %o2, 0xe, %o3
289 mov %o7, %g2
290 sll %o3, 3, %o4
291 sub %o0, %o3, %o0
292103: call 100f
293 sub %o1, %o3, %o1
294 mov %g2, %o7
295 jmpl %o5 + (76f - 103b), %g0
296 andcc %o2, 1, %g0
297
298 RMOVE_SHORTCHUNK(o1, o0, 0x0c, g2, g3)
299 RMOVE_SHORTCHUNK(o1, o0, 0x0a, g2, g3)
300 RMOVE_SHORTCHUNK(o1, o0, 0x08, g2, g3)
301 RMOVE_SHORTCHUNK(o1, o0, 0x06, g2, g3)
302 RMOVE_SHORTCHUNK(o1, o0, 0x04, g2, g3)
303 RMOVE_SHORTCHUNK(o1, o0, 0x02, g2, g3)
304 RMOVE_SHORTCHUNK(o1, o0, 0x00, g2, g3)
305
30676: be 1f
307 nop
308 ldub [%o1 - 1], %g2
309 stb %g2, [%o0 - 1]
3101: retl
311 ld [%sp + 64], %o0
312
31391: bne 75b
314 andcc %o2, 8, %g0
315
316 be 1f
317 andcc %o2, 4, %g0
318
319 ld [%o1 - 0x08], %g2
320 ld [%o1 - 0x04], %g3
321 sub %o1, 8, %o1
322 st %g2, [%o0 - 0x08]
323 st %g3, [%o0 - 0x04]
324 sub %o0, 8, %o0
3251: b 73b
326 mov %o2, %g1
327
32877: cmp %o2, 15
329 bleu 75b
330 andcc %o0, 3, %g0
331 be 64f
332 andcc %o0, 1, %g0
333 be 63f
334 andcc %o0, 2, %g0
335 ldub [%o1 - 1], %g5
336 sub %o1, 1, %o1
337 stb %g5, [%o0 - 1]
338 sub %o0, 1, %o0
339 be 64f
340 sub %o2, 1, %o2
341
34263: ldub [%o1 - 1], %g5
343 sub %o1, 2, %o1
344 stb %g5, [%o0 - 1]
345 sub %o0, 2, %o0
346 ldub [%o1], %g5
347 sub %o2, 2, %o2
348 stb %g5, [%o0]
34964: and %o1, 3, %g2
350 and %o1, -4, %o1
351 and %o2, 0xc, %g3
352 add %o1, 4, %o1
353 cmp %g3, 4
354 sll %g2, 3, %g4
355 mov 32, %g2
356 be 4f
357 sub %g2, %g4, %g6
358
359 blu 3f
360 cmp %g3, 8
361
362 be 2f
363 srl %o2, 2, %g3
364
365 ld [%o1 - 4], %o3
366 add %o0, -8, %o0
367 ld [%o1 - 8], %o4
368 add %o1, -16, %o1
369 b 7f
370 add %g3, 1, %g3
3712: ld [%o1 - 4], %o4
372 add %o0, -4, %o0
373 ld [%o1 - 8], %g1
374 add %o1, -12, %o1
375 b 8f
376 add %g3, 2, %g3
3773: ld [%o1 - 4], %o5
378 add %o0, -12, %o0
379 ld [%o1 - 8], %o3
380 add %o1, -20, %o1
381 b 6f
382 srl %o2, 2, %g3
3834: ld [%o1 - 4], %g1
384 srl %o2, 2, %g3
385 ld [%o1 - 8], %o5
386 add %o1, -24, %o1
387 add %o0, -16, %o0
388 add %g3, -1, %g3
389
390 ld [%o1 + 12], %o3
3915: sll %o5, %g4, %g2
392 srl %g1, %g6, %g5
393 or %g2, %g5, %g2
394 st %g2, [%o0 + 12]
3956: ld [%o1 + 8], %o4
396 sll %o3, %g4, %g2
397 srl %o5, %g6, %g5
398 or %g2, %g5, %g2
399 st %g2, [%o0 + 8]
4007: ld [%o1 + 4], %g1
401 sll %o4, %g4, %g2
402 srl %o3, %g6, %g5
403 or %g2, %g5, %g2
404 st %g2, [%o0 + 4]
4058: ld [%o1], %o5
406 sll %g1, %g4, %g2
407 srl %o4, %g6, %g5
408 addcc %g3, -4, %g3
409 or %g2, %g5, %g2
410 add %o1, -16, %o1
411 st %g2, [%o0]
412 add %o0, -16, %o0
413 bne,a 5b
414 ld [%o1 + 12], %o3
415 sll %o5, %g4, %g2
416 srl %g1, %g6, %g5
417 srl %g4, 3, %g3
418 or %g2, %g5, %g2
419 add %o1, %g3, %o1
420 andcc %o2, 2, %g0
421 st %g2, [%o0 + 12]
422 be 1f
423 andcc %o2, 1, %g0
424
425 ldub [%o1 + 15], %g5
426 add %o1, -2, %o1
427 stb %g5, [%o0 + 11]
428 add %o0, -2, %o0
429 ldub [%o1 + 16], %g5
430 stb %g5, [%o0 + 12]
4311: be 1f
432 nop
433 ldub [%o1 + 15], %g5
434 stb %g5, [%o0 + 11]
4351: retl
436 ld [%sp + 64], %o0
437
43878: andcc %o1, 1, %g0
439 be 4f
440 andcc %o1, 2, %g0
441
442 ldub [%o1], %g2
443 add %o1, 1, %o1
444 stb %g2, [%o0]
445 sub %o2, 1, %o2
446 bne 3f
447 add %o0, 1, %o0
4484: lduh [%o1], %g2
449 add %o1, 2, %o1
450 sth %g2, [%o0]
451 sub %o2, 2, %o2
452 b 3f
453 add %o0, 2, %o0
454END(memmove)
455libc_hidden_def(memmove)
456
457ENTRY(memcpy) /* %o0=dst %o1=src %o2=len */
458 sub %o0, %o1, %o4
459 st %o0, [%sp + 64]
4609: andcc %o4, 3, %o5
4610: bne 86f
462 cmp %o2, 15
463
464 bleu 90f
465 andcc %o1, 3, %g0
466
467 bne 78b
4683: andcc %o1, 4, %g0
469
470 be 2f
471 mov %o2, %g1
472
473 ld [%o1], %o4
474 sub %g1, 4, %g1
475 st %o4, [%o0]
476 add %o1, 4, %o1
477 add %o0, 4, %o0
4782: andcc %g1, 0xffffff80, %g6
479 be 3f
480 andcc %o0, 4, %g0
481
482 be 82f + 4
4835: MOVE_BIGCHUNK(o1, o0, 0x00, o2, o3, o4, o5, g2, g3, g4, g5)
484 MOVE_BIGCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5)
485 MOVE_BIGCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5)
486 MOVE_BIGCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5)
487 subcc %g6, 128, %g6
488 add %o1, 128, %o1
489 bne 5b
490 add %o0, 128, %o0
4913: andcc %g1, 0x70, %g6
492 be 80f
493 andcc %g1, 8, %g0
494
495 srl %g6, 1, %o4
496 mov %o7, %g2
497 add %g6, %o4, %o4
498 add %o1, %g6, %o1
499104: call 100f
500 add %o0, %g6, %o0
501 jmpl %o5 + (80f - 104b), %g0
502 mov %g2, %o7
503
50479: MOVE_LASTCHUNK(o1, o0, 0x60, g2, g3, g4, g5)
505 MOVE_LASTCHUNK(o1, o0, 0x50, g2, g3, g4, g5)
506 MOVE_LASTCHUNK(o1, o0, 0x40, g2, g3, g4, g5)
507 MOVE_LASTCHUNK(o1, o0, 0x30, g2, g3, g4, g5)
508 MOVE_LASTCHUNK(o1, o0, 0x20, g2, g3, g4, g5)
509 MOVE_LASTCHUNK(o1, o0, 0x10, g2, g3, g4, g5)
510 MOVE_LASTCHUNK(o1, o0, 0x00, g2, g3, g4, g5)
511
51280: be 81f
513 andcc %g1, 4, %g0
514
515 ldd [%o1], %g2
516 add %o0, 8, %o0
517 st %g2, [%o0 - 0x08]
518 add %o1, 8, %o1
519 st %g3, [%o0 - 0x04]
520
52181: be 1f
522 andcc %g1, 2, %g0
523
524 ld [%o1], %g2
525 add %o1, 4, %o1
526 st %g2, [%o0]
527 add %o0, 4, %o0
5281: be 1f
529 andcc %g1, 1, %g0
530
531 lduh [%o1], %g2
532 add %o1, 2, %o1
533 sth %g2, [%o0]
534 add %o0, 2, %o0
5351: be 1f
536 nop
537
538 ldub [%o1], %g2
539 stb %g2, [%o0]
5401: retl
541 ld [%sp + 64], %o0
542
54382: /* ldd_std */
544 MOVE_BIGALIGNCHUNK(o1, o0, 0x00, o2, o3, o4, o5, g2, g3, g4, g5)
545 MOVE_BIGALIGNCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5)
546 MOVE_BIGALIGNCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5)
547 MOVE_BIGALIGNCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5)
548 subcc %g6, 128, %g6
549 add %o1, 128, %o1
550 bne 82b
551 add %o0, 128, %o0
552
553 andcc %g1, 0x70, %g6
554 be 84f
555 andcc %g1, 8, %g0
556
557 mov %o7, %g2
558111: call 110f
559 add %o1, %g6, %o1
560 mov %g2, %o7
561 jmpl %o5 + (84f - 111b), %g0
562 add %o0, %g6, %o0
563
56483: MOVE_LASTALIGNCHUNK(o1, o0, 0x60, g2, g3, g4, g5)
565 MOVE_LASTALIGNCHUNK(o1, o0, 0x50, g2, g3, g4, g5)
566 MOVE_LASTALIGNCHUNK(o1, o0, 0x40, g2, g3, g4, g5)
567 MOVE_LASTALIGNCHUNK(o1, o0, 0x30, g2, g3, g4, g5)
568 MOVE_LASTALIGNCHUNK(o1, o0, 0x20, g2, g3, g4, g5)
569 MOVE_LASTALIGNCHUNK(o1, o0, 0x10, g2, g3, g4, g5)
570 MOVE_LASTALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5)
571
57284: be 85f
573 andcc %g1, 4, %g0
574
575 ldd [%o1], %g2
576 add %o0, 8, %o0
577 std %g2, [%o0 - 0x08]
578 add %o1, 8, %o1
57985: be 1f
580 andcc %g1, 2, %g0
581
582 ld [%o1], %g2
583 add %o1, 4, %o1
584 st %g2, [%o0]
585 add %o0, 4, %o0
5861: be 1f
587 andcc %g1, 1, %g0
588
589 lduh [%o1], %g2
590 add %o1, 2, %o1
591 sth %g2, [%o0]
592 add %o0, 2, %o0
5931: be 1f
594 nop
595
596 ldub [%o1], %g2
597 stb %g2, [%o0]
5981: retl
599 ld [%sp + 64], %o0
600
60186: cmp %o2, 6
602 bleu 88f
603
604 cmp %o2, 256
605 bcc 87f
606
607 andcc %o0, 3, %g0
608 be 61f
609 andcc %o0, 1, %g0
610 be 60f
611 andcc %o0, 2, %g0
612
613 ldub [%o1], %g5
614 add %o1, 1, %o1
615 stb %g5, [%o0]
616 sub %o2, 1, %o2
617 bne 61f
618 add %o0, 1, %o0
61960: ldub [%o1], %g3
620 add %o1, 2, %o1
621 stb %g3, [%o0]
622 sub %o2, 2, %o2
623 ldub [%o1 - 1], %g3
624 add %o0, 2, %o0
625 stb %g3, [%o0 - 1]
62661: and %o1, 3, %g2
627 and %o2, 0xc, %g3
628 and %o1, -4, %o1
629 cmp %g3, 4
630 sll %g2, 3, %g4
631 mov 32, %g2
632 be 4f
633 sub %g2, %g4, %g6
634
635 blu 3f
636 cmp %g3, 0x8
637
638 be 2f
639 srl %o2, 2, %g3
640
641 ld [%o1], %o3
642 add %o0, -8, %o0
643 ld [%o1 + 4], %o4
644 b 8f
645 add %g3, 1, %g3
6462: ld [%o1], %o4
647 add %o0, -12, %o0
648 ld [%o1 + 4], %o5
649 add %g3, 2, %g3
650 b 9f
651 add %o1, -4, %o1
6523: ld [%o1], %g1
653 add %o0, -4, %o0
654 ld [%o1 + 4], %o3
655 srl %o2, 2, %g3
656 b 7f
657 add %o1, 4, %o1
6584: ld [%o1], %o5
659 cmp %o2, 7
660 ld [%o1 + 4], %g1
661 srl %o2, 2, %g3
662 bleu 10f
663 add %o1, 8, %o1
664
665 ld [%o1], %o3
666 add %g3, -1, %g3
6675: sll %o5, %g4, %g2
668 srl %g1, %g6, %g5
669 or %g2, %g5, %g2
670 st %g2, [%o0]
6717: ld [%o1 + 4], %o4
672 sll %g1, %g4, %g2
673 srl %o3, %g6, %g5
674 or %g2, %g5, %g2
675 st %g2, [%o0 + 4]
6768: ld [%o1 + 8], %o5
677 sll %o3, %g4, %g2
678 srl %o4, %g6, %g5
679 or %g2, %g5, %g2
680 st %g2, [%o0 + 8]
6819: ld [%o1 + 12], %g1
682 sll %o4, %g4, %g2
683 srl %o5, %g6, %g5
684 addcc %g3, -4, %g3
685 or %g2, %g5, %g2
686 add %o1, 16, %o1
687 st %g2, [%o0 + 12]
688 add %o0, 16, %o0
689 bne,a 5b
690 ld [%o1], %o3
69110: sll %o5, %g4, %g2
692 srl %g1, %g6, %g5
693 srl %g6, 3, %g3
694 or %g2, %g5, %g2
695 sub %o1, %g3, %o1
696 andcc %o2, 2, %g0
697 st %g2, [%o0]
698 be 1f
699 andcc %o2, 1, %g0
700
701 ldub [%o1], %g2
702 add %o1, 2, %o1
703 stb %g2, [%o0 + 4]
704 add %o0, 2, %o0
705 ldub [%o1 - 1], %g2
706 stb %g2, [%o0 + 3]
7071: be 1f
708 nop
709 ldub [%o1], %g2
710 stb %g2, [%o0 + 4]
7111: retl
712 ld [%sp + 64], %o0
713
71487: andcc %o1, 3, %g0
715 be 3f
716 andcc %o1, 1, %g0
717
718 be 4f
719 andcc %o1, 2, %g0
720
721 ldub [%o1], %g2
722 add %o1, 1, %o1
723 stb %g2, [%o0]
724 sub %o2, 1, %o2
725 bne 3f
726 add %o0, 1, %o0
7274: lduh [%o1], %g2
728 add %o1, 2, %o1
729 srl %g2, 8, %g3
730 sub %o2, 2, %o2
731 stb %g3, [%o0]
732 add %o0, 2, %o0
733 stb %g2, [%o0 - 1]
7343: andcc %o1, 4, %g0
735
736 bne 2f
737 cmp %o5, 1
738
739 ld [%o1], %o4
740 srl %o4, 24, %g2
741 stb %g2, [%o0]
742 srl %o4, 16, %g3
743 stb %g3, [%o0 + 1]
744 srl %o4, 8, %g2
745 stb %g2, [%o0 + 2]
746 sub %o2, 4, %o2
747 stb %o4, [%o0 + 3]
748 add %o1, 4, %o1
749 add %o0, 4, %o0
7502: be 33f
751 cmp %o5, 2
752 be 32f
753 sub %o2, 4, %o2
75431: ld [%o1], %g2
755 add %o1, 4, %o1
756 srl %g2, 24, %g3
757 and %o0, 7, %g5
758 stb %g3, [%o0]
759 cmp %g5, 7
760 sll %g2, 8, %g1
761 add %o0, 4, %o0
762 be 41f
763 and %o2, 0xffffffc0, %o3
764 ld [%o0 - 7], %o4
7654: SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
766 SMOVE_CHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
767 SMOVE_CHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
768 SMOVE_CHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
769 subcc %o3, 64, %o3
770 add %o1, 64, %o1
771 bne 4b
772 add %o0, 64, %o0
773
774 andcc %o2, 0x30, %o3
775 be,a 1f
776 srl %g1, 16, %g2
7774: SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
778 subcc %o3, 16, %o3
779 add %o1, 16, %o1
780 bne 4b
781 add %o0, 16, %o0
782
783 srl %g1, 16, %g2
7841: st %o4, [%o0 - 7]
785 sth %g2, [%o0 - 3]
786 srl %g1, 8, %g4
787 b 88f
788 stb %g4, [%o0 - 1]
78932: ld [%o1], %g2
790 add %o1, 4, %o1
791 srl %g2, 16, %g3
792 and %o0, 7, %g5
793 sth %g3, [%o0]
794 cmp %g5, 6
795 sll %g2, 16, %g1
796 add %o0, 4, %o0
797 be 42f
798 and %o2, 0xffffffc0, %o3
799 ld [%o0 - 6], %o4
8004: SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
801 SMOVE_CHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
802 SMOVE_CHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
803 SMOVE_CHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
804 subcc %o3, 64, %o3
805 add %o1, 64, %o1
806 bne 4b
807 add %o0, 64, %o0
808
809 andcc %o2, 0x30, %o3
810 be,a 1f
811 srl %g1, 16, %g2
8124: SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
813 subcc %o3, 16, %o3
814 add %o1, 16, %o1
815 bne 4b
816 add %o0, 16, %o0
817
818 srl %g1, 16, %g2
8191: st %o4, [%o0 - 6]
820 b 88f
821 sth %g2, [%o0 - 2]
82233: ld [%o1], %g2
823 sub %o2, 4, %o2
824 srl %g2, 24, %g3
825 and %o0, 7, %g5
826 stb %g3, [%o0]
827 cmp %g5, 5
828 srl %g2, 8, %g4
829 sll %g2, 24, %g1
830 sth %g4, [%o0 + 1]
831 add %o1, 4, %o1
832 be 43f
833 and %o2, 0xffffffc0, %o3
834
835 ld [%o0 - 1], %o4
836 add %o0, 4, %o0
8374: SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, -1)
838 SMOVE_CHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, -1)
839 SMOVE_CHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, -1)
840 SMOVE_CHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, -1)
841 subcc %o3, 64, %o3
842 add %o1, 64, %o1
843 bne 4b
844 add %o0, 64, %o0
845
846 andcc %o2, 0x30, %o3
847 be,a 1f
848 srl %g1, 24, %g2
8494: SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, -1)
850 subcc %o3, 16, %o3
851 add %o1, 16, %o1
852 bne 4b
853 add %o0, 16, %o0
854
855 srl %g1, 24, %g2
8561: st %o4, [%o0 - 5]
857 b 88f
858 stb %g2, [%o0 - 1]
85941: SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
860 SMOVE_ALIGNCHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
861 SMOVE_ALIGNCHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
862 SMOVE_ALIGNCHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
863 subcc %o3, 64, %o3
864 add %o1, 64, %o1
865 bne 41b
866 add %o0, 64, %o0
867
868 andcc %o2, 0x30, %o3
869 be,a 1f
870 srl %g1, 16, %g2
8714: SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
872 subcc %o3, 16, %o3
873 add %o1, 16, %o1
874 bne 4b
875 add %o0, 16, %o0
876
877 srl %g1, 16, %g2
8781: sth %g2, [%o0 - 3]
879 srl %g1, 8, %g4
880 b 88f
881 stb %g4, [%o0 - 1]
88243: SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, 3)
883 SMOVE_ALIGNCHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, 3)
884 SMOVE_ALIGNCHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, 3)
885 SMOVE_ALIGNCHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, 3)
886 subcc %o3, 64, %o3
887 add %o1, 64, %o1
888 bne 43b
889 add %o0, 64, %o0
890
891 andcc %o2, 0x30, %o3
892 be,a 1f
893 srl %g1, 24, %g2
8944: SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, 3)
895 subcc %o3, 16, %o3
896 add %o1, 16, %o1
897 bne 4b
898 add %o0, 16, %o0
899
900 srl %g1, 24, %g2
9011: stb %g2, [%o0 + 3]
902 b 88f
903 add %o0, 4, %o0
90442: SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
905 SMOVE_ALIGNCHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
906 SMOVE_ALIGNCHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
907 SMOVE_ALIGNCHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
908 subcc %o3, 64, %o3
909 add %o1, 64, %o1
910 bne 42b
911 add %o0, 64, %o0
912
913 andcc %o2, 0x30, %o3
914 be,a 1f
915 srl %g1, 16, %g2
9164: SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
917 subcc %o3, 16, %o3
918 add %o1, 16, %o1
919 bne 4b
920 add %o0, 16, %o0
921
922 srl %g1, 16, %g2
9231: sth %g2, [%o0 - 2]
924
925 /* Fall through */
926
92788: and %o2, 0xe, %o3
928 mov %o7, %g2
929 sll %o3, 3, %o4
930 add %o0, %o3, %o0
931106: call 100f
932 add %o1, %o3, %o1
933 mov %g2, %o7
934 jmpl %o5 + (89f - 106b), %g0
935 andcc %o2, 1, %g0
936
937 MOVE_SHORTCHUNK(o1, o0, 0x0c, g2, g3)
938 MOVE_SHORTCHUNK(o1, o0, 0x0a, g2, g3)
939 MOVE_SHORTCHUNK(o1, o0, 0x08, g2, g3)
940 MOVE_SHORTCHUNK(o1, o0, 0x06, g2, g3)
941 MOVE_SHORTCHUNK(o1, o0, 0x04, g2, g3)
942 MOVE_SHORTCHUNK(o1, o0, 0x02, g2, g3)
943 MOVE_SHORTCHUNK(o1, o0, 0x00, g2, g3)
944
94589: be 1f
946 nop
947
948 ldub [%o1], %g2
949 stb %g2, [%o0]
9501: retl
951 ld [%sp + 64], %o0
952
95390: bne 88b
954 andcc %o2, 8, %g0
955
956 be 1f
957 andcc %o2, 4, %g0
958
959 ld [%o1 + 0x00], %g2
960 ld [%o1 + 0x04], %g3
961 add %o1, 8, %o1
962 st %g2, [%o0 + 0x00]
963 st %g3, [%o0 + 0x04]
964 add %o0, 8, %o0
9651: b 81b
966 mov %o2, %g1
967
968100: retl
969 sub %o7, %o4, %o5
970110: retl
971 sub %o7, %g6, %o5
972END(memcpy)
973libc_hidden_def(memcpy)