memcpy_xscale.S revision 1.6 1 1.6 mlelstv /* $NetBSD: memcpy_xscale.S,v 1.6 2023/01/19 18:03:03 mlelstv Exp $ */
2 1.1 christos
3 1.1 christos /*
4 1.1 christos * Copyright 2003 Wasabi Systems, Inc.
5 1.1 christos * All rights reserved.
6 1.1 christos *
7 1.1 christos * Written by Steve C. Woodford for Wasabi Systems, Inc.
8 1.1 christos *
9 1.1 christos * Redistribution and use in source and binary forms, with or without
10 1.1 christos * modification, are permitted provided that the following conditions
11 1.1 christos * are met:
12 1.1 christos * 1. Redistributions of source code must retain the above copyright
13 1.1 christos * notice, this list of conditions and the following disclaimer.
14 1.1 christos * 2. Redistributions in binary form must reproduce the above copyright
15 1.1 christos * notice, this list of conditions and the following disclaimer in the
16 1.1 christos * documentation and/or other materials provided with the distribution.
17 1.1 christos * 3. All advertising materials mentioning features or use of this software
18 1.1 christos * must display the following acknowledgement:
19 1.1 christos * This product includes software developed for the NetBSD Project by
20 1.1 christos * Wasabi Systems, Inc.
21 1.1 christos * 4. The name of Wasabi Systems, Inc. may not be used to endorse
22 1.1 christos * or promote products derived from this software without specific prior
23 1.1 christos * written permission.
24 1.1 christos *
25 1.1 christos * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
26 1.1 christos * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
27 1.1 christos * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 1.1 christos * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC
29 1.1 christos * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30 1.1 christos * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31 1.1 christos * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32 1.1 christos * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33 1.1 christos * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34 1.1 christos * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35 1.1 christos * POSSIBILITY OF SUCH DAMAGE.
36 1.1 christos */
37 1.1 christos
38 1.1 christos #include <machine/asm.h>
39 1.1 christos
40 1.1 christos /* LINTSTUB: Func: void *memcpy(void *dst, const void *src, size_t len) */
41 1.1 christos ENTRY(memcpy)
42 1.1 christos pld [r1]
43 1.1 christos cmp r2, #0x0c
44 1.6 mlelstv bls .Lmemcpy_short /* <= 12 bytes */
45 1.1 christos mov r3, r0 /* We must not clobber r0 */
46 1.1 christos
47 1.1 christos /* Word-align the destination buffer */
48 1.1 christos ands ip, r3, #0x03 /* Already word aligned? */
49 1.1 christos beq .Lmemcpy_wordaligned /* Yup */
50 1.1 christos cmp ip, #0x02
51 1.1 christos ldrb ip, [r1], #0x01
52 1.1 christos sub r2, r2, #0x01
53 1.1 christos strb ip, [r3], #0x01
54 1.6 mlelstv ldrbls ip, [r1], #0x01
55 1.6 mlelstv subls r2, r2, #0x01
56 1.6 mlelstv strbls ip, [r3], #0x01
57 1.6 mlelstv ldrblo ip, [r1], #0x01
58 1.6 mlelstv sublo r2, r2, #0x01
59 1.6 mlelstv strblo ip, [r3], #0x01
60 1.1 christos
61 1.1 christos /* Destination buffer is now word aligned */
62 1.1 christos .Lmemcpy_wordaligned:
63 1.1 christos ands ip, r1, #0x03 /* Is src also word-aligned? */
64 1.1 christos bne .Lmemcpy_bad_align /* Nope. Things just got bad */
65 1.1 christos
66 1.1 christos /* Quad-align the destination buffer */
67 1.1 christos tst r3, #0x07 /* Already quad aligned? */
68 1.1 christos ldrne ip, [r1], #0x04
69 1.3 matt push {r4-r9} /* Free up some registers */
70 1.1 christos subne r2, r2, #0x04
71 1.1 christos strne ip, [r3], #0x04
72 1.1 christos
73 1.1 christos /* Destination buffer quad aligned, source is at least word aligned */
74 1.1 christos subs r2, r2, #0x80
75 1.6 mlelstv blo .Lmemcpy_w_lessthan128
76 1.1 christos
77 1.1 christos /* Copy 128 bytes at a time */
78 1.1 christos .Lmemcpy_w_loop128:
79 1.1 christos ldr r4, [r1], #0x04 /* LD:00-03 */
80 1.1 christos ldr r5, [r1], #0x04 /* LD:04-07 */
81 1.1 christos pld [r1, #0x18] /* Prefetch 0x20 */
82 1.1 christos ldr r6, [r1], #0x04 /* LD:08-0b */
83 1.1 christos ldr r7, [r1], #0x04 /* LD:0c-0f */
84 1.1 christos ldr r8, [r1], #0x04 /* LD:10-13 */
85 1.1 christos ldr r9, [r1], #0x04 /* LD:14-17 */
86 1.5 joerg strd r4, r5, [r3], #0x08 /* ST:00-07 */
87 1.1 christos ldr r4, [r1], #0x04 /* LD:18-1b */
88 1.1 christos ldr r5, [r1], #0x04 /* LD:1c-1f */
89 1.5 joerg strd r6, r7, [r3], #0x08 /* ST:08-0f */
90 1.1 christos ldr r6, [r1], #0x04 /* LD:20-23 */
91 1.1 christos ldr r7, [r1], #0x04 /* LD:24-27 */
92 1.1 christos pld [r1, #0x18] /* Prefetch 0x40 */
93 1.5 joerg strd r8, r9, [r3], #0x08 /* ST:10-17 */
94 1.1 christos ldr r8, [r1], #0x04 /* LD:28-2b */
95 1.1 christos ldr r9, [r1], #0x04 /* LD:2c-2f */
96 1.5 joerg strd r4, r5, [r3], #0x08 /* ST:18-1f */
97 1.1 christos ldr r4, [r1], #0x04 /* LD:30-33 */
98 1.1 christos ldr r5, [r1], #0x04 /* LD:34-37 */
99 1.5 joerg strd r6, r7, [r3], #0x08 /* ST:20-27 */
100 1.1 christos ldr r6, [r1], #0x04 /* LD:38-3b */
101 1.1 christos ldr r7, [r1], #0x04 /* LD:3c-3f */
102 1.5 joerg strd r8, r9, [r3], #0x08 /* ST:28-2f */
103 1.1 christos ldr r8, [r1], #0x04 /* LD:40-43 */
104 1.1 christos ldr r9, [r1], #0x04 /* LD:44-47 */
105 1.1 christos pld [r1, #0x18] /* Prefetch 0x60 */
106 1.5 joerg strd r4, r5, [r3], #0x08 /* ST:30-37 */
107 1.1 christos ldr r4, [r1], #0x04 /* LD:48-4b */
108 1.1 christos ldr r5, [r1], #0x04 /* LD:4c-4f */
109 1.5 joerg strd r6, r7, [r3], #0x08 /* ST:38-3f */
110 1.1 christos ldr r6, [r1], #0x04 /* LD:50-53 */
111 1.1 christos ldr r7, [r1], #0x04 /* LD:54-57 */
112 1.5 joerg strd r8, r9, [r3], #0x08 /* ST:40-47 */
113 1.1 christos ldr r8, [r1], #0x04 /* LD:58-5b */
114 1.1 christos ldr r9, [r1], #0x04 /* LD:5c-5f */
115 1.5 joerg strd r4, r5, [r3], #0x08 /* ST:48-4f */
116 1.1 christos ldr r4, [r1], #0x04 /* LD:60-63 */
117 1.1 christos ldr r5, [r1], #0x04 /* LD:64-67 */
118 1.1 christos pld [r1, #0x18] /* Prefetch 0x80 */
119 1.5 joerg strd r6, r7, [r3], #0x08 /* ST:50-57 */
120 1.1 christos ldr r6, [r1], #0x04 /* LD:68-6b */
121 1.1 christos ldr r7, [r1], #0x04 /* LD:6c-6f */
122 1.5 joerg strd r8, r9, [r3], #0x08 /* ST:58-5f */
123 1.1 christos ldr r8, [r1], #0x04 /* LD:70-73 */
124 1.1 christos ldr r9, [r1], #0x04 /* LD:74-77 */
125 1.5 joerg strd r4, r5, [r3], #0x08 /* ST:60-67 */
126 1.1 christos ldr r4, [r1], #0x04 /* LD:78-7b */
127 1.1 christos ldr r5, [r1], #0x04 /* LD:7c-7f */
128 1.5 joerg strd r6, r7, [r3], #0x08 /* ST:68-6f */
129 1.5 joerg strd r8, r9, [r3], #0x08 /* ST:70-77 */
130 1.1 christos subs r2, r2, #0x80
131 1.5 joerg strd r4, r5, [r3], #0x08 /* ST:78-7f */
132 1.6 mlelstv bhs .Lmemcpy_w_loop128
133 1.1 christos
134 1.1 christos .Lmemcpy_w_lessthan128:
135 1.1 christos adds r2, r2, #0x80 /* Adjust for extra sub */
136 1.3 matt popeq {r4-r9}
137 1.3 matt RETc(eq) /* Return now if done */
138 1.1 christos subs r2, r2, #0x20
139 1.6 mlelstv blo .Lmemcpy_w_lessthan32
140 1.1 christos
141 1.1 christos /* Copy 32 bytes at a time */
142 1.1 christos .Lmemcpy_w_loop32:
143 1.1 christos ldr r4, [r1], #0x04
144 1.1 christos ldr r5, [r1], #0x04
145 1.1 christos pld [r1, #0x18]
146 1.1 christos ldr r6, [r1], #0x04
147 1.1 christos ldr r7, [r1], #0x04
148 1.1 christos ldr r8, [r1], #0x04
149 1.1 christos ldr r9, [r1], #0x04
150 1.5 joerg strd r4, r5, [r3], #0x08
151 1.1 christos ldr r4, [r1], #0x04
152 1.1 christos ldr r5, [r1], #0x04
153 1.5 joerg strd r6, r7, [r3], #0x08
154 1.5 joerg strd r8, r9, [r3], #0x08
155 1.1 christos subs r2, r2, #0x20
156 1.5 joerg strd r4, r5, [r3], #0x08
157 1.6 mlelstv bhs .Lmemcpy_w_loop32
158 1.1 christos
159 1.1 christos .Lmemcpy_w_lessthan32:
160 1.1 christos adds r2, r2, #0x20 /* Adjust for extra sub */
161 1.3 matt popeq {r4-r9}
162 1.3 matt RETc(eq) /* Return now if done */
163 1.1 christos
164 1.1 christos and r4, r2, #0x18
165 1.1 christos rsbs r4, r4, #0x18
166 1.1 christos addne pc, pc, r4, lsl #1
167 1.1 christos nop
168 1.1 christos
169 1.1 christos /* At least 24 bytes remaining */
170 1.1 christos ldr r4, [r1], #0x04
171 1.1 christos ldr r5, [r1], #0x04
172 1.1 christos sub r2, r2, #0x08
173 1.5 joerg strd r4, r5, [r3], #0x08
174 1.1 christos
175 1.1 christos /* At least 16 bytes remaining */
176 1.1 christos ldr r4, [r1], #0x04
177 1.1 christos ldr r5, [r1], #0x04
178 1.1 christos sub r2, r2, #0x08
179 1.5 joerg strd r4, r5, [r3], #0x08
180 1.1 christos
181 1.1 christos /* At least 8 bytes remaining */
182 1.1 christos ldr r4, [r1], #0x04
183 1.1 christos ldr r5, [r1], #0x04
184 1.1 christos subs r2, r2, #0x08
185 1.5 joerg strd r4, r5, [r3], #0x08
186 1.1 christos
187 1.1 christos /* Less than 8 bytes remaining */
188 1.3 matt pop {r4-r9}
189 1.3 matt RETc(eq) /* Return now if done */
190 1.1 christos subs r2, r2, #0x04
191 1.6 mlelstv ldrhs ip, [r1], #0x04
192 1.6 mlelstv strhs ip, [r3], #0x04
193 1.3 matt RETc(eq) /* Return now if done */
194 1.6 mlelstv addlo r2, r2, #0x04
195 1.1 christos ldrb ip, [r1], #0x01
196 1.1 christos cmp r2, #0x02
197 1.6 mlelstv ldrbhs r2, [r1], #0x01
198 1.1 christos strb ip, [r3], #0x01
199 1.6 mlelstv ldrbhi ip, [r1]
200 1.6 mlelstv strbhs r2, [r3], #0x01
201 1.6 mlelstv strbhi ip, [r3]
202 1.3 matt RET
203 1.1 christos
204 1.1 christos
205 1.1 christos /*
206 1.1 christos * At this point, it has not been possible to word align both buffers.
207 1.1 christos * The destination buffer is word aligned, but the source buffer is not.
208 1.1 christos */
209 1.1 christos .Lmemcpy_bad_align:
210 1.3 matt push {r4-r7}
211 1.1 christos bic r1, r1, #0x03
212 1.1 christos cmp ip, #2
213 1.1 christos ldr ip, [r1], #0x04
214 1.6 mlelstv bhi .Lmemcpy_bad3
215 1.1 christos beq .Lmemcpy_bad2
216 1.1 christos b .Lmemcpy_bad1
217 1.1 christos
218 1.1 christos .Lmemcpy_bad1_loop16:
219 1.1 christos #ifdef __ARMEB__
220 1.1 christos mov r4, ip, lsl #8
221 1.1 christos #else
222 1.1 christos mov r4, ip, lsr #8
223 1.1 christos #endif
224 1.1 christos ldr r5, [r1], #0x04
225 1.1 christos pld [r1, #0x018]
226 1.1 christos ldr r6, [r1], #0x04
227 1.1 christos ldr r7, [r1], #0x04
228 1.1 christos ldr ip, [r1], #0x04
229 1.1 christos #ifdef __ARMEB__
230 1.1 christos orr r4, r4, r5, lsr #24
231 1.1 christos mov r5, r5, lsl #8
232 1.1 christos orr r5, r5, r6, lsr #24
233 1.1 christos mov r6, r6, lsl #8
234 1.1 christos orr r6, r6, r7, lsr #24
235 1.1 christos mov r7, r7, lsl #8
236 1.1 christos orr r7, r7, ip, lsr #24
237 1.1 christos #else
238 1.1 christos orr r4, r4, r5, lsl #24
239 1.1 christos mov r5, r5, lsr #8
240 1.1 christos orr r5, r5, r6, lsl #24
241 1.1 christos mov r6, r6, lsr #8
242 1.1 christos orr r6, r6, r7, lsl #24
243 1.1 christos mov r7, r7, lsr #8
244 1.1 christos orr r7, r7, ip, lsl #24
245 1.1 christos #endif
246 1.1 christos str r4, [r3], #0x04
247 1.1 christos str r5, [r3], #0x04
248 1.1 christos str r6, [r3], #0x04
249 1.1 christos str r7, [r3], #0x04
250 1.2 scw sub r2, r2, #0x10
251 1.2 scw
252 1.1 christos .Lmemcpy_bad1:
253 1.2 scw cmp r2, #0x20
254 1.6 mlelstv bhs .Lmemcpy_bad1_loop16
255 1.2 scw cmp r2, #0x10
256 1.6 mlelstv blo .Lmemcpy_bad1_loop16_short
257 1.1 christos
258 1.2 scw /* copy last 16 bytes (without preload) */
259 1.2 scw #ifdef __ARMEB__
260 1.2 scw mov r4, ip, lsl #8
261 1.2 scw #else
262 1.2 scw mov r4, ip, lsr #8
263 1.2 scw #endif
264 1.2 scw ldr r5, [r1], #0x04
265 1.2 scw ldr r6, [r1], #0x04
266 1.2 scw ldr r7, [r1], #0x04
267 1.2 scw ldr ip, [r1], #0x04
268 1.2 scw #ifdef __ARMEB__
269 1.2 scw orr r4, r4, r5, lsr #24
270 1.2 scw mov r5, r5, lsl #8
271 1.2 scw orr r5, r5, r6, lsr #24
272 1.2 scw mov r6, r6, lsl #8
273 1.2 scw orr r6, r6, r7, lsr #24
274 1.2 scw mov r7, r7, lsl #8
275 1.2 scw orr r7, r7, ip, lsr #24
276 1.2 scw #else
277 1.2 scw orr r4, r4, r5, lsl #24
278 1.2 scw mov r5, r5, lsr #8
279 1.2 scw orr r5, r5, r6, lsl #24
280 1.2 scw mov r6, r6, lsr #8
281 1.2 scw orr r6, r6, r7, lsl #24
282 1.2 scw mov r7, r7, lsr #8
283 1.2 scw orr r7, r7, ip, lsl #24
284 1.2 scw #endif
285 1.2 scw str r4, [r3], #0x04
286 1.2 scw str r5, [r3], #0x04
287 1.2 scw str r6, [r3], #0x04
288 1.2 scw str r7, [r3], #0x04
289 1.2 scw subs r2, r2, #0x10
290 1.3 matt popeq {r4-r7}
291 1.3 matt RETc(eq) /* Return now if done */
292 1.2 scw
293 1.2 scw .Lmemcpy_bad1_loop16_short:
294 1.1 christos subs r2, r2, #0x04
295 1.6 mlelstv sublo r1, r1, #0x03
296 1.6 mlelstv blo .Lmemcpy_bad_done
297 1.1 christos
298 1.1 christos .Lmemcpy_bad1_loop4:
299 1.1 christos #ifdef __ARMEB__
300 1.1 christos mov r4, ip, lsl #8
301 1.1 christos #else
302 1.1 christos mov r4, ip, lsr #8
303 1.1 christos #endif
304 1.1 christos ldr ip, [r1], #0x04
305 1.1 christos subs r2, r2, #0x04
306 1.1 christos #ifdef __ARMEB__
307 1.1 christos orr r4, r4, ip, lsr #24
308 1.1 christos #else
309 1.1 christos orr r4, r4, ip, lsl #24
310 1.1 christos #endif
311 1.1 christos str r4, [r3], #0x04
312 1.6 mlelstv bhs .Lmemcpy_bad1_loop4
313 1.1 christos sub r1, r1, #0x03
314 1.1 christos b .Lmemcpy_bad_done
315 1.1 christos
316 1.1 christos .Lmemcpy_bad2_loop16:
317 1.1 christos #ifdef __ARMEB__
318 1.1 christos mov r4, ip, lsl #16
319 1.1 christos #else
320 1.1 christos mov r4, ip, lsr #16
321 1.1 christos #endif
322 1.1 christos ldr r5, [r1], #0x04
323 1.1 christos pld [r1, #0x018]
324 1.1 christos ldr r6, [r1], #0x04
325 1.1 christos ldr r7, [r1], #0x04
326 1.1 christos ldr ip, [r1], #0x04
327 1.1 christos #ifdef __ARMEB__
328 1.1 christos orr r4, r4, r5, lsr #16
329 1.1 christos mov r5, r5, lsl #16
330 1.1 christos orr r5, r5, r6, lsr #16
331 1.1 christos mov r6, r6, lsl #16
332 1.1 christos orr r6, r6, r7, lsr #16
333 1.1 christos mov r7, r7, lsl #16
334 1.1 christos orr r7, r7, ip, lsr #16
335 1.1 christos #else
336 1.1 christos orr r4, r4, r5, lsl #16
337 1.1 christos mov r5, r5, lsr #16
338 1.1 christos orr r5, r5, r6, lsl #16
339 1.1 christos mov r6, r6, lsr #16
340 1.1 christos orr r6, r6, r7, lsl #16
341 1.1 christos mov r7, r7, lsr #16
342 1.1 christos orr r7, r7, ip, lsl #16
343 1.1 christos #endif
344 1.1 christos str r4, [r3], #0x04
345 1.1 christos str r5, [r3], #0x04
346 1.1 christos str r6, [r3], #0x04
347 1.1 christos str r7, [r3], #0x04
348 1.2 scw sub r2, r2, #0x10
349 1.2 scw
350 1.1 christos .Lmemcpy_bad2:
351 1.2 scw cmp r2, #0x20
352 1.6 mlelstv bhs .Lmemcpy_bad2_loop16
353 1.2 scw cmp r2, #0x10
354 1.6 mlelstv blo .Lmemcpy_bad2_loop16_short
355 1.1 christos
356 1.2 scw /* copy last 16 bytes (without preload) */
357 1.2 scw #ifdef __ARMEB__
358 1.2 scw mov r4, ip, lsl #16
359 1.2 scw #else
360 1.2 scw mov r4, ip, lsr #16
361 1.2 scw #endif
362 1.2 scw ldr r5, [r1], #0x04
363 1.2 scw ldr r6, [r1], #0x04
364 1.2 scw ldr r7, [r1], #0x04
365 1.2 scw ldr ip, [r1], #0x04
366 1.2 scw #ifdef __ARMEB__
367 1.2 scw orr r4, r4, r5, lsr #16
368 1.2 scw mov r5, r5, lsl #16
369 1.2 scw orr r5, r5, r6, lsr #16
370 1.2 scw mov r6, r6, lsl #16
371 1.2 scw orr r6, r6, r7, lsr #16
372 1.2 scw mov r7, r7, lsl #16
373 1.2 scw orr r7, r7, ip, lsr #16
374 1.2 scw #else
375 1.2 scw orr r4, r4, r5, lsl #16
376 1.2 scw mov r5, r5, lsr #16
377 1.2 scw orr r5, r5, r6, lsl #16
378 1.2 scw mov r6, r6, lsr #16
379 1.2 scw orr r6, r6, r7, lsl #16
380 1.2 scw mov r7, r7, lsr #16
381 1.2 scw orr r7, r7, ip, lsl #16
382 1.2 scw #endif
383 1.2 scw str r4, [r3], #0x04
384 1.2 scw str r5, [r3], #0x04
385 1.2 scw str r6, [r3], #0x04
386 1.2 scw str r7, [r3], #0x04
387 1.2 scw subs r2, r2, #0x10
388 1.3 matt popeq {r4-r7}
389 1.3 matt RETc(eq) /* Return now if done */
390 1.2 scw
391 1.2 scw .Lmemcpy_bad2_loop16_short:
392 1.1 christos subs r2, r2, #0x04
393 1.6 mlelstv sublo r1, r1, #0x02
394 1.6 mlelstv blo .Lmemcpy_bad_done
395 1.1 christos
396 1.1 christos .Lmemcpy_bad2_loop4:
397 1.1 christos #ifdef __ARMEB__
398 1.1 christos mov r4, ip, lsl #16
399 1.1 christos #else
400 1.1 christos mov r4, ip, lsr #16
401 1.1 christos #endif
402 1.1 christos ldr ip, [r1], #0x04
403 1.1 christos subs r2, r2, #0x04
404 1.1 christos #ifdef __ARMEB__
405 1.1 christos orr r4, r4, ip, lsr #16
406 1.1 christos #else
407 1.1 christos orr r4, r4, ip, lsl #16
408 1.1 christos #endif
409 1.1 christos str r4, [r3], #0x04
410 1.6 mlelstv bhs .Lmemcpy_bad2_loop4
411 1.1 christos sub r1, r1, #0x02
412 1.1 christos b .Lmemcpy_bad_done
413 1.1 christos
414 1.1 christos .Lmemcpy_bad3_loop16:
415 1.1 christos #ifdef __ARMEB__
416 1.1 christos mov r4, ip, lsl #24
417 1.1 christos #else
418 1.1 christos mov r4, ip, lsr #24
419 1.1 christos #endif
420 1.1 christos ldr r5, [r1], #0x04
421 1.1 christos pld [r1, #0x018]
422 1.1 christos ldr r6, [r1], #0x04
423 1.1 christos ldr r7, [r1], #0x04
424 1.1 christos ldr ip, [r1], #0x04
425 1.1 christos #ifdef __ARMEB__
426 1.1 christos orr r4, r4, r5, lsr #8
427 1.1 christos mov r5, r5, lsl #24
428 1.1 christos orr r5, r5, r6, lsr #8
429 1.1 christos mov r6, r6, lsl #24
430 1.1 christos orr r6, r6, r7, lsr #8
431 1.1 christos mov r7, r7, lsl #24
432 1.1 christos orr r7, r7, ip, lsr #8
433 1.1 christos #else
434 1.1 christos orr r4, r4, r5, lsl #8
435 1.1 christos mov r5, r5, lsr #24
436 1.1 christos orr r5, r5, r6, lsl #8
437 1.1 christos mov r6, r6, lsr #24
438 1.1 christos orr r6, r6, r7, lsl #8
439 1.1 christos mov r7, r7, lsr #24
440 1.1 christos orr r7, r7, ip, lsl #8
441 1.1 christos #endif
442 1.1 christos str r4, [r3], #0x04
443 1.1 christos str r5, [r3], #0x04
444 1.1 christos str r6, [r3], #0x04
445 1.1 christos str r7, [r3], #0x04
446 1.2 scw sub r2, r2, #0x10
447 1.2 scw
448 1.1 christos .Lmemcpy_bad3:
449 1.2 scw cmp r2, #0x20
450 1.6 mlelstv bhs .Lmemcpy_bad3_loop16
451 1.2 scw cmp r2, #0x10
452 1.6 mlelstv blo .Lmemcpy_bad3_loop16_short
453 1.1 christos
454 1.2 scw /* copy last 16 bytes (without preload) */
455 1.2 scw #ifdef __ARMEB__
456 1.2 scw mov r4, ip, lsl #24
457 1.2 scw #else
458 1.2 scw mov r4, ip, lsr #24
459 1.2 scw #endif
460 1.2 scw ldr r5, [r1], #0x04
461 1.2 scw ldr r6, [r1], #0x04
462 1.2 scw ldr r7, [r1], #0x04
463 1.2 scw ldr ip, [r1], #0x04
464 1.2 scw #ifdef __ARMEB__
465 1.2 scw orr r4, r4, r5, lsr #8
466 1.2 scw mov r5, r5, lsl #24
467 1.2 scw orr r5, r5, r6, lsr #8
468 1.2 scw mov r6, r6, lsl #24
469 1.2 scw orr r6, r6, r7, lsr #8
470 1.2 scw mov r7, r7, lsl #24
471 1.2 scw orr r7, r7, ip, lsr #8
472 1.2 scw #else
473 1.2 scw orr r4, r4, r5, lsl #8
474 1.2 scw mov r5, r5, lsr #24
475 1.2 scw orr r5, r5, r6, lsl #8
476 1.2 scw mov r6, r6, lsr #24
477 1.2 scw orr r6, r6, r7, lsl #8
478 1.2 scw mov r7, r7, lsr #24
479 1.2 scw orr r7, r7, ip, lsl #8
480 1.2 scw #endif
481 1.2 scw str r4, [r3], #0x04
482 1.2 scw str r5, [r3], #0x04
483 1.2 scw str r6, [r3], #0x04
484 1.2 scw str r7, [r3], #0x04
485 1.2 scw subs r2, r2, #0x10
486 1.3 matt popeq {r4-r7}
487 1.3 matt RETc(eq) /* Return now if done */
488 1.2 scw
489 1.2 scw .Lmemcpy_bad3_loop16_short:
490 1.1 christos subs r2, r2, #0x04
491 1.6 mlelstv sublo r1, r1, #0x01
492 1.6 mlelstv blo .Lmemcpy_bad_done
493 1.1 christos
494 1.1 christos .Lmemcpy_bad3_loop4:
495 1.1 christos #ifdef __ARMEB__
496 1.1 christos mov r4, ip, lsl #24
497 1.1 christos #else
498 1.1 christos mov r4, ip, lsr #24
499 1.1 christos #endif
500 1.1 christos ldr ip, [r1], #0x04
501 1.1 christos subs r2, r2, #0x04
502 1.1 christos #ifdef __ARMEB__
503 1.1 christos orr r4, r4, ip, lsr #8
504 1.1 christos #else
505 1.1 christos orr r4, r4, ip, lsl #8
506 1.1 christos #endif
507 1.1 christos str r4, [r3], #0x04
508 1.6 mlelstv bhs .Lmemcpy_bad3_loop4
509 1.1 christos sub r1, r1, #0x01
510 1.1 christos
511 1.1 christos .Lmemcpy_bad_done:
512 1.3 matt pop {r4-r7}
513 1.1 christos adds r2, r2, #0x04
514 1.3 matt RETc(eq)
515 1.1 christos ldrb ip, [r1], #0x01
516 1.1 christos cmp r2, #0x02
517 1.6 mlelstv ldrbhs r2, [r1], #0x01
518 1.1 christos strb ip, [r3], #0x01
519 1.6 mlelstv ldrbhi ip, [r1]
520 1.6 mlelstv strbhs r2, [r3], #0x01
521 1.6 mlelstv strbhi ip, [r3]
522 1.3 matt RET
523 1.1 christos
524 1.1 christos
525 1.1 christos /*
526 1.1 christos * Handle short copies (less than 16 bytes), possibly misaligned.
527 1.1 christos * Some of these are *very* common, thanks to the network stack,
528 1.1 christos * and so are handled specially.
529 1.1 christos */
530 1.1 christos .Lmemcpy_short:
531 1.1 christos #ifndef _STANDALONE
532 1.1 christos add pc, pc, r2, lsl #2
533 1.1 christos nop
534 1.3 matt RET /* 0x00 */
535 1.1 christos b .Lmemcpy_bytewise /* 0x01 */
536 1.1 christos b .Lmemcpy_bytewise /* 0x02 */
537 1.1 christos b .Lmemcpy_bytewise /* 0x03 */
538 1.1 christos b .Lmemcpy_4 /* 0x04 */
539 1.1 christos b .Lmemcpy_bytewise /* 0x05 */
540 1.1 christos b .Lmemcpy_6 /* 0x06 */
541 1.1 christos b .Lmemcpy_bytewise /* 0x07 */
542 1.1 christos b .Lmemcpy_8 /* 0x08 */
543 1.1 christos b .Lmemcpy_bytewise /* 0x09 */
544 1.1 christos b .Lmemcpy_bytewise /* 0x0a */
545 1.1 christos b .Lmemcpy_bytewise /* 0x0b */
546 1.1 christos b .Lmemcpy_c /* 0x0c */
547 1.1 christos #endif
548 1.1 christos .Lmemcpy_bytewise:
549 1.1 christos mov r3, r0 /* We must not clobber r0 */
550 1.1 christos ldrb ip, [r1], #0x01
551 1.1 christos 1: subs r2, r2, #0x01
552 1.1 christos strb ip, [r3], #0x01
553 1.3 matt ldrbne ip, [r1], #0x01
554 1.1 christos bne 1b
555 1.3 matt RET
556 1.1 christos
557 1.1 christos #ifndef _STANDALONE
558 1.1 christos /******************************************************************************
559 1.1 christos * Special case for 4 byte copies
560 1.1 christos */
561 1.1 christos #define LMEMCPY_4_LOG2 6 /* 64 bytes */
562 1.1 christos #define LMEMCPY_4_PAD .align LMEMCPY_4_LOG2
563 1.1 christos LMEMCPY_4_PAD
564 1.1 christos .Lmemcpy_4:
565 1.1 christos and r2, r1, #0x03
566 1.1 christos orr r2, r2, r0, lsl #2
567 1.1 christos ands r2, r2, #0x0f
568 1.1 christos sub r3, pc, #0x14
569 1.1 christos addne pc, r3, r2, lsl #LMEMCPY_4_LOG2
570 1.1 christos
571 1.1 christos /*
572 1.1 christos * 0000: dst is 32-bit aligned, src is 32-bit aligned
573 1.1 christos */
574 1.1 christos ldr r2, [r1]
575 1.1 christos str r2, [r0]
576 1.3 matt RET
577 1.1 christos LMEMCPY_4_PAD
578 1.1 christos
579 1.1 christos /*
580 1.1 christos * 0001: dst is 32-bit aligned, src is 8-bit aligned
581 1.1 christos */
582 1.1 christos ldr r3, [r1, #-1] /* BE:r3 = x012 LE:r3 = 210x */
583 1.1 christos ldr r2, [r1, #3] /* BE:r2 = 3xxx LE:r2 = xxx3 */
584 1.1 christos #ifdef __ARMEB__
585 1.1 christos mov r3, r3, lsl #8 /* r3 = 012. */
586 1.1 christos orr r3, r3, r2, lsr #24 /* r3 = 0123 */
587 1.1 christos #else
588 1.1 christos mov r3, r3, lsr #8 /* r3 = .210 */
589 1.1 christos orr r3, r3, r2, lsl #24 /* r3 = 3210 */
590 1.1 christos #endif
591 1.1 christos str r3, [r0]
592 1.3 matt RET
593 1.1 christos LMEMCPY_4_PAD
594 1.1 christos
595 1.1 christos /*
596 1.1 christos * 0010: dst is 32-bit aligned, src is 16-bit aligned
597 1.1 christos */
598 1.1 christos #ifdef __ARMEB__
599 1.1 christos ldrh r3, [r1]
600 1.1 christos ldrh r2, [r1, #0x02]
601 1.1 christos #else
602 1.1 christos ldrh r3, [r1, #0x02]
603 1.1 christos ldrh r2, [r1]
604 1.1 christos #endif
605 1.1 christos orr r3, r2, r3, lsl #16
606 1.1 christos str r3, [r0]
607 1.3 matt RET
608 1.1 christos LMEMCPY_4_PAD
609 1.1 christos
610 1.1 christos /*
611 1.1 christos * 0011: dst is 32-bit aligned, src is 8-bit aligned
612 1.1 christos */
613 1.1 christos ldr r3, [r1, #-3] /* BE:r3 = xxx0 LE:r3 = 0xxx */
614 1.1 christos ldr r2, [r1, #1] /* BE:r2 = 123x LE:r2 = x321 */
615 1.1 christos #ifdef __ARMEB__
616 1.1 christos mov r3, r3, lsl #24 /* r3 = 0... */
617 1.1 christos orr r3, r3, r2, lsr #8 /* r3 = 0123 */
618 1.1 christos #else
619 1.1 christos mov r3, r3, lsr #24 /* r3 = ...0 */
620 1.1 christos orr r3, r3, r2, lsl #8 /* r3 = 3210 */
621 1.1 christos #endif
622 1.1 christos str r3, [r0]
623 1.3 matt RET
624 1.1 christos LMEMCPY_4_PAD
625 1.1 christos
626 1.1 christos /*
627 1.1 christos * 0100: dst is 8-bit aligned, src is 32-bit aligned
628 1.1 christos */
629 1.1 christos ldr r2, [r1]
630 1.1 christos #ifdef __ARMEB__
631 1.1 christos strb r2, [r0, #0x03]
632 1.1 christos mov r3, r2, lsr #8
633 1.1 christos mov r1, r2, lsr #24
634 1.1 christos strb r1, [r0]
635 1.1 christos #else
636 1.1 christos strb r2, [r0]
637 1.1 christos mov r3, r2, lsr #8
638 1.1 christos mov r1, r2, lsr #24
639 1.1 christos strb r1, [r0, #0x03]
640 1.1 christos #endif
641 1.1 christos strh r3, [r0, #0x01]
642 1.3 matt RET
643 1.1 christos LMEMCPY_4_PAD
644 1.1 christos
645 1.1 christos /*
646 1.1 christos * 0101: dst is 8-bit aligned, src is 8-bit aligned
647 1.1 christos */
648 1.1 christos ldrb r2, [r1]
649 1.1 christos ldrh r3, [r1, #0x01]
650 1.1 christos ldrb r1, [r1, #0x03]
651 1.1 christos strb r2, [r0]
652 1.1 christos strh r3, [r0, #0x01]
653 1.1 christos strb r1, [r0, #0x03]
654 1.3 matt RET
655 1.1 christos LMEMCPY_4_PAD
656 1.1 christos
657 1.1 christos /*
658 1.1 christos * 0110: dst is 8-bit aligned, src is 16-bit aligned
659 1.1 christos */
660 1.1 christos ldrh r2, [r1] /* BE:r2 = ..01 LE:r2 = ..10 */
661 1.1 christos ldrh r3, [r1, #0x02] /* LE:r3 = ..23 LE:r3 = ..32 */
662 1.1 christos #ifdef __ARMEB__
663 1.1 christos mov r1, r2, lsr #8 /* r1 = ...0 */
664 1.1 christos strb r1, [r0]
665 1.1 christos mov r2, r2, lsl #8 /* r2 = .01. */
666 1.1 christos orr r2, r2, r3, lsr #8 /* r2 = .012 */
667 1.1 christos #else
668 1.1 christos strb r2, [r0]
669 1.1 christos mov r2, r2, lsr #8 /* r2 = ...1 */
670 1.1 christos orr r2, r2, r3, lsl #8 /* r2 = .321 */
671 1.1 christos mov r3, r3, lsr #8 /* r3 = ...3 */
672 1.1 christos #endif
673 1.1 christos strh r2, [r0, #0x01]
674 1.1 christos strb r3, [r0, #0x03]
675 1.3 matt RET
676 1.1 christos LMEMCPY_4_PAD
677 1.1 christos
678 1.1 christos /*
679 1.1 christos * 0111: dst is 8-bit aligned, src is 8-bit aligned
680 1.1 christos */
681 1.1 christos ldrb r2, [r1]
682 1.1 christos ldrh r3, [r1, #0x01]
683 1.1 christos ldrb r1, [r1, #0x03]
684 1.1 christos strb r2, [r0]
685 1.1 christos strh r3, [r0, #0x01]
686 1.1 christos strb r1, [r0, #0x03]
687 1.3 matt RET
688 1.1 christos LMEMCPY_4_PAD
689 1.1 christos
690 1.1 christos /*
691 1.1 christos * 1000: dst is 16-bit aligned, src is 32-bit aligned
692 1.1 christos */
693 1.1 christos ldr r2, [r1]
694 1.1 christos #ifdef __ARMEB__
695 1.1 christos strh r2, [r0, #0x02]
696 1.1 christos mov r3, r2, lsr #16
697 1.1 christos strh r3, [r0]
698 1.1 christos #else
699 1.1 christos strh r2, [r0]
700 1.1 christos mov r3, r2, lsr #16
701 1.1 christos strh r3, [r0, #0x02]
702 1.1 christos #endif
703 1.3 matt RET
704 1.1 christos LMEMCPY_4_PAD
705 1.1 christos
706 1.1 christos /*
707 1.1 christos * 1001: dst is 16-bit aligned, src is 8-bit aligned
708 1.1 christos */
709 1.1 christos ldr r2, [r1, #-1] /* BE:r2 = x012 LE:r2 = 210x */
710 1.1 christos ldr r3, [r1, #3] /* BE:r3 = 3xxx LE:r3 = xxx3 */
711 1.1 christos mov r1, r2, lsr #8 /* BE:r1 = .x01 LE:r1 = .210 */
712 1.1 christos strh r1, [r0]
713 1.1 christos #ifdef __ARMEB__
714 1.1 christos mov r2, r2, lsl #8 /* r2 = 012. */
715 1.1 christos orr r2, r2, r3, lsr #24 /* r2 = 0123 */
716 1.1 christos #else
717 1.1 christos mov r2, r2, lsr #24 /* r2 = ...2 */
718 1.1 christos orr r2, r2, r3, lsl #8 /* r2 = xx32 */
719 1.1 christos #endif
720 1.1 christos strh r2, [r0, #0x02]
721 1.3 matt RET
722 1.1 christos LMEMCPY_4_PAD
723 1.1 christos
724 1.1 christos /*
725 1.1 christos * 1010: dst is 16-bit aligned, src is 16-bit aligned
726 1.1 christos */
727 1.1 christos ldrh r2, [r1]
728 1.1 christos ldrh r3, [r1, #0x02]
729 1.1 christos strh r2, [r0]
730 1.1 christos strh r3, [r0, #0x02]
731 1.3 matt RET
732 1.1 christos LMEMCPY_4_PAD
733 1.1 christos
734 1.1 christos /*
735 1.1 christos * 1011: dst is 16-bit aligned, src is 8-bit aligned
736 1.1 christos */
737 1.1 christos ldr r3, [r1, #1] /* BE:r3 = 123x LE:r3 = x321 */
738 1.1 christos ldr r2, [r1, #-3] /* BE:r2 = xxx0 LE:r2 = 0xxx */
739 1.1 christos mov r1, r3, lsr #8 /* BE:r1 = .123 LE:r1 = .x32 */
740 1.1 christos strh r1, [r0, #0x02]
741 1.1 christos #ifdef __ARMEB__
742 1.1 christos mov r3, r3, lsr #24 /* r3 = ...1 */
743 1.1 christos orr r3, r3, r2, lsl #8 /* r3 = xx01 */
744 1.1 christos #else
745 1.1 christos mov r3, r3, lsl #8 /* r3 = 321. */
746 1.1 christos orr r3, r3, r2, lsr #24 /* r3 = 3210 */
747 1.1 christos #endif
748 1.1 christos strh r3, [r0]
749 1.3 matt RET
750 1.1 christos LMEMCPY_4_PAD
751 1.1 christos
752 1.1 christos /*
753 1.1 christos * 1100: dst is 8-bit aligned, src is 32-bit aligned
754 1.1 christos */
755 1.1 christos ldr r2, [r1] /* BE:r2 = 0123 LE:r2 = 3210 */
756 1.1 christos #ifdef __ARMEB__
757 1.1 christos strb r2, [r0, #0x03]
758 1.1 christos mov r3, r2, lsr #8
759 1.1 christos mov r1, r2, lsr #24
760 1.1 christos strh r3, [r0, #0x01]
761 1.1 christos strb r1, [r0]
762 1.1 christos #else
763 1.1 christos strb r2, [r0]
764 1.1 christos mov r3, r2, lsr #8
765 1.1 christos mov r1, r2, lsr #24
766 1.1 christos strh r3, [r0, #0x01]
767 1.1 christos strb r1, [r0, #0x03]
768 1.1 christos #endif
769 1.3 matt RET
770 1.1 christos LMEMCPY_4_PAD
771 1.1 christos
772 1.1 christos /*
773 1.1 christos * 1101: dst is 8-bit aligned, src is 8-bit aligned
774 1.1 christos */
775 1.1 christos ldrb r2, [r1]
776 1.1 christos ldrh r3, [r1, #0x01]
777 1.1 christos ldrb r1, [r1, #0x03]
778 1.1 christos strb r2, [r0]
779 1.1 christos strh r3, [r0, #0x01]
780 1.1 christos strb r1, [r0, #0x03]
781 1.3 matt RET
782 1.1 christos LMEMCPY_4_PAD
783 1.1 christos
784 1.1 christos /*
785 1.1 christos * 1110: dst is 8-bit aligned, src is 16-bit aligned
786 1.1 christos */
787 1.1 christos #ifdef __ARMEB__
788 1.1 christos ldrh r3, [r1, #0x02] /* BE:r3 = ..23 LE:r3 = ..32 */
789 1.1 christos ldrh r2, [r1] /* BE:r2 = ..01 LE:r2 = ..10 */
790 1.1 christos strb r3, [r0, #0x03]
791 1.1 christos mov r3, r3, lsr #8 /* r3 = ...2 */
792 1.1 christos orr r3, r3, r2, lsl #8 /* r3 = ..12 */
793 1.1 christos strh r3, [r0, #0x01]
794 1.1 christos mov r2, r2, lsr #8 /* r2 = ...0 */
795 1.1 christos strb r2, [r0]
796 1.1 christos #else
797 1.1 christos ldrh r2, [r1] /* BE:r2 = ..01 LE:r2 = ..10 */
798 1.1 christos ldrh r3, [r1, #0x02] /* BE:r3 = ..23 LE:r3 = ..32 */
799 1.1 christos strb r2, [r0]
800 1.1 christos mov r2, r2, lsr #8 /* r2 = ...1 */
801 1.1 christos orr r2, r2, r3, lsl #8 /* r2 = .321 */
802 1.1 christos strh r2, [r0, #0x01]
803 1.1 christos mov r3, r3, lsr #8 /* r3 = ...3 */
804 1.1 christos strb r3, [r0, #0x03]
805 1.1 christos #endif
806 1.3 matt RET
807 1.1 christos LMEMCPY_4_PAD
808 1.1 christos
809 1.1 christos /*
810 1.1 christos * 1111: dst is 8-bit aligned, src is 8-bit aligned
811 1.1 christos */
812 1.1 christos ldrb r2, [r1]
813 1.1 christos ldrh r3, [r1, #0x01]
814 1.1 christos ldrb r1, [r1, #0x03]
815 1.1 christos strb r2, [r0]
816 1.1 christos strh r3, [r0, #0x01]
817 1.1 christos strb r1, [r0, #0x03]
818 1.3 matt RET
819 1.1 christos LMEMCPY_4_PAD
820 1.1 christos
821 1.1 christos
822 1.1 christos /******************************************************************************
823 1.1 christos * Special case for 6 byte copies
824 1.1 christos */
825 1.1 christos #define LMEMCPY_6_LOG2 6 /* 64 bytes */
826 1.1 christos #define LMEMCPY_6_PAD .align LMEMCPY_6_LOG2
827 1.1 christos LMEMCPY_6_PAD
828 1.1 christos .Lmemcpy_6:
829 1.1 christos and r2, r1, #0x03
830 1.1 christos orr r2, r2, r0, lsl #2
831 1.1 christos ands r2, r2, #0x0f
832 1.1 christos sub r3, pc, #0x14
833 1.1 christos addne pc, r3, r2, lsl #LMEMCPY_6_LOG2
834 1.1 christos
835 1.1 christos /*
836 1.1 christos * 0000: dst is 32-bit aligned, src is 32-bit aligned
837 1.1 christos */
838 1.1 christos ldr r2, [r1]
839 1.1 christos ldrh r3, [r1, #0x04]
840 1.1 christos str r2, [r0]
841 1.1 christos strh r3, [r0, #0x04]
842 1.3 matt RET
843 1.1 christos LMEMCPY_6_PAD
844 1.1 christos
845 1.1 christos /*
846 1.1 christos * 0001: dst is 32-bit aligned, src is 8-bit aligned
847 1.1 christos */
848 1.1 christos ldr r2, [r1, #-1] /* BE:r2 = x012 LE:r2 = 210x */
849 1.1 christos ldr r3, [r1, #0x03] /* BE:r3 = 345x LE:r3 = x543 */
850 1.1 christos #ifdef __ARMEB__
851 1.1 christos mov r2, r2, lsl #8 /* r2 = 012. */
852 1.1 christos orr r2, r2, r3, lsr #24 /* r2 = 0123 */
853 1.1 christos #else
854 1.1 christos mov r2, r2, lsr #8 /* r2 = .210 */
855 1.1 christos orr r2, r2, r3, lsl #24 /* r2 = 3210 */
856 1.1 christos #endif
857 1.1 christos mov r3, r3, lsr #8 /* BE:r3 = .345 LE:r3 = .x54 */
858 1.1 christos str r2, [r0]
859 1.1 christos strh r3, [r0, #0x04]
860 1.3 matt RET
861 1.1 christos LMEMCPY_6_PAD
862 1.1 christos
863 1.1 christos /*
864 1.1 christos * 0010: dst is 32-bit aligned, src is 16-bit aligned
865 1.1 christos */
866 1.1 christos ldr r3, [r1, #0x02] /* BE:r3 = 2345 LE:r3 = 5432 */
867 1.1 christos ldrh r2, [r1] /* BE:r2 = ..01 LE:r2 = ..10 */
868 1.1 christos #ifdef __ARMEB__
869 1.1 christos mov r1, r3, lsr #16 /* r1 = ..23 */
870 1.1 christos orr r1, r1, r2, lsl #16 /* r1 = 0123 */
871 1.1 christos str r1, [r0]
872 1.1 christos strh r3, [r0, #0x04]
873 1.1 christos #else
874 1.1 christos mov r1, r3, lsr #16 /* r1 = ..54 */
875 1.1 christos orr r2, r2, r3, lsl #16 /* r2 = 3210 */
876 1.1 christos str r2, [r0]
877 1.1 christos strh r1, [r0, #0x04]
878 1.1 christos #endif
879 1.3 matt RET
880 1.1 christos LMEMCPY_6_PAD
881 1.1 christos
882 1.1 christos /*
883 1.1 christos * 0011: dst is 32-bit aligned, src is 8-bit aligned
884 1.1 christos */
885 1.1 christos ldr r2, [r1, #-3] /* BE:r2 = xxx0 LE:r2 = 0xxx */
886 1.1 christos ldr r3, [r1, #1] /* BE:r3 = 1234 LE:r3 = 4321 */
887 1.1 christos ldr r1, [r1, #5] /* BE:r1 = 5xxx LE:r3 = xxx5 */
888 1.1 christos #ifdef __ARMEB__
889 1.1 christos mov r2, r2, lsl #24 /* r2 = 0... */
890 1.1 christos orr r2, r2, r3, lsr #8 /* r2 = 0123 */
891 1.1 christos mov r3, r3, lsl #8 /* r3 = 234. */
892 1.1 christos orr r1, r3, r1, lsr #24 /* r1 = 2345 */
893 1.1 christos #else
894 1.1 christos mov r2, r2, lsr #24 /* r2 = ...0 */
895 1.1 christos orr r2, r2, r3, lsl #8 /* r2 = 3210 */
896 1.1 christos mov r1, r1, lsl #8 /* r1 = xx5. */
897 1.1 christos orr r1, r1, r3, lsr #24 /* r1 = xx54 */
898 1.1 christos #endif
899 1.1 christos str r2, [r0]
900 1.1 christos strh r1, [r0, #0x04]
901 1.3 matt RET
902 1.1 christos LMEMCPY_6_PAD
903 1.1 christos
904 1.1 christos /*
905 1.1 christos * 0100: dst is 8-bit aligned, src is 32-bit aligned
906 1.1 christos */
907 1.1 christos ldr r3, [r1] /* BE:r3 = 0123 LE:r3 = 3210 */
908 1.1 christos ldrh r2, [r1, #0x04] /* BE:r2 = ..45 LE:r2 = ..54 */
909 1.1 christos mov r1, r3, lsr #8 /* BE:r1 = .012 LE:r1 = .321 */
910 1.1 christos strh r1, [r0, #0x01]
911 1.1 christos #ifdef __ARMEB__
912 1.1 christos mov r1, r3, lsr #24 /* r1 = ...0 */
913 1.1 christos strb r1, [r0]
914 1.1 christos mov r3, r3, lsl #8 /* r3 = 123. */
915 1.1 christos orr r3, r3, r2, lsr #8 /* r3 = 1234 */
916 1.1 christos #else
917 1.1 christos strb r3, [r0]
918 1.1 christos mov r3, r3, lsr #24 /* r3 = ...3 */
919 1.1 christos orr r3, r3, r2, lsl #8 /* r3 = .543 */
920 1.1 christos mov r2, r2, lsr #8 /* r2 = ...5 */
921 1.1 christos #endif
922 1.1 christos strh r3, [r0, #0x03]
923 1.1 christos strb r2, [r0, #0x05]
924 1.3 matt RET
925 1.1 christos LMEMCPY_6_PAD
926 1.1 christos
927 1.1 christos /*
928 1.1 christos * 0101: dst is 8-bit aligned, src is 8-bit aligned
929 1.1 christos */
930 1.1 christos ldrb r2, [r1]
931 1.1 christos ldrh r3, [r1, #0x01]
932 1.1 christos ldrh ip, [r1, #0x03]
933 1.1 christos ldrb r1, [r1, #0x05]
934 1.1 christos strb r2, [r0]
935 1.1 christos strh r3, [r0, #0x01]
936 1.1 christos strh ip, [r0, #0x03]
937 1.1 christos strb r1, [r0, #0x05]
938 1.3 matt RET
939 1.1 christos LMEMCPY_6_PAD
940 1.1 christos
941 1.1 christos /*
942 1.1 christos * 0110: dst is 8-bit aligned, src is 16-bit aligned
943 1.1 christos */
944 1.1 christos ldrh r2, [r1] /* BE:r2 = ..01 LE:r2 = ..10 */
945 1.1 christos ldr r1, [r1, #0x02] /* BE:r1 = 2345 LE:r1 = 5432 */
946 1.1 christos #ifdef __ARMEB__
947 1.1 christos mov r3, r2, lsr #8 /* r3 = ...0 */
948 1.1 christos strb r3, [r0]
949 1.1 christos strb r1, [r0, #0x05]
950 1.1 christos mov r3, r1, lsr #8 /* r3 = .234 */
951 1.1 christos strh r3, [r0, #0x03]
952 1.1 christos mov r3, r2, lsl #8 /* r3 = .01. */
953 1.1 christos orr r3, r3, r1, lsr #24 /* r3 = .012 */
954 1.1 christos strh r3, [r0, #0x01]
955 1.1 christos #else
956 1.1 christos strb r2, [r0]
957 1.1 christos mov r3, r1, lsr #24
958 1.1 christos strb r3, [r0, #0x05]
959 1.1 christos mov r3, r1, lsr #8 /* r3 = .543 */
960 1.1 christos strh r3, [r0, #0x03]
961 1.1 christos mov r3, r2, lsr #8 /* r3 = ...1 */
962 1.1 christos orr r3, r3, r1, lsl #8 /* r3 = 4321 */
963 1.1 christos strh r3, [r0, #0x01]
964 1.1 christos #endif
965 1.3 matt RET
966 1.1 christos LMEMCPY_6_PAD
967 1.1 christos
968 1.1 christos /*
969 1.1 christos * 0111: dst is 8-bit aligned, src is 8-bit aligned
970 1.1 christos */
971 1.1 christos ldrb r2, [r1]
972 1.1 christos ldrh r3, [r1, #0x01]
973 1.1 christos ldrh ip, [r1, #0x03]
974 1.1 christos ldrb r1, [r1, #0x05]
975 1.1 christos strb r2, [r0]
976 1.1 christos strh r3, [r0, #0x01]
977 1.1 christos strh ip, [r0, #0x03]
978 1.1 christos strb r1, [r0, #0x05]
979 1.3 matt RET
980 1.1 christos LMEMCPY_6_PAD
981 1.1 christos
982 1.1 christos /*
983 1.1 christos * 1000: dst is 16-bit aligned, src is 32-bit aligned
984 1.1 christos */
985 1.1 christos #ifdef __ARMEB__
986 1.1 christos ldr r2, [r1] /* r2 = 0123 */
987 1.1 christos ldrh r3, [r1, #0x04] /* r3 = ..45 */
988 1.1 christos mov r1, r2, lsr #16 /* r1 = ..01 */
989 1.1 christos orr r3, r3, r2, lsl#16 /* r3 = 2345 */
990 1.1 christos strh r1, [r0]
991 1.1 christos str r3, [r0, #0x02]
992 1.1 christos #else
993 1.1 christos ldrh r2, [r1, #0x04] /* r2 = ..54 */
994 1.1 christos ldr r3, [r1] /* r3 = 3210 */
995 1.1 christos mov r2, r2, lsl #16 /* r2 = 54.. */
996 1.1 christos orr r2, r2, r3, lsr #16 /* r2 = 5432 */
997 1.1 christos strh r3, [r0]
998 1.1 christos str r2, [r0, #0x02]
999 1.1 christos #endif
1000 1.3 matt RET
1001 1.1 christos LMEMCPY_6_PAD
1002 1.1 christos
1003 1.1 christos /*
1004 1.1 christos * 1001: dst is 16-bit aligned, src is 8-bit aligned
1005 1.1 christos */
1006 1.1 christos ldr r3, [r1, #-1] /* BE:r3 = x012 LE:r3 = 210x */
1007 1.1 christos ldr r2, [r1, #3] /* BE:r2 = 345x LE:r2 = x543 */
1008 1.1 christos mov r1, r3, lsr #8 /* BE:r1 = .x01 LE:r1 = .210 */
1009 1.1 christos #ifdef __ARMEB__
1010 1.1 christos mov r2, r2, lsr #8 /* r2 = .345 */
1011 1.1 christos orr r2, r2, r3, lsl #24 /* r2 = 2345 */
1012 1.1 christos #else
1013 1.1 christos mov r2, r2, lsl #8 /* r2 = 543. */
1014 1.1 christos orr r2, r2, r3, lsr #24 /* r2 = 5432 */
1015 1.1 christos #endif
1016 1.1 christos strh r1, [r0]
1017 1.1 christos str r2, [r0, #0x02]
1018 1.3 matt RET
1019 1.1 christos LMEMCPY_6_PAD
1020 1.1 christos
1021 1.1 christos /*
1022 1.1 christos * 1010: dst is 16-bit aligned, src is 16-bit aligned
1023 1.1 christos */
1024 1.1 christos ldrh r2, [r1]
1025 1.1 christos ldr r3, [r1, #0x02]
1026 1.1 christos strh r2, [r0]
1027 1.1 christos str r3, [r0, #0x02]
1028 1.3 matt RET
1029 1.1 christos LMEMCPY_6_PAD
1030 1.1 christos
1031 1.1 christos /*
1032 1.1 christos * 1011: dst is 16-bit aligned, src is 8-bit aligned
1033 1.1 christos */
1034 1.1 christos ldrb r3, [r1] /* r3 = ...0 */
1035 1.1 christos ldr r2, [r1, #0x01] /* BE:r2 = 1234 LE:r2 = 4321 */
1036 1.1 christos ldrb r1, [r1, #0x05] /* r1 = ...5 */
1037 1.1 christos #ifdef __ARMEB__
1038 1.1 christos mov r3, r3, lsl #8 /* r3 = ..0. */
1039 1.1 christos orr r3, r3, r2, lsr #24 /* r3 = ..01 */
1040 1.1 christos orr r1, r1, r2, lsl #8 /* r1 = 2345 */
1041 1.1 christos #else
1042 1.1 christos orr r3, r3, r2, lsl #8 /* r3 = 3210 */
1043 1.1 christos mov r1, r1, lsl #24 /* r1 = 5... */
1044 1.1 christos orr r1, r1, r2, lsr #8 /* r1 = 5432 */
1045 1.1 christos #endif
1046 1.1 christos strh r3, [r0]
1047 1.1 christos str r1, [r0, #0x02]
1048 1.3 matt RET
1049 1.1 christos LMEMCPY_6_PAD
1050 1.1 christos
1051 1.1 christos /*
1052 1.1 christos * 1100: dst is 8-bit aligned, src is 32-bit aligned
1053 1.1 christos */
1054 1.1 christos ldr r2, [r1] /* BE:r2 = 0123 LE:r2 = 3210 */
1055 1.1 christos ldrh r1, [r1, #0x04] /* BE:r1 = ..45 LE:r1 = ..54 */
1056 1.1 christos #ifdef __ARMEB__
1057 1.1 christos mov r3, r2, lsr #24 /* r3 = ...0 */
1058 1.1 christos strb r3, [r0]
1059 1.1 christos mov r2, r2, lsl #8 /* r2 = 123. */
1060 1.1 christos orr r2, r2, r1, lsr #8 /* r2 = 1234 */
1061 1.1 christos #else
1062 1.1 christos strb r2, [r0]
1063 1.1 christos mov r2, r2, lsr #8 /* r2 = .321 */
1064 1.1 christos orr r2, r2, r1, lsl #24 /* r2 = 4321 */
1065 1.1 christos mov r1, r1, lsr #8 /* r1 = ...5 */
1066 1.1 christos #endif
1067 1.1 christos str r2, [r0, #0x01]
1068 1.1 christos strb r1, [r0, #0x05]
1069 1.3 matt RET
1070 1.1 christos LMEMCPY_6_PAD
1071 1.1 christos
1072 1.1 christos /*
1073 1.1 christos * 1101: dst is 8-bit aligned, src is 8-bit aligned
1074 1.1 christos */
1075 1.1 christos ldrb r2, [r1]
1076 1.1 christos ldrh r3, [r1, #0x01]
1077 1.1 christos ldrh ip, [r1, #0x03]
1078 1.1 christos ldrb r1, [r1, #0x05]
1079 1.1 christos strb r2, [r0]
1080 1.1 christos strh r3, [r0, #0x01]
1081 1.1 christos strh ip, [r0, #0x03]
1082 1.1 christos strb r1, [r0, #0x05]
1083 1.3 matt RET
1084 1.1 christos LMEMCPY_6_PAD
1085 1.1 christos
1086 1.1 christos /*
1087 1.1 christos * 1110: dst is 8-bit aligned, src is 16-bit aligned
1088 1.1 christos */
1089 1.1 christos ldrh r2, [r1] /* BE:r2 = ..01 LE:r2 = ..10 */
1090 1.1 christos ldr r1, [r1, #0x02] /* BE:r1 = 2345 LE:r1 = 5432 */
1091 1.1 christos #ifdef __ARMEB__
1092 1.1 christos mov r3, r2, lsr #8 /* r3 = ...0 */
1093 1.1 christos strb r3, [r0]
1094 1.1 christos mov r2, r2, lsl #24 /* r2 = 1... */
1095 1.1 christos orr r2, r2, r1, lsr #8 /* r2 = 1234 */
1096 1.1 christos #else
1097 1.1 christos strb r2, [r0]
1098 1.1 christos mov r2, r2, lsr #8 /* r2 = ...1 */
1099 1.1 christos orr r2, r2, r1, lsl #8 /* r2 = 4321 */
1100 1.1 christos mov r1, r1, lsr #24 /* r1 = ...5 */
1101 1.1 christos #endif
1102 1.1 christos str r2, [r0, #0x01]
1103 1.1 christos strb r1, [r0, #0x05]
1104 1.3 matt RET
1105 1.1 christos LMEMCPY_6_PAD
1106 1.1 christos
1107 1.1 christos /*
1108 1.1 christos * 1111: dst is 8-bit aligned, src is 8-bit aligned
1109 1.1 christos */
1110 1.1 christos ldrb r2, [r1]
1111 1.1 christos ldr r3, [r1, #0x01]
1112 1.1 christos ldrb r1, [r1, #0x05]
1113 1.1 christos strb r2, [r0]
1114 1.1 christos str r3, [r0, #0x01]
1115 1.1 christos strb r1, [r0, #0x05]
1116 1.3 matt RET
1117 1.1 christos LMEMCPY_6_PAD
1118 1.1 christos
1119 1.1 christos
1120 1.1 christos /******************************************************************************
1121 1.1 christos * Special case for 8 byte copies
1122 1.1 christos */
1123 1.1 christos #define LMEMCPY_8_LOG2 6 /* 64 bytes */
1124 1.1 christos #define LMEMCPY_8_PAD .align LMEMCPY_8_LOG2
1125 1.1 christos LMEMCPY_8_PAD
1126 1.1 christos .Lmemcpy_8:
1127 1.1 christos and r2, r1, #0x03
1128 1.1 christos orr r2, r2, r0, lsl #2
1129 1.1 christos ands r2, r2, #0x0f
1130 1.1 christos sub r3, pc, #0x14
1131 1.1 christos addne pc, r3, r2, lsl #LMEMCPY_8_LOG2
1132 1.1 christos
1133 1.1 christos /*
1134 1.1 christos * 0000: dst is 32-bit aligned, src is 32-bit aligned
1135 1.1 christos */
1136 1.1 christos ldr r2, [r1]
1137 1.1 christos ldr r3, [r1, #0x04]
1138 1.1 christos str r2, [r0]
1139 1.1 christos str r3, [r0, #0x04]
1140 1.3 matt RET
1141 1.1 christos LMEMCPY_8_PAD
1142 1.1 christos
1143 1.1 christos /*
1144 1.1 christos * 0001: dst is 32-bit aligned, src is 8-bit aligned
1145 1.1 christos */
1146 1.1 christos ldr r3, [r1, #-1] /* BE:r3 = x012 LE:r3 = 210x */
1147 1.1 christos ldr r2, [r1, #0x03] /* BE:r2 = 3456 LE:r2 = 6543 */
1148 1.1 christos ldrb r1, [r1, #0x07] /* r1 = ...7 */
1149 1.1 christos #ifdef __ARMEB__
1150 1.1 christos mov r3, r3, lsl #8 /* r3 = 012. */
1151 1.1 christos orr r3, r3, r2, lsr #24 /* r3 = 0123 */
1152 1.1 christos orr r2, r1, r2, lsl #8 /* r2 = 4567 */
1153 1.1 christos #else
1154 1.1 christos mov r3, r3, lsr #8 /* r3 = .210 */
1155 1.1 christos orr r3, r3, r2, lsl #24 /* r3 = 3210 */
1156 1.1 christos mov r1, r1, lsl #24 /* r1 = 7... */
1157 1.1 christos orr r2, r1, r2, lsr #8 /* r2 = 7654 */
1158 1.1 christos #endif
1159 1.1 christos str r3, [r0]
1160 1.1 christos str r2, [r0, #0x04]
1161 1.3 matt RET
1162 1.1 christos LMEMCPY_8_PAD
1163 1.1 christos
1164 1.1 christos /*
1165 1.1 christos * 0010: dst is 32-bit aligned, src is 16-bit aligned
1166 1.1 christos */
1167 1.1 christos ldrh r2, [r1] /* BE:r2 = ..01 LE:r2 = ..10 */
1168 1.1 christos ldr r3, [r1, #0x02] /* BE:r3 = 2345 LE:r3 = 5432 */
1169 1.1 christos ldrh r1, [r1, #0x06] /* BE:r1 = ..67 LE:r1 = ..76 */
1170 1.1 christos #ifdef __ARMEB__
1171 1.1 christos mov r2, r2, lsl #16 /* r2 = 01.. */
1172 1.1 christos orr r2, r2, r3, lsr #16 /* r2 = 0123 */
1173 1.1 christos orr r3, r1, r3, lsl #16 /* r3 = 4567 */
1174 1.1 christos #else
1175 1.1 christos orr r2, r2, r3, lsl #16 /* r2 = 3210 */
1176 1.1 christos mov r3, r3, lsr #16 /* r3 = ..54 */
1177 1.1 christos orr r3, r3, r1, lsl #16 /* r3 = 7654 */
1178 1.1 christos #endif
1179 1.1 christos str r2, [r0]
1180 1.1 christos str r3, [r0, #0x04]
1181 1.3 matt RET
1182 1.1 christos LMEMCPY_8_PAD
1183 1.1 christos
1184 1.1 christos /*
1185 1.1 christos * 0011: dst is 32-bit aligned, src is 8-bit aligned
1186 1.1 christos */
1187 1.1 christos ldrb r3, [r1] /* r3 = ...0 */
1188 1.1 christos ldr r2, [r1, #0x01] /* BE:r2 = 1234 LE:r2 = 4321 */
1189 1.1 christos ldr r1, [r1, #0x05] /* BE:r1 = 567x LE:r1 = x765 */
1190 1.1 christos #ifdef __ARMEB__
1191 1.1 christos mov r3, r3, lsl #24 /* r3 = 0... */
1192 1.1 christos orr r3, r3, r2, lsr #8 /* r3 = 0123 */
1193 1.1 christos mov r2, r2, lsl #24 /* r2 = 4... */
1194 1.1 christos orr r2, r2, r1, lsr #8 /* r2 = 4567 */
1195 1.1 christos #else
1196 1.1 christos orr r3, r3, r2, lsl #8 /* r3 = 3210 */
1197 1.1 christos mov r2, r2, lsr #24 /* r2 = ...4 */
1198 1.1 christos orr r2, r2, r1, lsl #8 /* r2 = 7654 */
1199 1.1 christos #endif
1200 1.1 christos str r3, [r0]
1201 1.1 christos str r2, [r0, #0x04]
1202 1.3 matt RET
1203 1.1 christos LMEMCPY_8_PAD
1204 1.1 christos
1205 1.1 christos /*
1206 1.1 christos * 0100: dst is 8-bit aligned, src is 32-bit aligned
1207 1.1 christos */
1208 1.1 christos ldr r3, [r1] /* BE:r3 = 0123 LE:r3 = 3210 */
1209 1.1 christos ldr r2, [r1, #0x04] /* BE:r2 = 4567 LE:r2 = 7654 */
1210 1.1 christos #ifdef __ARMEB__
1211 1.1 christos mov r1, r3, lsr #24 /* r1 = ...0 */
1212 1.1 christos strb r1, [r0]
1213 1.1 christos mov r1, r3, lsr #8 /* r1 = .012 */
1214 1.1 christos strb r2, [r0, #0x07]
1215 1.1 christos mov r3, r3, lsl #24 /* r3 = 3... */
1216 1.1 christos orr r3, r3, r2, lsr #8 /* r3 = 3456 */
1217 1.1 christos #else
1218 1.1 christos strb r3, [r0]
1219 1.1 christos mov r1, r2, lsr #24 /* r1 = ...7 */
1220 1.1 christos strb r1, [r0, #0x07]
1221 1.1 christos mov r1, r3, lsr #8 /* r1 = .321 */
1222 1.1 christos mov r3, r3, lsr #24 /* r3 = ...3 */
1223 1.1 christos orr r3, r3, r2, lsl #8 /* r3 = 6543 */
1224 1.1 christos #endif
1225 1.1 christos strh r1, [r0, #0x01]
1226 1.1 christos str r3, [r0, #0x03]
1227 1.3 matt RET
1228 1.1 christos LMEMCPY_8_PAD
1229 1.1 christos
1230 1.1 christos /*
1231 1.1 christos * 0101: dst is 8-bit aligned, src is 8-bit aligned
1232 1.1 christos */
1233 1.1 christos ldrb r2, [r1]
1234 1.1 christos ldrh r3, [r1, #0x01]
1235 1.1 christos ldr ip, [r1, #0x03]
1236 1.1 christos ldrb r1, [r1, #0x07]
1237 1.1 christos strb r2, [r0]
1238 1.1 christos strh r3, [r0, #0x01]
1239 1.1 christos str ip, [r0, #0x03]
1240 1.1 christos strb r1, [r0, #0x07]
1241 1.3 matt RET
1242 1.1 christos LMEMCPY_8_PAD
1243 1.1 christos
1244 1.1 christos /*
1245 1.1 christos * 0110: dst is 8-bit aligned, src is 16-bit aligned
1246 1.1 christos */
1247 1.1 christos ldrh r2, [r1] /* BE:r2 = ..01 LE:r2 = ..10 */
1248 1.1 christos ldr r3, [r1, #0x02] /* BE:r3 = 2345 LE:r3 = 5432 */
1249 1.1 christos ldrh r1, [r1, #0x06] /* BE:r1 = ..67 LE:r1 = ..76 */
1250 1.1 christos #ifdef __ARMEB__
1251 1.1 christos mov ip, r2, lsr #8 /* ip = ...0 */
1252 1.1 christos strb ip, [r0]
1253 1.1 christos mov ip, r2, lsl #8 /* ip = .01. */
1254 1.1 christos orr ip, ip, r3, lsr #24 /* ip = .012 */
1255 1.1 christos strb r1, [r0, #0x07]
1256 1.1 christos mov r3, r3, lsl #8 /* r3 = 345. */
1257 1.1 christos orr r3, r3, r1, lsr #8 /* r3 = 3456 */
1258 1.1 christos #else
1259 1.1 christos strb r2, [r0] /* 0 */
1260 1.1 christos mov ip, r1, lsr #8 /* ip = ...7 */
1261 1.1 christos strb ip, [r0, #0x07] /* 7 */
1262 1.1 christos mov ip, r2, lsr #8 /* ip = ...1 */
1263 1.1 christos orr ip, ip, r3, lsl #8 /* ip = 4321 */
1264 1.1 christos mov r3, r3, lsr #8 /* r3 = .543 */
1265 1.1 christos orr r3, r3, r1, lsl #24 /* r3 = 6543 */
1266 1.1 christos #endif
1267 1.1 christos strh ip, [r0, #0x01]
1268 1.1 christos str r3, [r0, #0x03]
1269 1.3 matt RET
1270 1.1 christos LMEMCPY_8_PAD
1271 1.1 christos
1272 1.1 christos /*
1273 1.1 christos * 0111: dst is 8-bit aligned, src is 8-bit aligned
1274 1.1 christos */
1275 1.1 christos ldrb r3, [r1] /* r3 = ...0 */
1276 1.1 christos ldr ip, [r1, #0x01] /* BE:ip = 1234 LE:ip = 4321 */
1277 1.1 christos ldrh r2, [r1, #0x05] /* BE:r2 = ..56 LE:r2 = ..65 */
1278 1.1 christos ldrb r1, [r1, #0x07] /* r1 = ...7 */
1279 1.1 christos strb r3, [r0]
1280 1.1 christos mov r3, ip, lsr #16 /* BE:r3 = ..12 LE:r3 = ..43 */
1281 1.1 christos #ifdef __ARMEB__
1282 1.1 christos strh r3, [r0, #0x01]
1283 1.1 christos orr r2, r2, ip, lsl #16 /* r2 = 3456 */
1284 1.1 christos #else
1285 1.1 christos strh ip, [r0, #0x01]
1286 1.1 christos orr r2, r3, r2, lsl #16 /* r2 = 6543 */
1287 1.1 christos #endif
1288 1.1 christos str r2, [r0, #0x03]
1289 1.1 christos strb r1, [r0, #0x07]
1290 1.3 matt RET
1291 1.1 christos LMEMCPY_8_PAD
1292 1.1 christos
1293 1.1 christos /*
1294 1.1 christos * 1000: dst is 16-bit aligned, src is 32-bit aligned
1295 1.1 christos */
1296 1.1 christos ldr r2, [r1] /* BE:r2 = 0123 LE:r2 = 3210 */
1297 1.1 christos ldr r3, [r1, #0x04] /* BE:r3 = 4567 LE:r3 = 7654 */
1298 1.1 christos mov r1, r2, lsr #16 /* BE:r1 = ..01 LE:r1 = ..32 */
1299 1.1 christos #ifdef __ARMEB__
1300 1.1 christos strh r1, [r0]
1301 1.1 christos mov r1, r3, lsr #16 /* r1 = ..45 */
1302 1.1 christos orr r2, r1 ,r2, lsl #16 /* r2 = 2345 */
1303 1.1 christos #else
1304 1.1 christos strh r2, [r0]
1305 1.1 christos orr r2, r1, r3, lsl #16 /* r2 = 5432 */
1306 1.1 christos mov r3, r3, lsr #16 /* r3 = ..76 */
1307 1.1 christos #endif
1308 1.1 christos str r2, [r0, #0x02]
1309 1.1 christos strh r3, [r0, #0x06]
1310 1.3 matt RET
1311 1.1 christos LMEMCPY_8_PAD
1312 1.1 christos
1313 1.1 christos /*
1314 1.1 christos * 1001: dst is 16-bit aligned, src is 8-bit aligned
1315 1.1 christos */
1316 1.1 christos ldr r2, [r1, #-1] /* BE:r2 = x012 LE:r2 = 210x */
1317 1.1 christos ldr r3, [r1, #0x03] /* BE:r3 = 3456 LE:r3 = 6543 */
1318 1.1 christos ldrb ip, [r1, #0x07] /* ip = ...7 */
1319 1.1 christos mov r1, r2, lsr #8 /* BE:r1 = .x01 LE:r1 = .210 */
1320 1.1 christos strh r1, [r0]
1321 1.1 christos #ifdef __ARMEB__
1322 1.1 christos mov r1, r2, lsl #24 /* r1 = 2... */
1323 1.1 christos orr r1, r1, r3, lsr #8 /* r1 = 2345 */
1324 1.1 christos orr r3, ip, r3, lsl #8 /* r3 = 4567 */
1325 1.1 christos #else
1326 1.1 christos mov r1, r2, lsr #24 /* r1 = ...2 */
1327 1.1 christos orr r1, r1, r3, lsl #8 /* r1 = 5432 */
1328 1.1 christos mov r3, r3, lsr #24 /* r3 = ...6 */
1329 1.1 christos orr r3, r3, ip, lsl #8 /* r3 = ..76 */
1330 1.1 christos #endif
1331 1.1 christos str r1, [r0, #0x02]
1332 1.1 christos strh r3, [r0, #0x06]
1333 1.3 matt RET
1334 1.1 christos LMEMCPY_8_PAD
1335 1.1 christos
1336 1.1 christos /*
1337 1.1 christos * 1010: dst is 16-bit aligned, src is 16-bit aligned
1338 1.1 christos */
1339 1.1 christos ldrh r2, [r1]
1340 1.1 christos ldr ip, [r1, #0x02]
1341 1.1 christos ldrh r3, [r1, #0x06]
1342 1.1 christos strh r2, [r0]
1343 1.1 christos str ip, [r0, #0x02]
1344 1.1 christos strh r3, [r0, #0x06]
1345 1.3 matt RET
1346 1.1 christos LMEMCPY_8_PAD
1347 1.1 christos
1348 1.1 christos /*
1349 1.1 christos * 1011: dst is 16-bit aligned, src is 8-bit aligned
1350 1.1 christos */
1351 1.1 christos ldr r3, [r1, #0x05] /* BE:r3 = 567x LE:r3 = x765 */
1352 1.1 christos ldr r2, [r1, #0x01] /* BE:r2 = 1234 LE:r2 = 4321 */
1353 1.1 christos ldrb ip, [r1] /* ip = ...0 */
1354 1.1 christos mov r1, r3, lsr #8 /* BE:r1 = .567 LE:r1 = .x76 */
1355 1.1 christos strh r1, [r0, #0x06]
1356 1.1 christos #ifdef __ARMEB__
1357 1.1 christos mov r3, r3, lsr #24 /* r3 = ...5 */
1358 1.1 christos orr r3, r3, r2, lsl #8 /* r3 = 2345 */
1359 1.1 christos mov r2, r2, lsr #24 /* r2 = ...1 */
1360 1.1 christos orr r2, r2, ip, lsl #8 /* r2 = ..01 */
1361 1.1 christos #else
1362 1.1 christos mov r3, r3, lsl #24 /* r3 = 5... */
1363 1.1 christos orr r3, r3, r2, lsr #8 /* r3 = 5432 */
1364 1.1 christos orr r2, ip, r2, lsl #8 /* r2 = 3210 */
1365 1.1 christos #endif
1366 1.1 christos str r3, [r0, #0x02]
1367 1.1 christos strh r2, [r0]
1368 1.3 matt RET
1369 1.1 christos LMEMCPY_8_PAD
1370 1.1 christos
1371 1.1 christos /*
1372 1.1 christos * 1100: dst is 8-bit aligned, src is 32-bit aligned
1373 1.1 christos */
1374 1.1 christos ldr r3, [r1, #0x04] /* BE:r3 = 4567 LE:r3 = 7654 */
1375 1.1 christos ldr r2, [r1] /* BE:r2 = 0123 LE:r2 = 3210 */
1376 1.1 christos mov r1, r3, lsr #8 /* BE:r1 = .456 LE:r1 = .765 */
1377 1.1 christos strh r1, [r0, #0x05]
1378 1.1 christos #ifdef __ARMEB__
1379 1.1 christos strb r3, [r0, #0x07]
1380 1.1 christos mov r1, r2, lsr #24 /* r1 = ...0 */
1381 1.1 christos strb r1, [r0]
1382 1.1 christos mov r2, r2, lsl #8 /* r2 = 123. */
1383 1.1 christos orr r2, r2, r3, lsr #24 /* r2 = 1234 */
1384 1.1 christos str r2, [r0, #0x01]
1385 1.1 christos #else
1386 1.1 christos strb r2, [r0]
1387 1.1 christos mov r1, r3, lsr #24 /* r1 = ...7 */
1388 1.1 christos strb r1, [r0, #0x07]
1389 1.1 christos mov r2, r2, lsr #8 /* r2 = .321 */
1390 1.1 christos orr r2, r2, r3, lsl #24 /* r2 = 4321 */
1391 1.1 christos str r2, [r0, #0x01]
1392 1.1 christos #endif
1393 1.3 matt RET
1394 1.1 christos LMEMCPY_8_PAD
1395 1.1 christos
1396 1.1 christos /*
1397 1.1 christos * 1101: dst is 8-bit aligned, src is 8-bit aligned
1398 1.1 christos */
1399 1.1 christos ldrb r3, [r1] /* r3 = ...0 */
1400 1.1 christos ldrh r2, [r1, #0x01] /* BE:r2 = ..12 LE:r2 = ..21 */
1401 1.1 christos ldr ip, [r1, #0x03] /* BE:ip = 3456 LE:ip = 6543 */
1402 1.1 christos ldrb r1, [r1, #0x07] /* r1 = ...7 */
1403 1.1 christos strb r3, [r0]
1404 1.1 christos mov r3, ip, lsr #16 /* BE:r3 = ..34 LE:r3 = ..65 */
1405 1.1 christos #ifdef __ARMEB__
1406 1.1 christos strh ip, [r0, #0x05]
1407 1.1 christos orr r2, r3, r2, lsl #16 /* r2 = 1234 */
1408 1.1 christos #else
1409 1.1 christos strh r3, [r0, #0x05]
1410 1.1 christos orr r2, r2, ip, lsl #16 /* r2 = 4321 */
1411 1.1 christos #endif
1412 1.1 christos str r2, [r0, #0x01]
1413 1.1 christos strb r1, [r0, #0x07]
1414 1.3 matt RET
1415 1.1 christos LMEMCPY_8_PAD
1416 1.1 christos
1417 1.1 christos /*
1418 1.1 christos * 1110: dst is 8-bit aligned, src is 16-bit aligned
1419 1.1 christos */
1420 1.1 christos ldrh r2, [r1] /* BE:r2 = ..01 LE:r2 = ..10 */
1421 1.1 christos ldr r3, [r1, #0x02] /* BE:r3 = 2345 LE:r3 = 5432 */
1422 1.1 christos ldrh r1, [r1, #0x06] /* BE:r1 = ..67 LE:r1 = ..76 */
1423 1.1 christos #ifdef __ARMEB__
1424 1.1 christos mov ip, r2, lsr #8 /* ip = ...0 */
1425 1.1 christos strb ip, [r0]
1426 1.1 christos mov ip, r2, lsl #24 /* ip = 1... */
1427 1.1 christos orr ip, ip, r3, lsr #8 /* ip = 1234 */
1428 1.1 christos strb r1, [r0, #0x07]
1429 1.1 christos mov r1, r1, lsr #8 /* r1 = ...6 */
1430 1.1 christos orr r1, r1, r3, lsl #8 /* r1 = 3456 */
1431 1.1 christos #else
1432 1.1 christos strb r2, [r0]
1433 1.1 christos mov ip, r2, lsr #8 /* ip = ...1 */
1434 1.1 christos orr ip, ip, r3, lsl #8 /* ip = 4321 */
1435 1.1 christos mov r2, r1, lsr #8 /* r2 = ...7 */
1436 1.1 christos strb r2, [r0, #0x07]
1437 1.1 christos mov r1, r1, lsl #8 /* r1 = .76. */
1438 1.1 christos orr r1, r1, r3, lsr #24 /* r1 = .765 */
1439 1.1 christos #endif
1440 1.1 christos str ip, [r0, #0x01]
1441 1.1 christos strh r1, [r0, #0x05]
1442 1.3 matt RET
1443 1.1 christos LMEMCPY_8_PAD
1444 1.1 christos
1445 1.1 christos /*
1446 1.1 christos * 1111: dst is 8-bit aligned, src is 8-bit aligned
1447 1.1 christos */
1448 1.1 christos ldrb r2, [r1]
1449 1.1 christos ldr ip, [r1, #0x01]
1450 1.1 christos ldrh r3, [r1, #0x05]
1451 1.1 christos ldrb r1, [r1, #0x07]
1452 1.1 christos strb r2, [r0]
1453 1.1 christos str ip, [r0, #0x01]
1454 1.1 christos strh r3, [r0, #0x05]
1455 1.1 christos strb r1, [r0, #0x07]
1456 1.3 matt RET
1457 1.1 christos LMEMCPY_8_PAD
1458 1.1 christos
1459 1.1 christos /******************************************************************************
1460 1.1 christos * Special case for 12 byte copies
1461 1.1 christos */
1462 1.1 christos #define LMEMCPY_C_LOG2 7 /* 128 bytes */
1463 1.1 christos #define LMEMCPY_C_PAD .align LMEMCPY_C_LOG2
1464 1.1 christos LMEMCPY_C_PAD
1465 1.1 christos .Lmemcpy_c:
1466 1.1 christos and r2, r1, #0x03
1467 1.1 christos orr r2, r2, r0, lsl #2
1468 1.1 christos ands r2, r2, #0x0f
1469 1.1 christos sub r3, pc, #0x14
1470 1.1 christos addne pc, r3, r2, lsl #LMEMCPY_C_LOG2
1471 1.1 christos
1472 1.1 christos /*
1473 1.1 christos * 0000: dst is 32-bit aligned, src is 32-bit aligned
1474 1.1 christos */
1475 1.1 christos ldr r2, [r1]
1476 1.1 christos ldr r3, [r1, #0x04]
1477 1.1 christos ldr r1, [r1, #0x08]
1478 1.1 christos str r2, [r0]
1479 1.1 christos str r3, [r0, #0x04]
1480 1.1 christos str r1, [r0, #0x08]
1481 1.3 matt RET
1482 1.1 christos LMEMCPY_C_PAD
1483 1.1 christos
1484 1.1 christos /*
1485 1.1 christos * 0001: dst is 32-bit aligned, src is 8-bit aligned
1486 1.1 christos */
1487 1.1 christos ldrb r2, [r1, #0xb] /* r2 = ...B */
1488 1.1 christos ldr ip, [r1, #0x07] /* BE:ip = 789A LE:ip = A987 */
1489 1.1 christos ldr r3, [r1, #0x03] /* BE:r3 = 3456 LE:r3 = 6543 */
1490 1.1 christos ldr r1, [r1, #-1] /* BE:r1 = x012 LE:r1 = 210x */
1491 1.1 christos #ifdef __ARMEB__
1492 1.1 christos orr r2, r2, ip, lsl #8 /* r2 = 89AB */
1493 1.1 christos str r2, [r0, #0x08]
1494 1.1 christos mov r2, ip, lsr #24 /* r2 = ...7 */
1495 1.1 christos orr r2, r2, r3, lsl #8 /* r2 = 4567 */
1496 1.1 christos mov r1, r1, lsl #8 /* r1 = 012. */
1497 1.1 christos orr r1, r1, r3, lsr #24 /* r1 = 0123 */
1498 1.1 christos #else
1499 1.1 christos mov r2, r2, lsl #24 /* r2 = B... */
1500 1.1 christos orr r2, r2, ip, lsr #8 /* r2 = BA98 */
1501 1.1 christos str r2, [r0, #0x08]
1502 1.1 christos mov r2, ip, lsl #24 /* r2 = 7... */
1503 1.1 christos orr r2, r2, r3, lsr #8 /* r2 = 7654 */
1504 1.1 christos mov r1, r1, lsr #8 /* r1 = .210 */
1505 1.1 christos orr r1, r1, r3, lsl #24 /* r1 = 3210 */
1506 1.1 christos #endif
1507 1.1 christos str r2, [r0, #0x04]
1508 1.1 christos str r1, [r0]
1509 1.3 matt RET
1510 1.1 christos LMEMCPY_C_PAD
1511 1.1 christos
1512 1.1 christos /*
1513 1.1 christos * 0010: dst is 32-bit aligned, src is 16-bit aligned
1514 1.1 christos */
1515 1.1 christos ldrh r2, [r1] /* BE:r2 = ..01 LE:r2 = ..10 */
1516 1.1 christos ldr r3, [r1, #0x02] /* BE:r3 = 2345 LE:r3 = 5432 */
1517 1.1 christos ldr ip, [r1, #0x06] /* BE:ip = 6789 LE:ip = 9876 */
1518 1.1 christos ldrh r1, [r1, #0x0a] /* BE:r1 = ..AB LE:r1 = ..BA */
1519 1.1 christos #ifdef __ARMEB__
1520 1.1 christos mov r2, r2, lsl #16 /* r2 = 01.. */
1521 1.1 christos orr r2, r2, r3, lsr #16 /* r2 = 0123 */
1522 1.1 christos str r2, [r0]
1523 1.1 christos mov r3, r3, lsl #16 /* r3 = 45.. */
1524 1.1 christos orr r3, r3, ip, lsr #16 /* r3 = 4567 */
1525 1.1 christos orr r1, r1, ip, lsl #16 /* r1 = 89AB */
1526 1.1 christos #else
1527 1.1 christos orr r2, r2, r3, lsl #16 /* r2 = 3210 */
1528 1.1 christos str r2, [r0]
1529 1.1 christos mov r3, r3, lsr #16 /* r3 = ..54 */
1530 1.1 christos orr r3, r3, ip, lsl #16 /* r3 = 7654 */
1531 1.1 christos mov r1, r1, lsl #16 /* r1 = BA.. */
1532 1.1 christos orr r1, r1, ip, lsr #16 /* r1 = BA98 */
1533 1.1 christos #endif
1534 1.1 christos str r3, [r0, #0x04]
1535 1.1 christos str r1, [r0, #0x08]
1536 1.3 matt RET
1537 1.1 christos LMEMCPY_C_PAD
1538 1.1 christos
1539 1.1 christos /*
1540 1.1 christos * 0011: dst is 32-bit aligned, src is 8-bit aligned
1541 1.1 christos */
1542 1.1 christos ldrb r2, [r1] /* r2 = ...0 */
1543 1.1 christos ldr r3, [r1, #0x01] /* BE:r3 = 1234 LE:r3 = 4321 */
1544 1.1 christos ldr ip, [r1, #0x05] /* BE:ip = 5678 LE:ip = 8765 */
1545 1.1 christos ldr r1, [r1, #0x09] /* BE:r1 = 9ABx LE:r1 = xBA9 */
1546 1.1 christos #ifdef __ARMEB__
1547 1.1 christos mov r2, r2, lsl #24 /* r2 = 0... */
1548 1.1 christos orr r2, r2, r3, lsr #8 /* r2 = 0123 */
1549 1.1 christos str r2, [r0]
1550 1.1 christos mov r3, r3, lsl #24 /* r3 = 4... */
1551 1.1 christos orr r3, r3, ip, lsr #8 /* r3 = 4567 */
1552 1.1 christos mov r1, r1, lsr #8 /* r1 = .9AB */
1553 1.1 christos orr r1, r1, ip, lsl #24 /* r1 = 89AB */
1554 1.1 christos #else
1555 1.1 christos orr r2, r2, r3, lsl #8 /* r2 = 3210 */
1556 1.1 christos str r2, [r0]
1557 1.1 christos mov r3, r3, lsr #24 /* r3 = ...4 */
1558 1.1 christos orr r3, r3, ip, lsl #8 /* r3 = 7654 */
1559 1.1 christos mov r1, r1, lsl #8 /* r1 = BA9. */
1560 1.1 christos orr r1, r1, ip, lsr #24 /* r1 = BA98 */
1561 1.1 christos #endif
1562 1.1 christos str r3, [r0, #0x04]
1563 1.1 christos str r1, [r0, #0x08]
1564 1.3 matt RET
1565 1.1 christos LMEMCPY_C_PAD
1566 1.1 christos
1567 1.1 christos /*
1568 1.1 christos * 0100: dst is 8-bit aligned (byte 1), src is 32-bit aligned
1569 1.1 christos */
1570 1.1 christos ldr r2, [r1] /* BE:r2 = 0123 LE:r2 = 3210 */
1571 1.1 christos ldr r3, [r1, #0x04] /* BE:r3 = 4567 LE:r3 = 7654 */
1572 1.1 christos ldr ip, [r1, #0x08] /* BE:ip = 89AB LE:ip = BA98 */
1573 1.1 christos mov r1, r2, lsr #8 /* BE:r1 = .012 LE:r1 = .321 */
1574 1.1 christos strh r1, [r0, #0x01]
1575 1.1 christos #ifdef __ARMEB__
1576 1.1 christos mov r1, r2, lsr #24 /* r1 = ...0 */
1577 1.1 christos strb r1, [r0]
1578 1.1 christos mov r1, r2, lsl #24 /* r1 = 3... */
1579 1.1 christos orr r2, r1, r3, lsr #8 /* r1 = 3456 */
1580 1.1 christos mov r1, r3, lsl #24 /* r1 = 7... */
1581 1.1 christos orr r1, r1, ip, lsr #8 /* r1 = 789A */
1582 1.1 christos #else
1583 1.1 christos strb r2, [r0]
1584 1.1 christos mov r1, r2, lsr #24 /* r1 = ...3 */
1585 1.1 christos orr r2, r1, r3, lsl #8 /* r1 = 6543 */
1586 1.1 christos mov r1, r3, lsr #24 /* r1 = ...7 */
1587 1.1 christos orr r1, r1, ip, lsl #8 /* r1 = A987 */
1588 1.1 christos mov ip, ip, lsr #24 /* ip = ...B */
1589 1.1 christos #endif
1590 1.1 christos str r2, [r0, #0x03]
1591 1.1 christos str r1, [r0, #0x07]
1592 1.1 christos strb ip, [r0, #0x0b]
1593 1.3 matt RET
1594 1.1 christos LMEMCPY_C_PAD
1595 1.1 christos
1596 1.1 christos /*
1597 1.1 christos * 0101: dst is 8-bit aligned (byte 1), src is 8-bit aligned (byte 1)
1598 1.1 christos */
1599 1.1 christos ldrb r2, [r1]
1600 1.1 christos ldrh r3, [r1, #0x01]
1601 1.1 christos ldr ip, [r1, #0x03]
1602 1.1 christos strb r2, [r0]
1603 1.1 christos ldr r2, [r1, #0x07]
1604 1.1 christos ldrb r1, [r1, #0x0b]
1605 1.1 christos strh r3, [r0, #0x01]
1606 1.1 christos str ip, [r0, #0x03]
1607 1.1 christos str r2, [r0, #0x07]
1608 1.1 christos strb r1, [r0, #0x0b]
1609 1.3 matt RET
1610 1.1 christos LMEMCPY_C_PAD
1611 1.1 christos
1612 1.1 christos /*
1613 1.1 christos * 0110: dst is 8-bit aligned (byte 1), src is 16-bit aligned
1614 1.1 christos */
1615 1.1 christos ldrh r2, [r1] /* BE:r2 = ..01 LE:r2 = ..10 */
1616 1.1 christos ldr r3, [r1, #0x02] /* BE:r3 = 2345 LE:r3 = 5432 */
1617 1.1 christos ldr ip, [r1, #0x06] /* BE:ip = 6789 LE:ip = 9876 */
1618 1.1 christos ldrh r1, [r1, #0x0a] /* BE:r1 = ..AB LE:r1 = ..BA */
1619 1.1 christos #ifdef __ARMEB__
1620 1.1 christos mov r2, r2, ror #8 /* r2 = 1..0 */
1621 1.1 christos strb r2, [r0]
1622 1.1 christos mov r2, r2, lsr #16 /* r2 = ..1. */
1623 1.1 christos orr r2, r2, r3, lsr #24 /* r2 = ..12 */
1624 1.1 christos strh r2, [r0, #0x01]
1625 1.1 christos mov r2, r3, lsl #8 /* r2 = 345. */
1626 1.1 christos orr r3, r2, ip, lsr #24 /* r3 = 3456 */
1627 1.1 christos mov r2, ip, lsl #8 /* r2 = 789. */
1628 1.1 christos orr r2, r2, r1, lsr #8 /* r2 = 789A */
1629 1.1 christos #else
1630 1.1 christos strb r2, [r0]
1631 1.1 christos mov r2, r2, lsr #8 /* r2 = ...1 */
1632 1.1 christos orr r2, r2, r3, lsl #8 /* r2 = 4321 */
1633 1.1 christos strh r2, [r0, #0x01]
1634 1.1 christos mov r2, r3, lsr #8 /* r2 = .543 */
1635 1.1 christos orr r3, r2, ip, lsl #24 /* r3 = 6543 */
1636 1.1 christos mov r2, ip, lsr #8 /* r2 = .987 */
1637 1.1 christos orr r2, r2, r1, lsl #24 /* r2 = A987 */
1638 1.1 christos mov r1, r1, lsr #8 /* r1 = ...B */
1639 1.1 christos #endif
1640 1.1 christos str r3, [r0, #0x03]
1641 1.1 christos str r2, [r0, #0x07]
1642 1.1 christos strb r1, [r0, #0x0b]
1643 1.3 matt RET
1644 1.1 christos LMEMCPY_C_PAD
1645 1.1 christos
1646 1.1 christos /*
1647 1.1 christos * 0111: dst is 8-bit aligned (byte 1), src is 8-bit aligned (byte 3)
1648 1.1 christos */
1649 1.1 christos ldrb r2, [r1]
1650 1.1 christos ldr r3, [r1, #0x01] /* BE:r3 = 1234 LE:r3 = 4321 */
1651 1.1 christos ldr ip, [r1, #0x05] /* BE:ip = 5678 LE:ip = 8765 */
1652 1.1 christos ldr r1, [r1, #0x09] /* BE:r1 = 9ABx LE:r1 = xBA9 */
1653 1.1 christos strb r2, [r0]
1654 1.1 christos #ifdef __ARMEB__
1655 1.1 christos mov r2, r3, lsr #16 /* r2 = ..12 */
1656 1.1 christos strh r2, [r0, #0x01]
1657 1.1 christos mov r3, r3, lsl #16 /* r3 = 34.. */
1658 1.1 christos orr r3, r3, ip, lsr #16 /* r3 = 3456 */
1659 1.1 christos mov ip, ip, lsl #16 /* ip = 78.. */
1660 1.1 christos orr ip, ip, r1, lsr #16 /* ip = 789A */
1661 1.1 christos mov r1, r1, lsr #8 /* r1 = .9AB */
1662 1.1 christos #else
1663 1.1 christos strh r3, [r0, #0x01]
1664 1.1 christos mov r3, r3, lsr #16 /* r3 = ..43 */
1665 1.1 christos orr r3, r3, ip, lsl #16 /* r3 = 6543 */
1666 1.1 christos mov ip, ip, lsr #16 /* ip = ..87 */
1667 1.1 christos orr ip, ip, r1, lsl #16 /* ip = A987 */
1668 1.1 christos mov r1, r1, lsr #16 /* r1 = ..xB */
1669 1.1 christos #endif
1670 1.1 christos str r3, [r0, #0x03]
1671 1.1 christos str ip, [r0, #0x07]
1672 1.1 christos strb r1, [r0, #0x0b]
1673 1.3 matt RET
1674 1.1 christos LMEMCPY_C_PAD
1675 1.1 christos
1676 1.1 christos /*
1677 1.1 christos * 1000: dst is 16-bit aligned, src is 32-bit aligned
1678 1.1 christos */
1679 1.1 christos ldr ip, [r1] /* BE:ip = 0123 LE:ip = 3210 */
1680 1.1 christos ldr r3, [r1, #0x04] /* BE:r3 = 4567 LE:r3 = 7654 */
1681 1.1 christos ldr r2, [r1, #0x08] /* BE:r2 = 89AB LE:r2 = BA98 */
1682 1.1 christos mov r1, ip, lsr #16 /* BE:r1 = ..01 LE:r1 = ..32 */
1683 1.1 christos #ifdef __ARMEB__
1684 1.1 christos strh r1, [r0]
1685 1.1 christos mov r1, ip, lsl #16 /* r1 = 23.. */
1686 1.1 christos orr r1, r1, r3, lsr #16 /* r1 = 2345 */
1687 1.1 christos mov r3, r3, lsl #16 /* r3 = 67.. */
1688 1.1 christos orr r3, r3, r2, lsr #16 /* r3 = 6789 */
1689 1.1 christos #else
1690 1.1 christos strh ip, [r0]
1691 1.1 christos orr r1, r1, r3, lsl #16 /* r1 = 5432 */
1692 1.1 christos mov r3, r3, lsr #16 /* r3 = ..76 */
1693 1.1 christos orr r3, r3, r2, lsl #16 /* r3 = 9876 */
1694 1.1 christos mov r2, r2, lsr #16 /* r2 = ..BA */
1695 1.1 christos #endif
1696 1.1 christos str r1, [r0, #0x02]
1697 1.1 christos str r3, [r0, #0x06]
1698 1.1 christos strh r2, [r0, #0x0a]
1699 1.3 matt RET
1700 1.1 christos LMEMCPY_C_PAD
1701 1.1 christos
1702 1.1 christos /*
1703 1.1 christos * 1001: dst is 16-bit aligned, src is 8-bit aligned (byte 1)
1704 1.1 christos */
1705 1.1 christos ldr r2, [r1, #-1] /* BE:r2 = x012 LE:r2 = 210x */
1706 1.1 christos ldr r3, [r1, #0x03] /* BE:r3 = 3456 LE:r3 = 6543 */
1707 1.1 christos mov ip, r2, lsr #8 /* BE:ip = .x01 LE:ip = .210 */
1708 1.1 christos strh ip, [r0]
1709 1.1 christos ldr ip, [r1, #0x07] /* BE:ip = 789A LE:ip = A987 */
1710 1.1 christos ldrb r1, [r1, #0x0b] /* r1 = ...B */
1711 1.1 christos #ifdef __ARMEB__
1712 1.1 christos mov r2, r2, lsl #24 /* r2 = 2... */
1713 1.1 christos orr r2, r2, r3, lsr #8 /* r2 = 2345 */
1714 1.1 christos mov r3, r3, lsl #24 /* r3 = 6... */
1715 1.1 christos orr r3, r3, ip, lsr #8 /* r3 = 6789 */
1716 1.1 christos orr r1, r1, ip, lsl #8 /* r1 = 89AB */
1717 1.1 christos #else
1718 1.1 christos mov r2, r2, lsr #24 /* r2 = ...2 */
1719 1.1 christos orr r2, r2, r3, lsl #8 /* r2 = 5432 */
1720 1.1 christos mov r3, r3, lsr #24 /* r3 = ...6 */
1721 1.1 christos orr r3, r3, ip, lsl #8 /* r3 = 9876 */
1722 1.1 christos mov r1, r1, lsl #8 /* r1 = ..B. */
1723 1.1 christos orr r1, r1, ip, lsr #24 /* r1 = ..BA */
1724 1.1 christos #endif
1725 1.1 christos str r2, [r0, #0x02]
1726 1.1 christos str r3, [r0, #0x06]
1727 1.1 christos strh r1, [r0, #0x0a]
1728 1.3 matt RET
1729 1.1 christos LMEMCPY_C_PAD
1730 1.1 christos
1731 1.1 christos /*
1732 1.1 christos * 1010: dst is 16-bit aligned, src is 16-bit aligned
1733 1.1 christos */
1734 1.1 christos ldrh r2, [r1]
1735 1.1 christos ldr r3, [r1, #0x02]
1736 1.1 christos ldr ip, [r1, #0x06]
1737 1.1 christos ldrh r1, [r1, #0x0a]
1738 1.1 christos strh r2, [r0]
1739 1.1 christos str r3, [r0, #0x02]
1740 1.1 christos str ip, [r0, #0x06]
1741 1.1 christos strh r1, [r0, #0x0a]
1742 1.3 matt RET
1743 1.1 christos LMEMCPY_C_PAD
1744 1.1 christos
1745 1.1 christos /*
1746 1.1 christos * 1011: dst is 16-bit aligned, src is 8-bit aligned (byte 3)
1747 1.1 christos */
1748 1.1 christos ldr r2, [r1, #0x09] /* BE:r2 = 9ABx LE:r2 = xBA9 */
1749 1.1 christos ldr r3, [r1, #0x05] /* BE:r3 = 5678 LE:r3 = 8765 */
1750 1.1 christos mov ip, r2, lsr #8 /* BE:ip = .9AB LE:ip = .xBA */
1751 1.1 christos strh ip, [r0, #0x0a]
1752 1.1 christos ldr ip, [r1, #0x01] /* BE:ip = 1234 LE:ip = 4321 */
1753 1.1 christos ldrb r1, [r1] /* r1 = ...0 */
1754 1.1 christos #ifdef __ARMEB__
1755 1.1 christos mov r2, r2, lsr #24 /* r2 = ...9 */
1756 1.1 christos orr r2, r2, r3, lsl #8 /* r2 = 6789 */
1757 1.1 christos mov r3, r3, lsr #24 /* r3 = ...5 */
1758 1.1 christos orr r3, r3, ip, lsl #8 /* r3 = 2345 */
1759 1.1 christos mov r1, r1, lsl #8 /* r1 = ..0. */
1760 1.1 christos orr r1, r1, ip, lsr #24 /* r1 = ..01 */
1761 1.1 christos #else
1762 1.1 christos mov r2, r2, lsl #24 /* r2 = 9... */
1763 1.1 christos orr r2, r2, r3, lsr #8 /* r2 = 9876 */
1764 1.1 christos mov r3, r3, lsl #24 /* r3 = 5... */
1765 1.1 christos orr r3, r3, ip, lsr #8 /* r3 = 5432 */
1766 1.1 christos orr r1, r1, ip, lsl #8 /* r1 = 3210 */
1767 1.1 christos #endif
1768 1.1 christos str r2, [r0, #0x06]
1769 1.1 christos str r3, [r0, #0x02]
1770 1.1 christos strh r1, [r0]
1771 1.3 matt RET
1772 1.1 christos LMEMCPY_C_PAD
1773 1.1 christos
1774 1.1 christos /*
1775 1.1 christos * 1100: dst is 8-bit aligned (byte 3), src is 32-bit aligned
1776 1.1 christos */
1777 1.1 christos ldr r2, [r1] /* BE:r2 = 0123 LE:r2 = 3210 */
1778 1.1 christos ldr ip, [r1, #0x04] /* BE:ip = 4567 LE:ip = 7654 */
1779 1.1 christos ldr r1, [r1, #0x08] /* BE:r1 = 89AB LE:r1 = BA98 */
1780 1.1 christos #ifdef __ARMEB__
1781 1.1 christos mov r3, r2, lsr #24 /* r3 = ...0 */
1782 1.1 christos strb r3, [r0]
1783 1.1 christos mov r2, r2, lsl #8 /* r2 = 123. */
1784 1.1 christos orr r2, r2, ip, lsr #24 /* r2 = 1234 */
1785 1.1 christos str r2, [r0, #0x01]
1786 1.1 christos mov r2, ip, lsl #8 /* r2 = 567. */
1787 1.1 christos orr r2, r2, r1, lsr #24 /* r2 = 5678 */
1788 1.1 christos str r2, [r0, #0x05]
1789 1.1 christos mov r2, r1, lsr #8 /* r2 = ..9A */
1790 1.1 christos strh r2, [r0, #0x09]
1791 1.1 christos strb r1, [r0, #0x0b]
1792 1.1 christos #else
1793 1.1 christos strb r2, [r0]
1794 1.1 christos mov r3, r2, lsr #8 /* r3 = .321 */
1795 1.1 christos orr r3, r3, ip, lsl #24 /* r3 = 4321 */
1796 1.1 christos str r3, [r0, #0x01]
1797 1.1 christos mov r3, ip, lsr #8 /* r3 = .765 */
1798 1.1 christos orr r3, r3, r1, lsl #24 /* r3 = 8765 */
1799 1.1 christos str r3, [r0, #0x05]
1800 1.1 christos mov r1, r1, lsr #8 /* r1 = .BA9 */
1801 1.1 christos strh r1, [r0, #0x09]
1802 1.1 christos mov r1, r1, lsr #16 /* r1 = ...B */
1803 1.1 christos strb r1, [r0, #0x0b]
1804 1.1 christos #endif
1805 1.3 matt RET
1806 1.1 christos LMEMCPY_C_PAD
1807 1.1 christos
1808 1.1 christos /*
1809 1.1 christos * 1101: dst is 8-bit aligned (byte 3), src is 8-bit aligned (byte 1)
1810 1.1 christos */
1811 1.1 christos ldrb r2, [r1, #0x0b] /* r2 = ...B */
1812 1.1 christos ldr r3, [r1, #0x07] /* BE:r3 = 789A LE:r3 = A987 */
1813 1.1 christos ldr ip, [r1, #0x03] /* BE:ip = 3456 LE:ip = 6543 */
1814 1.1 christos ldr r1, [r1, #-1] /* BE:r1 = x012 LE:r1 = 210x */
1815 1.1 christos strb r2, [r0, #0x0b]
1816 1.1 christos #ifdef __ARMEB__
1817 1.1 christos strh r3, [r0, #0x09]
1818 1.1 christos mov r3, r3, lsr #16 /* r3 = ..78 */
1819 1.1 christos orr r3, r3, ip, lsl #16 /* r3 = 5678 */
1820 1.1 christos mov ip, ip, lsr #16 /* ip = ..34 */
1821 1.1 christos orr ip, ip, r1, lsl #16 /* ip = 1234 */
1822 1.1 christos mov r1, r1, lsr #16 /* r1 = ..x0 */
1823 1.1 christos #else
1824 1.1 christos mov r2, r3, lsr #16 /* r2 = ..A9 */
1825 1.1 christos strh r2, [r0, #0x09]
1826 1.1 christos mov r3, r3, lsl #16 /* r3 = 87.. */
1827 1.1 christos orr r3, r3, ip, lsr #16 /* r3 = 8765 */
1828 1.1 christos mov ip, ip, lsl #16 /* ip = 43.. */
1829 1.1 christos orr ip, ip, r1, lsr #16 /* ip = 4321 */
1830 1.1 christos mov r1, r1, lsr #8 /* r1 = .210 */
1831 1.1 christos #endif
1832 1.1 christos str r3, [r0, #0x05]
1833 1.1 christos str ip, [r0, #0x01]
1834 1.1 christos strb r1, [r0]
1835 1.3 matt RET
1836 1.1 christos LMEMCPY_C_PAD
1837 1.1 christos
1838 1.1 christos /*
1839 1.1 christos * 1110: dst is 8-bit aligned (byte 3), src is 16-bit aligned
1840 1.1 christos */
1841 1.1 christos #ifdef __ARMEB__
1842 1.1 christos ldrh r2, [r1, #0x0a] /* r2 = ..AB */
1843 1.1 christos ldr ip, [r1, #0x06] /* ip = 6789 */
1844 1.1 christos ldr r3, [r1, #0x02] /* r3 = 2345 */
1845 1.1 christos ldrh r1, [r1] /* r1 = ..01 */
1846 1.1 christos strb r2, [r0, #0x0b]
1847 1.1 christos mov r2, r2, lsr #8 /* r2 = ...A */
1848 1.1 christos orr r2, r2, ip, lsl #8 /* r2 = 789A */
1849 1.1 christos mov ip, ip, lsr #8 /* ip = .678 */
1850 1.1 christos orr ip, ip, r3, lsl #24 /* ip = 5678 */
1851 1.1 christos mov r3, r3, lsr #8 /* r3 = .234 */
1852 1.1 christos orr r3, r3, r1, lsl #24 /* r3 = 1234 */
1853 1.1 christos mov r1, r1, lsr #8 /* r1 = ...0 */
1854 1.1 christos strb r1, [r0]
1855 1.1 christos str r3, [r0, #0x01]
1856 1.1 christos str ip, [r0, #0x05]
1857 1.1 christos strh r2, [r0, #0x09]
1858 1.1 christos #else
1859 1.1 christos ldrh r2, [r1] /* r2 = ..10 */
1860 1.1 christos ldr r3, [r1, #0x02] /* r3 = 5432 */
1861 1.1 christos ldr ip, [r1, #0x06] /* ip = 9876 */
1862 1.1 christos ldrh r1, [r1, #0x0a] /* r1 = ..BA */
1863 1.1 christos strb r2, [r0]
1864 1.1 christos mov r2, r2, lsr #8 /* r2 = ...1 */
1865 1.1 christos orr r2, r2, r3, lsl #8 /* r2 = 4321 */
1866 1.1 christos mov r3, r3, lsr #24 /* r3 = ...5 */
1867 1.1 christos orr r3, r3, ip, lsl #8 /* r3 = 8765 */
1868 1.1 christos mov ip, ip, lsr #24 /* ip = ...9 */
1869 1.1 christos orr ip, ip, r1, lsl #8 /* ip = .BA9 */
1870 1.1 christos mov r1, r1, lsr #8 /* r1 = ...B */
1871 1.1 christos str r2, [r0, #0x01]
1872 1.1 christos str r3, [r0, #0x05]
1873 1.1 christos strh ip, [r0, #0x09]
1874 1.1 christos strb r1, [r0, #0x0b]
1875 1.1 christos #endif
1876 1.3 matt RET
1877 1.1 christos LMEMCPY_C_PAD
1878 1.1 christos
1879 1.1 christos /*
1880 1.1 christos * 1111: dst is 8-bit aligned (byte 3), src is 8-bit aligned (byte 3)
1881 1.1 christos */
1882 1.1 christos ldrb r2, [r1]
1883 1.1 christos ldr r3, [r1, #0x01]
1884 1.1 christos ldr ip, [r1, #0x05]
1885 1.1 christos strb r2, [r0]
1886 1.1 christos ldrh r2, [r1, #0x09]
1887 1.1 christos ldrb r1, [r1, #0x0b]
1888 1.1 christos str r3, [r0, #0x01]
1889 1.1 christos str ip, [r0, #0x05]
1890 1.1 christos strh r2, [r0, #0x09]
1891 1.1 christos strb r1, [r0, #0x0b]
1892 1.3 matt RET
1893 1.4 matt END(memcpy)
1894 1.1 christos #endif /* !_STANDALONE */
1895