ARMv8 Cortex-a 编程向导手册学习_5.AArch64 下的浮点与 NEON

/* TODO 本系列文章是对 ARMv8 Cortex-a 系列编程向导手册拙劣的翻译和注解,若有出入,以官方文档为准 */

Chapter 7 AArch64 下的浮点与 NEON

ARM 先进的 SIMD(单指令多数据)架构,及其相关实现与支持的软件,被称作 NEON???
ARMv7 与 ARMv8 都支持 NEON 指令集,这些指令集可以显著的加速大数据量的重复操作,这对于多媒体编码很重要。
AArch64 下,NEON 使用 32 个 128 位宽的寄存器,ARMv7 只有 16 个。
这些寄存器同样被浮点指令使用。

7.1 AArch64 下 NEON 与浮点的新功能

AArch64 NEON 基于现有的 AArch32 NEON,并作出了下列改进:

  • AArch64 状态下拥有32个128位的寄存器,ARMv7 只有16个
  • 往向量寄存器写64位值或更少位的值时,会导致高位为0

AArch64 下浮点功能被增强:

  • 在 AArch64 下浮点指令使用 F前缀,在 ARMv7 中使用 V 前缀,比如 FCSEL, FCCMP
  • 支持单精度(32位)与双精度(64位)浮点向量数据类型与算数
  • 存储地址模式操作 FP/NEON 寄存器时,等同于对整数存储
  • AArch64 提供额外的转换操作,比如64位整型数据与浮点数据的转换,单精度数据与双精度数据的转换。

7.2 NEON 与浮点架构

NEON 操作如下的32 * 128 寄存器:V0-V31

ARMv8 Cortex-a 编程向导手册学习_5.AArch64 下的浮点与 NEON_第1张图片
浮点可以操作 32 * 64 寄存器:D0-D31,Dn 寄存器是 Vn 寄存器的低64位?
ARMv8 Cortex-a 编程向导手册学习_5.AArch64 下的浮点与 NEON_第2张图片

7.2.1 浮点

在AArch64 执行状态下,浮点单元可以按如下方式使用 NEON 寄存器:

  • 32*64 的 D0-D31,这些 D 寄存器被称作双精度寄存器。
  • 32*32 的 S0-S31, 这些 S 寄存器被称作单精度寄存器。
  • 32*16 的 H0-H31, 这些 H 寄存器被称作半精度寄存器。

ARMv8 Cortex-a 编程向导手册学习_5.AArch64 下的浮点与 NEON_第3张图片

7.2.2 标量数据与 NEON

标量数据不同于向量数据,标量数据只包含单独的一个值,而向量数据包含多个值。
一些 NEON 指令可以操作标量数据,NEON 寄存器中的一个标量数据可以通过索引的方式访问。
示例代码INS V0.S[1], V1.S[0]图解如下:

ARMv8 Cortex-a 编程向导手册学习_5.AArch64 下的浮点与 NEON_第4张图片
示例代码: MOV V0.B[3], W0,图解如下:
ARMv8 Cortex-a 编程向导手册学习_5.AArch64 下的浮点与 NEON_第5张图片

7.2.3 浮点参数

在函数调用时,浮点值使用浮点寄存器传递,整型值通过通用目的寄存器传递。
AArch64 状态下强制使用硬件浮点,任何时候都不会使用软浮点。
主要的浮点数据处理指令如下:(所有的浮点指令都使用 F 前缀)

浮点指令 描述
FABS Sd, Sn 计算绝对值
FNEG Sd, Sn 取负值
FSQRT Sd, Sn 计算平方根
FADD Sd, Sn, Sm 浮点加法
FSUB Sd, Sn, Sm 浮点减法
FDIV Sd, Sn, Sm 浮点除法
FMUL Sd, Sn, Sm 浮点乘法

7.3 AArch64 NEON 指令格式

7.4 NEON 编码替代

你可能感兴趣的:(ARM,armv8,学习,arm,arm开发)