One more sanity check in free.
[glibc.git] / sysdeps / sparc / sparc32 / memcpy.S
blob748a0862fecd409ed028b9546294877fc94aa972
1 /* 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>.
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.
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.
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.  */
24 #include <sysdep.h>
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];
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];
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];
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];
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];
71 #define SMOVE_CHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, prev, shil, shir, offset2)            \
72         ldd     [%src + offset + 0x00], %t0;                                                            \
73         ldd     [%src + offset + 0x08], %t2;                                                            \
74         srl     %t0, shir, %t5;                                                                         \
75         srl     %t1, shir, %t6;                                                                         \
76         sll     %t0, shil, %t0;                                                                         \
77         or      %t5, %prev, %t5;                                                                        \
78         sll     %t1, shil, %prev;                                                                       \
79         or      %t6, %t0, %t0;                                                                          \
80         srl     %t2, shir, %t1;                                                                         \
81         srl     %t3, shir, %t6;                                                                         \
82         sll     %t2, shil, %t2;                                                                         \
83         or      %t1, %prev, %t1;                                                                        \
84         std     %t4, [%dst + offset + offset2 - 0x04];                                                  \
85         std     %t0, [%dst + offset + offset2 + 0x04];                                                  \
86         sll     %t3, shil, %prev;                                                                       \
87         or      %t6, %t2, %t4;
89 #define SMOVE_ALIGNCHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, prev, shil, shir, offset2)       \
90         ldd     [%src + offset + 0x00], %t0;                                                            \
91         ldd     [%src + offset + 0x08], %t2;                                                            \
92         srl     %t0, shir, %t4;                                                                         \
93         srl     %t1, shir, %t5;                                                                         \
94         sll     %t0, shil, %t6;                                                                         \
95         or      %t4, %prev, %t0;                                                                        \
96         sll     %t1, shil, %prev;                                                                       \
97         or      %t5, %t6, %t1;                                                                          \
98         srl     %t2, shir, %t4;                                                                         \
99         srl     %t3, shir, %t5;                                                                         \
100         sll     %t2, shil, %t6;                                                                         \
101         or      %t4, %prev, %t2;                                                                        \
102         sll     %t3, shil, %prev;                                                                       \
103         or      %t5, %t6, %t3;                                                                          \
104         std     %t0, [%dst + offset + offset2 + 0x00];                                                  \
105         std     %t2, [%dst + offset + offset2 + 0x08];
107         .text
108         .align  4
110 ENTRY(memcpy)           /* %o0=dst %o1=src %o2=len */
111         sub             %o0, %o1, %o4
112         st              %o0, [%sp + 64]
113 9:      andcc           %o4, 3, %o5
114 0:      bne             86f
115          cmp            %o2, 15
117         bleu            90f
118          andcc          %o1, 3, %g0
120         be              78f
121          andcc          %o1, 4, %g0
123         andcc           %o1, 1, %g0
124         be              4f
125          andcc          %o1, 2, %g0
127         ldub            [%o1], %g2
128         add             %o1, 1, %o1
129         stb             %g2, [%o0]
130         sub             %o2, 1, %o2
131         bne             77f
132          add            %o0, 1, %o0
133 4:      lduh            [%o1], %g2
134         add             %o1, 2, %o1
135         sth             %g2, [%o0]
136         sub             %o2, 2, %o2
137         add             %o0, 2, %o0
139 77:     andcc           %o1, 4, %g0
140 78:     be              2f
141          mov            %o2, %g1
143         ld              [%o1], %o4
144         sub             %g1, 4, %g1
145         st              %o4, [%o0]
146         add             %o1, 4, %o1
147         add             %o0, 4, %o0
148 2:      andcc           %g1, 0xffffff80, %g6
149         be              3f
150          andcc          %o0, 4, %g0
152         be              82f + 4
153 5:      MOVE_BIGCHUNK(o1, o0, 0x00, o2, o3, o4, o5, g2, g3, g4, g5)
154         MOVE_BIGCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5)
155         MOVE_BIGCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5)
156         MOVE_BIGCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5)
157         subcc           %g6, 128, %g6
158         add             %o1, 128, %o1
159         bne             5b
160          add            %o0, 128, %o0
161 3:      andcc           %g1, 0x70, %g6
162         be              80f
163          andcc          %g1, 8, %g0
165         srl             %g6, 1, %o4
166         mov             %o7, %g2
167         add             %g6, %o4, %o4
168         add             %o1, %g6, %o1
169 104:    call            100f
170          add            %o0, %g6, %o0
171         jmpl            %o5 + (80f - 104b), %g0
172          mov            %g2, %o7
174 79:     MOVE_LASTCHUNK(o1, o0, 0x60, g2, g3, g4, g5)
175         MOVE_LASTCHUNK(o1, o0, 0x50, g2, g3, g4, g5)
176         MOVE_LASTCHUNK(o1, o0, 0x40, g2, g3, g4, g5)
177         MOVE_LASTCHUNK(o1, o0, 0x30, g2, g3, g4, g5)
178         MOVE_LASTCHUNK(o1, o0, 0x20, g2, g3, g4, g5)
179         MOVE_LASTCHUNK(o1, o0, 0x10, g2, g3, g4, g5)
180         MOVE_LASTCHUNK(o1, o0, 0x00, g2, g3, g4, g5)
182 80:     be              81f
183          andcc          %g1, 4, %g0
185         ldd             [%o1], %g2
186         add             %o0, 8, %o0
187         st              %g2, [%o0 - 0x08]
188         add             %o1, 8, %o1
189         st              %g3, [%o0 - 0x04]
191 81:     be              1f
192          andcc          %g1, 2, %g0
194         ld              [%o1], %g2
195         add             %o1, 4, %o1
196         st              %g2, [%o0]
197         add             %o0, 4, %o0
198 1:      be              1f
199          andcc          %g1, 1, %g0
201         lduh            [%o1], %g2
202         add             %o1, 2, %o1
203         sth             %g2, [%o0]
204         add             %o0, 2, %o0
205 1:      be              1f
206          nop
208         ldub            [%o1], %g2
209         stb             %g2, [%o0]
210 1:      retl
211          ld             [%sp + 64], %o0
213 82:     /* ldd_std */
214         MOVE_BIGALIGNCHUNK(o1, o0, 0x00, o2, o3, o4, o5, g2, g3, g4, g5)
215         MOVE_BIGALIGNCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5)
216         MOVE_BIGALIGNCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5)
217         MOVE_BIGALIGNCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5)
218         subcc           %g6, 128, %g6
219         add             %o1, 128, %o1
220         bne             82b
221          add            %o0, 128, %o0
223         andcc           %g1, 0x70, %g6
224         be              84f
225          andcc          %g1, 8, %g0
227         mov             %o7, %g2
228 111:    call            110f
229          add            %o1, %g6, %o1
230         mov             %g2, %o7
231         jmpl            %o5 + (84f - 111b), %g0
232          add            %o0, %g6, %o0
234 83:     MOVE_LASTALIGNCHUNK(o1, o0, 0x60, g2, g3, g4, g5)
235         MOVE_LASTALIGNCHUNK(o1, o0, 0x50, g2, g3, g4, g5)
236         MOVE_LASTALIGNCHUNK(o1, o0, 0x40, g2, g3, g4, g5)
237         MOVE_LASTALIGNCHUNK(o1, o0, 0x30, g2, g3, g4, g5)
238         MOVE_LASTALIGNCHUNK(o1, o0, 0x20, g2, g3, g4, g5)
239         MOVE_LASTALIGNCHUNK(o1, o0, 0x10, g2, g3, g4, g5)
240         MOVE_LASTALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5)
242 84:     be              85f
243          andcc          %g1, 4, %g0
245         ldd             [%o1], %g2
246         add             %o0, 8, %o0
247         std             %g2, [%o0 - 0x08]
248         add             %o1, 8, %o1
249 85:     be              1f
250          andcc          %g1, 2, %g0
252         ld              [%o1], %g2
253         add             %o1, 4, %o1
254         st              %g2, [%o0]
255         add             %o0, 4, %o0
256 1:      be              1f
257          andcc          %g1, 1, %g0
259         lduh            [%o1], %g2
260         add             %o1, 2, %o1
261         sth             %g2, [%o0]
262         add             %o0, 2, %o0
263 1:      be              1f
264          nop
266         ldub            [%o1], %g2
267         stb             %g2, [%o0]
268 1:      retl
269          ld             [%sp + 64], %o0
271 86:     cmp             %o2, 6
272         bleu            88f
274          cmp            %o2, 256
275         bcc             87f
277          andcc          %o0, 3, %g0
278         be              61f
279          andcc          %o0, 1, %g0
280         be              60f
281          andcc          %o0, 2, %g0
283         ldub            [%o1], %g5
284         add             %o1, 1, %o1
285         stb             %g5, [%o0]
286         sub             %o2, 1, %o2
287         bne             61f
288          add            %o0, 1, %o0
289 60:     ldub            [%o1], %g3
290         add             %o1, 2, %o1
291         stb             %g3, [%o0]
292         sub             %o2, 2, %o2
293         ldub            [%o1 - 1], %g3
294         add             %o0, 2, %o0
295         stb             %g3, [%o0 - 1]
296 61:     and             %o1, 3, %g2
297         and             %o2, 0xc, %g3
298         and             %o1, -4, %o1
299         cmp             %g3, 4
300         sll             %g2, 3, %g4
301         mov             32, %g2
302         be              4f
303          sub            %g2, %g4, %g6
304         
305         blu             3f
306          cmp            %g3, 0x8
308         be              2f
309          srl            %o2, 2, %g3
311         ld              [%o1], %o3
312         add             %o0, -8, %o0
313         ld              [%o1 + 4], %o4
314         b               8f
315          add            %g3, 1, %g3
316 2:      ld              [%o1], %o4
317         add             %o0, -12, %o0
318         ld              [%o1 + 4], %o5
319         add             %g3, 2, %g3
320         b               9f
321          add            %o1, -4, %o1
322 3:      ld              [%o1], %g1
323         add             %o0, -4, %o0
324         ld              [%o1 + 4], %o3
325         srl             %o2, 2, %g3
326         b               7f
327          add            %o1, 4, %o1
328 4:      ld              [%o1], %o5
329         cmp             %o2, 7
330         ld              [%o1 + 4], %g1
331         srl             %o2, 2, %g3
332         bleu            10f
333          add            %o1, 8, %o1
335         ld              [%o1], %o3
336         add             %g3, -1, %g3
337 5:      sll             %o5, %g4, %g2
338         srl             %g1, %g6, %g5
339         or              %g2, %g5, %g2
340         st              %g2, [%o0]
341 7:      ld              [%o1 + 4], %o4
342         sll             %g1, %g4, %g2
343         srl             %o3, %g6, %g5
344         or              %g2, %g5, %g2
345         st              %g2, [%o0 + 4]
346 8:      ld              [%o1 + 8], %o5
347         sll             %o3, %g4, %g2
348         srl             %o4, %g6, %g5
349         or              %g2, %g5, %g2
350         st              %g2, [%o0 + 8]
351 9:      ld              [%o1 + 12], %g1
352         sll             %o4, %g4, %g2
353         srl             %o5, %g6, %g5
354         addcc           %g3, -4, %g3
355         or              %g2, %g5, %g2
356         add             %o1, 16, %o1
357         st              %g2, [%o0 + 12]
358         add             %o0, 16, %o0
359         bne,a           5b
360          ld             [%o1], %o3
361 10:     sll             %o5, %g4, %g2
362         srl             %g1, %g6, %g5
363         srl             %g6, 3, %g3
364         or              %g2, %g5, %g2
365         sub             %o1, %g3, %o1
366         andcc           %o2, 2, %g0
367         st              %g2, [%o0]
368         be              1f
369          andcc          %o2, 1, %g0
371         ldub            [%o1], %g2
372         add             %o1, 2, %o1
373         stb             %g2, [%o0 + 4]
374         add             %o0, 2, %o0
375         ldub            [%o1 - 1], %g2
376         stb             %g2, [%o0 + 3]
377 1:      be              1f
378          nop
379         ldub            [%o1], %g2
380         stb             %g2, [%o0 + 4]
381 1:      retl
382          ld             [%sp + 64], %o0
384 87:     andcc           %o1, 3, %g0
385         be              3f
386          andcc          %o1, 1, %g0
388         be              4f
389          andcc          %o1, 2, %g0
391         ldub            [%o1], %g2
392         add             %o1, 1, %o1
393         stb             %g2, [%o0]
394         sub             %o2, 1, %o2
395         bne             3f
396          add            %o0, 1, %o0
397 4:      lduh            [%o1], %g2
398         add             %o1, 2, %o1
399         srl             %g2, 8, %g3
400         sub             %o2, 2, %o2
401         stb             %g3, [%o0]
402         add             %o0, 2, %o0
403         stb             %g2, [%o0 - 1]
404 3:       andcc          %o1, 4, %g0
406         bne             2f
407          cmp            %o5, 1
409         ld              [%o1], %o4
410         srl             %o4, 24, %g2
411         stb             %g2, [%o0]
412         srl             %o4, 16, %g3
413         stb             %g3, [%o0 + 1]
414         srl             %o4, 8, %g2
415         stb             %g2, [%o0 + 2]
416         sub             %o2, 4, %o2
417         stb             %o4, [%o0 + 3]
418         add             %o1, 4, %o1
419         add             %o0, 4, %o0
420 2:      be              33f
421          cmp            %o5, 2
422         be              32f
423          sub            %o2, 4, %o2
424 31:     ld              [%o1], %g2
425         add             %o1, 4, %o1
426         srl             %g2, 24, %g3
427         and             %o0, 7, %g5
428         stb             %g3, [%o0]
429         cmp             %g5, 7
430         sll             %g2, 8, %g1
431         add             %o0, 4, %o0
432         be              41f
433          and            %o2, 0xffffffc0, %o3
434         ld              [%o0 - 7], %o4
435 4:      SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
436         SMOVE_CHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
437         SMOVE_CHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
438         SMOVE_CHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
439         subcc           %o3, 64, %o3
440         add             %o1, 64, %o1
441         bne             4b
442          add            %o0, 64, %o0
444         andcc           %o2, 0x30, %o3
445         be,a            1f
446          srl            %g1, 16, %g2
447 4:      SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
448         subcc           %o3, 16, %o3
449         add             %o1, 16, %o1
450         bne             4b
451          add            %o0, 16, %o0
453         srl             %g1, 16, %g2
454 1:      st              %o4, [%o0 - 7]
455         sth             %g2, [%o0 - 3]
456         srl             %g1, 8, %g4
457         b               88f
458          stb            %g4, [%o0 - 1]
459 32:     ld              [%o1], %g2
460         add             %o1, 4, %o1
461         srl             %g2, 16, %g3
462         and             %o0, 7, %g5
463         sth             %g3, [%o0]
464         cmp             %g5, 6
465         sll             %g2, 16, %g1
466         add             %o0, 4, %o0
467         be              42f
468          and            %o2, 0xffffffc0, %o3
469         ld              [%o0 - 6], %o4
470 4:      SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
471         SMOVE_CHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
472         SMOVE_CHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
473         SMOVE_CHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
474         subcc           %o3, 64, %o3
475         add             %o1, 64, %o1
476         bne             4b
477          add            %o0, 64, %o0
479         andcc           %o2, 0x30, %o3
480         be,a            1f
481          srl            %g1, 16, %g2
482 4:      SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
483         subcc           %o3, 16, %o3
484         add             %o1, 16, %o1
485         bne             4b
486          add            %o0, 16, %o0
488         srl             %g1, 16, %g2
489 1:      st              %o4, [%o0 - 6]
490         b               88f
491          sth            %g2, [%o0 - 2]
492 33:     ld              [%o1], %g2
493         sub             %o2, 4, %o2
494         srl             %g2, 24, %g3
495         and             %o0, 7, %g5
496         stb             %g3, [%o0]
497         cmp             %g5, 5
498         srl             %g2, 8, %g4
499         sll             %g2, 24, %g1
500         sth             %g4, [%o0 + 1]
501         add             %o1, 4, %o1
502         be              43f
503          and            %o2, 0xffffffc0, %o3
505         ld              [%o0 - 1], %o4
506         add             %o0, 4, %o0
507 4:      SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, -1)
508         SMOVE_CHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, -1)
509         SMOVE_CHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, -1)
510         SMOVE_CHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, -1)
511         subcc           %o3, 64, %o3
512         add             %o1, 64, %o1
513         bne             4b
514          add            %o0, 64, %o0
516         andcc           %o2, 0x30, %o3
517         be,a            1f
518          srl            %g1, 24, %g2
519 4:      SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, -1)
520         subcc           %o3, 16, %o3
521         add             %o1, 16, %o1
522         bne             4b
523          add            %o0, 16, %o0
525         srl             %g1, 24, %g2
526 1:      st              %o4, [%o0 - 5]
527         b               88f
528          stb            %g2, [%o0 - 1]
529 41:     SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
530         SMOVE_ALIGNCHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
531         SMOVE_ALIGNCHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
532         SMOVE_ALIGNCHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
533         subcc           %o3, 64, %o3
534         add             %o1, 64, %o1
535         bne             41b
536          add            %o0, 64, %o0
537          
538         andcc           %o2, 0x30, %o3
539         be,a            1f
540          srl            %g1, 16, %g2
541 4:      SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
542         subcc           %o3, 16, %o3
543         add             %o1, 16, %o1
544         bne             4b
545          add            %o0, 16, %o0
547         srl             %g1, 16, %g2
548 1:      sth             %g2, [%o0 - 3]
549         srl             %g1, 8, %g4
550         b               88f
551          stb            %g4, [%o0 - 1]
552 43:     SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, 3)
553         SMOVE_ALIGNCHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, 3)
554         SMOVE_ALIGNCHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, 3)
555         SMOVE_ALIGNCHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, 3)
556         subcc           %o3, 64, %o3
557         add             %o1, 64, %o1
558         bne             43b
559          add            %o0, 64, %o0
561         andcc           %o2, 0x30, %o3
562         be,a            1f
563          srl            %g1, 24, %g2
564 4:      SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, 3)
565         subcc           %o3, 16, %o3
566         add             %o1, 16, %o1
567         bne             4b
568          add            %o0, 16, %o0
570         srl             %g1, 24, %g2
571 1:      stb             %g2, [%o0 + 3]
572         b               88f
573          add            %o0, 4, %o0
574 42:     SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
575         SMOVE_ALIGNCHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
576         SMOVE_ALIGNCHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
577         SMOVE_ALIGNCHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
578         subcc           %o3, 64, %o3
579         add             %o1, 64, %o1
580         bne             42b
581          add            %o0, 64, %o0
582          
583         andcc           %o2, 0x30, %o3
584         be,a            1f
585          srl            %g1, 16, %g2
586 4:      SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
587         subcc           %o3, 16, %o3
588         add             %o1, 16, %o1
589         bne             4b
590          add            %o0, 16, %o0
592         srl             %g1, 16, %g2
593 1:      sth             %g2, [%o0 - 2]
595         /* Fall through */
596          
597 88:     and             %o2, 0xe, %o3
598         mov             %o7, %g2
599         sll             %o3, 3, %o4
600         add             %o0, %o3, %o0
601 106:    call            100f
602          add            %o1, %o3, %o1
603         mov             %g2, %o7
604         jmpl            %o5 + (89f - 106b), %g0
605          andcc          %o2, 1, %g0
607         MOVE_SHORTCHUNK(o1, o0, 0x0c, g2, g3)
608         MOVE_SHORTCHUNK(o1, o0, 0x0a, g2, g3)
609         MOVE_SHORTCHUNK(o1, o0, 0x08, g2, g3)
610         MOVE_SHORTCHUNK(o1, o0, 0x06, g2, g3)
611         MOVE_SHORTCHUNK(o1, o0, 0x04, g2, g3)
612         MOVE_SHORTCHUNK(o1, o0, 0x02, g2, g3)
613         MOVE_SHORTCHUNK(o1, o0, 0x00, g2, g3)
615 89:     be              1f
616          nop
618         ldub            [%o1], %g2
619         stb             %g2, [%o0]
620 1:      retl
621          ld             [%sp + 64], %o0
623 90:     bne             88b
624          andcc          %o2, 8, %g0
626         be              1f
627          andcc          %o2, 4, %g0
629         ld              [%o1 + 0x00], %g2
630         ld              [%o1 + 0x04], %g3
631         add             %o1, 8, %o1
632         st              %g2, [%o0 + 0x00]
633         st              %g3, [%o0 + 0x04]
634         add             %o0, 8, %o0
635 1:      b               81b
636          mov            %o2, %g1
638 100:    retl
639          sub            %o7, %o4, %o5
640 110:    retl
641          sub            %o7, %g6, %o5
642 END(memcpy)
644 libc_hidden_builtin_def (memcpy)