.text | |
.syntax unified | |
.global memcpy | |
.func memcpy | |
.thumb_func | |
memcpy: | |
/* on entry | |
* r0 = targ | |
* r1 = src | |
* r2 = len (bytes) | |
* on exit | |
* r0 = targ (unchanged) | |
*/ | |
push {r0, r4, lr} | |
/* If targ or src are unaligned, drop to byte | |
* processing. */ | |
mov r3, r0 | |
movs r4, #3 | |
orrs r3, r1 | |
ands r3, r4 | |
bne L_bytewise | |
/* Process words */ | |
L_wordwise: | |
cmp r2, #4 | |
blo L_bytewise | |
ldr r4, [r1] | |
adds r1, #4 | |
str r4, [r0] | |
adds r0, #4 | |
subs r2, #4 | |
b L_wordwise | |
/* Process bytes */ | |
L_bytewise: | |
cmp r2, #0 | |
beq L_fin | |
ldrb r4, [r1] | |
adds r1, #1 | |
strb r4, [r0] | |
adds r0, #1 | |
subs r2, #1 | |
b L_bytewise | |
L_fin: | |
pop {r0, r4, pc} | |
.endfunc |