OpenCores
URL https://opencores.org/ocsvn/c0or1k/c0or1k/trunk

Subversion Repositories c0or1k

[/] [c0or1k/] [trunk/] [conts/] [libc/] [src/] [memcpy.S.ARM] - Blame information for rev 6

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 drasko
/*
2
 * Copyright 2010 B Labs.Ltd.
3
 *
4
 * Author: Prem Mallappa  
5
 *
6
 * Description: Optimized memcpy for ARM
7
 *
8
 */
9
 
10
#include  INC_ARCH(asm.h)
11
/*
12
void*
13
memcpy(void *dst, const void *src, register uint len)
14
*/
15
BEGIN_PROC(memcpy)
16
                push {r0, r4-r11, lr}
17
        loop32:
18
                cmp r2, #32
19
                blt loop16
20
                ldmia r1!, {r4 - r11}
21
                stmia r0!, {r4 - r11}
22
                sub r2, r2, #32
23
                b loop32
24
 
25
        loop16:
26
                cmp r2, #16
27
                blt loop8
28
                ldmia   r1!, {r4 - r7}
29
                stmia   r0!, {r4 - r7}
30
                sub r2, r2, #16
31
                b loop16
32
 
33
        loop8:
34
                cmp r2, #8
35
                blt loop4
36
                ldmia   r1!, {r4, r5}
37
                stmia   r0!, {r4, r5}
38
                sub r2, r2, #8
39
                b loop8
40
 
41
        loop4:
42
                cmp r2, #4
43
                blt end
44
                ldmia   r1!, {r4}
45
                stmia   r0!, {r4}
46
                sub r2, r2, #4
47
                b loop4
48
        end:
49
        last:
50
                teq   r2, #0
51
                ldrgtb r4, [r1]
52
                strneb r4, [r0]         // V7 supports strneb , [, +/-] !, with write back
53
                lsrne r4, r4, #8
54
                subne r2, r2, #1        // Can be reduced to 1 LDR, but has a catch if it is end of memory
55
                addne r0, r0, #1        // we dont want to fetch 1 byte extra to end up in abort
56
                addne r1, r1, #1        // so, playing safe, worst case 3 LDRs
57
                bne last
58
        1:
59
        pop {r0, r4 - r11, pc}
60
END_PROC(_memcpy)

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.