Update to LGPL v2.1.
[jlayton/glibc.git] / sysdeps / sh / memcpy.S
1 /* Copyright (C) 1999, 2000 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, write to the Free
16    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
17    02111-1307 USA.  */
18
19 #include <sysdep.h>
20 #include <endian.h>
21
22 /*
23  * void *memcpy(void *dst, const void *src, size_t n);
24  * No overlap between the memory of DST and of SRC are assumed.
25  */
26
27 ENTRY(memcpy)
28         tst     r6,r6
29         bt/s    1f
30         mov     r4,r0
31         mov     #12,r1
32         cmp/gt  r6,r1
33         bf      2f
34 0:
35         mov.b   @r5+,r1
36         dt      r6
37         mov.b   r1,@r4
38         bf/s    0b
39         add     #1,r4
40 1:
41         rts
42         nop
43 2:      
44         mov.l   r8,@-r15
45         mov.l   r9,@-r15
46         mov     r6,r2
47         mov.l   r10,@-r15
48         mov.l   r11,@-r15
49         mov.l   r14,@-r15
50         mov     r4,r11
51         mov     r15,r14
52         mov     r5,r0
53         and     #1,r0
54         tst     r0,r0
55         bt/s    .L42
56         mov     r5,r0
57         mov.b   @r5+,r1
58         add     #-1,r2
59         add     #1,r4
60         mov.b   r1,@r11
61         mov     r5,r0
62 .L42:
63         and     #2,r0
64         tst     r0,r0
65         bt/s    .L43
66         mov     r4,r0
67         mov.b   @r5+,r1
68         mov.b   r1,@r4
69         mov.b   @r5+,r1
70         add     #1,r4
71         add     #-2,r2
72         mov.b   r1,@r4
73         add     #1,r4
74         mov     r4,r0
75 .L43:
76         and     #1,r0
77         tst     r0,r0
78         bf/s    .L38
79         mov     r4,r0
80         and     #2,r0
81         tst     r0,r0
82         bf/s    .L7
83         mov     r2,r0
84         shlr2   r0
85         and     #3,r0
86         cmp/eq  #2,r0
87         bt/s    .L10
88         mov     #2,r1
89         cmp/gt  r1,r0
90         bt/s    .L14
91         cmp/eq  #3,r0
92         cmp/eq  #1,r0
93         bt/s    .L11
94         mov     r0,r1
95         bra     .L44
96         shll2   r1
97         .align 5
98 .L14:
99         bf      .L8
100         mov.l   @(8,r5),r1
101         mov.l   r1,@(8,r4)
102 .L10:
103         mov.l   @(4,r5),r1
104         mov.l   r1,@(4,r4)
105 .L11:
106         mov.l   @r5,r1
107         mov.l   r1,@r4
108 .L8:
109         mov     r0,r1
110         shll2   r1
111 .L44:
112         add     r1,r4
113         add     r1,r5
114         mov     r2,r0
115         mov     #-4,r1
116         shad    r1,r0
117         mov     #3,r6
118         bra     .L37
119         and     r2,r6
120         .align 5
121 .L18:
122         mov.l   @r5+,r1
123         mov.l   @r5+,r2
124         mov.l   @r5+,r3
125         mov.l   @r5+,r7
126         mov.l   r1,@r4
127         mov.l   r2,@(4,r4)
128         mov.l   r3,@(8,r4)
129         mov.l   r7,@(12,r4)
130         add     #16,r4
131 .L37:
132         cmp/pl  r0
133         bt/s    .L18
134         add     #-1,r0
135         mov     r6,r2
136 .L38:
137         bra     .L40
138         mov     r2,r0
139         .align 5
140 .L7:
141         shar    r0
142         and     #3,r0
143         cmp/eq  #2,r0
144         bt/s    .L23
145         mov     #2,r1
146         cmp/gt  r1,r0
147         bt/s    .L27
148         cmp/eq  #3,r0
149         cmp/eq  #1,r0
150         bt/s    .L24
151         mov     r0,r1
152         bra     .L45
153         add     r0,r1
154         .align 5
155 .L27:
156         bf      .L21
157         add     #4,r5
158         mov.w   @r5,r1
159         add     #4,r4
160         mov.w   r1,@r4
161         add     #-4,r5
162         add     #-4,r4
163 .L23:
164         add     #2,r5
165         mov.w   @r5,r1
166         add     #2,r4
167         mov.w   r1,@r4
168         add     #-2,r5
169         add     #-2,r4
170 .L24:
171         mov.w   @r5,r1
172         mov.w   r1,@r4
173 .L21:
174         mov     r0,r1
175         add     r0,r1
176 .L45:
177         add     r1,r4
178         add     r1,r5
179         mov     r2,r0
180         mov     #-3,r1
181         shad    r1,r0
182         mov     #1,r10
183         mov     r0,r1
184         and     r2,r10
185         cmp/pl  r1
186         bf/s    .L29
187         add     #-1,r0
188         mov     r4,r9
189         mov     r4,r8
190         add     #4,r9
191         mov     r4,r6
192         add     #6,r8
193         add     #2,r6
194 .L31:
195         mov.w   @r5+,r1
196         mov.w   @r5+,r2
197         mov.w   @r5+,r3
198         mov.w   @r5+,r7
199         mov.w   r1,@r4
200         mov.w   r2,@r6
201         add     #8,r4
202         mov     r0,r1
203         add     #8,r6
204         mov.w   r3,@r9
205         add     #-1,r0
206         add     #8,r9
207         mov.w   r7,@r8
208         cmp/pl  r1
209         bt/s    .L31
210         add     #8,r8
211 .L29:
212         mov     r10,r2
213         mov     r2,r0
214 .L40:
215         cmp/pl  r0
216         bf      .L34
217 .L35:
218         mov.b   @r5+,r1
219         dt      r2
220         mov.b   r1,@r4
221         bf/s    .L35
222         add     #1,r4
223 .L34:
224         mov     r11,r0
225         mov     r14,r15
226         mov.l   @r15+,r14
227         mov.l   @r15+,r11
228         mov.l   @r15+,r10
229         mov.l   @r15+,r9
230         rts     
231         mov.l   @r15+,r8