| /* |
| * linux/arch/arm26/lib/memcpy.S |
| * |
| * Copyright (C) 1995-1999 Russell King |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License version 2 as |
| * published by the Free Software Foundation. |
| * |
| * ASM optimised string functions |
| */ |
| #include <linux/linkage.h> |
| #include <asm/assembler.h> |
| |
| .text |
| |
| #define ENTER \ |
| mov ip,sp ;\ |
| stmfd sp!,{r4-r9,fp,ip,lr,pc} ;\ |
| sub fp,ip,#4 |
| |
| #define EXIT \ |
| LOADREGS(ea, fp, {r4 - r9, fp, sp, pc}) |
| |
| #define EXITEQ \ |
| LOADREGS(eqea, fp, {r4 - r9, fp, sp, pc}) |
| |
| /* |
| * Prototype: void memcpy(void *to,const void *from,unsigned long n); |
| * ARM3: cant use memcopy here!!! |
| */ |
| ENTRY(memcpy) |
| ENTRY(memmove) |
| ENTER |
| cmp r1, r0 |
| bcc 19f |
| subs r2, r2, #4 |
| blt 6f |
| ands ip, r0, #3 |
| bne 7f |
| ands ip, r1, #3 |
| bne 8f |
| |
| 1: subs r2, r2, #8 |
| blt 5f |
| subs r2, r2, #0x14 |
| blt 3f |
| 2: ldmia r1!,{r3 - r9, ip} |
| stmia r0!,{r3 - r9, ip} |
| subs r2, r2, #32 |
| bge 2b |
| cmn r2, #16 |
| ldmgeia r1!, {r3 - r6} |
| stmgeia r0!, {r3 - r6} |
| subge r2, r2, #0x10 |
| 3: adds r2, r2, #0x14 |
| 4: ldmgeia r1!, {r3 - r5} |
| stmgeia r0!, {r3 - r5} |
| subges r2, r2, #12 |
| bge 4b |
| 5: adds r2, r2, #8 |
| blt 6f |
| subs r2, r2, #4 |
| ldrlt r3, [r1], #4 |
| ldmgeia r1!, {r4, r5} |
| strlt r3, [r0], #4 |
| stmgeia r0!, {r4, r5} |
| subge r2, r2, #4 |
| |
| 6: adds r2, r2, #4 |
| EXITEQ |
| cmp r2, #2 |
| ldrb r3, [r1], #1 |
| ldrgeb r4, [r1], #1 |
| ldrgtb r5, [r1], #1 |
| strb r3, [r0], #1 |
| strgeb r4, [r0], #1 |
| strgtb r5, [r0], #1 |
| EXIT |
| |
| 7: rsb ip, ip, #4 |
| cmp ip, #2 |
| ldrb r3, [r1], #1 |
| ldrgeb r4, [r1], #1 |
| ldrgtb r5, [r1], #1 |
| strb r3, [r0], #1 |
| strgeb r4, [r0], #1 |
| strgtb r5, [r0], #1 |
| subs r2, r2, ip |
| blt 6b |
| ands ip, r1, #3 |
| beq 1b |
| |
| 8: bic r1, r1, #3 |
| ldr r7, [r1], #4 |
| cmp ip, #2 |
| bgt 15f |
| beq 11f |
| cmp r2, #12 |
| blt 10f |
| sub r2, r2, #12 |
| 9: mov r3, r7, pull #8 |
| ldmia r1!, {r4 - r7} |
| orr r3, r3, r4, push #24 |
| mov r4, r4, pull #8 |
| orr r4, r4, r5, push #24 |
| mov r5, r5, pull #8 |
| orr r5, r5, r6, push #24 |
| mov r6, r6, pull #8 |
| orr r6, r6, r7, push #24 |
| stmia r0!, {r3 - r6} |
| subs r2, r2, #16 |
| bge 9b |
| adds r2, r2, #12 |
| blt 100f |
| 10: mov r3, r7, pull #8 |
| ldr r7, [r1], #4 |
| subs r2, r2, #4 |
| orr r3, r3, r7, push #24 |
| str r3, [r0], #4 |
| bge 10b |
| 100: sub r1, r1, #3 |
| b 6b |
| |
| 11: cmp r2, #12 |
| blt 13f /* */ |
| sub r2, r2, #12 |
| 12: mov r3, r7, pull #16 |
| ldmia r1!, {r4 - r7} |
| orr r3, r3, r4, push #16 |
| mov r4, r4, pull #16 |
| orr r4, r4, r5, push #16 |
| mov r5, r5, pull #16 |
| orr r5, r5, r6, push #16 |
| mov r6, r6, pull #16 |
| orr r6, r6, r7, push #16 |
| stmia r0!, {r3 - r6} |
| subs r2, r2, #16 |
| bge 12b |
| adds r2, r2, #12 |
| blt 14f |
| 13: mov r3, r7, pull #16 |
| ldr r7, [r1], #4 |
| subs r2, r2, #4 |
| orr r3, r3, r7, push #16 |
| str r3, [r0], #4 |
| bge 13b |
| 14: sub r1, r1, #2 |
| b 6b |
| |
| 15: cmp r2, #12 |
| blt 17f |
| sub r2, r2, #12 |
| 16: mov r3, r7, pull #24 |
| ldmia r1!, {r4 - r7} |
| orr r3, r3, r4, push #8 |
| mov r4, r4, pull #24 |
| orr r4, r4, r5, push #8 |
| mov r5, r5, pull #24 |
| orr r5, r5, r6, push #8 |
| mov r6, r6, pull #24 |
| orr r6, r6, r7, push #8 |
| stmia r0!, {r3 - r6} |
| subs r2, r2, #16 |
| bge 16b |
| adds r2, r2, #12 |
| blt 18f |
| 17: mov r3, r7, pull #24 |
| ldr r7, [r1], #4 |
| subs r2, r2, #4 |
| orr r3, r3, r7, push #8 |
| str r3, [r0], #4 |
| bge 17b |
| 18: sub r1, r1, #1 |
| b 6b |
| |
| |
| 19: add r1, r1, r2 |
| add r0, r0, r2 |
| subs r2, r2, #4 |
| blt 24f |
| ands ip, r0, #3 |
| bne 25f |
| ands ip, r1, #3 |
| bne 26f |
| |
| 20: subs r2, r2, #8 |
| blt 23f |
| subs r2, r2, #0x14 |
| blt 22f |
| 21: ldmdb r1!, {r3 - r9, ip} |
| stmdb r0!, {r3 - r9, ip} |
| subs r2, r2, #32 |
| bge 21b |
| 22: cmn r2, #16 |
| ldmgedb r1!, {r3 - r6} |
| stmgedb r0!, {r3 - r6} |
| subge r2, r2, #16 |
| adds r2, r2, #20 |
| ldmgedb r1!, {r3 - r5} |
| stmgedb r0!, {r3 - r5} |
| subge r2, r2, #12 |
| 23: adds r2, r2, #8 |
| blt 24f |
| subs r2, r2, #4 |
| ldrlt r3, [r1, #-4]! |
| ldmgedb r1!, {r4, r5} |
| strlt r3, [r0, #-4]! |
| stmgedb r0!, {r4, r5} |
| subge r2, r2, #4 |
| |
| 24: adds r2, r2, #4 |
| EXITEQ |
| cmp r2, #2 |
| ldrb r3, [r1, #-1]! |
| ldrgeb r4, [r1, #-1]! |
| ldrgtb r5, [r1, #-1]! |
| strb r3, [r0, #-1]! |
| strgeb r4, [r0, #-1]! |
| strgtb r5, [r0, #-1]! |
| EXIT |
| |
| 25: cmp ip, #2 |
| ldrb r3, [r1, #-1]! |
| ldrgeb r4, [r1, #-1]! |
| ldrgtb r5, [r1, #-1]! |
| strb r3, [r0, #-1]! |
| strgeb r4, [r0, #-1]! |
| strgtb r5, [r0, #-1]! |
| subs r2, r2, ip |
| blt 24b |
| ands ip, r1, #3 |
| beq 20b |
| |
| 26: bic r1, r1, #3 |
| ldr r3, [r1], #0 |
| cmp ip, #2 |
| blt 34f |
| beq 30f |
| cmp r2, #12 |
| blt 28f |
| sub r2, r2, #12 |
| 27: mov r7, r3, push #8 |
| ldmdb r1!, {r3, r4, r5, r6} |
| orr r7, r7, r6, pull #24 |
| mov r6, r6, push #8 |
| orr r6, r6, r5, pull #24 |
| mov r5, r5, push #8 |
| orr r5, r5, r4, pull #24 |
| mov r4, r4, push #8 |
| orr r4, r4, r3, pull #24 |
| stmdb r0!, {r4, r5, r6, r7} |
| subs r2, r2, #16 |
| bge 27b |
| adds r2, r2, #12 |
| blt 29f |
| 28: mov ip, r3, push #8 |
| ldr r3, [r1, #-4]! |
| subs r2, r2, #4 |
| orr ip, ip, r3, pull #24 |
| str ip, [r0, #-4]! |
| bge 28b |
| 29: add r1, r1, #3 |
| b 24b |
| |
| 30: cmp r2, #12 |
| blt 32f |
| sub r2, r2, #12 |
| 31: mov r7, r3, push #16 |
| ldmdb r1!, {r3, r4, r5, r6} |
| orr r7, r7, r6, pull #16 |
| mov r6, r6, push #16 |
| orr r6, r6, r5, pull #16 |
| mov r5, r5, push #16 |
| orr r5, r5, r4, pull #16 |
| mov r4, r4, push #16 |
| orr r4, r4, r3, pull #16 |
| stmdb r0!, {r4, r5, r6, r7} |
| subs r2, r2, #16 |
| bge 31b |
| adds r2, r2, #12 |
| blt 33f |
| 32: mov ip, r3, push #16 |
| ldr r3, [r1, #-4]! |
| subs r2, r2, #4 |
| orr ip, ip, r3, pull #16 |
| str ip, [r0, #-4]! |
| bge 32b |
| 33: add r1, r1, #2 |
| b 24b |
| |
| 34: cmp r2, #12 |
| blt 36f |
| sub r2, r2, #12 |
| 35: mov r7, r3, push #24 |
| ldmdb r1!, {r3, r4, r5, r6} |
| orr r7, r7, r6, pull #8 |
| mov r6, r6, push #24 |
| orr r6, r6, r5, pull #8 |
| mov r5, r5, push #24 |
| orr r5, r5, r4, pull #8 |
| mov r4, r4, push #24 |
| orr r4, r4, r3, pull #8 |
| stmdb r0!, {r4, r5, r6, r7} |
| subs r2, r2, #16 |
| bge 35b |
| adds r2, r2, #12 |
| blt 37f |
| 36: mov ip, r3, push #24 |
| ldr r3, [r1, #-4]! |
| subs r2, r2, #4 |
| orr ip, ip, r3, pull #8 |
| str ip, [r0, #-4]! |
| bge 36b |
| 37: add r1, r1, #1 |
| b 24b |
| |
| .align |