- 本篇博客将对NEON Intrinsic进行介绍,同时末尾会给出几个example。如有谬误,烦请指出,谢谢。
Introduction
- NEON Intrinsics是一种比汇编更高级的API,可以直接在C/C++中进行调用。使用汇编,我们可以对更多的硬件执行细节进行控制,但是汇编相对来说维护代价较高。相比之下,NEON Intrinsic易于维护,同时也可以对硬件执行细节进行一定程度的控制。编译器会将NEON Intrinsic调用替换成对应的NEON指令。NEON Intrinsic定义在arm_neon.h中,包含一些函数和数据类型。
Data Type
- NEON vector数据类型的命名规则如下:
<type><size>x<number_of_lanes>_t
例如:int16x4_t 定义一个包含4个元素的short类型vector
- NEON 支持vector数组,规则如下:
<type><size>x<number_of_lanes>x<length_of_array>_t
例如:int16x4x2_t指由两个int16x4_t类型组成的数组。
NEON Intrinsics
- NEON Intrinsic明明规则如下:
<opname><flags>_<type>
例如:
- vmul_s16,两个s16类型的vector相乘
- vadd_u8, add two 64-bit vectors containing unsigned 8-bit and return 64-bit vectors, doubleword registers
- vaddq_u8, add two 128-bit vectors containing unsigned 8-bit and return 128-bit vectors, quadword registers
- vaddl_u8, vector add long unsigned 8-bit, add two 64-bit vectors containing unsigned 8-bit and return 128-bit vectors containing unsigned 16-bit
Variabls and constants
uint32x2_t vec64a, vec64b; // create two D-register variables
uint8x8_t start_value = vdup_n_u8(0); // create D-register with initial value 0
result = vget_lane_u32(vec64a, 0); // extract lane 0
vec64a = vget_low_u32(vec128); // split 128-bit vector into 2x 64-bit vectors
vec64b = vget_high_u32(vec128);
Load and Store
unsigned short int A[] = {1,2,3,4};
uint16x4_t v;
v = vld1_u16(A);
vst1_u16(A, v);
uint8x8x3_t v;
unsigned char A[24];
v = vld3_u8(A);
vst3_u8(A, v);
Example
- neon_intrinsics.c
- neon_load.c
- neon_interleave.c