arm/arm64 linux memcpy优化函数

在uncache区域memcpy时通常很慢,下面是一些优化:

arm下的memcpy实现:

void my_memcpy(volatile void char *dst, volatile unsigned void *src, int sz)
{
    if (sz & 63) {
        sz = (sz & -64) + 64;
    }
    asm volatile (
        "NEONcopyPLD:                          \n"
        "    VLDM %[src]!,{d0-d7}                 \n"
        "    VSTM %[dst]!,{d0-d7}                 \n"
        "    SUBS %[sz],%[sz],#0x40                 \n"
        "    BGT NEONcopyPLD                  \n"
        : [dst]"+r"(dst), [src]"+r"(src), [sz]"+r"(sz) : : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "cc", "memory");
}

arm64位下的优化:

uncached区域:

void my_memcpy(volatile void *dst, volatile void *src, int sz)
{
    if (sz & 63) {
        sz = (sz & -64) + 64;
    }
    asm volatile (
        "NEONcopyPLD: \n"
		"sub %[dst], %[dst], #64 \n"
		"1: \n"
		"ldnp q0, q1, [%[src]] \n"
		"ldnp q2, q3, [%[src], #32] \n"
		"add %[dst], %[dst], #64 \n"
		"subs %[sz], %[sz], #64 \n"
		"add %[src], %[src], #64 \n"
		"stnp q0, q1, [%[dst]] \n"
		"stnp q2, q3, [%[dst], #32] \n"
		"b.gt 1b \n"
		: [dst]"+r"(dst), [src]"+r"(src), [sz]"+r"(sz) : : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "cc", "memory");
}

cached区域:

void my_memcpy(volatile void *dst, volatile void *src, int sz)
{
    if (sz & 63) {
        sz = (sz & -64) + 64;
    }
    asm volatile (
        "NEONcopyPLD: \n"
		"sub %[src], %[src], #32 \n"
		"sub %[dst], %[dst], #32 \n"
		"1: \n"
		"ldp q0, q1, [%[src], #32] \n"
		"ldp q2, q3, [%[src], #64]! \n"
		"subs %[sz], %[sz], #64 \n"
		"stp q0, q1, [%[dst], #32] \n"
		"stp q2, q3, [%[dst], #64]! \n"
		"b.gt 1b \n"
		: [dst]"+r"(dst), [src]"+r"(src), [sz]"+r"(sz) : : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "cc", "memory");
}

相关文章

显卡天梯图2024最新版,显卡是电脑进行图形处理的重要设备,...
初始化电脑时出现问题怎么办,可以使用win系统的安装介质,连...
todesk远程开机怎么设置,两台电脑要在同一局域网内,然后需...
油猴谷歌插件怎么安装,可以通过谷歌应用商店进行安装,需要...
虚拟内存这个名词想必很多人都听说过,我们在使用电脑的时候...