ARMv7-A 下的 Neon 指令
数据类型
- 32 bits 单精度浮点数
- 8, 16, 32, 64 bits 无符号有符号整形
- 8, 16 bits 多项式
类型说明符
- 无符号数
U8,U16,U32,U64 - 有符号数
S8,S16,S32,S64 - 无指定类型整型
I8,I16,I32,I63 - 浮点数
F16,F32 - 0 - 1 多项式
P8
指令格式
Neon 指令的一般格式如下
1 | V{<mod>}<op>{<shape>}{<cond>}{.<datatype>} {dest}, <src1>, <src2> |
- mod
- Q
指令使用饱和算法,所以结果总会在指定的数据类型的表示范围之间 - H
指令会使结果减半,将结果右移一位实现 - D
指令会使结果乘二 - R
指令会将结果取整,等价于加上 0.5 之后截断小数部分
- Q
- op
操作,如ADD,SUB - shape
- L
操作双字 vector, 生成四倍长字 vector
结果宽度通常是操作数的两倍,类型相同 - W
操作双字 + 四倍长字,结果和第一个操作数都是第二个操作数宽度的两倍 - N
操作四倍长字,结果生成双字,结果宽度一般是操作数的一半。
- L
- cond
与 IT 指令混用 - datatype
数据类型,s8, u8, f32 - dest
目的寄存器 - src1
第一操作数 - src2
第二操作数
饱和算法
- ARM 中的饱和算法
- 对于有符号饱和运算,若结果小于
, 那么返回结果 - 对于无符号饱和运算,若结果小于 0, 那么结果返回 0, 如果结果大于
, 那么返回
- 对于有符号饱和运算,若结果小于
- Neon 中的饱和算法
指令中使用 Q 前缀指定饱和算法,原理与 ARM 相同。