📄 memcpy2.c
字号:
void* memcpy2( void* dst, const void* src, int len )
{
asm volatile (
"cmp r2, #0 \n\t"
"moveq pc, lr \n\t"
"cmp r2, #8 \n\t"
"bls different_aligns \n\t"
"eor r3, r0, r1 \n\t"
"tst r3, #3 \n\t"
"bne different_aligns \n\t"
"stmfd r13!, {r0, r4-r8, lr } \n\t"
"ands r3, r0, #3 \n\t"
"beq multi \n\t"
"cmp r3, #2 \n\t"
"ldrneb r4, [r1], #1 \n\t"
"strneb r4, [r0], #1 \n\t"
"ldrlsb r4, [r1], #1 \n\t"
"strlsb r4, [r0], #1 \n\t"
"ldrlsb r4, [r1], #1 \n\t"
"strlsb r4, [r0], #1 \n\t"
"sub r3, r3, #4 \n\t"
"add r2, r2, r3 \n\t"
"multi: \n\t"
"ands r3, r2, #48 \n\t"
"mov r4, r2, LSR #6 \n\t"
"beq loop_test \n\t"
"cmp r3, #32 \n\t"
"bhi loop3 \n\t"
"beq loop2 \n\t"
"blo loop1 \n\t"
"loop: \n\t"
"ldmia r1!, { r5-r8 } \n\t"
"stmia r0!, { r5-r8 } \n\t"
"loop3: \n\t"
"ldmia r1!, { r5-r8 } \n\t"
"stmia r0!, { r5-r8 } \n\t"
"loop2: \n\t"
"ldmia r1!, { r5-r8 } \n\t"
"stmia r0!, { r5-r8 } \n\t"
"loop1: \n\t"
"ldmia r1!, { r5-r8 } \n\t"
"stmia r0!, { r5-r8 } \n\t"
"loop_test: \n\t"
"cmp r4, #0 \n\t"
"subne r4, r4, #1 \n\t"
"bne loop \n\t"
"ands r3, r2, #12 \n\t"
"beq extra_bytes \n\t"
"cmp r3, #8 \n\t"
"ldrne r5, [r1], #4 \n\t"
"strne r5, [r0], #4 \n\t"
"ldmhsia r1!, {r5-r6} \n\t"
"stmhsia r0!, {r5-r6} \n\t"
"extra_bytes: \n\t"
"tst r2, #2 \n\t"
"beq clean_up \n\t"
"cmp r3, #2 \n\t"
"ldrneb r5, [r1], #1 \n\t"
"strneb r5, [r0], #1 \n\t"
"ldrhsb r5, [r1], #1 \n\t"
"strhsb r5, [r0], #1 \n\t"
"ldrhsb r5, [r1], #1 \n\t"
"strhsb r5, [r0], #1 \n\t"
"clean_up: \n\t"
"ldmfd r13!, {r0, r4-r8, pc } \n\t"
"different_aligns: \n\t"
"stmfd r13!, {r0, lr } \n\t"
"byte_loop: \n\t"
"ldrb r3, [r1], #1 \n\t"
"strb r3, [r0], #1 \n\t"
"subs r2, r2, #1 \n\t"
"bne byte_loop \n\t"
"ldmfd r13!, {r0, pc } \n\t"
);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -