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

댓글

이 블로그의 인기 게시물

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

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

바로 프로젝트 적용 가능한 FIR Filter (low/high/band pass filter )를 c나 python으로 만들기

base64 인코딩 디코딩 예제 c 소스

Eigen 라이브러리 matrix 사용법