ARM NEON asm memcpy 코드

ARM NEON 어셈블리 코드를 이용한 memcpy 이다.
D0~D7 레지스터를 사용하여 src 포인터의 데이터를 dest 포인터로 복사한다. 


ARM NEON 레지스터

NEON registers
< 출처 : https://developer.arm.com/documentation/dht0002/a/Introducing-NEON/NEON-architecture-overview/NEON-registers>


memcpy  코드

void __attribute__ ((noninline)) memcpy_neon(void *dest, const void *src, size_t n)
{
   // r0 : dest
   // r1 : src
   // r2 : n

   asm(
   "_copy_inner_loop:\n"
   " pld [r1,#0xC00]\n" // cache preload
   " vldm r1!,{d0-d7}\n" // load r1 point data do d0-d7 neno register, size is 64*8 bits = 64 bytes. and increase r1 pointer.
   " vstm r0!,{d0-d7}\n" // store d0-d7 register to r0(dest) pointer, and increase r0 pointer
   " subs r2,r2,#0x40\n" // decrease size of remains to copy
   " bgt _copy_inner_loop\n" // continue loop until complete
   );
}


빌드 옵션에 -mfpu=neon 을 추가해야하며,

neon지원 여부나 버전은 "cat /proc/cpuinfo"를 통해 쉽게 확인 가능하다. 

D Register의 크기는 64 bits이고 D0~D7, 8개의 Register를 사용하기 때문에, 64 bytes align된 메모리를 사용해야한다.  aligned_alloc같은 함수를 사용하여 메모리를 할당하면 된다. 


aligned malloc free 예제 코드

댓글

이 블로그의 인기 게시물

windows에서 간단하게 크롬캐스트(Chromecast)를 통해 윈도우 화면 미러링 방법

python winsound를 이용한 윈도우 환경에서 소리 재생 예제

mkfs.fat Device or resource busy 에러 해결법

간단한 cfar 알고리즘에 대해

Embedded Linux USB Ethernet Gadget 사용하기