ARMv7 和 ARMv8 下的 Neon 指令

寄存器

ARMv7

ARMv7 有 32 个 64bits D 寄存器[D0-D31], 16 个 128 bits Q 寄存器[Q0-Q15], 一个 Q 寄存器对应两个 D 寄存器(2 个 D register 分别与 Q register 的 低 64 位 和高 64 位物理重合)

armv7_neon_register

ARMv8

ARMv8 有 31 个 64bits 通用寄存器,1 个不同名字的特殊寄存器,用途取决于上下文。可以看做 31 个 64bits 的 X 寄存器,或者 31 个 32 bits 的 W 寄存器(对应于 X 寄存器的 低 32 位).

ARMv8 有 32 个 128bits 的 V 寄存器,类似的可以看做 32 个 64 bits 的 D 寄存器或者 32 个 32 bits 的 S 寄存器.

指令集

ARMv7-A, ARMv8-A AArch32 和 ARMv8-A AArch64关系如下

arm_instruction_set

ARMv8 AArch32 指令集包含 A32,T32, 是 ARMv7-A 指令集的超集.

ARMv8-A AArch64 指令集与原有指令集不兼容。

指令格式

ARMv7-A/AArch32 指令语法

1
V{<mod>}<op>{<shape>}{<cond>}{.<dt>}{<dest>}, src1, src2

解释见之前的博文

ARMv8-A/AArch64 语法

1
{<prefix>}<op>{<suffix>}  Vd.<T>, Vn.<T>, Vm.<T>
  • prefix
    可选前缀,S/U/F/P 表示 有符号 / 无符号 / 浮点数 / bool 型数据
  • op
    指令操作
  • suffix
    可选后缀
    • P
      pairwise 操作(成对操作)
    • V
      new reduction(新缩减算法)
    • 2
      宽/窄指令模式
  • T
    数据类型,8B/16B/4H/8H/2S/4S/2D