1129202Scognet/* $NetBSD: memcpy_xscale.S,v 1.1 2003/10/14 07:51:45 scw Exp $ */ 2129202Scognet 3129202Scognet/* 4129202Scognet * Copyright 2003 Wasabi Systems, Inc. 5129202Scognet * All rights reserved. 6129202Scognet * 7129202Scognet * Written by Steve C. Woodford for Wasabi Systems, Inc. 8129202Scognet * 9129202Scognet * Redistribution and use in source and binary forms, with or without 10129202Scognet * modification, are permitted provided that the following conditions 11129202Scognet * are met: 12129202Scognet * 1. Redistributions of source code must retain the above copyright 13129202Scognet * notice, this list of conditions and the following disclaimer. 14129202Scognet * 2. Redistributions in binary form must reproduce the above copyright 15129202Scognet * notice, this list of conditions and the following disclaimer in the 16129202Scognet * documentation and/or other materials provided with the distribution. 17129202Scognet * 3. All advertising materials mentioning features or use of this software 18129202Scognet * must display the following acknowledgement: 19129202Scognet * This product includes software developed for the NetBSD Project by 20129202Scognet * Wasabi Systems, Inc. 21129202Scognet * 4. The name of Wasabi Systems, Inc. may not be used to endorse 22129202Scognet * or promote products derived from this software without specific prior 23129202Scognet * written permission. 24129202Scognet * 25129202Scognet * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND 26129202Scognet * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 27129202Scognet * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 28129202Scognet * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC 29129202Scognet * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 30129202Scognet * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 31129202Scognet * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 32129202Scognet * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 33129202Scognet * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 34129202Scognet * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 35129202Scognet * POSSIBILITY OF SUCH DAMAGE. 36129202Scognet */ 37129202Scognet 38129202Scognet#include <machine/asm.h> 39129202Scognet__FBSDID("$FreeBSD$"); 40129202Scognet 41129202Scognet/* LINTSTUB: Func: void *memcpy(void *dst, const void *src, size_t len) */ 42129202ScognetENTRY(memcpy) 43129202Scognet pld [r1] 44129202Scognet cmp r2, #0x0c 45129202Scognet ble .Lmemcpy_short /* <= 12 bytes */ 46129202Scognet mov r3, r0 /* We must not clobber r0 */ 47129202Scognet 48129202Scognet /* Word-align the destination buffer */ 49129202Scognet ands ip, r3, #0x03 /* Already word aligned? */ 50129202Scognet beq .Lmemcpy_wordaligned /* Yup */ 51129202Scognet cmp ip, #0x02 52129202Scognet ldrb ip, [r1], #0x01 53129202Scognet sub r2, r2, #0x01 54129202Scognet strb ip, [r3], #0x01 55129202Scognet ldrleb ip, [r1], #0x01 56129202Scognet suble r2, r2, #0x01 57129202Scognet strleb ip, [r3], #0x01 58129202Scognet ldrltb ip, [r1], #0x01 59129202Scognet sublt r2, r2, #0x01 60129202Scognet strltb ip, [r3], #0x01 61129202Scognet 62129202Scognet /* Destination buffer is now word aligned */ 63129202Scognet.Lmemcpy_wordaligned: 64129202Scognet ands ip, r1, #0x03 /* Is src also word-aligned? */ 65129202Scognet bne .Lmemcpy_bad_align /* Nope. Things just got bad */ 66129202Scognet 67129202Scognet /* Quad-align the destination buffer */ 68129202Scognet tst r3, #0x07 /* Already quad aligned? */ 69129202Scognet ldrne ip, [r1], #0x04 70129202Scognet stmfd sp!, {r4-r9} /* Free up some registers */ 71129202Scognet subne r2, r2, #0x04 72129202Scognet strne ip, [r3], #0x04 73129202Scognet 74129202Scognet /* Destination buffer quad aligned, source is at least word aligned */ 75129202Scognet subs r2, r2, #0x80 76129202Scognet blt .Lmemcpy_w_lessthan128 77129202Scognet 78129202Scognet /* Copy 128 bytes at a time */ 79129202Scognet.Lmemcpy_w_loop128: 80129202Scognet ldr r4, [r1], #0x04 /* LD:00-03 */ 81129202Scognet ldr r5, [r1], #0x04 /* LD:04-07 */ 82129202Scognet pld [r1, #0x18] /* Prefetch 0x20 */ 83129202Scognet ldr r6, [r1], #0x04 /* LD:08-0b */ 84129202Scognet ldr r7, [r1], #0x04 /* LD:0c-0f */ 85129202Scognet ldr r8, [r1], #0x04 /* LD:10-13 */ 86129202Scognet ldr r9, [r1], #0x04 /* LD:14-17 */ 87129202Scognet strd r4, [r3], #0x08 /* ST:00-07 */ 88129202Scognet ldr r4, [r1], #0x04 /* LD:18-1b */ 89129202Scognet ldr r5, [r1], #0x04 /* LD:1c-1f */ 90129202Scognet strd r6, [r3], #0x08 /* ST:08-0f */ 91129202Scognet ldr r6, [r1], #0x04 /* LD:20-23 */ 92129202Scognet ldr r7, [r1], #0x04 /* LD:24-27 */ 93129202Scognet pld [r1, #0x18] /* Prefetch 0x40 */ 94129202Scognet strd r8, [r3], #0x08 /* ST:10-17 */ 95129202Scognet ldr r8, [r1], #0x04 /* LD:28-2b */ 96129202Scognet ldr r9, [r1], #0x04 /* LD:2c-2f */ 97129202Scognet strd r4, [r3], #0x08 /* ST:18-1f */ 98129202Scognet ldr r4, [r1], #0x04 /* LD:30-33 */ 99129202Scognet ldr r5, [r1], #0x04 /* LD:34-37 */ 100129202Scognet strd r6, [r3], #0x08 /* ST:20-27 */ 101129202Scognet ldr r6, [r1], #0x04 /* LD:38-3b */ 102129202Scognet ldr r7, [r1], #0x04 /* LD:3c-3f */ 103129202Scognet strd r8, [r3], #0x08 /* ST:28-2f */ 104129202Scognet ldr r8, [r1], #0x04 /* LD:40-43 */ 105129202Scognet ldr r9, [r1], #0x04 /* LD:44-47 */ 106129202Scognet pld [r1, #0x18] /* Prefetch 0x60 */ 107129202Scognet strd r4, [r3], #0x08 /* ST:30-37 */ 108129202Scognet ldr r4, [r1], #0x04 /* LD:48-4b */ 109129202Scognet ldr r5, [r1], #0x04 /* LD:4c-4f */ 110129202Scognet strd r6, [r3], #0x08 /* ST:38-3f */ 111129202Scognet ldr r6, [r1], #0x04 /* LD:50-53 */ 112129202Scognet ldr r7, [r1], #0x04 /* LD:54-57 */ 113129202Scognet strd r8, [r3], #0x08 /* ST:40-47 */ 114129202Scognet ldr r8, [r1], #0x04 /* LD:58-5b */ 115129202Scognet ldr r9, [r1], #0x04 /* LD:5c-5f */ 116129202Scognet strd r4, [r3], #0x08 /* ST:48-4f */ 117129202Scognet ldr r4, [r1], #0x04 /* LD:60-63 */ 118129202Scognet ldr r5, [r1], #0x04 /* LD:64-67 */ 119129202Scognet pld [r1, #0x18] /* Prefetch 0x80 */ 120129202Scognet strd r6, [r3], #0x08 /* ST:50-57 */ 121129202Scognet ldr r6, [r1], #0x04 /* LD:68-6b */ 122129202Scognet ldr r7, [r1], #0x04 /* LD:6c-6f */ 123129202Scognet strd r8, [r3], #0x08 /* ST:58-5f */ 124129202Scognet ldr r8, [r1], #0x04 /* LD:70-73 */ 125129202Scognet ldr r9, [r1], #0x04 /* LD:74-77 */ 126129202Scognet strd r4, [r3], #0x08 /* ST:60-67 */ 127129202Scognet ldr r4, [r1], #0x04 /* LD:78-7b */ 128129202Scognet ldr r5, [r1], #0x04 /* LD:7c-7f */ 129129202Scognet strd r6, [r3], #0x08 /* ST:68-6f */ 130129202Scognet strd r8, [r3], #0x08 /* ST:70-77 */ 131129202Scognet subs r2, r2, #0x80 132129202Scognet strd r4, [r3], #0x08 /* ST:78-7f */ 133129202Scognet bge .Lmemcpy_w_loop128 134129202Scognet 135129202Scognet.Lmemcpy_w_lessthan128: 136129202Scognet adds r2, r2, #0x80 /* Adjust for extra sub */ 137129202Scognet ldmeqfd sp!, {r4-r9} 138135683Scognet bxeq lr /* Return now if done */ 139129202Scognet subs r2, r2, #0x20 140129202Scognet blt .Lmemcpy_w_lessthan32 141129202Scognet 142129202Scognet /* Copy 32 bytes at a time */ 143129202Scognet.Lmemcpy_w_loop32: 144129202Scognet ldr r4, [r1], #0x04 145129202Scognet ldr r5, [r1], #0x04 146129202Scognet pld [r1, #0x18] 147129202Scognet ldr r6, [r1], #0x04 148129202Scognet ldr r7, [r1], #0x04 149129202Scognet ldr r8, [r1], #0x04 150129202Scognet ldr r9, [r1], #0x04 151129202Scognet strd r4, [r3], #0x08 152129202Scognet ldr r4, [r1], #0x04 153129202Scognet ldr r5, [r1], #0x04 154129202Scognet strd r6, [r3], #0x08 155129202Scognet strd r8, [r3], #0x08 156129202Scognet subs r2, r2, #0x20 157129202Scognet strd r4, [r3], #0x08 158129202Scognet bge .Lmemcpy_w_loop32 159129202Scognet 160129202Scognet.Lmemcpy_w_lessthan32: 161129202Scognet adds r2, r2, #0x20 /* Adjust for extra sub */ 162129202Scognet ldmeqfd sp!, {r4-r9} 163135683Scognet bxeq lr /* Return now if done */ 164129202Scognet 165129202Scognet and r4, r2, #0x18 166129202Scognet rsbs r4, r4, #0x18 167129202Scognet addne pc, pc, r4, lsl #1 168129202Scognet nop 169129202Scognet 170129202Scognet /* At least 24 bytes remaining */ 171129202Scognet ldr r4, [r1], #0x04 172129202Scognet ldr r5, [r1], #0x04 173129202Scognet sub r2, r2, #0x08 174129202Scognet strd r4, [r3], #0x08 175129202Scognet 176129202Scognet /* At least 16 bytes remaining */ 177129202Scognet ldr r4, [r1], #0x04 178129202Scognet ldr r5, [r1], #0x04 179129202Scognet sub r2, r2, #0x08 180129202Scognet strd r4, [r3], #0x08 181129202Scognet 182129202Scognet /* At least 8 bytes remaining */ 183129202Scognet ldr r4, [r1], #0x04 184129202Scognet ldr r5, [r1], #0x04 185129202Scognet subs r2, r2, #0x08 186129202Scognet strd r4, [r3], #0x08 187129202Scognet 188129202Scognet /* Less than 8 bytes remaining */ 189129202Scognet ldmfd sp!, {r4-r9} 190135683Scognet bxeq lr /* Return now if done */ 191129202Scognet subs r2, r2, #0x04 192129202Scognet ldrge ip, [r1], #0x04 193129202Scognet strge ip, [r3], #0x04 194135683Scognet bxeq lr /* Return now if done */ 195129202Scognet addlt r2, r2, #0x04 196129202Scognet ldrb ip, [r1], #0x01 197129202Scognet cmp r2, #0x02 198129202Scognet ldrgeb r2, [r1], #0x01 199129202Scognet strb ip, [r3], #0x01 200129202Scognet ldrgtb ip, [r1] 201129202Scognet strgeb r2, [r3], #0x01 202129202Scognet strgtb ip, [r3] 203135683Scognet bx lr 204129202Scognet 205129202Scognet 206129202Scognet/* 207129202Scognet * At this point, it has not been possible to word align both buffers. 208129202Scognet * The destination buffer is word aligned, but the source buffer is not. 209129202Scognet */ 210129202Scognet.Lmemcpy_bad_align: 211129202Scognet stmfd sp!, {r4-r7} 212129202Scognet bic r1, r1, #0x03 213129202Scognet cmp ip, #2 214129202Scognet ldr ip, [r1], #0x04 215129202Scognet bgt .Lmemcpy_bad3 216129202Scognet beq .Lmemcpy_bad2 217129202Scognet b .Lmemcpy_bad1 218129202Scognet 219129202Scognet.Lmemcpy_bad1_loop16: 220129202Scognet#ifdef __ARMEB__ 221129202Scognet mov r4, ip, lsl #8 222129202Scognet#else 223129202Scognet mov r4, ip, lsr #8 224129202Scognet#endif 225129202Scognet ldr r5, [r1], #0x04 226129202Scognet pld [r1, #0x018] 227129202Scognet ldr r6, [r1], #0x04 228129202Scognet ldr r7, [r1], #0x04 229129202Scognet ldr ip, [r1], #0x04 230129202Scognet#ifdef __ARMEB__ 231129202Scognet orr r4, r4, r5, lsr #24 232129202Scognet mov r5, r5, lsl #8 233129202Scognet orr r5, r5, r6, lsr #24 234129202Scognet mov r6, r6, lsl #8 235129202Scognet orr r6, r6, r7, lsr #24 236129202Scognet mov r7, r7, lsl #8 237129202Scognet orr r7, r7, ip, lsr #24 238129202Scognet#else 239129202Scognet orr r4, r4, r5, lsl #24 240129202Scognet mov r5, r5, lsr #8 241129202Scognet orr r5, r5, r6, lsl #24 242129202Scognet mov r6, r6, lsr #8 243129202Scognet orr r6, r6, r7, lsl #24 244129202Scognet mov r7, r7, lsr #8 245129202Scognet orr r7, r7, ip, lsl #24 246129202Scognet#endif 247129202Scognet str r4, [r3], #0x04 248129202Scognet str r5, [r3], #0x04 249129202Scognet str r6, [r3], #0x04 250129202Scognet str r7, [r3], #0x04 251129202Scognet.Lmemcpy_bad1: 252129202Scognet subs r2, r2, #0x10 253129202Scognet bge .Lmemcpy_bad1_loop16 254129202Scognet 255129202Scognet adds r2, r2, #0x10 256129202Scognet ldmeqfd sp!, {r4-r7} 257135683Scognet bxeq lr /* Return now if done */ 258129202Scognet subs r2, r2, #0x04 259129202Scognet sublt r1, r1, #0x03 260129202Scognet blt .Lmemcpy_bad_done 261129202Scognet 262129202Scognet.Lmemcpy_bad1_loop4: 263129202Scognet#ifdef __ARMEB__ 264129202Scognet mov r4, ip, lsl #8 265129202Scognet#else 266129202Scognet mov r4, ip, lsr #8 267129202Scognet#endif 268129202Scognet ldr ip, [r1], #0x04 269129202Scognet subs r2, r2, #0x04 270129202Scognet#ifdef __ARMEB__ 271129202Scognet orr r4, r4, ip, lsr #24 272129202Scognet#else 273129202Scognet orr r4, r4, ip, lsl #24 274129202Scognet#endif 275129202Scognet str r4, [r3], #0x04 276129202Scognet bge .Lmemcpy_bad1_loop4 277129202Scognet sub r1, r1, #0x03 278129202Scognet b .Lmemcpy_bad_done 279129202Scognet 280129202Scognet.Lmemcpy_bad2_loop16: 281129202Scognet#ifdef __ARMEB__ 282129202Scognet mov r4, ip, lsl #16 283129202Scognet#else 284129202Scognet mov r4, ip, lsr #16 285129202Scognet#endif 286129202Scognet ldr r5, [r1], #0x04 287129202Scognet pld [r1, #0x018] 288129202Scognet ldr r6, [r1], #0x04 289129202Scognet ldr r7, [r1], #0x04 290129202Scognet ldr ip, [r1], #0x04 291129202Scognet#ifdef __ARMEB__ 292129202Scognet orr r4, r4, r5, lsr #16 293129202Scognet mov r5, r5, lsl #16 294129202Scognet orr r5, r5, r6, lsr #16 295129202Scognet mov r6, r6, lsl #16 296129202Scognet orr r6, r6, r7, lsr #16 297129202Scognet mov r7, r7, lsl #16 298129202Scognet orr r7, r7, ip, lsr #16 299129202Scognet#else 300129202Scognet orr r4, r4, r5, lsl #16 301129202Scognet mov r5, r5, lsr #16 302129202Scognet orr r5, r5, r6, lsl #16 303129202Scognet mov r6, r6, lsr #16 304129202Scognet orr r6, r6, r7, lsl #16 305129202Scognet mov r7, r7, lsr #16 306129202Scognet orr r7, r7, ip, lsl #16 307129202Scognet#endif 308129202Scognet str r4, [r3], #0x04 309129202Scognet str r5, [r3], #0x04 310129202Scognet str r6, [r3], #0x04 311129202Scognet str r7, [r3], #0x04 312129202Scognet.Lmemcpy_bad2: 313129202Scognet subs r2, r2, #0x10 314129202Scognet bge .Lmemcpy_bad2_loop16 315129202Scognet 316129202Scognet adds r2, r2, #0x10 317129202Scognet ldmeqfd sp!, {r4-r7} 318135683Scognet bxeq lr /* Return now if done */ 319129202Scognet subs r2, r2, #0x04 320129202Scognet sublt r1, r1, #0x02 321129202Scognet blt .Lmemcpy_bad_done 322129202Scognet 323129202Scognet.Lmemcpy_bad2_loop4: 324129202Scognet#ifdef __ARMEB__ 325129202Scognet mov r4, ip, lsl #16 326129202Scognet#else 327129202Scognet mov r4, ip, lsr #16 328129202Scognet#endif 329129202Scognet ldr ip, [r1], #0x04 330129202Scognet subs r2, r2, #0x04 331129202Scognet#ifdef __ARMEB__ 332129202Scognet orr r4, r4, ip, lsr #16 333129202Scognet#else 334129202Scognet orr r4, r4, ip, lsl #16 335129202Scognet#endif 336129202Scognet str r4, [r3], #0x04 337129202Scognet bge .Lmemcpy_bad2_loop4 338129202Scognet sub r1, r1, #0x02 339129202Scognet b .Lmemcpy_bad_done 340129202Scognet 341129202Scognet.Lmemcpy_bad3_loop16: 342129202Scognet#ifdef __ARMEB__ 343129202Scognet mov r4, ip, lsl #24 344129202Scognet#else 345129202Scognet mov r4, ip, lsr #24 346129202Scognet#endif 347129202Scognet ldr r5, [r1], #0x04 348129202Scognet pld [r1, #0x018] 349129202Scognet ldr r6, [r1], #0x04 350129202Scognet ldr r7, [r1], #0x04 351129202Scognet ldr ip, [r1], #0x04 352129202Scognet#ifdef __ARMEB__ 353129202Scognet orr r4, r4, r5, lsr #8 354129202Scognet mov r5, r5, lsl #24 355129202Scognet orr r5, r5, r6, lsr #8 356129202Scognet mov r6, r6, lsl #24 357129202Scognet orr r6, r6, r7, lsr #8 358129202Scognet mov r7, r7, lsl #24 359129202Scognet orr r7, r7, ip, lsr #8 360129202Scognet#else 361129202Scognet orr r4, r4, r5, lsl #8 362129202Scognet mov r5, r5, lsr #24 363129202Scognet orr r5, r5, r6, lsl #8 364129202Scognet mov r6, r6, lsr #24 365129202Scognet orr r6, r6, r7, lsl #8 366129202Scognet mov r7, r7, lsr #24 367129202Scognet orr r7, r7, ip, lsl #8 368129202Scognet#endif 369129202Scognet str r4, [r3], #0x04 370129202Scognet str r5, [r3], #0x04 371129202Scognet str r6, [r3], #0x04 372129202Scognet str r7, [r3], #0x04 373129202Scognet.Lmemcpy_bad3: 374129202Scognet subs r2, r2, #0x10 375129202Scognet bge .Lmemcpy_bad3_loop16 376129202Scognet 377129202Scognet adds r2, r2, #0x10 378129202Scognet ldmeqfd sp!, {r4-r7} 379135683Scognet bxeq lr /* Return now if done */ 380129202Scognet subs r2, r2, #0x04 381129202Scognet sublt r1, r1, #0x01 382129202Scognet blt .Lmemcpy_bad_done 383129202Scognet 384129202Scognet.Lmemcpy_bad3_loop4: 385129202Scognet#ifdef __ARMEB__ 386129202Scognet mov r4, ip, lsl #24 387129202Scognet#else 388129202Scognet mov r4, ip, lsr #24 389129202Scognet#endif 390129202Scognet ldr ip, [r1], #0x04 391129202Scognet subs r2, r2, #0x04 392129202Scognet#ifdef __ARMEB__ 393129202Scognet orr r4, r4, ip, lsr #8 394129202Scognet#else 395129202Scognet orr r4, r4, ip, lsl #8 396129202Scognet#endif 397129202Scognet str r4, [r3], #0x04 398129202Scognet bge .Lmemcpy_bad3_loop4 399129202Scognet sub r1, r1, #0x01 400129202Scognet 401129202Scognet.Lmemcpy_bad_done: 402129202Scognet ldmfd sp!, {r4-r7} 403129202Scognet adds r2, r2, #0x04 404135683Scognet bxeq lr 405129202Scognet ldrb ip, [r1], #0x01 406129202Scognet cmp r2, #0x02 407129202Scognet ldrgeb r2, [r1], #0x01 408129202Scognet strb ip, [r3], #0x01 409129202Scognet ldrgtb ip, [r1] 410129202Scognet strgeb r2, [r3], #0x01 411129202Scognet strgtb ip, [r3] 412135683Scognet bx lr 413129202Scognet 414129202Scognet 415129202Scognet/* 416129202Scognet * Handle short copies (less than 16 bytes), possibly misaligned. 417129202Scognet * Some of these are *very* common, thanks to the network stack, 418129202Scognet * and so are handled specially. 419129202Scognet */ 420129202Scognet.Lmemcpy_short: 421129202Scognet#ifndef _STANDALONE 422129202Scognet add pc, pc, r2, lsl #2 423129202Scognet nop 424135683Scognet bx lr /* 0x00 */ 425129202Scognet b .Lmemcpy_bytewise /* 0x01 */ 426129202Scognet b .Lmemcpy_bytewise /* 0x02 */ 427129202Scognet b .Lmemcpy_bytewise /* 0x03 */ 428129202Scognet b .Lmemcpy_4 /* 0x04 */ 429129202Scognet b .Lmemcpy_bytewise /* 0x05 */ 430129202Scognet b .Lmemcpy_6 /* 0x06 */ 431129202Scognet b .Lmemcpy_bytewise /* 0x07 */ 432129202Scognet b .Lmemcpy_8 /* 0x08 */ 433129202Scognet b .Lmemcpy_bytewise /* 0x09 */ 434129202Scognet b .Lmemcpy_bytewise /* 0x0a */ 435129202Scognet b .Lmemcpy_bytewise /* 0x0b */ 436129202Scognet b .Lmemcpy_c /* 0x0c */ 437129202Scognet#endif 438129202Scognet.Lmemcpy_bytewise: 439129202Scognet mov r3, r0 /* We must not clobber r0 */ 440129202Scognet ldrb ip, [r1], #0x01 441129202Scognet1: subs r2, r2, #0x01 442129202Scognet strb ip, [r3], #0x01 443129202Scognet ldrneb ip, [r1], #0x01 444129202Scognet bne 1b 445135683Scognet bx lr 446129202Scognet 447129202Scognet#ifndef _STANDALONE 448129202Scognet/****************************************************************************** 449129202Scognet * Special case for 4 byte copies 450129202Scognet */ 451129202Scognet#define LMEMCPY_4_LOG2 6 /* 64 bytes */ 452129202Scognet#define LMEMCPY_4_PAD .align LMEMCPY_4_LOG2 453129202Scognet LMEMCPY_4_PAD 454129202Scognet.Lmemcpy_4: 455129202Scognet and r2, r1, #0x03 456129202Scognet orr r2, r2, r0, lsl #2 457129202Scognet ands r2, r2, #0x0f 458129202Scognet sub r3, pc, #0x14 459129202Scognet addne pc, r3, r2, lsl #LMEMCPY_4_LOG2 460129202Scognet 461129202Scognet/* 462129202Scognet * 0000: dst is 32-bit aligned, src is 32-bit aligned 463129202Scognet */ 464129202Scognet ldr r2, [r1] 465129202Scognet str r2, [r0] 466135683Scognet bx lr 467129202Scognet LMEMCPY_4_PAD 468129202Scognet 469129202Scognet/* 470129202Scognet * 0001: dst is 32-bit aligned, src is 8-bit aligned 471129202Scognet */ 472129202Scognet ldr r3, [r1, #-1] /* BE:r3 = x012 LE:r3 = 210x */ 473129202Scognet ldr r2, [r1, #3] /* BE:r2 = 3xxx LE:r2 = xxx3 */ 474129202Scognet#ifdef __ARMEB__ 475129202Scognet mov r3, r3, lsl #8 /* r3 = 012. */ 476129202Scognet orr r3, r3, r2, lsr #24 /* r3 = 0123 */ 477129202Scognet#else 478129202Scognet mov r3, r3, lsr #8 /* r3 = .210 */ 479129202Scognet orr r3, r3, r2, lsl #24 /* r3 = 3210 */ 480129202Scognet#endif 481129202Scognet str r3, [r0] 482135683Scognet bx lr 483129202Scognet LMEMCPY_4_PAD 484129202Scognet 485129202Scognet/* 486129202Scognet * 0010: dst is 32-bit aligned, src is 16-bit aligned 487129202Scognet */ 488129202Scognet#ifdef __ARMEB__ 489129202Scognet ldrh r3, [r1] 490129202Scognet ldrh r2, [r1, #0x02] 491129202Scognet#else 492129202Scognet ldrh r3, [r1, #0x02] 493129202Scognet ldrh r2, [r1] 494129202Scognet#endif 495129202Scognet orr r3, r2, r3, lsl #16 496129202Scognet str r3, [r0] 497135683Scognet bx lr 498129202Scognet LMEMCPY_4_PAD 499129202Scognet 500129202Scognet/* 501129202Scognet * 0011: dst is 32-bit aligned, src is 8-bit aligned 502129202Scognet */ 503129202Scognet ldr r3, [r1, #-3] /* BE:r3 = xxx0 LE:r3 = 0xxx */ 504129202Scognet ldr r2, [r1, #1] /* BE:r2 = 123x LE:r2 = x321 */ 505129202Scognet#ifdef __ARMEB__ 506129202Scognet mov r3, r3, lsl #24 /* r3 = 0... */ 507129202Scognet orr r3, r3, r2, lsr #8 /* r3 = 0123 */ 508129202Scognet#else 509129202Scognet mov r3, r3, lsr #24 /* r3 = ...0 */ 510129202Scognet orr r3, r3, r2, lsl #8 /* r3 = 3210 */ 511129202Scognet#endif 512129202Scognet str r3, [r0] 513135683Scognet bx lr 514129202Scognet LMEMCPY_4_PAD 515129202Scognet 516129202Scognet/* 517129202Scognet * 0100: dst is 8-bit aligned, src is 32-bit aligned 518129202Scognet */ 519129202Scognet ldr r2, [r1] 520129202Scognet#ifdef __ARMEB__ 521129202Scognet strb r2, [r0, #0x03] 522129202Scognet mov r3, r2, lsr #8 523129202Scognet mov r1, r2, lsr #24 524129202Scognet strb r1, [r0] 525129202Scognet#else 526129202Scognet strb r2, [r0] 527129202Scognet mov r3, r2, lsr #8 528129202Scognet mov r1, r2, lsr #24 529129202Scognet strb r1, [r0, #0x03] 530129202Scognet#endif 531129202Scognet strh r3, [r0, #0x01] 532135683Scognet bx lr 533129202Scognet LMEMCPY_4_PAD 534129202Scognet 535129202Scognet/* 536129202Scognet * 0101: dst is 8-bit aligned, src is 8-bit aligned 537129202Scognet */ 538129202Scognet ldrb r2, [r1] 539129202Scognet ldrh r3, [r1, #0x01] 540129202Scognet ldrb r1, [r1, #0x03] 541129202Scognet strb r2, [r0] 542129202Scognet strh r3, [r0, #0x01] 543129202Scognet strb r1, [r0, #0x03] 544135683Scognet bx lr 545129202Scognet LMEMCPY_4_PAD 546129202Scognet 547129202Scognet/* 548129202Scognet * 0110: dst is 8-bit aligned, src is 16-bit aligned 549129202Scognet */ 550129202Scognet ldrh r2, [r1] /* BE:r2 = ..01 LE:r2 = ..10 */ 551129202Scognet ldrh r3, [r1, #0x02] /* LE:r3 = ..23 LE:r3 = ..32 */ 552129202Scognet#ifdef __ARMEB__ 553129202Scognet mov r1, r2, lsr #8 /* r1 = ...0 */ 554129202Scognet strb r1, [r0] 555129202Scognet mov r2, r2, lsl #8 /* r2 = .01. */ 556129202Scognet orr r2, r2, r3, lsr #8 /* r2 = .012 */ 557129202Scognet#else 558129202Scognet strb r2, [r0] 559129202Scognet mov r2, r2, lsr #8 /* r2 = ...1 */ 560129202Scognet orr r2, r2, r3, lsl #8 /* r2 = .321 */ 561129202Scognet mov r3, r3, lsr #8 /* r3 = ...3 */ 562129202Scognet#endif 563129202Scognet strh r2, [r0, #0x01] 564129202Scognet strb r3, [r0, #0x03] 565135683Scognet bx lr 566129202Scognet LMEMCPY_4_PAD 567129202Scognet 568129202Scognet/* 569129202Scognet * 0111: dst is 8-bit aligned, src is 8-bit aligned 570129202Scognet */ 571129202Scognet ldrb r2, [r1] 572129202Scognet ldrh r3, [r1, #0x01] 573129202Scognet ldrb r1, [r1, #0x03] 574129202Scognet strb r2, [r0] 575129202Scognet strh r3, [r0, #0x01] 576129202Scognet strb r1, [r0, #0x03] 577135683Scognet bx lr 578129202Scognet LMEMCPY_4_PAD 579129202Scognet 580129202Scognet/* 581129202Scognet * 1000: dst is 16-bit aligned, src is 32-bit aligned 582129202Scognet */ 583129202Scognet ldr r2, [r1] 584129202Scognet#ifdef __ARMEB__ 585129202Scognet strh r2, [r0, #0x02] 586129202Scognet mov r3, r2, lsr #16 587129202Scognet strh r3, [r0] 588129202Scognet#else 589129202Scognet strh r2, [r0] 590129202Scognet mov r3, r2, lsr #16 591129202Scognet strh r3, [r0, #0x02] 592129202Scognet#endif 593135683Scognet bx lr 594129202Scognet LMEMCPY_4_PAD 595129202Scognet 596129202Scognet/* 597129202Scognet * 1001: dst is 16-bit aligned, src is 8-bit aligned 598129202Scognet */ 599129202Scognet ldr r2, [r1, #-1] /* BE:r2 = x012 LE:r2 = 210x */ 600129202Scognet ldr r3, [r1, #3] /* BE:r3 = 3xxx LE:r3 = xxx3 */ 601129202Scognet mov r1, r2, lsr #8 /* BE:r1 = .x01 LE:r1 = .210 */ 602129202Scognet strh r1, [r0] 603129202Scognet#ifdef __ARMEB__ 604129202Scognet mov r2, r2, lsl #8 /* r2 = 012. */ 605129202Scognet orr r2, r2, r3, lsr #24 /* r2 = 0123 */ 606129202Scognet#else 607129202Scognet mov r2, r2, lsr #24 /* r2 = ...2 */ 608129202Scognet orr r2, r2, r3, lsl #8 /* r2 = xx32 */ 609129202Scognet#endif 610129202Scognet strh r2, [r0, #0x02] 611135683Scognet bx lr 612129202Scognet LMEMCPY_4_PAD 613129202Scognet 614129202Scognet/* 615129202Scognet * 1010: dst is 16-bit aligned, src is 16-bit aligned 616129202Scognet */ 617129202Scognet ldrh r2, [r1] 618129202Scognet ldrh r3, [r1, #0x02] 619129202Scognet strh r2, [r0] 620129202Scognet strh r3, [r0, #0x02] 621135683Scognet bx lr 622129202Scognet LMEMCPY_4_PAD 623129202Scognet 624129202Scognet/* 625129202Scognet * 1011: dst is 16-bit aligned, src is 8-bit aligned 626129202Scognet */ 627129202Scognet ldr r3, [r1, #1] /* BE:r3 = 123x LE:r3 = x321 */ 628129202Scognet ldr r2, [r1, #-3] /* BE:r2 = xxx0 LE:r2 = 0xxx */ 629129202Scognet mov r1, r3, lsr #8 /* BE:r1 = .123 LE:r1 = .x32 */ 630129202Scognet strh r1, [r0, #0x02] 631129202Scognet#ifdef __ARMEB__ 632129202Scognet mov r3, r3, lsr #24 /* r3 = ...1 */ 633129202Scognet orr r3, r3, r2, lsl #8 /* r3 = xx01 */ 634129202Scognet#else 635129202Scognet mov r3, r3, lsl #8 /* r3 = 321. */ 636129202Scognet orr r3, r3, r2, lsr #24 /* r3 = 3210 */ 637129202Scognet#endif 638129202Scognet strh r3, [r0] 639135683Scognet bx lr 640129202Scognet LMEMCPY_4_PAD 641129202Scognet 642129202Scognet/* 643129202Scognet * 1100: dst is 8-bit aligned, src is 32-bit aligned 644129202Scognet */ 645129202Scognet ldr r2, [r1] /* BE:r2 = 0123 LE:r2 = 3210 */ 646129202Scognet#ifdef __ARMEB__ 647129202Scognet strb r2, [r0, #0x03] 648129202Scognet mov r3, r2, lsr #8 649129202Scognet mov r1, r2, lsr #24 650129202Scognet strh r3, [r0, #0x01] 651129202Scognet strb r1, [r0] 652129202Scognet#else 653129202Scognet strb r2, [r0] 654129202Scognet mov r3, r2, lsr #8 655129202Scognet mov r1, r2, lsr #24 656129202Scognet strh r3, [r0, #0x01] 657129202Scognet strb r1, [r0, #0x03] 658129202Scognet#endif 659135683Scognet bx lr 660129202Scognet LMEMCPY_4_PAD 661129202Scognet 662129202Scognet/* 663129202Scognet * 1101: dst is 8-bit aligned, src is 8-bit aligned 664129202Scognet */ 665129202Scognet ldrb r2, [r1] 666129202Scognet ldrh r3, [r1, #0x01] 667129202Scognet ldrb r1, [r1, #0x03] 668129202Scognet strb r2, [r0] 669129202Scognet strh r3, [r0, #0x01] 670129202Scognet strb r1, [r0, #0x03] 671135683Scognet bx lr 672129202Scognet LMEMCPY_4_PAD 673129202Scognet 674129202Scognet/* 675129202Scognet * 1110: dst is 8-bit aligned, src is 16-bit aligned 676129202Scognet */ 677129202Scognet#ifdef __ARMEB__ 678129202Scognet ldrh r3, [r1, #0x02] /* BE:r3 = ..23 LE:r3 = ..32 */ 679129202Scognet ldrh r2, [r1] /* BE:r2 = ..01 LE:r2 = ..10 */ 680129202Scognet strb r3, [r0, #0x03] 681129202Scognet mov r3, r3, lsr #8 /* r3 = ...2 */ 682129202Scognet orr r3, r3, r2, lsl #8 /* r3 = ..12 */ 683129202Scognet strh r3, [r0, #0x01] 684129202Scognet mov r2, r2, lsr #8 /* r2 = ...0 */ 685129202Scognet strb r2, [r0] 686129202Scognet#else 687129202Scognet ldrh r2, [r1] /* BE:r2 = ..01 LE:r2 = ..10 */ 688129202Scognet ldrh r3, [r1, #0x02] /* BE:r3 = ..23 LE:r3 = ..32 */ 689129202Scognet strb r2, [r0] 690129202Scognet mov r2, r2, lsr #8 /* r2 = ...1 */ 691129202Scognet orr r2, r2, r3, lsl #8 /* r2 = .321 */ 692129202Scognet strh r2, [r0, #0x01] 693129202Scognet mov r3, r3, lsr #8 /* r3 = ...3 */ 694129202Scognet strb r3, [r0, #0x03] 695129202Scognet#endif 696135683Scognet bx lr 697129202Scognet LMEMCPY_4_PAD 698129202Scognet 699129202Scognet/* 700129202Scognet * 1111: dst is 8-bit aligned, src is 8-bit aligned 701129202Scognet */ 702129202Scognet ldrb r2, [r1] 703129202Scognet ldrh r3, [r1, #0x01] 704129202Scognet ldrb r1, [r1, #0x03] 705129202Scognet strb r2, [r0] 706129202Scognet strh r3, [r0, #0x01] 707129202Scognet strb r1, [r0, #0x03] 708135683Scognet bx lr 709129202Scognet LMEMCPY_4_PAD 710129202Scognet 711129202Scognet 712129202Scognet/****************************************************************************** 713129202Scognet * Special case for 6 byte copies 714129202Scognet */ 715129202Scognet#define LMEMCPY_6_LOG2 6 /* 64 bytes */ 716129202Scognet#define LMEMCPY_6_PAD .align LMEMCPY_6_LOG2 717129202Scognet LMEMCPY_6_PAD 718129202Scognet.Lmemcpy_6: 719129202Scognet and r2, r1, #0x03 720129202Scognet orr r2, r2, r0, lsl #2 721129202Scognet ands r2, r2, #0x0f 722129202Scognet sub r3, pc, #0x14 723129202Scognet addne pc, r3, r2, lsl #LMEMCPY_6_LOG2 724129202Scognet 725129202Scognet/* 726129202Scognet * 0000: dst is 32-bit aligned, src is 32-bit aligned 727129202Scognet */ 728129202Scognet ldr r2, [r1] 729129202Scognet ldrh r3, [r1, #0x04] 730129202Scognet str r2, [r0] 731129202Scognet strh r3, [r0, #0x04] 732135683Scognet bx lr 733129202Scognet LMEMCPY_6_PAD 734129202Scognet 735129202Scognet/* 736129202Scognet * 0001: dst is 32-bit aligned, src is 8-bit aligned 737129202Scognet */ 738129202Scognet ldr r2, [r1, #-1] /* BE:r2 = x012 LE:r2 = 210x */ 739129202Scognet ldr r3, [r1, #0x03] /* BE:r3 = 345x LE:r3 = x543 */ 740129202Scognet#ifdef __ARMEB__ 741129202Scognet mov r2, r2, lsl #8 /* r2 = 012. */ 742129202Scognet orr r2, r2, r3, lsr #24 /* r2 = 0123 */ 743129202Scognet#else 744129202Scognet mov r2, r2, lsr #8 /* r2 = .210 */ 745129202Scognet orr r2, r2, r3, lsl #24 /* r2 = 3210 */ 746129202Scognet#endif 747129202Scognet mov r3, r3, lsr #8 /* BE:r3 = .345 LE:r3 = .x54 */ 748129202Scognet str r2, [r0] 749129202Scognet strh r3, [r0, #0x04] 750135683Scognet bx lr 751129202Scognet LMEMCPY_6_PAD 752129202Scognet 753129202Scognet/* 754129202Scognet * 0010: dst is 32-bit aligned, src is 16-bit aligned 755129202Scognet */ 756129202Scognet ldr r3, [r1, #0x02] /* BE:r3 = 2345 LE:r3 = 5432 */ 757129202Scognet ldrh r2, [r1] /* BE:r2 = ..01 LE:r2 = ..10 */ 758129202Scognet#ifdef __ARMEB__ 759129202Scognet mov r1, r3, lsr #16 /* r1 = ..23 */ 760129202Scognet orr r1, r1, r2, lsl #16 /* r1 = 0123 */ 761129202Scognet str r1, [r0] 762129202Scognet strh r3, [r0, #0x04] 763129202Scognet#else 764129202Scognet mov r1, r3, lsr #16 /* r1 = ..54 */ 765129202Scognet orr r2, r2, r3, lsl #16 /* r2 = 3210 */ 766129202Scognet str r2, [r0] 767129202Scognet strh r1, [r0, #0x04] 768129202Scognet#endif 769135683Scognet bx lr 770129202Scognet LMEMCPY_6_PAD 771129202Scognet 772129202Scognet/* 773129202Scognet * 0011: dst is 32-bit aligned, src is 8-bit aligned 774129202Scognet */ 775129202Scognet ldr r2, [r1, #-3] /* BE:r2 = xxx0 LE:r2 = 0xxx */ 776129202Scognet ldr r3, [r1, #1] /* BE:r3 = 1234 LE:r3 = 4321 */ 777129202Scognet ldr r1, [r1, #5] /* BE:r1 = 5xxx LE:r3 = xxx5 */ 778129202Scognet#ifdef __ARMEB__ 779129202Scognet mov r2, r2, lsl #24 /* r2 = 0... */ 780129202Scognet orr r2, r2, r3, lsr #8 /* r2 = 0123 */ 781129202Scognet mov r3, r3, lsl #8 /* r3 = 234. */ 782129202Scognet orr r1, r3, r1, lsr #24 /* r1 = 2345 */ 783129202Scognet#else 784129202Scognet mov r2, r2, lsr #24 /* r2 = ...0 */ 785129202Scognet orr r2, r2, r3, lsl #8 /* r2 = 3210 */ 786129202Scognet mov r1, r1, lsl #8 /* r1 = xx5. */ 787129202Scognet orr r1, r1, r3, lsr #24 /* r1 = xx54 */ 788129202Scognet#endif 789129202Scognet str r2, [r0] 790129202Scognet strh r1, [r0, #0x04] 791135683Scognet bx lr 792129202Scognet LMEMCPY_6_PAD 793129202Scognet 794129202Scognet/* 795129202Scognet * 0100: dst is 8-bit aligned, src is 32-bit aligned 796129202Scognet */ 797129202Scognet ldr r3, [r1] /* BE:r3 = 0123 LE:r3 = 3210 */ 798129202Scognet ldrh r2, [r1, #0x04] /* BE:r2 = ..45 LE:r2 = ..54 */ 799129202Scognet mov r1, r3, lsr #8 /* BE:r1 = .012 LE:r1 = .321 */ 800129202Scognet strh r1, [r0, #0x01] 801129202Scognet#ifdef __ARMEB__ 802129202Scognet mov r1, r3, lsr #24 /* r1 = ...0 */ 803129202Scognet strb r1, [r0] 804129202Scognet mov r3, r3, lsl #8 /* r3 = 123. */ 805129202Scognet orr r3, r3, r2, lsr #8 /* r3 = 1234 */ 806129202Scognet#else 807129202Scognet strb r3, [r0] 808129202Scognet mov r3, r3, lsr #24 /* r3 = ...3 */ 809129202Scognet orr r3, r3, r2, lsl #8 /* r3 = .543 */ 810129202Scognet mov r2, r2, lsr #8 /* r2 = ...5 */ 811129202Scognet#endif 812129202Scognet strh r3, [r0, #0x03] 813129202Scognet strb r2, [r0, #0x05] 814135683Scognet bx lr 815129202Scognet LMEMCPY_6_PAD 816129202Scognet 817129202Scognet/* 818129202Scognet * 0101: dst is 8-bit aligned, src is 8-bit aligned 819129202Scognet */ 820129202Scognet ldrb r2, [r1] 821129202Scognet ldrh r3, [r1, #0x01] 822129202Scognet ldrh ip, [r1, #0x03] 823129202Scognet ldrb r1, [r1, #0x05] 824129202Scognet strb r2, [r0] 825129202Scognet strh r3, [r0, #0x01] 826129202Scognet strh ip, [r0, #0x03] 827129202Scognet strb r1, [r0, #0x05] 828135683Scognet bx lr 829129202Scognet LMEMCPY_6_PAD 830129202Scognet 831129202Scognet/* 832129202Scognet * 0110: dst is 8-bit aligned, src is 16-bit aligned 833129202Scognet */ 834129202Scognet ldrh r2, [r1] /* BE:r2 = ..01 LE:r2 = ..10 */ 835129202Scognet ldr r1, [r1, #0x02] /* BE:r1 = 2345 LE:r1 = 5432 */ 836129202Scognet#ifdef __ARMEB__ 837129202Scognet mov r3, r2, lsr #8 /* r3 = ...0 */ 838129202Scognet strb r3, [r0] 839129202Scognet strb r1, [r0, #0x05] 840129202Scognet mov r3, r1, lsr #8 /* r3 = .234 */ 841129202Scognet strh r3, [r0, #0x03] 842129202Scognet mov r3, r2, lsl #8 /* r3 = .01. */ 843129202Scognet orr r3, r3, r1, lsr #24 /* r3 = .012 */ 844129202Scognet strh r3, [r0, #0x01] 845129202Scognet#else 846129202Scognet strb r2, [r0] 847129202Scognet mov r3, r1, lsr #24 848129202Scognet strb r3, [r0, #0x05] 849129202Scognet mov r3, r1, lsr #8 /* r3 = .543 */ 850129202Scognet strh r3, [r0, #0x03] 851129202Scognet mov r3, r2, lsr #8 /* r3 = ...1 */ 852129202Scognet orr r3, r3, r1, lsl #8 /* r3 = 4321 */ 853129202Scognet strh r3, [r0, #0x01] 854129202Scognet#endif 855135683Scognet bx lr 856129202Scognet LMEMCPY_6_PAD 857129202Scognet 858129202Scognet/* 859129202Scognet * 0111: dst is 8-bit aligned, src is 8-bit aligned 860129202Scognet */ 861129202Scognet ldrb r2, [r1] 862129202Scognet ldrh r3, [r1, #0x01] 863129202Scognet ldrh ip, [r1, #0x03] 864129202Scognet ldrb r1, [r1, #0x05] 865129202Scognet strb r2, [r0] 866129202Scognet strh r3, [r0, #0x01] 867129202Scognet strh ip, [r0, #0x03] 868129202Scognet strb r1, [r0, #0x05] 869135683Scognet bx lr 870129202Scognet LMEMCPY_6_PAD 871129202Scognet 872129202Scognet/* 873129202Scognet * 1000: dst is 16-bit aligned, src is 32-bit aligned 874129202Scognet */ 875129202Scognet#ifdef __ARMEB__ 876129202Scognet ldr r2, [r1] /* r2 = 0123 */ 877129202Scognet ldrh r3, [r1, #0x04] /* r3 = ..45 */ 878129202Scognet mov r1, r2, lsr #16 /* r1 = ..01 */ 879129202Scognet orr r3, r3, r2, lsl#16 /* r3 = 2345 */ 880129202Scognet strh r1, [r0] 881129202Scognet str r3, [r0, #0x02] 882129202Scognet#else 883129202Scognet ldrh r2, [r1, #0x04] /* r2 = ..54 */ 884129202Scognet ldr r3, [r1] /* r3 = 3210 */ 885129202Scognet mov r2, r2, lsl #16 /* r2 = 54.. */ 886129202Scognet orr r2, r2, r3, lsr #16 /* r2 = 5432 */ 887129202Scognet strh r3, [r0] 888129202Scognet str r2, [r0, #0x02] 889129202Scognet#endif 890135683Scognet bx lr 891129202Scognet LMEMCPY_6_PAD 892129202Scognet 893129202Scognet/* 894129202Scognet * 1001: dst is 16-bit aligned, src is 8-bit aligned 895129202Scognet */ 896129202Scognet ldr r3, [r1, #-1] /* BE:r3 = x012 LE:r3 = 210x */ 897129202Scognet ldr r2, [r1, #3] /* BE:r2 = 345x LE:r2 = x543 */ 898129202Scognet mov r1, r3, lsr #8 /* BE:r1 = .x01 LE:r1 = .210 */ 899129202Scognet#ifdef __ARMEB__ 900129202Scognet mov r2, r2, lsr #8 /* r2 = .345 */ 901129202Scognet orr r2, r2, r3, lsl #24 /* r2 = 2345 */ 902129202Scognet#else 903129202Scognet mov r2, r2, lsl #8 /* r2 = 543. */ 904129202Scognet orr r2, r2, r3, lsr #24 /* r2 = 5432 */ 905129202Scognet#endif 906129202Scognet strh r1, [r0] 907129202Scognet str r2, [r0, #0x02] 908135683Scognet bx lr 909129202Scognet LMEMCPY_6_PAD 910129202Scognet 911129202Scognet/* 912129202Scognet * 1010: dst is 16-bit aligned, src is 16-bit aligned 913129202Scognet */ 914129202Scognet ldrh r2, [r1] 915129202Scognet ldr r3, [r1, #0x02] 916129202Scognet strh r2, [r0] 917129202Scognet str r3, [r0, #0x02] 918135683Scognet bx lr 919129202Scognet LMEMCPY_6_PAD 920129202Scognet 921129202Scognet/* 922129202Scognet * 1011: dst is 16-bit aligned, src is 8-bit aligned 923129202Scognet */ 924129202Scognet ldrb r3, [r1] /* r3 = ...0 */ 925129202Scognet ldr r2, [r1, #0x01] /* BE:r2 = 1234 LE:r2 = 4321 */ 926129202Scognet ldrb r1, [r1, #0x05] /* r1 = ...5 */ 927129202Scognet#ifdef __ARMEB__ 928129202Scognet mov r3, r3, lsl #8 /* r3 = ..0. */ 929129202Scognet orr r3, r3, r2, lsr #24 /* r3 = ..01 */ 930129202Scognet orr r1, r1, r2, lsl #8 /* r1 = 2345 */ 931129202Scognet#else 932129202Scognet orr r3, r3, r2, lsl #8 /* r3 = 3210 */ 933129202Scognet mov r1, r1, lsl #24 /* r1 = 5... */ 934129202Scognet orr r1, r1, r2, lsr #8 /* r1 = 5432 */ 935129202Scognet#endif 936129202Scognet strh r3, [r0] 937129202Scognet str r1, [r0, #0x02] 938135683Scognet bx lr 939129202Scognet LMEMCPY_6_PAD 940129202Scognet 941129202Scognet/* 942129202Scognet * 1100: dst is 8-bit aligned, src is 32-bit aligned 943129202Scognet */ 944129202Scognet ldr r2, [r1] /* BE:r2 = 0123 LE:r2 = 3210 */ 945129202Scognet ldrh r1, [r1, #0x04] /* BE:r1 = ..45 LE:r1 = ..54 */ 946129202Scognet#ifdef __ARMEB__ 947129202Scognet mov r3, r2, lsr #24 /* r3 = ...0 */ 948129202Scognet strb r3, [r0] 949129202Scognet mov r2, r2, lsl #8 /* r2 = 123. */ 950129202Scognet orr r2, r2, r1, lsr #8 /* r2 = 1234 */ 951129202Scognet#else 952129202Scognet strb r2, [r0] 953129202Scognet mov r2, r2, lsr #8 /* r2 = .321 */ 954129202Scognet orr r2, r2, r1, lsl #24 /* r2 = 4321 */ 955129202Scognet mov r1, r1, lsr #8 /* r1 = ...5 */ 956129202Scognet#endif 957129202Scognet str r2, [r0, #0x01] 958129202Scognet strb r1, [r0, #0x05] 959135683Scognet bx lr 960129202Scognet LMEMCPY_6_PAD 961129202Scognet 962129202Scognet/* 963129202Scognet * 1101: dst is 8-bit aligned, src is 8-bit aligned 964129202Scognet */ 965129202Scognet ldrb r2, [r1] 966129202Scognet ldrh r3, [r1, #0x01] 967129202Scognet ldrh ip, [r1, #0x03] 968129202Scognet ldrb r1, [r1, #0x05] 969129202Scognet strb r2, [r0] 970129202Scognet strh r3, [r0, #0x01] 971129202Scognet strh ip, [r0, #0x03] 972129202Scognet strb r1, [r0, #0x05] 973135683Scognet bx lr 974129202Scognet LMEMCPY_6_PAD 975129202Scognet 976129202Scognet/* 977129202Scognet * 1110: dst is 8-bit aligned, src is 16-bit aligned 978129202Scognet */ 979129202Scognet ldrh r2, [r1] /* BE:r2 = ..01 LE:r2 = ..10 */ 980129202Scognet ldr r1, [r1, #0x02] /* BE:r1 = 2345 LE:r1 = 5432 */ 981129202Scognet#ifdef __ARMEB__ 982129202Scognet mov r3, r2, lsr #8 /* r3 = ...0 */ 983129202Scognet strb r3, [r0] 984129202Scognet mov r2, r2, lsl #24 /* r2 = 1... */ 985129202Scognet orr r2, r2, r1, lsr #8 /* r2 = 1234 */ 986129202Scognet#else 987129202Scognet strb r2, [r0] 988129202Scognet mov r2, r2, lsr #8 /* r2 = ...1 */ 989129202Scognet orr r2, r2, r1, lsl #8 /* r2 = 4321 */ 990129202Scognet mov r1, r1, lsr #24 /* r1 = ...5 */ 991129202Scognet#endif 992129202Scognet str r2, [r0, #0x01] 993129202Scognet strb r1, [r0, #0x05] 994135683Scognet bx lr 995129202Scognet LMEMCPY_6_PAD 996129202Scognet 997129202Scognet/* 998129202Scognet * 1111: dst is 8-bit aligned, src is 8-bit aligned 999129202Scognet */ 1000129202Scognet ldrb r2, [r1] 1001129202Scognet ldr r3, [r1, #0x01] 1002129202Scognet ldrb r1, [r1, #0x05] 1003129202Scognet strb r2, [r0] 1004129202Scognet str r3, [r0, #0x01] 1005129202Scognet strb r1, [r0, #0x05] 1006135683Scognet bx lr 1007129202Scognet LMEMCPY_6_PAD 1008129202Scognet 1009129202Scognet 1010129202Scognet/****************************************************************************** 1011129202Scognet * Special case for 8 byte copies 1012129202Scognet */ 1013129202Scognet#define LMEMCPY_8_LOG2 6 /* 64 bytes */ 1014129202Scognet#define LMEMCPY_8_PAD .align LMEMCPY_8_LOG2 1015129202Scognet LMEMCPY_8_PAD 1016129202Scognet.Lmemcpy_8: 1017129202Scognet and r2, r1, #0x03 1018129202Scognet orr r2, r2, r0, lsl #2 1019129202Scognet ands r2, r2, #0x0f 1020129202Scognet sub r3, pc, #0x14 1021129202Scognet addne pc, r3, r2, lsl #LMEMCPY_8_LOG2 1022129202Scognet 1023129202Scognet/* 1024129202Scognet * 0000: dst is 32-bit aligned, src is 32-bit aligned 1025129202Scognet */ 1026129202Scognet ldr r2, [r1] 1027129202Scognet ldr r3, [r1, #0x04] 1028129202Scognet str r2, [r0] 1029129202Scognet str r3, [r0, #0x04] 1030135683Scognet bx lr 1031129202Scognet LMEMCPY_8_PAD 1032129202Scognet 1033129202Scognet/* 1034129202Scognet * 0001: dst is 32-bit aligned, src is 8-bit aligned 1035129202Scognet */ 1036129202Scognet ldr r3, [r1, #-1] /* BE:r3 = x012 LE:r3 = 210x */ 1037129202Scognet ldr r2, [r1, #0x03] /* BE:r2 = 3456 LE:r2 = 6543 */ 1038129202Scognet ldrb r1, [r1, #0x07] /* r1 = ...7 */ 1039129202Scognet#ifdef __ARMEB__ 1040129202Scognet mov r3, r3, lsl #8 /* r3 = 012. */ 1041129202Scognet orr r3, r3, r2, lsr #24 /* r3 = 0123 */ 1042129202Scognet orr r2, r1, r2, lsl #8 /* r2 = 4567 */ 1043129202Scognet#else 1044129202Scognet mov r3, r3, lsr #8 /* r3 = .210 */ 1045129202Scognet orr r3, r3, r2, lsl #24 /* r3 = 3210 */ 1046129202Scognet mov r1, r1, lsl #24 /* r1 = 7... */ 1047129202Scognet orr r2, r1, r2, lsr #8 /* r2 = 7654 */ 1048129202Scognet#endif 1049129202Scognet str r3, [r0] 1050129202Scognet str r2, [r0, #0x04] 1051135683Scognet bx lr 1052129202Scognet LMEMCPY_8_PAD 1053129202Scognet 1054129202Scognet/* 1055129202Scognet * 0010: dst is 32-bit aligned, src is 16-bit aligned 1056129202Scognet */ 1057129202Scognet ldrh r2, [r1] /* BE:r2 = ..01 LE:r2 = ..10 */ 1058129202Scognet ldr r3, [r1, #0x02] /* BE:r3 = 2345 LE:r3 = 5432 */ 1059129202Scognet ldrh r1, [r1, #0x06] /* BE:r1 = ..67 LE:r1 = ..76 */ 1060129202Scognet#ifdef __ARMEB__ 1061129202Scognet mov r2, r2, lsl #16 /* r2 = 01.. */ 1062129202Scognet orr r2, r2, r3, lsr #16 /* r2 = 0123 */ 1063129202Scognet orr r3, r1, r3, lsl #16 /* r3 = 4567 */ 1064129202Scognet#else 1065129202Scognet orr r2, r2, r3, lsl #16 /* r2 = 3210 */ 1066129202Scognet mov r3, r3, lsr #16 /* r3 = ..54 */ 1067129202Scognet orr r3, r3, r1, lsl #16 /* r3 = 7654 */ 1068129202Scognet#endif 1069129202Scognet str r2, [r0] 1070129202Scognet str r3, [r0, #0x04] 1071135683Scognet bx lr 1072129202Scognet LMEMCPY_8_PAD 1073129202Scognet 1074129202Scognet/* 1075129202Scognet * 0011: dst is 32-bit aligned, src is 8-bit aligned 1076129202Scognet */ 1077129202Scognet ldrb r3, [r1] /* r3 = ...0 */ 1078129202Scognet ldr r2, [r1, #0x01] /* BE:r2 = 1234 LE:r2 = 4321 */ 1079129202Scognet ldr r1, [r1, #0x05] /* BE:r1 = 567x LE:r1 = x765 */ 1080129202Scognet#ifdef __ARMEB__ 1081129202Scognet mov r3, r3, lsl #24 /* r3 = 0... */ 1082129202Scognet orr r3, r3, r2, lsr #8 /* r3 = 0123 */ 1083129202Scognet mov r2, r2, lsl #24 /* r2 = 4... */ 1084129202Scognet orr r2, r2, r1, lsr #8 /* r2 = 4567 */ 1085129202Scognet#else 1086129202Scognet orr r3, r3, r2, lsl #8 /* r3 = 3210 */ 1087129202Scognet mov r2, r2, lsr #24 /* r2 = ...4 */ 1088129202Scognet orr r2, r2, r1, lsl #8 /* r2 = 7654 */ 1089129202Scognet#endif 1090129202Scognet str r3, [r0] 1091129202Scognet str r2, [r0, #0x04] 1092135683Scognet bx lr 1093129202Scognet LMEMCPY_8_PAD 1094129202Scognet 1095129202Scognet/* 1096129202Scognet * 0100: dst is 8-bit aligned, src is 32-bit aligned 1097129202Scognet */ 1098129202Scognet ldr r3, [r1] /* BE:r3 = 0123 LE:r3 = 3210 */ 1099129202Scognet ldr r2, [r1, #0x04] /* BE:r2 = 4567 LE:r2 = 7654 */ 1100129202Scognet#ifdef __ARMEB__ 1101129202Scognet mov r1, r3, lsr #24 /* r1 = ...0 */ 1102129202Scognet strb r1, [r0] 1103129202Scognet mov r1, r3, lsr #8 /* r1 = .012 */ 1104129202Scognet strb r2, [r0, #0x07] 1105129202Scognet mov r3, r3, lsl #24 /* r3 = 3... */ 1106129202Scognet orr r3, r3, r2, lsr #8 /* r3 = 3456 */ 1107129202Scognet#else 1108129202Scognet strb r3, [r0] 1109129202Scognet mov r1, r2, lsr #24 /* r1 = ...7 */ 1110129202Scognet strb r1, [r0, #0x07] 1111129202Scognet mov r1, r3, lsr #8 /* r1 = .321 */ 1112129202Scognet mov r3, r3, lsr #24 /* r3 = ...3 */ 1113129202Scognet orr r3, r3, r2, lsl #8 /* r3 = 6543 */ 1114129202Scognet#endif 1115129202Scognet strh r1, [r0, #0x01] 1116129202Scognet str r3, [r0, #0x03] 1117135683Scognet bx lr 1118129202Scognet LMEMCPY_8_PAD 1119129202Scognet 1120129202Scognet/* 1121129202Scognet * 0101: dst is 8-bit aligned, src is 8-bit aligned 1122129202Scognet */ 1123129202Scognet ldrb r2, [r1] 1124129202Scognet ldrh r3, [r1, #0x01] 1125129202Scognet ldr ip, [r1, #0x03] 1126129202Scognet ldrb r1, [r1, #0x07] 1127129202Scognet strb r2, [r0] 1128129202Scognet strh r3, [r0, #0x01] 1129129202Scognet str ip, [r0, #0x03] 1130129202Scognet strb r1, [r0, #0x07] 1131135683Scognet bx lr 1132129202Scognet LMEMCPY_8_PAD 1133129202Scognet 1134129202Scognet/* 1135129202Scognet * 0110: dst is 8-bit aligned, src is 16-bit aligned 1136129202Scognet */ 1137129202Scognet ldrh r2, [r1] /* BE:r2 = ..01 LE:r2 = ..10 */ 1138129202Scognet ldr r3, [r1, #0x02] /* BE:r3 = 2345 LE:r3 = 5432 */ 1139129202Scognet ldrh r1, [r1, #0x06] /* BE:r1 = ..67 LE:r1 = ..76 */ 1140129202Scognet#ifdef __ARMEB__ 1141129202Scognet mov ip, r2, lsr #8 /* ip = ...0 */ 1142129202Scognet strb ip, [r0] 1143129202Scognet mov ip, r2, lsl #8 /* ip = .01. */ 1144129202Scognet orr ip, ip, r3, lsr #24 /* ip = .012 */ 1145129202Scognet strb r1, [r0, #0x07] 1146129202Scognet mov r3, r3, lsl #8 /* r3 = 345. */ 1147129202Scognet orr r3, r3, r1, lsr #8 /* r3 = 3456 */ 1148129202Scognet#else 1149129202Scognet strb r2, [r0] /* 0 */ 1150129202Scognet mov ip, r1, lsr #8 /* ip = ...7 */ 1151129202Scognet strb ip, [r0, #0x07] /* 7 */ 1152129202Scognet mov ip, r2, lsr #8 /* ip = ...1 */ 1153129202Scognet orr ip, ip, r3, lsl #8 /* ip = 4321 */ 1154129202Scognet mov r3, r3, lsr #8 /* r3 = .543 */ 1155129202Scognet orr r3, r3, r1, lsl #24 /* r3 = 6543 */ 1156129202Scognet#endif 1157129202Scognet strh ip, [r0, #0x01] 1158129202Scognet str r3, [r0, #0x03] 1159135683Scognet bx lr 1160129202Scognet LMEMCPY_8_PAD 1161129202Scognet 1162129202Scognet/* 1163129202Scognet * 0111: dst is 8-bit aligned, src is 8-bit aligned 1164129202Scognet */ 1165129202Scognet ldrb r3, [r1] /* r3 = ...0 */ 1166129202Scognet ldr ip, [r1, #0x01] /* BE:ip = 1234 LE:ip = 4321 */ 1167129202Scognet ldrh r2, [r1, #0x05] /* BE:r2 = ..56 LE:r2 = ..65 */ 1168129202Scognet ldrb r1, [r1, #0x07] /* r1 = ...7 */ 1169129202Scognet strb r3, [r0] 1170129202Scognet mov r3, ip, lsr #16 /* BE:r3 = ..12 LE:r3 = ..43 */ 1171129202Scognet#ifdef __ARMEB__ 1172129202Scognet strh r3, [r0, #0x01] 1173129202Scognet orr r2, r2, ip, lsl #16 /* r2 = 3456 */ 1174129202Scognet#else 1175129202Scognet strh ip, [r0, #0x01] 1176129202Scognet orr r2, r3, r2, lsl #16 /* r2 = 6543 */ 1177129202Scognet#endif 1178129202Scognet str r2, [r0, #0x03] 1179129202Scognet strb r1, [r0, #0x07] 1180135683Scognet bx lr 1181129202Scognet LMEMCPY_8_PAD 1182129202Scognet 1183129202Scognet/* 1184129202Scognet * 1000: dst is 16-bit aligned, src is 32-bit aligned 1185129202Scognet */ 1186129202Scognet ldr r2, [r1] /* BE:r2 = 0123 LE:r2 = 3210 */ 1187129202Scognet ldr r3, [r1, #0x04] /* BE:r3 = 4567 LE:r3 = 7654 */ 1188129202Scognet mov r1, r2, lsr #16 /* BE:r1 = ..01 LE:r1 = ..32 */ 1189129202Scognet#ifdef __ARMEB__ 1190129202Scognet strh r1, [r0] 1191129202Scognet mov r1, r3, lsr #16 /* r1 = ..45 */ 1192129202Scognet orr r2, r1 ,r2, lsl #16 /* r2 = 2345 */ 1193129202Scognet#else 1194129202Scognet strh r2, [r0] 1195129202Scognet orr r2, r1, r3, lsl #16 /* r2 = 5432 */ 1196129202Scognet mov r3, r3, lsr #16 /* r3 = ..76 */ 1197129202Scognet#endif 1198129202Scognet str r2, [r0, #0x02] 1199129202Scognet strh r3, [r0, #0x06] 1200135683Scognet bx lr 1201129202Scognet LMEMCPY_8_PAD 1202129202Scognet 1203129202Scognet/* 1204129202Scognet * 1001: dst is 16-bit aligned, src is 8-bit aligned 1205129202Scognet */ 1206129202Scognet ldr r2, [r1, #-1] /* BE:r2 = x012 LE:r2 = 210x */ 1207129202Scognet ldr r3, [r1, #0x03] /* BE:r3 = 3456 LE:r3 = 6543 */ 1208129202Scognet ldrb ip, [r1, #0x07] /* ip = ...7 */ 1209129202Scognet mov r1, r2, lsr #8 /* BE:r1 = .x01 LE:r1 = .210 */ 1210129202Scognet strh r1, [r0] 1211129202Scognet#ifdef __ARMEB__ 1212129202Scognet mov r1, r2, lsl #24 /* r1 = 2... */ 1213129202Scognet orr r1, r1, r3, lsr #8 /* r1 = 2345 */ 1214129202Scognet orr r3, ip, r3, lsl #8 /* r3 = 4567 */ 1215129202Scognet#else 1216129202Scognet mov r1, r2, lsr #24 /* r1 = ...2 */ 1217129202Scognet orr r1, r1, r3, lsl #8 /* r1 = 5432 */ 1218129202Scognet mov r3, r3, lsr #24 /* r3 = ...6 */ 1219129202Scognet orr r3, r3, ip, lsl #8 /* r3 = ..76 */ 1220129202Scognet#endif 1221129202Scognet str r1, [r0, #0x02] 1222129202Scognet strh r3, [r0, #0x06] 1223135683Scognet bx lr 1224129202Scognet LMEMCPY_8_PAD 1225129202Scognet 1226129202Scognet/* 1227129202Scognet * 1010: dst is 16-bit aligned, src is 16-bit aligned 1228129202Scognet */ 1229129202Scognet ldrh r2, [r1] 1230129202Scognet ldr ip, [r1, #0x02] 1231129202Scognet ldrh r3, [r1, #0x06] 1232129202Scognet strh r2, [r0] 1233129202Scognet str ip, [r0, #0x02] 1234129202Scognet strh r3, [r0, #0x06] 1235135683Scognet bx lr 1236129202Scognet LMEMCPY_8_PAD 1237129202Scognet 1238129202Scognet/* 1239129202Scognet * 1011: dst is 16-bit aligned, src is 8-bit aligned 1240129202Scognet */ 1241129202Scognet ldr r3, [r1, #0x05] /* BE:r3 = 567x LE:r3 = x765 */ 1242129202Scognet ldr r2, [r1, #0x01] /* BE:r2 = 1234 LE:r2 = 4321 */ 1243129202Scognet ldrb ip, [r1] /* ip = ...0 */ 1244129202Scognet mov r1, r3, lsr #8 /* BE:r1 = .567 LE:r1 = .x76 */ 1245129202Scognet strh r1, [r0, #0x06] 1246129202Scognet#ifdef __ARMEB__ 1247129202Scognet mov r3, r3, lsr #24 /* r3 = ...5 */ 1248129202Scognet orr r3, r3, r2, lsl #8 /* r3 = 2345 */ 1249129202Scognet mov r2, r2, lsr #24 /* r2 = ...1 */ 1250129202Scognet orr r2, r2, ip, lsl #8 /* r2 = ..01 */ 1251129202Scognet#else 1252129202Scognet mov r3, r3, lsl #24 /* r3 = 5... */ 1253129202Scognet orr r3, r3, r2, lsr #8 /* r3 = 5432 */ 1254129202Scognet orr r2, ip, r2, lsl #8 /* r2 = 3210 */ 1255129202Scognet#endif 1256129202Scognet str r3, [r0, #0x02] 1257129202Scognet strh r2, [r0] 1258135683Scognet bx lr 1259129202Scognet LMEMCPY_8_PAD 1260129202Scognet 1261129202Scognet/* 1262129202Scognet * 1100: dst is 8-bit aligned, src is 32-bit aligned 1263129202Scognet */ 1264129202Scognet ldr r3, [r1, #0x04] /* BE:r3 = 4567 LE:r3 = 7654 */ 1265129202Scognet ldr r2, [r1] /* BE:r2 = 0123 LE:r2 = 3210 */ 1266129202Scognet mov r1, r3, lsr #8 /* BE:r1 = .456 LE:r1 = .765 */ 1267129202Scognet strh r1, [r0, #0x05] 1268129202Scognet#ifdef __ARMEB__ 1269129202Scognet strb r3, [r0, #0x07] 1270129202Scognet mov r1, r2, lsr #24 /* r1 = ...0 */ 1271129202Scognet strb r1, [r0] 1272129202Scognet mov r2, r2, lsl #8 /* r2 = 123. */ 1273129202Scognet orr r2, r2, r3, lsr #24 /* r2 = 1234 */ 1274129202Scognet str r2, [r0, #0x01] 1275129202Scognet#else 1276129202Scognet strb r2, [r0] 1277129202Scognet mov r1, r3, lsr #24 /* r1 = ...7 */ 1278129202Scognet strb r1, [r0, #0x07] 1279129202Scognet mov r2, r2, lsr #8 /* r2 = .321 */ 1280129202Scognet orr r2, r2, r3, lsl #24 /* r2 = 4321 */ 1281129202Scognet str r2, [r0, #0x01] 1282129202Scognet#endif 1283135683Scognet bx lr 1284129202Scognet LMEMCPY_8_PAD 1285129202Scognet 1286129202Scognet/* 1287129202Scognet * 1101: dst is 8-bit aligned, src is 8-bit aligned 1288129202Scognet */ 1289129202Scognet ldrb r3, [r1] /* r3 = ...0 */ 1290129202Scognet ldrh r2, [r1, #0x01] /* BE:r2 = ..12 LE:r2 = ..21 */ 1291129202Scognet ldr ip, [r1, #0x03] /* BE:ip = 3456 LE:ip = 6543 */ 1292129202Scognet ldrb r1, [r1, #0x07] /* r1 = ...7 */ 1293129202Scognet strb r3, [r0] 1294129202Scognet mov r3, ip, lsr #16 /* BE:r3 = ..34 LE:r3 = ..65 */ 1295129202Scognet#ifdef __ARMEB__ 1296129202Scognet strh ip, [r0, #0x05] 1297129202Scognet orr r2, r3, r2, lsl #16 /* r2 = 1234 */ 1298129202Scognet#else 1299129202Scognet strh r3, [r0, #0x05] 1300129202Scognet orr r2, r2, ip, lsl #16 /* r2 = 4321 */ 1301129202Scognet#endif 1302129202Scognet str r2, [r0, #0x01] 1303129202Scognet strb r1, [r0, #0x07] 1304135683Scognet bx lr 1305129202Scognet LMEMCPY_8_PAD 1306129202Scognet 1307129202Scognet/* 1308129202Scognet * 1110: dst is 8-bit aligned, src is 16-bit aligned 1309129202Scognet */ 1310129202Scognet ldrh r2, [r1] /* BE:r2 = ..01 LE:r2 = ..10 */ 1311129202Scognet ldr r3, [r1, #0x02] /* BE:r3 = 2345 LE:r3 = 5432 */ 1312129202Scognet ldrh r1, [r1, #0x06] /* BE:r1 = ..67 LE:r1 = ..76 */ 1313129202Scognet#ifdef __ARMEB__ 1314129202Scognet mov ip, r2, lsr #8 /* ip = ...0 */ 1315129202Scognet strb ip, [r0] 1316129202Scognet mov ip, r2, lsl #24 /* ip = 1... */ 1317129202Scognet orr ip, ip, r3, lsr #8 /* ip = 1234 */ 1318129202Scognet strb r1, [r0, #0x07] 1319129202Scognet mov r1, r1, lsr #8 /* r1 = ...6 */ 1320129202Scognet orr r1, r1, r3, lsl #8 /* r1 = 3456 */ 1321129202Scognet#else 1322129202Scognet strb r2, [r0] 1323129202Scognet mov ip, r2, lsr #8 /* ip = ...1 */ 1324129202Scognet orr ip, ip, r3, lsl #8 /* ip = 4321 */ 1325129202Scognet mov r2, r1, lsr #8 /* r2 = ...7 */ 1326129202Scognet strb r2, [r0, #0x07] 1327129202Scognet mov r1, r1, lsl #8 /* r1 = .76. */ 1328129202Scognet orr r1, r1, r3, lsr #24 /* r1 = .765 */ 1329129202Scognet#endif 1330129202Scognet str ip, [r0, #0x01] 1331129202Scognet strh r1, [r0, #0x05] 1332135683Scognet bx lr 1333129202Scognet LMEMCPY_8_PAD 1334129202Scognet 1335129202Scognet/* 1336129202Scognet * 1111: dst is 8-bit aligned, src is 8-bit aligned 1337129202Scognet */ 1338129202Scognet ldrb r2, [r1] 1339129202Scognet ldr ip, [r1, #0x01] 1340129202Scognet ldrh r3, [r1, #0x05] 1341129202Scognet ldrb r1, [r1, #0x07] 1342129202Scognet strb r2, [r0] 1343129202Scognet str ip, [r0, #0x01] 1344129202Scognet strh r3, [r0, #0x05] 1345129202Scognet strb r1, [r0, #0x07] 1346135683Scognet bx lr 1347129202Scognet LMEMCPY_8_PAD 1348129202Scognet 1349129202Scognet/****************************************************************************** 1350129202Scognet * Special case for 12 byte copies 1351129202Scognet */ 1352129202Scognet#define LMEMCPY_C_LOG2 7 /* 128 bytes */ 1353129202Scognet#define LMEMCPY_C_PAD .align LMEMCPY_C_LOG2 1354129202Scognet LMEMCPY_C_PAD 1355129202Scognet.Lmemcpy_c: 1356129202Scognet and r2, r1, #0x03 1357129202Scognet orr r2, r2, r0, lsl #2 1358129202Scognet ands r2, r2, #0x0f 1359129202Scognet sub r3, pc, #0x14 1360129202Scognet addne pc, r3, r2, lsl #LMEMCPY_C_LOG2 1361129202Scognet 1362129202Scognet/* 1363129202Scognet * 0000: dst is 32-bit aligned, src is 32-bit aligned 1364129202Scognet */ 1365129202Scognet ldr r2, [r1] 1366129202Scognet ldr r3, [r1, #0x04] 1367129202Scognet ldr r1, [r1, #0x08] 1368129202Scognet str r2, [r0] 1369129202Scognet str r3, [r0, #0x04] 1370129202Scognet str r1, [r0, #0x08] 1371135683Scognet bx lr 1372129202Scognet LMEMCPY_C_PAD 1373129202Scognet 1374129202Scognet/* 1375129202Scognet * 0001: dst is 32-bit aligned, src is 8-bit aligned 1376129202Scognet */ 1377129202Scognet ldrb r2, [r1, #0xb] /* r2 = ...B */ 1378129202Scognet ldr ip, [r1, #0x07] /* BE:ip = 789A LE:ip = A987 */ 1379129202Scognet ldr r3, [r1, #0x03] /* BE:r3 = 3456 LE:r3 = 6543 */ 1380129202Scognet ldr r1, [r1, #-1] /* BE:r1 = x012 LE:r1 = 210x */ 1381129202Scognet#ifdef __ARMEB__ 1382129202Scognet orr r2, r2, ip, lsl #8 /* r2 = 89AB */ 1383129202Scognet str r2, [r0, #0x08] 1384129202Scognet mov r2, ip, lsr #24 /* r2 = ...7 */ 1385129202Scognet orr r2, r2, r3, lsl #8 /* r2 = 4567 */ 1386129202Scognet mov r1, r1, lsl #8 /* r1 = 012. */ 1387129202Scognet orr r1, r1, r3, lsr #24 /* r1 = 0123 */ 1388129202Scognet#else 1389129202Scognet mov r2, r2, lsl #24 /* r2 = B... */ 1390129202Scognet orr r2, r2, ip, lsr #8 /* r2 = BA98 */ 1391129202Scognet str r2, [r0, #0x08] 1392129202Scognet mov r2, ip, lsl #24 /* r2 = 7... */ 1393129202Scognet orr r2, r2, r3, lsr #8 /* r2 = 7654 */ 1394129202Scognet mov r1, r1, lsr #8 /* r1 = .210 */ 1395129202Scognet orr r1, r1, r3, lsl #24 /* r1 = 3210 */ 1396129202Scognet#endif 1397129202Scognet str r2, [r0, #0x04] 1398129202Scognet str r1, [r0] 1399135683Scognet bx lr 1400129202Scognet LMEMCPY_C_PAD 1401129202Scognet 1402129202Scognet/* 1403129202Scognet * 0010: dst is 32-bit aligned, src is 16-bit aligned 1404129202Scognet */ 1405129202Scognet ldrh r2, [r1] /* BE:r2 = ..01 LE:r2 = ..10 */ 1406129202Scognet ldr r3, [r1, #0x02] /* BE:r3 = 2345 LE:r3 = 5432 */ 1407129202Scognet ldr ip, [r1, #0x06] /* BE:ip = 6789 LE:ip = 9876 */ 1408129202Scognet ldrh r1, [r1, #0x0a] /* BE:r1 = ..AB LE:r1 = ..BA */ 1409129202Scognet#ifdef __ARMEB__ 1410129202Scognet mov r2, r2, lsl #16 /* r2 = 01.. */ 1411129202Scognet orr r2, r2, r3, lsr #16 /* r2 = 0123 */ 1412129202Scognet str r2, [r0] 1413129202Scognet mov r3, r3, lsl #16 /* r3 = 45.. */ 1414129202Scognet orr r3, r3, ip, lsr #16 /* r3 = 4567 */ 1415129202Scognet orr r1, r1, ip, lsl #16 /* r1 = 89AB */ 1416129202Scognet#else 1417129202Scognet orr r2, r2, r3, lsl #16 /* r2 = 3210 */ 1418129202Scognet str r2, [r0] 1419129202Scognet mov r3, r3, lsr #16 /* r3 = ..54 */ 1420129202Scognet orr r3, r3, ip, lsl #16 /* r3 = 7654 */ 1421129202Scognet mov r1, r1, lsl #16 /* r1 = BA.. */ 1422129202Scognet orr r1, r1, ip, lsr #16 /* r1 = BA98 */ 1423129202Scognet#endif 1424129202Scognet str r3, [r0, #0x04] 1425129202Scognet str r1, [r0, #0x08] 1426135683Scognet bx lr 1427129202Scognet LMEMCPY_C_PAD 1428129202Scognet 1429129202Scognet/* 1430129202Scognet * 0011: dst is 32-bit aligned, src is 8-bit aligned 1431129202Scognet */ 1432129202Scognet ldrb r2, [r1] /* r2 = ...0 */ 1433129202Scognet ldr r3, [r1, #0x01] /* BE:r3 = 1234 LE:r3 = 4321 */ 1434129202Scognet ldr ip, [r1, #0x05] /* BE:ip = 5678 LE:ip = 8765 */ 1435129202Scognet ldr r1, [r1, #0x09] /* BE:r1 = 9ABx LE:r1 = xBA9 */ 1436129202Scognet#ifdef __ARMEB__ 1437129202Scognet mov r2, r2, lsl #24 /* r2 = 0... */ 1438129202Scognet orr r2, r2, r3, lsr #8 /* r2 = 0123 */ 1439129202Scognet str r2, [r0] 1440129202Scognet mov r3, r3, lsl #24 /* r3 = 4... */ 1441129202Scognet orr r3, r3, ip, lsr #8 /* r3 = 4567 */ 1442129202Scognet mov r1, r1, lsr #8 /* r1 = .9AB */ 1443129202Scognet orr r1, r1, ip, lsl #24 /* r1 = 89AB */ 1444129202Scognet#else 1445129202Scognet orr r2, r2, r3, lsl #8 /* r2 = 3210 */ 1446129202Scognet str r2, [r0] 1447129202Scognet mov r3, r3, lsr #24 /* r3 = ...4 */ 1448129202Scognet orr r3, r3, ip, lsl #8 /* r3 = 7654 */ 1449129202Scognet mov r1, r1, lsl #8 /* r1 = BA9. */ 1450129202Scognet orr r1, r1, ip, lsr #24 /* r1 = BA98 */ 1451129202Scognet#endif 1452129202Scognet str r3, [r0, #0x04] 1453129202Scognet str r1, [r0, #0x08] 1454135683Scognet bx lr 1455129202Scognet LMEMCPY_C_PAD 1456129202Scognet 1457129202Scognet/* 1458129202Scognet * 0100: dst is 8-bit aligned (byte 1), src is 32-bit aligned 1459129202Scognet */ 1460129202Scognet ldr r2, [r1] /* BE:r2 = 0123 LE:r2 = 3210 */ 1461129202Scognet ldr r3, [r1, #0x04] /* BE:r3 = 4567 LE:r3 = 7654 */ 1462129202Scognet ldr ip, [r1, #0x08] /* BE:ip = 89AB LE:ip = BA98 */ 1463129202Scognet mov r1, r2, lsr #8 /* BE:r1 = .012 LE:r1 = .321 */ 1464129202Scognet strh r1, [r0, #0x01] 1465129202Scognet#ifdef __ARMEB__ 1466129202Scognet mov r1, r2, lsr #24 /* r1 = ...0 */ 1467129202Scognet strb r1, [r0] 1468129202Scognet mov r1, r2, lsl #24 /* r1 = 3... */ 1469129202Scognet orr r2, r1, r3, lsr #8 /* r1 = 3456 */ 1470129202Scognet mov r1, r3, lsl #24 /* r1 = 7... */ 1471129202Scognet orr r1, r1, ip, lsr #8 /* r1 = 789A */ 1472129202Scognet#else 1473129202Scognet strb r2, [r0] 1474129202Scognet mov r1, r2, lsr #24 /* r1 = ...3 */ 1475129202Scognet orr r2, r1, r3, lsl #8 /* r1 = 6543 */ 1476129202Scognet mov r1, r3, lsr #24 /* r1 = ...7 */ 1477129202Scognet orr r1, r1, ip, lsl #8 /* r1 = A987 */ 1478129202Scognet mov ip, ip, lsr #24 /* ip = ...B */ 1479129202Scognet#endif 1480129202Scognet str r2, [r0, #0x03] 1481129202Scognet str r1, [r0, #0x07] 1482129202Scognet strb ip, [r0, #0x0b] 1483135683Scognet bx lr 1484129202Scognet LMEMCPY_C_PAD 1485129202Scognet 1486129202Scognet/* 1487129202Scognet * 0101: dst is 8-bit aligned (byte 1), src is 8-bit aligned (byte 1) 1488129202Scognet */ 1489129202Scognet ldrb r2, [r1] 1490129202Scognet ldrh r3, [r1, #0x01] 1491129202Scognet ldr ip, [r1, #0x03] 1492129202Scognet strb r2, [r0] 1493129202Scognet ldr r2, [r1, #0x07] 1494129202Scognet ldrb r1, [r1, #0x0b] 1495129202Scognet strh r3, [r0, #0x01] 1496129202Scognet str ip, [r0, #0x03] 1497129202Scognet str r2, [r0, #0x07] 1498129202Scognet strb r1, [r0, #0x0b] 1499135683Scognet bx lr 1500129202Scognet LMEMCPY_C_PAD 1501129202Scognet 1502129202Scognet/* 1503129202Scognet * 0110: dst is 8-bit aligned (byte 1), src is 16-bit aligned 1504129202Scognet */ 1505129202Scognet ldrh r2, [r1] /* BE:r2 = ..01 LE:r2 = ..10 */ 1506129202Scognet ldr r3, [r1, #0x02] /* BE:r3 = 2345 LE:r3 = 5432 */ 1507129202Scognet ldr ip, [r1, #0x06] /* BE:ip = 6789 LE:ip = 9876 */ 1508129202Scognet ldrh r1, [r1, #0x0a] /* BE:r1 = ..AB LE:r1 = ..BA */ 1509129202Scognet#ifdef __ARMEB__ 1510129202Scognet mov r2, r2, ror #8 /* r2 = 1..0 */ 1511129202Scognet strb r2, [r0] 1512129202Scognet mov r2, r2, lsr #16 /* r2 = ..1. */ 1513129202Scognet orr r2, r2, r3, lsr #24 /* r2 = ..12 */ 1514129202Scognet strh r2, [r0, #0x01] 1515129202Scognet mov r2, r3, lsl #8 /* r2 = 345. */ 1516129202Scognet orr r3, r2, ip, lsr #24 /* r3 = 3456 */ 1517129202Scognet mov r2, ip, lsl #8 /* r2 = 789. */ 1518129202Scognet orr r2, r2, r1, lsr #8 /* r2 = 789A */ 1519129202Scognet#else 1520129202Scognet strb r2, [r0] 1521129202Scognet mov r2, r2, lsr #8 /* r2 = ...1 */ 1522129202Scognet orr r2, r2, r3, lsl #8 /* r2 = 4321 */ 1523129202Scognet strh r2, [r0, #0x01] 1524129202Scognet mov r2, r3, lsr #8 /* r2 = .543 */ 1525129202Scognet orr r3, r2, ip, lsl #24 /* r3 = 6543 */ 1526129202Scognet mov r2, ip, lsr #8 /* r2 = .987 */ 1527129202Scognet orr r2, r2, r1, lsl #24 /* r2 = A987 */ 1528129202Scognet mov r1, r1, lsr #8 /* r1 = ...B */ 1529129202Scognet#endif 1530129202Scognet str r3, [r0, #0x03] 1531129202Scognet str r2, [r0, #0x07] 1532129202Scognet strb r1, [r0, #0x0b] 1533135683Scognet bx lr 1534129202Scognet LMEMCPY_C_PAD 1535129202Scognet 1536129202Scognet/* 1537129202Scognet * 0111: dst is 8-bit aligned (byte 1), src is 8-bit aligned (byte 3) 1538129202Scognet */ 1539129202Scognet ldrb r2, [r1] 1540129202Scognet ldr r3, [r1, #0x01] /* BE:r3 = 1234 LE:r3 = 4321 */ 1541129202Scognet ldr ip, [r1, #0x05] /* BE:ip = 5678 LE:ip = 8765 */ 1542129202Scognet ldr r1, [r1, #0x09] /* BE:r1 = 9ABx LE:r1 = xBA9 */ 1543129202Scognet strb r2, [r0] 1544129202Scognet#ifdef __ARMEB__ 1545129202Scognet mov r2, r3, lsr #16 /* r2 = ..12 */ 1546129202Scognet strh r2, [r0, #0x01] 1547129202Scognet mov r3, r3, lsl #16 /* r3 = 34.. */ 1548129202Scognet orr r3, r3, ip, lsr #16 /* r3 = 3456 */ 1549129202Scognet mov ip, ip, lsl #16 /* ip = 78.. */ 1550129202Scognet orr ip, ip, r1, lsr #16 /* ip = 789A */ 1551129202Scognet mov r1, r1, lsr #8 /* r1 = .9AB */ 1552129202Scognet#else 1553129202Scognet strh r3, [r0, #0x01] 1554129202Scognet mov r3, r3, lsr #16 /* r3 = ..43 */ 1555129202Scognet orr r3, r3, ip, lsl #16 /* r3 = 6543 */ 1556129202Scognet mov ip, ip, lsr #16 /* ip = ..87 */ 1557129202Scognet orr ip, ip, r1, lsl #16 /* ip = A987 */ 1558129202Scognet mov r1, r1, lsr #16 /* r1 = ..xB */ 1559129202Scognet#endif 1560129202Scognet str r3, [r0, #0x03] 1561129202Scognet str ip, [r0, #0x07] 1562129202Scognet strb r1, [r0, #0x0b] 1563135683Scognet bx lr 1564129202Scognet LMEMCPY_C_PAD 1565129202Scognet 1566129202Scognet/* 1567129202Scognet * 1000: dst is 16-bit aligned, src is 32-bit aligned 1568129202Scognet */ 1569129202Scognet ldr ip, [r1] /* BE:ip = 0123 LE:ip = 3210 */ 1570129202Scognet ldr r3, [r1, #0x04] /* BE:r3 = 4567 LE:r3 = 7654 */ 1571129202Scognet ldr r2, [r1, #0x08] /* BE:r2 = 89AB LE:r2 = BA98 */ 1572129202Scognet mov r1, ip, lsr #16 /* BE:r1 = ..01 LE:r1 = ..32 */ 1573129202Scognet#ifdef __ARMEB__ 1574129202Scognet strh r1, [r0] 1575129202Scognet mov r1, ip, lsl #16 /* r1 = 23.. */ 1576129202Scognet orr r1, r1, r3, lsr #16 /* r1 = 2345 */ 1577129202Scognet mov r3, r3, lsl #16 /* r3 = 67.. */ 1578129202Scognet orr r3, r3, r2, lsr #16 /* r3 = 6789 */ 1579129202Scognet#else 1580129202Scognet strh ip, [r0] 1581129202Scognet orr r1, r1, r3, lsl #16 /* r1 = 5432 */ 1582129202Scognet mov r3, r3, lsr #16 /* r3 = ..76 */ 1583129202Scognet orr r3, r3, r2, lsl #16 /* r3 = 9876 */ 1584129202Scognet mov r2, r2, lsr #16 /* r2 = ..BA */ 1585129202Scognet#endif 1586129202Scognet str r1, [r0, #0x02] 1587129202Scognet str r3, [r0, #0x06] 1588129202Scognet strh r2, [r0, #0x0a] 1589135683Scognet bx lr 1590129202Scognet LMEMCPY_C_PAD 1591129202Scognet 1592129202Scognet/* 1593129202Scognet * 1001: dst is 16-bit aligned, src is 8-bit aligned (byte 1) 1594129202Scognet */ 1595129202Scognet ldr r2, [r1, #-1] /* BE:r2 = x012 LE:r2 = 210x */ 1596129202Scognet ldr r3, [r1, #0x03] /* BE:r3 = 3456 LE:r3 = 6543 */ 1597129202Scognet mov ip, r2, lsr #8 /* BE:ip = .x01 LE:ip = .210 */ 1598129202Scognet strh ip, [r0] 1599129202Scognet ldr ip, [r1, #0x07] /* BE:ip = 789A LE:ip = A987 */ 1600129202Scognet ldrb r1, [r1, #0x0b] /* r1 = ...B */ 1601129202Scognet#ifdef __ARMEB__ 1602129202Scognet mov r2, r2, lsl #24 /* r2 = 2... */ 1603129202Scognet orr r2, r2, r3, lsr #8 /* r2 = 2345 */ 1604129202Scognet mov r3, r3, lsl #24 /* r3 = 6... */ 1605129202Scognet orr r3, r3, ip, lsr #8 /* r3 = 6789 */ 1606129202Scognet orr r1, r1, ip, lsl #8 /* r1 = 89AB */ 1607129202Scognet#else 1608129202Scognet mov r2, r2, lsr #24 /* r2 = ...2 */ 1609129202Scognet orr r2, r2, r3, lsl #8 /* r2 = 5432 */ 1610129202Scognet mov r3, r3, lsr #24 /* r3 = ...6 */ 1611129202Scognet orr r3, r3, ip, lsl #8 /* r3 = 9876 */ 1612129202Scognet mov r1, r1, lsl #8 /* r1 = ..B. */ 1613129202Scognet orr r1, r1, ip, lsr #24 /* r1 = ..BA */ 1614129202Scognet#endif 1615129202Scognet str r2, [r0, #0x02] 1616129202Scognet str r3, [r0, #0x06] 1617129202Scognet strh r1, [r0, #0x0a] 1618135683Scognet bx lr 1619129202Scognet LMEMCPY_C_PAD 1620129202Scognet 1621129202Scognet/* 1622129202Scognet * 1010: dst is 16-bit aligned, src is 16-bit aligned 1623129202Scognet */ 1624129202Scognet ldrh r2, [r1] 1625129202Scognet ldr r3, [r1, #0x02] 1626129202Scognet ldr ip, [r1, #0x06] 1627129202Scognet ldrh r1, [r1, #0x0a] 1628129202Scognet strh r2, [r0] 1629129202Scognet str r3, [r0, #0x02] 1630129202Scognet str ip, [r0, #0x06] 1631129202Scognet strh r1, [r0, #0x0a] 1632135683Scognet bx lr 1633129202Scognet LMEMCPY_C_PAD 1634129202Scognet 1635129202Scognet/* 1636129202Scognet * 1011: dst is 16-bit aligned, src is 8-bit aligned (byte 3) 1637129202Scognet */ 1638129202Scognet ldr r2, [r1, #0x09] /* BE:r2 = 9ABx LE:r2 = xBA9 */ 1639129202Scognet ldr r3, [r1, #0x05] /* BE:r3 = 5678 LE:r3 = 8765 */ 1640129202Scognet mov ip, r2, lsr #8 /* BE:ip = .9AB LE:ip = .xBA */ 1641129202Scognet strh ip, [r0, #0x0a] 1642129202Scognet ldr ip, [r1, #0x01] /* BE:ip = 1234 LE:ip = 4321 */ 1643129202Scognet ldrb r1, [r1] /* r1 = ...0 */ 1644129202Scognet#ifdef __ARMEB__ 1645129202Scognet mov r2, r2, lsr #24 /* r2 = ...9 */ 1646129202Scognet orr r2, r2, r3, lsl #8 /* r2 = 6789 */ 1647129202Scognet mov r3, r3, lsr #24 /* r3 = ...5 */ 1648129202Scognet orr r3, r3, ip, lsl #8 /* r3 = 2345 */ 1649129202Scognet mov r1, r1, lsl #8 /* r1 = ..0. */ 1650129202Scognet orr r1, r1, ip, lsr #24 /* r1 = ..01 */ 1651129202Scognet#else 1652129202Scognet mov r2, r2, lsl #24 /* r2 = 9... */ 1653129202Scognet orr r2, r2, r3, lsr #8 /* r2 = 9876 */ 1654129202Scognet mov r3, r3, lsl #24 /* r3 = 5... */ 1655129202Scognet orr r3, r3, ip, lsr #8 /* r3 = 5432 */ 1656129202Scognet orr r1, r1, ip, lsl #8 /* r1 = 3210 */ 1657129202Scognet#endif 1658129202Scognet str r2, [r0, #0x06] 1659129202Scognet str r3, [r0, #0x02] 1660129202Scognet strh r1, [r0] 1661135683Scognet bx lr 1662129202Scognet LMEMCPY_C_PAD 1663129202Scognet 1664129202Scognet/* 1665129202Scognet * 1100: dst is 8-bit aligned (byte 3), src is 32-bit aligned 1666129202Scognet */ 1667129202Scognet ldr r2, [r1] /* BE:r2 = 0123 LE:r2 = 3210 */ 1668129202Scognet ldr ip, [r1, #0x04] /* BE:ip = 4567 LE:ip = 7654 */ 1669129202Scognet ldr r1, [r1, #0x08] /* BE:r1 = 89AB LE:r1 = BA98 */ 1670129202Scognet#ifdef __ARMEB__ 1671129202Scognet mov r3, r2, lsr #24 /* r3 = ...0 */ 1672129202Scognet strb r3, [r0] 1673129202Scognet mov r2, r2, lsl #8 /* r2 = 123. */ 1674129202Scognet orr r2, r2, ip, lsr #24 /* r2 = 1234 */ 1675129202Scognet str r2, [r0, #0x01] 1676129202Scognet mov r2, ip, lsl #8 /* r2 = 567. */ 1677129202Scognet orr r2, r2, r1, lsr #24 /* r2 = 5678 */ 1678129202Scognet str r2, [r0, #0x05] 1679129202Scognet mov r2, r1, lsr #8 /* r2 = ..9A */ 1680129202Scognet strh r2, [r0, #0x09] 1681129202Scognet strb r1, [r0, #0x0b] 1682129202Scognet#else 1683129202Scognet strb r2, [r0] 1684129202Scognet mov r3, r2, lsr #8 /* r3 = .321 */ 1685129202Scognet orr r3, r3, ip, lsl #24 /* r3 = 4321 */ 1686129202Scognet str r3, [r0, #0x01] 1687129202Scognet mov r3, ip, lsr #8 /* r3 = .765 */ 1688129202Scognet orr r3, r3, r1, lsl #24 /* r3 = 8765 */ 1689129202Scognet str r3, [r0, #0x05] 1690129202Scognet mov r1, r1, lsr #8 /* r1 = .BA9 */ 1691129202Scognet strh r1, [r0, #0x09] 1692129202Scognet mov r1, r1, lsr #16 /* r1 = ...B */ 1693129202Scognet strb r1, [r0, #0x0b] 1694129202Scognet#endif 1695135683Scognet bx lr 1696129202Scognet LMEMCPY_C_PAD 1697129202Scognet 1698129202Scognet/* 1699129202Scognet * 1101: dst is 8-bit aligned (byte 3), src is 8-bit aligned (byte 1) 1700129202Scognet */ 1701129202Scognet ldrb r2, [r1, #0x0b] /* r2 = ...B */ 1702129202Scognet ldr r3, [r1, #0x07] /* BE:r3 = 789A LE:r3 = A987 */ 1703129202Scognet ldr ip, [r1, #0x03] /* BE:ip = 3456 LE:ip = 6543 */ 1704129202Scognet ldr r1, [r1, #-1] /* BE:r1 = x012 LE:r1 = 210x */ 1705129202Scognet strb r2, [r0, #0x0b] 1706129202Scognet#ifdef __ARMEB__ 1707129202Scognet strh r3, [r0, #0x09] 1708129202Scognet mov r3, r3, lsr #16 /* r3 = ..78 */ 1709129202Scognet orr r3, r3, ip, lsl #16 /* r3 = 5678 */ 1710129202Scognet mov ip, ip, lsr #16 /* ip = ..34 */ 1711129202Scognet orr ip, ip, r1, lsl #16 /* ip = 1234 */ 1712129202Scognet mov r1, r1, lsr #16 /* r1 = ..x0 */ 1713129202Scognet#else 1714129202Scognet mov r2, r3, lsr #16 /* r2 = ..A9 */ 1715129202Scognet strh r2, [r0, #0x09] 1716129202Scognet mov r3, r3, lsl #16 /* r3 = 87.. */ 1717129202Scognet orr r3, r3, ip, lsr #16 /* r3 = 8765 */ 1718129202Scognet mov ip, ip, lsl #16 /* ip = 43.. */ 1719129202Scognet orr ip, ip, r1, lsr #16 /* ip = 4321 */ 1720129202Scognet mov r1, r1, lsr #8 /* r1 = .210 */ 1721129202Scognet#endif 1722129202Scognet str r3, [r0, #0x05] 1723129202Scognet str ip, [r0, #0x01] 1724129202Scognet strb r1, [r0] 1725135683Scognet bx lr 1726129202Scognet LMEMCPY_C_PAD 1727129202Scognet 1728129202Scognet/* 1729129202Scognet * 1110: dst is 8-bit aligned (byte 3), src is 16-bit aligned 1730129202Scognet */ 1731129202Scognet#ifdef __ARMEB__ 1732129202Scognet ldrh r2, [r1, #0x0a] /* r2 = ..AB */ 1733129202Scognet ldr ip, [r1, #0x06] /* ip = 6789 */ 1734129202Scognet ldr r3, [r1, #0x02] /* r3 = 2345 */ 1735129202Scognet ldrh r1, [r1] /* r1 = ..01 */ 1736129202Scognet strb r2, [r0, #0x0b] 1737129202Scognet mov r2, r2, lsr #8 /* r2 = ...A */ 1738129202Scognet orr r2, r2, ip, lsl #8 /* r2 = 789A */ 1739129202Scognet mov ip, ip, lsr #8 /* ip = .678 */ 1740129202Scognet orr ip, ip, r3, lsl #24 /* ip = 5678 */ 1741129202Scognet mov r3, r3, lsr #8 /* r3 = .234 */ 1742129202Scognet orr r3, r3, r1, lsl #24 /* r3 = 1234 */ 1743129202Scognet mov r1, r1, lsr #8 /* r1 = ...0 */ 1744129202Scognet strb r1, [r0] 1745129202Scognet str r3, [r0, #0x01] 1746129202Scognet str ip, [r0, #0x05] 1747129202Scognet strh r2, [r0, #0x09] 1748129202Scognet#else 1749129202Scognet ldrh r2, [r1] /* r2 = ..10 */ 1750129202Scognet ldr r3, [r1, #0x02] /* r3 = 5432 */ 1751129202Scognet ldr ip, [r1, #0x06] /* ip = 9876 */ 1752129202Scognet ldrh r1, [r1, #0x0a] /* r1 = ..BA */ 1753129202Scognet strb r2, [r0] 1754129202Scognet mov r2, r2, lsr #8 /* r2 = ...1 */ 1755129202Scognet orr r2, r2, r3, lsl #8 /* r2 = 4321 */ 1756129202Scognet mov r3, r3, lsr #24 /* r3 = ...5 */ 1757129202Scognet orr r3, r3, ip, lsl #8 /* r3 = 8765 */ 1758129202Scognet mov ip, ip, lsr #24 /* ip = ...9 */ 1759129202Scognet orr ip, ip, r1, lsl #8 /* ip = .BA9 */ 1760129202Scognet mov r1, r1, lsr #8 /* r1 = ...B */ 1761129202Scognet str r2, [r0, #0x01] 1762129202Scognet str r3, [r0, #0x05] 1763129202Scognet strh ip, [r0, #0x09] 1764129202Scognet strb r1, [r0, #0x0b] 1765129202Scognet#endif 1766135683Scognet bx lr 1767129202Scognet LMEMCPY_C_PAD 1768129202Scognet 1769129202Scognet/* 1770129202Scognet * 1111: dst is 8-bit aligned (byte 3), src is 8-bit aligned (byte 3) 1771129202Scognet */ 1772129202Scognet ldrb r2, [r1] 1773129202Scognet ldr r3, [r1, #0x01] 1774129202Scognet ldr ip, [r1, #0x05] 1775129202Scognet strb r2, [r0] 1776129202Scognet ldrh r2, [r1, #0x09] 1777129202Scognet ldrb r1, [r1, #0x0b] 1778129202Scognet str r3, [r0, #0x01] 1779129202Scognet str ip, [r0, #0x05] 1780129202Scognet strh r2, [r0, #0x09] 1781129202Scognet strb r1, [r0, #0x0b] 1782135683Scognet bx lr 1783129202Scognet#endif /* !_STANDALONE */ 1784