【Neon】arm neon指令集指令解析

在arm neon的指令集中,大多数都是单词的缩写加一些特殊的前后缀修饰符。

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

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

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

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

饱和指令q
在V与指令助记符之间的使用q前缀可以指定饱和指令。饱和指令限定了各种类型的数据范围。

neon寄存器

有16个128位的四字寄存器Q0-Q15,32个64位的双字寄存器D0-D31,两个寄存器是重叠的。(每32位一个字)

对于指令最前面的v表示是向量操作。

neon支持的主要操作

助记符含义
add加法
sub减法
mul乘法
mla乘加
mls乘减
ceq比较 ==
cge比较 >=
cle比较 <=
cgt比较 >
clt比较 <
max最大值
min最小值
shl左移位
shr右移位
abs求绝对值
neg取反
mvn按位取反
and与运算
orr或运算
eor异或运算
get取值
set赋值
dup构造一个向量,并进行初始化
combine合并操作,将两个向量进行合并
mov改变数据类型和数据范围
zip压缩操作
uzp解压操作
ld1加载数据,从给定的buffer指针中拷贝数据
st1拷贝数据,将数据拷贝到指定的buffer中
tst进行与运算之后,判断是否等于0
abd两个向量相减之后的绝对值

学习资源
https://people.xiph.org/~tterribe/daala/neon_tutorial.pdf
https://elinux.org/images/4/40/Elc2011_anderson_arm.pdf
https://community.arm.com/processors/b/blog/posts/coding-for-neon—part-1-load-and-stores
https://community.arm.com/processors/b/blog/posts/coding-for-neon—part-2-dealing-with-leftovers
https://community.arm.com/processors/b/blog/posts/coding-for-neon—part-3-matrix-multiplication
https://github.com/thenifty/neon-guide
http://infocenter.arm.com/help/topic/com.arm.doc.ihi0073a/IHI0073A_arm_neon_intrinsics_ref.pdf?resultof=%22vmovq_n_f32%22%20

参考文献:
https://blog.csdn.net/xiongtiancheng/article/details/77103810

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值