URL
https://opencores.org/ocsvn/c0or1k/c0or1k/trunk
Subversion Repositories c0or1k
[/] [c0or1k/] [trunk/] [src/] [arch/] [arm/] [memcpy.S.ARM] - Rev 6
Compare with Previous | Blame | View Log
/** Copyright 2010 B Labs.Ltd.** Author: Prem Mallappa <prem.mallappa@b-labs.co.uk>** Description: Optimized memcpy for ARM**/#include INC_ARCH(asm.h)/*void*_memcpy(void *dst, const void *src, register uint len)*/BEGIN_PROC(_memcpy)push {r0, r4-r11, lr}loop32:cmp r2, #32blt loop16ldmia r1!, {r4 - r11}stmia r0!, {r4 - r11}sub r2, r2, #32b loop32loop16:cmp r2, #16blt loop8ldmia r1!, {r4 - r7}stmia r0!, {r4 - r7}sub r2, r2, #16b loop16loop8:cmp r2, #8blt loop4ldmia r1!, {r4, r5}stmia r0!, {r4, r5}sub r2, r2, #8b loop8loop4:cmp r2, #4blt endldmia r1!, {r4}stmia r0!, {r4}sub r2, r2, #4b loop4end:last:teq r2, #0ldrgtb r4, [r1]strneb r4, [r0] // V7 supports strneb <rt>, [<rb>, +/-<index>] !, with write backlsrne r4, r4, #8subne r2, r2, #1 // Can be reduced to 1 LDR, but has a catch if it is end of memoryaddne r0, r0, #1 // we dont want to fetch 1 byte extra to end up in abortaddne r1, r1, #1 // so, playing safe, worst case 3 LDRsbne last1:pop {r0, r4 - r11, pc}END_PROC(_memcpy)
