⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 memcpy2.c

📁 memcpy函数优化代码,使用汇编实现,可提高memcpy的实现性能.
💻 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 + -