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 예제 코드

댓글

이 블로그의 인기 게시물

간단한 cfar 알고리즘에 대해

쉽게 설명한 파티클 필터(particle filter) 동작 원리와 예제

아두이노(arduino) 심박센서 (heart rate sensor) 심박수 측정 example code

리눅스 디바이스 드라이버 기초와 예제

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