前言
ARM NEON 可以提升音视频,图像,计算机视觉等计算密集型程序的性能,在上一篇大前端CPU优化技术--NEON技术的介绍中,我们知道一些编译器可以将 C/C++ 代码自动转换为 NEON 指令,这种技术称为自动向量化,我们总是想要追求最极致的性能,想要极力的榨干CPU的性能,而自动向量化技术受限于编译器的规则和环境限制很难达到最理想的收益。所以想要有更好的性能还是需要手工编写 NEON 汇编代码或者用内联函数,但熟练掌握 NEON 指令是实现理想性能的基础。
本文接下来会详细地介绍 Armv7 和 Armv8 架构下 NEON 向量寄存器、NEON 汇编指令格式、NEON Intrinsics 指令格式等内容,感谢耐心阅读。
NEON指令格式
ARM 主流架构
Armv7-A 和 Armv8-A 的关系如下图所示
Arm v8-A是一个非常重要的架构变化,它支持64位执行模式 “AArch64” ,并且带来了全新的64位指令集 “A64” 。同时,为了兼容Arm v7-A (32位架构)指令集,也引入了 “AArch32” 的概念。
- AArch64 是 64 位执行状态,支持 A64 指令集。
- AArch32 是 32 位执行状态,支持 T32 和 A32 指令集,同时 AArch32 与 AArch64 中一些的功能保持一致,而且 AArch32 兼容 Armv7-A。
ARM v7 的NEON是可选的,而在ARM v8上是默认支持的,ARM v8 支持浮点类型的除法向量操作,这是ARM v7所没有的。另外AArch64还支持double类型的操作。
Armv9-A 是 arm 当前最新的指令架构,Armv9-A 除了向前兼容 Armv8-A,在性能计算上有了很大的提升,主要表现在安全、AI 以及改进矢量扩展(SVE2)和 DSP 能力。
AArch64 向量寄存器
AArch64 有 32 个 128bit 的向量寄存器,这些寄存器又可以划分为:
- 32 个 128bit 的 V 寄存器,V0~V31。
- 32 个 64bit 的 D 寄存器,D0~D31。
- 32 个 32bit 的 S 寄存器,S0~S31。
每种类型寄存器的映射关系如下: