对于neon内置函数的概念相关定义网上很多,下面是对最近用的Neon函数的记录,以便方便查找。
必须使用头文件arm_neon.h来使用内部函数,并为矢量操作定义C样式类型。 C类型以以下形式编写:
uint8x16_t:这是一个包含无符号8位整数的向量。向量中有16个元素。因此,向量必须位于128位Q寄存器中。
int16x4_t:这是一个包含有符号16位整数的向量。向量中有4个元素。因此,向量必须位于64位D寄存器中。
关于指令:
当-mfpu=neon编译选项时就可以在C/C++代码内使用ARM的SIMD指令,包括加法、乘法、比较、移位、绝对值 、极大极小极值运算、保存和加载指令等。
(1)、正常指令:生成大小相同且类型通常与操作数向量相同的结果向量;
(2)、长指令:对双字向量操作数执行运算,生成四字向量的结果。所生成的元素一般是操作数元素宽度的两倍,
并属于同一类型;
(3)、宽指令:一个双字向量操作数和一个四字向量操作数执行运算,生成四字向量结果。所生成的元素和第一个
操作数的元素是第二个操作数元素宽度的两倍;
(4)、窄指令:四字向量操作数执行运算,并生成双字向量结果,所生成的元素一般是操作数元素宽度的一半;
(5)、饱和指令:当超过数据类型指定的范围则自动限制在该范围内。
一、 常用函数(基础函数)
注意:q标志,以指定内部函数对128位vector进行操作。
Result_t vld1_type(Scalar_t* N); //后缀不带有q,输出向量是D寄存器的64位向量
Result_t vld1q_type(Scalar_t* N); //带有q后缀,输出向量是128位向量,使用Q寄存器
从数组arr中依次Load 4个元素存到寄存器中:
float32x2_t temp = vld1_f32(int32_t arr);//
float32x4_t temp = vld1q_f32(int32_t arr); //
将寄存器中的值写入数组中:(temp中的四个元素以此存入数组ptr中)
void vst1q_f32 (float32_t * ptr, float32x4_t temp )
将常量value复制4份到寄存器的每个元素中:
float32x4_t sum_vec = vdupq_n_f32(value);
将结果移回普通变量中。即从NEON寄存器中访问具体元素:
float sum = vgetq_lane_f32(sum_vec, i); //i取值:0-3。表示从寄存器sum_vec中通道i