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