学习Armv8架构时,对部分内容的翻译和整理
Armv8体系架构(1)
Armv8体系架构(2)
Armv8体系架构(3)
在AArch32状态下,对SIMD&FP寄存器进行操作的SIMD指令始终被描述为高级SIMD指令,以便区别于基本指令集中的SIMD指令,这些指令对32位通用寄存器进行操作。
A64指令集不提供任何对通用寄存器进行操作的SIMD指令,因此一些AArch64状态描述使用SIMD作为高级SIMD的同义词。
Armv8可以支持以下级别的高级SIMD和浮点指令:
(1) 完整的SIMD和浮点支持,无异常捕获;
(2) 带有异常捕获的完整SIMD和浮点支持;
(3) 不支持浮点或SIMD。(仅针对特定的场景)
Note: 所有支持具有丰富应用环境的标准操作系统的系统都提供了对高级SIMD和浮点的硬件支持。
SIMD指令提供打包的单指令多数据(SIMD)和单元素标量操作,并支持:
(1)AArch64状态下的单精度和双精度算术;
(2)仅在AArch32状态下的单精度算术;
(3)当Armv8.2-FP16实施时,AArch64和AArch32状态支持半精度算术。
AArch64状态SIMD中的浮点支持符合IEEE754-2008,符合:
(1)可配置的舍入模式;
(2)可配置的默认NaN行为;
(3)可配置的清零行为。
使用AArch32高级SIMD指令的浮点计算与Armv7保持不变。 A32和R32高级SIMD浮点始终使用Arm标准浮点运算并执行IEEE754浮点运算,但具有如下限制:
(1)非规范化数字被刷新为零;
(2)仅支持默认NaN;
(3)未捕获的浮点异常处理用于所有浮点异常。
如果支持异常捕获,则可以在不捕获的情况下处理浮点异常,例如溢出或除以零。这适用于SIMD和浮点运算。以这种方式处理时,浮点异常会导致累积状态寄存器位设置为1,并且操作会产生默认结果。
在AArch64状态下,以下寄存器控制浮点运算并返回浮点状态信息:
Note: 在AArch64状态下,进程状态标志PSTA TE.{N, Z, C, V}用于所有数据处理和任何相关的条件执行。
AArch32状态提供单个浮点状态和控制寄存器FPSCR,结合了FPCR和FPSR字段。
Armv8提供完整的IEEE 754浮点算术支持。在AArch32状态下,使用高级SIMD指令执行的浮点运算仅限于Arm标准浮点运算,而与FPSCR中的舍入模式无关。与AArch32不同,AArch64 SIMD浮点运算是使用FPCR选择的舍入模式执行的。
Arm标准浮点运算支持IEEE 754浮点标准定义的以下输入格式:
Arm标准浮点运算支持IEEE 754浮点标准定义的以下输出结果格式:
在涉及非规范化数字和下溢异常的计算时,浮点处理的性能可能会降低。在许多算法中,可以通过用零替换非规范化操作数和中间结果来恢复这种性能,而不会显著影响最终结果的准确性。Arm浮点实现允许将清零模式用于不同的浮点格式, 如下所示:
AArch64状态:
1. 如果FPCR.FZ=1,清零模式用于所有指令的所有单精度和双精度输入和输出。
2. 如果FPCR.FZ16=1,则清零模式用于浮点指令的所有半精度输入和输出。除了:
a. 半精度和单精度数字之间的转换;
b. 半精度和双精度数字之间的转换。
AArch32状态:
1. 如果FPSCR.FZ=0,则清零模式用于所有高级SIMD浮点指令的所有单精度和双精度输入和输出;
2. 如果FPSCR.FZ=1,则清零模式用于所有指令的所有单精度和双精度输入和输出。
3. 如果FPSCR.FZ16==1,则清零模式用于浮点指令的所有半精度输入和输出,除了:
a. 半精度和单精度数字之间的转换;
b. 半精度和双精度数字之间的转换。
如果在单精度或双精度输入上使用清零模式:
如果在半精度输入上使用清零模式:
如果在指令的任何输出上使用清零模式:
Arm内存模型支持:
虚拟内存支持取决于执行状态:
AArch64状态: 支持64位虚拟寻址,转换控制寄存器确定支持的虚拟内存(VA)范围。EL0和EL1的执行支持两个独立的VA范围,每个范围都有自己的翻译控件;
AArch32状态: 支持32位虚拟寻址,转换控制寄存器确定支持的VA范围。为了在EL1和EL0上执行,系统软件可以将VA范围分成两个子范围,每个子范围都有自己的转换控件。
无论执行状态如何,虚拟内存系统架构(VMSA)都可将VAs转换为支持的PA空间内任何位置的内存块或内存页。