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

댓글

이 블로그의 인기 게시물

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

간단한 cfar 알고리즘에 대해

HTTP 프로토콜 구조 개요와 예제

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

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