ARM NEON asm memcpy 코드
ARM NEON 어셈블리 코드를 이용한 memcpy 이다.
D0~D7 레지스터를 사용하여
src 포인터의 데이터를 dest 포인터로 복사한다.
ARM NEON 레지스터
< 출처 : 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같은 함수를 사용하여 메모리를 할당하면 된다.
댓글
댓글 쓰기