У меня проблема с реализацией memcpy (sr c, dst, sz); для NEON
Поскольку в DMA ARM нет кэшированной памяти. Итак, C, это сильно замедляет копирование из DMA.
void my_copy(volatile unsigned char *dst, volatile unsigned char *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");
}
Это код для ARMv7 от @Timothy Miller ARM / neon memcpy, оптимизированный для * некэшированной * памяти?
А так как VLDM и VSTM отсутствуют в наборах команд ARM64
Я использую LD и ST. Однако это так же медленно, как memcpy () в C.
"NEONCopyPLD: \n"
"ld4 {v0.16b, v1.16b, v2.16b, v3.16b}, [%[src]], #64 \n"
"st4 {v0.16b, v1.16b, v2.16b, v3.16b}, [%[dst]], #64 \n"
"SUBS %[sz], %[sz],#0x40\n"
"BGT NEONCopyPLD \n"
есть ли лучший способ вместо использования LD & ST в ARM64?