arm neon 指令集

arm neon 指令分类:

正常指令(q)

正常指令可对上述任意向量类型执行运算,并生成大小相同且类型通常与操作数向量相同的结果向量。

长指令(l)
长指令对双字向量操作数执行运算,并生成四字向量结果。 所生成的元素通常是操作数元素宽度的两倍,并属于同一类型。

宽指令(w)
宽指令对一个双字向量操作数和一个四字向量操作数执行运算。 此类指令生成四字向量结果。 所生成的元素和第一个操作数的元素是第二个操作数元素宽度的两倍。

窄指令(n)

窄指令对四字向量操作数执行运算,并生成双字向量结果。 所生成的元素通常是操作数元素宽度的一半。

 

饱和指令(q)
通过在 V 和指令助记符之间使用 Q 前缀可以指定饱和指令。

 

数据类型     x 的饱和范围    (s 就是signed,有符号的意思,u就是unsigned,无符号的意思)
s8  –2^7 <= x < 2^7
s16   –2^15 <= x < 2^15
s32 –2^31 <= x < 2^31
s64 –2^63 <= x < 2^63
u8          0 <= x < 2^8
u16      0 <= x < 2^16
u32      0 <= x < 2^32

u64      0 <= x < 2^64

 

neon的寄存器:
有16个128位四字到寄存器Q0-Q15,32个64位双子寄存器D0-D31,两个寄存器是重叠的。

arm_neon.h 中的函数介绍
例如
int8x8_t vadd_s8 (int8x8_t __a, int8x8_t __b);
v是向量操作,可以认为就是neon函数,add 是相加,s8表示结果是s8类型(向量)
int8x16_t vaddq_s8 (int8x16_t __a, int8x16_t __b);
v是向量操作,可以认为就是neon函数,add 是相加,后面的q代表正常指令,s8表示结果是s8类型(向量)
int8x8_t vqadd_s8 (int8x8_t __a, int8x8_t __b);
v是向量操作,可以认为就是neon函数,后面的q代表饱和指令,add 是相加,s8表示结果是s8类型(向量)
int8x8_t vshr_n_s8 (int8x8_t __a, const int __b);
v是向量操作,可以认为就是neon函数,shr是右移位,n表示参数中有个基本数据类型,也就是不是向量或指针,s8表示结果是s8类型(向量)
int8_t vget_lane_s8 (int8x8_t __a, const int __b);
v是向量操作,可以认为就是neon函数,lane表示操作向量中的某个元素,s8表示结果是s8类型(向量)
int8x8_t vget_high_s8 (int8x16_t __a);  //ri = a(i+4);
v是向量操作,可以认为就是neon函数,get是取值,high表示取高位值,向量后面的值,s8表示结果是s8类型(向量)
int8x8_t vget_low_s8 (int8x16_t __a);   //ri = ai;
v是向量操作,可以认为就是neon函数,get是取值,low表示取低位值,向量前面的值,s8表示结果是s8类型(向量)


综上所述,可以总结函数的定义如下
vq<饱和操作>ops<具体操作>tyep<指令类型  q,l,w,n>_flag<标识  n,lane,high or low>_dtype<返回值类型或参数类型>

arm_neon.h 支持的操作
add  加法
mul  乘法
sub  减法
mla  乘加
mls  乘减
ceq  比较,类似与 ==
cge  比较,类似与 >=
cle  比较,类似与 <=
cgt  比较,类似与 >
clt  比较,类似与 <
tst  做与运算后,判断是否等于0 ,ri = (ai & bi != 0) ? 1...1:0...0;
abd  两个向量相减后的绝对值,vabd -> ri = |ai - bi|;
max  求最大值,ri = ai >= bi ? ai : bi;
min  求最小值,ri = ai >= bi ? bi : ai;
shl  左移位, ri = ai << b;
shr  右移位, ri = ai >> b;
abs  求绝对值,ri = |ai|;
neg  取反,ri = -ai;
mvn  按位取反,ri = ~ai;
and  与运算,ri = ai & bi;
orr  或运算,ri = ai | bi;
eor  异或运算,ri = ai ^ bi;
cls  计算连续相同的位数
get  取值,从向量中取出一个值,所谓的向量可以认为是一个数组,给数组中的某个元素赋值
set  赋值,给向量中赋值
dup  构造一个向量,并赋上初始值,ri = a;
combine 合并操作,把两个向量合并
mov  改变数据类型,数据范围,比如把u8 变成u16,或者u16变成u8
zip  压缩操作
uzp  解压操作
ld1  加载数据,给定的buffer 指针中拷贝数据,注意是ld后面的是数字1,而不是字母l
st1  拷贝数据,将neon数据类型拷贝到指定buffer中

...

 

你可能感兴趣的:(arm)