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 之后截断小数部分
  • op
    操作,如 ADD, SUB
  • shape
    • L
      操作双字 vector, 生成四倍长字 vector
      结果宽度通常是操作数的两倍,类型相同
    • W
      操作双字 + 四倍长字,结果和第一个操作数都是第二个操作数宽度的两倍
    • N
      操作四倍长字,结果生成双字,结果宽度一般是操作数的一半。
  • cond
    与 IT 指令混用
  • datatype
    数据类型,s8, u8, f32
  • dest
    目的寄存器
  • src1
    第一操作数
  • src2
    第二操作数

饱和算法

  • ARM 中的饱和算法
    • 对于有符号饱和运算,若结果小于 , 那么返回结果
    • 对于无符号饱和运算,若结果小于 0, 那么结果返回 0, 如果结果大于 , 那么返回
  • Neon 中的饱和算法
    指令中使用 Q 前缀指定饱和算法,原理与 ARM 相同。