- pre3:
[davej-history.git] / arch / arm / lib / memcpy.S
blob87c13f5d8f10b91edd4259b1be68336684fcb627
1 /*
2  * linux/arch/arm/lib/memcpy.S
3  *
4  * Copyright (C) 1995-1999 Russell King
5  *
6  * ASM optimised string functions
7  */
8 #include <linux/linkage.h>
9 #include <asm/assembler.h>
10 #include "constants.h"
12                 .text
14 #define ENTER   \
15                 mov     ip,sp   ;\
16                 stmfd   sp!,{r4-r9,fp,ip,lr,pc} ;\
17                 sub     fp,ip,#4
19 #define EXIT    \
20                 LOADREGS(ea, fp, {r4 - r9, fp, sp, pc})
22 #define EXITEQ  \
23                 LOADREGS(eqea, fp, {r4 - r9, fp, sp, pc})
26  * Prototype: void memcpy(void *to,const void *from,unsigned long n);
27  * ARM3: cant use memcopy here!!!
28  */
29 ENTRY(memcpy)
30 ENTRY(memmove)
31                 ENTER
32                 cmp     r1, r0
33                 bcc     19f
34                 subs    r2, r2, #4
35                 blt     6f
36                 ands    ip, r0, #3
37                 bne     7f
38                 ands    ip, r1, #3
39                 bne     8f
41 1:              subs    r2, r2, #8
42                 blt     5f
43                 subs    r2, r2, #0x14
44                 blt     3f
45 2:              ldmia   r1!,{r3 - r9, ip}
46                 stmia   r0!,{r3 - r9, ip}
47                 subs    r2, r2, #32
48                 bge     2b
49                 cmn     r2, #16
50                 ldmgeia r1!, {r3 - r6}
51                 stmgeia r0!, {r3 - r6}
52                 subge   r2, r2, #0x10
53 3:              adds    r2, r2, #0x14
54 4:              ldmgeia r1!, {r3 - r5}
55                 stmgeia r0!, {r3 - r5}
56                 subges  r2, r2, #12
57                 bge     4b
58 5:              adds    r2, r2, #8
59                 blt     6f
60                 subs    r2, r2, #4
61                 ldrlt   r3, [r1], #4
62                 ldmgeia r1!, {r4, r5}
63                 strlt   r3, [r0], #4
64                 stmgeia r0!, {r4, r5}
65                 subge   r2, r2, #4
67 6:              adds    r2, r2, #4
68                 EXITEQ
69                 cmp     r2, #2
70                 ldrb    r3, [r1], #1
71                 ldrgeb  r4, [r1], #1
72                 ldrgtb  r5, [r1], #1
73                 strb    r3, [r0], #1
74                 strgeb  r4, [r0], #1
75                 strgtb  r5, [r0], #1
76                 EXIT
78 7:              rsb     ip, ip, #4
79                 cmp     ip, #2
80                 ldrb    r3, [r1], #1
81                 ldrgeb  r4, [r1], #1
82                 ldrgtb  r5, [r1], #1
83                 strb    r3, [r0], #1
84                 strgeb  r4, [r0], #1
85                 strgtb  r5, [r0], #1
86                 subs    r2, r2, ip
87                 blt     6b
88                 ands    ip, r1, #3
89                 beq     1b
91 8:              bic     r1, r1, #3
92                 ldr     r7, [r1], #4
93                 cmp     ip, #2
94                 bgt     15f
95                 beq     11f
96                 cmp     r2, #12
97                 blt     10f
98                 sub     r2, r2, #12
99 9:              mov     r3, r7, lsr #8
100                 ldmia   r1!, {r4 - r7}
101                 orr     r3, r3, r4, lsl #24
102                 mov     r4, r4, lsr #8
103                 orr     r4, r4, r5, lsl #24
104                 mov     r5, r5, lsr #8
105                 orr     r5, r5, r6, lsl #24
106                 mov     r6, r6, lsr #8
107                 orr     r6, r6, r7, lsl #24
108                 stmia   r0!, {r3 - r6}
109                 subs    r2, r2, #16
110                 bge     9b
111                 adds    r2, r2, #12
112                 blt     100f
113 10:             mov     r3, r7, lsr #8
114                 ldr     r7, [r1], #4
115                 subs    r2, r2, #4
116                 orr     r3, r3, r7, lsl #24
117                 str     r3, [r0], #4
118                 bge     10b
119 100:            sub     r1, r1, #3
120                 b       6b
122 11:             cmp     r2, #12
123                 blt     13f             /* */
124                 sub     r2, r2, #12
125 12:             mov     r3, r7, lsr #16
126                 ldmia   r1!, {r4 - r7}
127                 orr     r3, r3, r4, lsl #16
128                 mov     r4, r4, lsr #16
129                 orr     r4, r4, r5, lsl #16
130                 mov     r5, r5, lsr #16
131                 orr     r5, r5, r6, lsl #16
132                 mov     r6, r6, lsr #16
133                 orr     r6, r6, r7,LSL#16
134                 stmia   r0!, {r3 - r6}
135                 subs    r2, r2, #16
136                 bge     12b
137                 adds    r2, r2, #12
138                 blt     14f
139 13:             mov     r3, r7, lsr #16
140                 ldr     r7, [r1], #4
141                 subs    r2, r2, #4
142                 orr     r3, r3, r7, lsl #16
143                 str     r3, [r0], #4
144                 bge     13b
145 14:             sub     r1, r1, #2
146                 b       6b
148 15:             cmp     r2, #12
149                 blt     17f
150                 sub     r2, r2, #12
151 16:             mov     r3, r7, lsr #24
152                 ldmia   r1!,{r4 - r7}
153                 orr     r3, r3, r4, lsl #8
154                 mov     r4, r4, lsr #24
155                 orr     r4, r4, r5, lsl #8
156                 mov     r5, r5, lsr #24
157                 orr     r5, r5, r6, lsl #8
158                 mov     r6, r6, lsr #24
159                 orr     r6, r6, r7, lsl #8
160                 stmia   r0!, {r3 - r6}
161                 subs    r2, r2, #16
162                 bge     16b
163                 adds    r2, r2, #12
164                 blt     18f
165 17:             mov     r3, r7, lsr #24
166                 ldr     r7, [r1], #4
167                 subs    r2, r2, #4
168                 orr     r3, r3, r7, lsl#8
169                 str     r3, [r0], #4
170                 bge     17b
171 18:             sub     r1, r1, #1
172                 b       6b
175 19:             add     r1, r1, r2
176                 add     r0, r0, r2
177                 subs    r2, r2, #4
178                 blt     24f
179                 ands    ip, r0, #3
180                 bne     25f
181                 ands    ip, r1, #3
182                 bne     26f
184 20:             subs    r2, r2, #8
185                 blt     23f
186                 subs    r2, r2, #0x14
187                 blt     22f
188 21:             ldmdb   r1!, {r3 - r9, ip}
189                 stmdb   r0!, {r3 - r9, ip}
190                 subs    r2, r2, #32
191                 bge     21b
192 22:             cmn     r2, #16
193                 ldmgedb r1!, {r3 - r6}
194                 stmgedb r0!, {r3 - r6}
195                 subge   r2, r2, #16
196                 adds    r2, r2, #20
197                 ldmgedb r1!, {r3 - r5}
198                 stmgedb r0!, {r3 - r5}
199                 subge   r2, r2, #12
200 23:             adds    r2, r2, #8
201                 blt     24f
202                 subs    r2, r2, #4
203                 ldrlt   r3, [r1, #-4]!
204                 ldmgedb r1!, {r4, r5}
205                 strlt   r3, [r0, #-4]!
206                 stmgedb r0!, {r4, r5}
207                 subge   r2, r2, #4
209 24:             adds    r2, r2, #4
210                 EXITEQ
211                 cmp     r2, #2
212                 ldrb    r3, [r1, #-1]!
213                 ldrgeb  r4, [r1, #-1]!
214                 ldrgtb  r5, [r1, #-1]!
215                 strb    r3, [r0, #-1]!
216                 strgeb  r4, [r0, #-1]!
217                 strgtb  r5, [r0, #-1]!
218                 EXIT
220 25:             cmp     ip, #2
221                 ldrb    r3, [r1, #-1]!
222                 ldrgeb  r4, [r1, #-1]!
223                 ldrgtb  r5, [r1, #-1]!
224                 strb    r3, [r0, #-1]!
225                 strgeb  r4, [r0, #-1]!
226                 strgtb  r5, [r0, #-1]!
227                 subs    r2, r2, ip
228                 blt     24b
229                 ands    ip, r1, #3
230                 beq     20b
232 26:             bic     r1, r1, #3
233                 ldr     r3, [r1], #0
234                 cmp     ip, #2
235                 blt     34f
236                 beq     30f
237                 cmp     r2, #12
238                 blt     28f
239                 sub     r2, r2, #12
240 27:             mov     r7, r3, lsl #8
241                 ldmdb   r1!, {r3, r4, r5, r6}
242                 orr     r7, r7, r6, lsr #24
243                 mov     r6, r6, lsl #8
244                 orr     r6, r6, r5, lsr #24
245                 mov     r5, r5, lsl #8
246                 orr     r5, r5, r4, lsr #24
247                 mov     r4, r4, lsl #8
248                 orr     r4, r4, r3, lsr #24
249                 stmdb   r0!, {r4, r5, r6, r7}
250                 subs    r2, r2, #16
251                 bge     27b
252                 adds    r2, r2, #12
253                 blt     29f
254 28:             mov     ip, r3, lsl #8
255                 ldr     r3, [r1, #-4]!
256                 subs    r2, r2, #4
257                 orr     ip, ip, r3, lsr #24
258                 str     ip, [r0, #-4]!
259                 bge     28b
260 29:             add     r1, r1, #3
261                 b       24b
263 30:             cmp     r2, #12
264                 blt     32f
265                 sub     r2, r2, #12
266 31:             mov     r7, r3, lsl #16
267                 ldmdb   r1!, {r3, r4, r5, r6}
268                 orr     r7, r7, r6, lsr #16
269                 mov     r6, r6, lsl #16
270                 orr     r6, r6, r5, lsr #16
271                 mov     r5, r5, lsl #16
272                 orr     r5, r5, r4, lsr #16
273                 mov     r4, r4, lsl #16
274                 orr     r4, r4, r3, lsr #16
275                 stmdb   r0!, {r4, r5, r6, r7}
276                 subs    r2, r2, #16
277                 bge     31b
278                 adds    r2, r2, #12
279                 blt     33f
280 32:             mov     ip, r3, lsl #16
281                 ldr     r3, [r1, #-4]!
282                 subs    r2, r2, #4
283                 orr     ip, ip, r3, lsr #16
284                 str     ip, [r0, #-4]!
285                 bge     32b
286 33:             add     r1, r1, #2
287                 b       24b
289 34:             cmp     r2, #12
290                 blt     36f
291                 sub     r2, r2, #12
292 35:             mov     r7, r3, lsl #24
293                 ldmdb   r1!, {r3, r4, r5, r6}
294                 orr     r7, r7, r6, lsr #8
295                 mov     r6, r6, lsl #24
296                 orr     r6, r6, r5, lsr #8
297                 mov     r5, r5, lsl #24
298                 orr     r5, r5, r4, lsr #8
299                 mov     r4, r4, lsl #24
300                 orr     r4, r4, r3, lsr #8
301                 stmdb   r0!, {r4, r5, r6, r7}
302                 subs    r2, r2, #16
303                 bge     35b
304                 adds    r2, r2, #12
305                 blt     37f
306 36:             mov     ip, r3, lsl #24
307                 ldr     r3, [r1, #-4]!
308                 subs    r2, r2, #4
309                 orr     ip, ip, r3, lsr #8
310                 str     ip, [r0, #-4]!
311                 bge     36b
312 37:             add     r1, r1, #1
313                 b       24b
315                 .align