Programming/neon2015. 5. 5. 22:03

GCC 쪽 문서에도 어셈블리 명령어로만 설명이 있어서

결국은 어셈블리 명령어를 먼지 알아야 겠네 -_-


기본적으로 V를 접두로 가지며 V는 Vector의 약자로 보인다.

L은 Long


The Neon Register file has a dual view:


32 - 64 bit registers (The Dx registers)

16 - 128 bit registers (The Qx registers)

The VFP Register file also has a dual view:


32 - 64 bit registers (The Dx registers)

32 - 32 bit registers (The Sx registers - Only 1/2 of the registers may be viewed as 32 bit)


[링크 : http://processors.wiki.ti.com/index.php/Cortex-A8] 


Qd, Qn, Qm 쿼드워드 연산에 대한 대상 벡터, 첫 번째 피연산자 벡터 및 두 번째 피연산자 벡터입니다.

Dd, Dn, Dm 더블워드 연산에 대한 대상 벡터, 첫 번째 피연산자 벡터 및 두 번째 피연산자 벡터입니다.

Qd, Dn, Dm long 연산에 대한 대상 벡터, 첫 번째 피연산자 벡터 및 두 번째 피연산자 벡터입니다.

Qd, Qn, Dm Wide 연산에 대한 대상 벡터, 첫 번째 피연산자 벡터 및 두 번째 피연산자 벡터입니다.


[링크 : http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204ik/CIHJCAAG.html] 


double(64bit) / float(32bit)에 이은.. 덜 정밀한(16bit) 부동소수점인가?

반정밀도 확장은 VFPv3 및 NEON 아키텍처를 모두 확장하는 선택적 아키텍처로, 단정밀도 (32비트) 및 반정밀도 (16비트) 부동 소수점 숫자 간에 변환을 수행하는 VFP 및 NEON 명령어를 제공합니다.


[링크 : http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204ik/CJAJBFBF.html] 


128비트 쿼드워드

64비트 더블워드

32비트 워드

32개의 64비트 더블워드 레지스터, D0-D31

32개의 32비트 단일 워드 레지스터, S0-S31. 이 뷰에서는 레지스터 뱅크의 반에만 액세스할 수 있습니다.

[링크 : http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204ik/CIHBGCCH.html] 


음.. ARMv8 부터는 64bit 확장되면서 64bit = 1word가 되나보다?

[링크 : http://en.wikipedia.org/wiki/Word_(computer_architecture)]




NEON 논리 및 비교 연산

VAND, VBIC, VEOR, VORN 및 VORR (레지스터) - 비트 단위 AND, 비트 지우기, 배타적 OR, OR Not 및 OR (레지스터)

VBIC 및 VORR (즉치값) - 비트 단위 비트 지우기 및 OR (즉치값

VBIF, VBIT 및 VBSL - False인 경우 비트 단위 삽입, True인 경우 삽입 및 선택

VMOV, VMVN (레지스터) - 이동 및 이동하지 않음

VACGE 및 VACGT - 비교 절대값

VCEQ, VCGE, VCGT, VCLE 및 VCLT - 비교

VTST - 비트 테스트


NEON 일반 데이터 처리 명령어

VCVT (고정 소수점 또는 정수와 부동 소수점 간 변환) - 고정 소수점 또는 정수와 부동 소수점 간의 벡터 변환

VCVT (반정밀도 부동 소수점과 단정밀도 부동 소수점 간에 변환) - 반정밀도 부동 소수점과 단정밀도 부동 소수점 간의 벡터 변환

VDUP - 스칼라를 벡터의 모든 레인으로 복제

VEXT - 추출

VMOV, VMVN (즉치값) - 이동 및 음수 이동 (즉치값)

VMOVL, V{Q}MOVN, VQMOVUN - 이동 (레지스터)

VREV - 벡터 내 요소 반전

VSWP - 벡터 스왑

VTBL, VTBX - 벡터 테이블 조회

VTRN - 벡터 이항

VUZP, VZIP - 벡터 인터리브 및 디인터리브


NEON 시프트 명령어

VSHL, VQSHL, VQSHLU 및 VSHLL (즉치값 기준) - 즉치값만큼 왼쪽으로 시프트

V{Q}{R}SHL (부호 있는 변수 기준) - 부호 있는 변수만큼 왼쪽으로 시프트

V{R}SHR{N}, V{R}SRA (즉치값 기준) - 즉치값만큼 오른쪽으로 시프트

VQ{R}SHR{U}N (즉치값 기준) - 즉치값만큼 오른쪽으로 시프트 및 포화

VSLI 및 VSRI - 왼쪽으로 시프트 및 삽입 및 오른쪽으로 시프트 및 삽입


NEON 일반 산술 명령어

VABA{L} 및 VABD{L} - 벡터 절대 차이, 누산 및 절대 차이

V{Q}ABS 및 V{Q}NEG - 벡터 절대값 및 부정

V{Q}ADD, VADDL, VADDW, V{Q}SUB, VSUBL 및 VSUBW - 벡터 더하기 및 빼기

V{R}ADDHN 및 V{R}SUBHN - 벡터 더하기 상위 반 선택 및 빼기 상위 반 선택

V{R}HADD 및 VHSUB - 벡터 양분 더하기 및 빼기

VPADD{L}, VPADAL - 벡터 인접 쌍 더하기, 더하기 및 누산

VMAX, VMIN, VPMAX 및 VPMIN - 벡터 최대값, 최소값, 인접 쌍 최대 값 및 인접 쌍 최소값

VCLS, VCLZ 및 VCNT - 벡터 선행 부호 비트 계산, 선행 0 수 계산 및 세트 비트 계산

VRECPE 및 VRSQRTE - 벡터 역수 추정 및 역수 제곱근 추정

VRECPS 및 VRSQRTS - 벡터 역수 추정 및 역수 제곱근 추정


NEON 곱하기 명령어

VMUL{L}, VMLA{L} 및 VMLS{L} - 벡터 곱하기, 곱하기 누산 및 곱하기 빼기

VMUL{L}, VMLA{L} 및 VMLS{L} (스칼라 기준) - 벡터 곱하기, 곱하기 누산 및 곱하기 빼기 (스칼라 기준)

VQDMULL, VQDMLAL 및 VQDMLSL (벡터 기준 또는 스칼라 기준) - 벡터 포화 배수화 곱하기, 곱하기 누산 및 곱하기 빼기 (벡터 또는 스칼라 기준)

VQ{R}DMULH (벡터 기준 또는 스칼라 기준) - 상위 반을 반환하는 벡터 포화 배수화 곱하기 (벡터 또는 스칼라 기준)


NEON 요소 및 구조체 로드/저장 명령어

인터리브

요소 및 구조체 로드와 저장 명령어의 정렬에 대한 제한

VLDn 및 VSTn (단일 n-요소 구조체를 하나의 레인에 로드) - 대부분의 데이터 액세스에 사용됩니다. 일반 벡터가 로드될 수 있습니다 (n = 1)

VLDn (단일 n-요소 구조체를 모든 레인에 로드)

VLDn 및 VSTn (여러 n-요소 구조체)


[링크 : http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204ik/CIHJCAAG.html] 


[링크 : http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0489i/CJABFHEJ.html]


아따.. 타입 여러가지네..

uint64x1_t vadd_u64 (uint64x1_t, uint64x1_t)

uint32x2_t vadd_u32 (uint32x2_t, uint32x2_t) - Form of expected instruction(s): vadd.i32 d0, d0, d0

uint16x4_t vadd_u16 (uint16x4_t, uint16x4_t) - Form of expected instruction(s): vadd.i16 d0, d0, d0

uint8x8_t vadd_u8 (uint8x8_t, uint8x8_t) - Form of expected instruction(s): vadd.i8 d0, d0, d0

int64x1_t vadd_s64 (int64x1_t, int64x1_t)

int32x2_t vadd_s32 (int32x2_t, int32x2_t) - Form of expected instruction(s): vadd.i32 d0, d0, d0

int16x4_t vadd_s16 (int16x4_t, int16x4_t) - Form of expected instruction(s): vadd.i16 d0, d0, d0

int8x8_t vadd_s8 (int8x8_t, int8x8_t) - Form of expected instruction(s): vadd.i8 d0, d0, d0

float32x2_t vadd_f32 (float32x2_t, float32x2_t) - Form of expected instruction(s): vadd.f32 d0, d0, d0


[링크 : https://gcc.gnu.org/onlinedocs/gcc-4.6.1/gcc/ARM-NEON-Intrinsics.html] 


'Programming > neon' 카테고리의 다른 글

neon auto vectoring  (0) 2015.05.06
kernel mode neon support?  (0) 2015.05.06
neon 예제 실행 + 커널 교체  (0) 2015.05.04
arm neon 예제 컴파일  (0) 2015.05.03
NEON Intrinsics  (0) 2015.04.30
Posted by 구차니