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