ARM高级单指令多数据(SIMD)架构、相关实现以及支持软件通常被称为NEON技术。AArch32(相当于ARMv7 NEON指令集)和AArch64都有对应的NEON指令集。这两种指令集都可显著加速对大型数据集的重复操作,这在媒体编解码器等应用中非常有用。
AArch64的NEON架构使用32个128位寄存器,数量是ARMv7的两倍。这些寄存器与浮点指令所使用的寄存器相同。所有编译后的代码和子程序都遵循嵌入式应用二进制接口(EABI),该接口规定了在特定子程序中哪些寄存器可以被修改,哪些寄存器必须被保留。编译器可以在代码的任何位置自由地使用任何NEON/向量浮点单元(VFP)寄存器来存储浮点值或NEON数据。
在所有标准的ARMv8实现中,浮点运算和NEON技术都是必需的。不过,针对特定市场的实现可能支持以下几种组合: • 不支持NEON或浮点运算。 • 支持完整的浮点运算和SIMD,并带有异常捕获功能。 • 支持完整的浮点运算和SIMD,但不带有异常捕获功能。
7.1 AArch64中NEON和浮点运算的新特性
AArch64 NEON特性基于现有的AArch32 NEON,并做出了以下更改:
-
寄存器数量增加:现在有32个128位寄存器,而ARMv7只有16个。
-
寄存器映射方式改变:较小的寄存器不再被打包到较大的寄存器中,而是一对一映射到128位寄存器的低位。单精度浮点值使用128位寄存器的低32位,双精度浮点值使用低64位。详情请见第7 - 4页的“NEON和浮点运算架构”。
-
指令前缀变更:ARMv7 - A NEON指令中存在的V前缀已被移除。
-
高位清零:向向量寄存器写入64位或更少的数据时,高位会被清零。
-
通用寄存器操作限制:在AArch64中,没有对通用寄存器进行操作的单指令多数据(SIMD)或饱和算术指令。此类操作使用NEON寄存器。
-
新增指令:添加了新的通道插入和提取指令,以支持新的寄存器打包方案。
-
指令拆分:提供了额外的指令,用于生成或处理128位向量寄存器的高64位。会生成多个结果寄存器(扩展为256位向量)或使用两个源操作数(缩减为128位向量)的数据处理指令,已被拆分为单独的指令。
-
向量归约操作:一组新的向量归约操作可实现跨通道求和、求最小值和最大值。
-
指令扩展支持64位整数:一些现有指令已扩展为支持64位整数值。例如,比较、加法、绝对值和取反操作,包括饱和版本。
-
饱和指令扩展:饱和指令已扩展,包括无符号累加为有符号数,以及有符号数累加为无符号数。
-
双精度浮点支持:AArch64 NEON支持双精度浮点运算和完整的IEEE 754操作,包括舍入模式、非规格化数和NaN处理。
AArch64中浮点运算的增强特性如下:
-
指令前缀变更:ARMv7 - A浮点指令中存在的V前缀已被F取代。
-
浮点标准支持:支持IEEE 754浮点标准定义的单精度(32位)和双精度(64位)浮点向量数据类型及算术运算,遵循浮点控制寄存器(FPCR)的舍入模式字段、默认NaN控制、归零控制,以及(在实现支持的情况下)异常陷阱使能位。
-
加载/存储寻址模式:浮点/ NEON寄存器的加载/存储寻址模式与整数的加载/存储模式相同,包括能够加载或存储一对浮点寄存器。
-
新增浮点指令:添加了与整数CSEL和CCMP指令等效的浮点FCSEL、选择和比较指令。
-
标志设置差异:浮点FCMP、FCMPE、FCCMP和FCCMP指令根据浮点比较结果设置PSTATE.{N, Z, C, V}标志,并且不像ARMv7那样修改浮点状态寄存器(FPSR)中的条件标志。
-
融合乘加/乘减指令:所有浮点乘加和乘减指令都是融合的。
融合乘加运算在VFPv4中被引入,它指的是乘法运算的结果在用于加法运算之前不会进行舍入。在早期的ARM浮点架构中,乘积累加操作会对中间结果和最终结果都进行舍入,这可能会导致精度的轻微损失。
-
提供了额外的转换操作,例如在64位整数与浮点数之间,以及半精度浮点数与双精度浮点数之间的转换。 将浮点数转换为整数的指令(FCVTxU、FCVTxS)对定向舍入模式进行了编码:
-
向零舍入。
-
向正无穷大舍入。
-
向负无穷大舍入。
-
四舍五入到最接近的整数,若刚好处于两个整数中间,则舍入到偶数。
-
四舍五入到最接近的整数,若刚好处于两个整数中间,则舍入到离零更远的整数。
-
-
新增了将浮点数舍入为最接近整数(以浮点格式表示)的指令(FRINTx),其具有上述相同的定向舍入模式,同时也支持根据当前舍入模式进行舍入。
-
新增了一条双精度转单精度的向下转换指令(FCVTXN),该指令采用不精确的舍入方式,将结果舍入为奇数,适用于后续正确舍入到半精度的向下转换操作。
-
新增了FMINNM和FMAXNM指令,

925

被折叠的 条评论
为什么被折叠?



