319 строки
5.8 KiB
ArmAsm
319 строки
5.8 KiB
ArmAsm
|
/*
|
||
|
* 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
|