本文档介绍 NEON 和 VFP 的系统寄存器,他们用于描述 NEON 和 VFP 的系统架构。包括:FPSCR, FPEXC, FPSID,MVFR0/1.
常见的术语
-
CPSR(Current Program Status Register)是 ARM 处理器中的一个寄存器,用于存储当前程序的状态信息。它包含了一些标志位,用于记录程序的运行状态和条件,例如条件码(Condition Codes)标志,用于条件分支和条件执行。CPSR 还包含了处理器模式(Processor Mode)信息,指示处理器当前处于用户模式、特权模式(如系统模式、监管模式等)或异常模式(如中断、异常处理模式)等。
-
NaN 模式指的是在计算中涉及到 NaN(Not-a-Number)值的处理方式。NaN 是一种特殊的浮点数值,通常表示无效或未定义的数值结果。NaN 可以出现在浮点运算中,例如当进行无法定义的计算时,或者当计算结果无法表示为有效的浮点数时。
- 认 NaN 模式(Default NaN Mode):在这种模式下,处理器将 NaN 视为普通的浮点数值,允许其参与计算并产生新的 NaN 值。这是通常的行为。
- 静默 NaN 模式(Silent NaN Mode):在这种模式下,处理器不会引发异常或产生任何错误,当遇到 NaN 时,它会默默地将 NaN 替换为预定义的特殊值,而不影响计算的进行。
FPSCR, the floating-point status and control register
包含了所有用户级 NEON 和 VFP 的状态和控制位,NEON 单元仅使用位 [31:27]。这些位的用途如下:
-
bits[31:28], N、Z、C 和 V 标志, NEON 和 VFP 的状态标志, 在将它们复制到 CPSR 中的状态标志之前,它们不能用于控制条件执行。
- N 负标志(由浮点比较运算更新)
- Z 零标志(由浮点比较运算更新)
- C 进位/借位标志(由浮点比较运算更新)
- V 溢出标志(由浮点比较运算更新)
-
bits[27], QC(累积饱和标志)是指 NEON 饱和指令发生饱和时设置的标志。
-
bits[26], AHP 交替半精度控制位:
- 0:IEEE半精度格式(默认)
- 1:交替半精度格式
-
bits[25], DN, 这是默认 NaN(DN)模式控制位:
- 禁用。NaN 操作数会变为浮点运算的输出(默认)
- 启用。任何涉及一个或多个 NaN 的操作都会返回默认的 NaN
-
bits[24], FZ, flush-to-zero模式控制位
- 0,禁用
- 1,启用
-
bits[23:22], ROUND, 四舍五入模式控制位
- 00:最近舍入(RN)模式(默认) : 四舍五入
- 01:正无穷舍入(RP)模式 : 对正数而言,只要多余位不全为0则向最低有效位进1;负数则直接截尾。
- 10:负无穷舍入(RM)模式 : 对负数而言,只要多余位不全为0则向最低有效位进1;正数若多余位不全部为0则简单截尾。
- 11:向零舍入(RZ)模式 : 直接截尾。
-
bits[21:20], Stride, 向量中连续值之间的距离
- 00, STRIDE = 1
- 11, STRIDE = 2
这个字段在AArch64状态下没有功能,而且在AArch64状态下执行时忽略非零值。(矢量模式已经弃用该位)
-
bits[19], FZ16, 在半精度数据处理指令上将非规范化数字刷新到零。
- 0, 对于某些指令,该位禁止将半精度非规范化数字的输入和输出刷新为零。
- 1, 启用将非规范化数字刷新为零
-
bits[18:16], LEN, 每个向量使用的寄存器数
- 0b000 LEN = 1.
- … …
- 0b111 LEN = 8.
该字段在AArch64状态下没有作用,并且在执行过程中忽略非零值。(矢量模式已经弃用该位)
-
bits[15, 12:8] 异常陷阱使能位(使能,启用或禁用相关异常)
- bits[15], IDE 输入非规格化异常使能。
- bits[12], IXE 不精确异常使能。
- bits[11], UFE 下溢出异常使能。
- bits[10], OFE 溢出异常使能。
- bits[9], DZE 除零异常使能。
- bits[8], IOE 无效操作异常使能。
-
bits[7, 4:0], 累积异常位
- bits[7], IDC 输入非正常累积异常位(结果未在正常数值范围内)
- bits[4], IXC 不精确的累积异常位
- bits[3], UFC 下溢累积异常位
- bits[2], OFC 溢出累积异常位
- bits[1], DZC 被零除累积异常位
- bits[0], IOC 非法操作累积异常位
FPEXC, the floating-point exception register
只有在特权级别的软件执行中才能访问FPEXC。
-
bit[31], EX 位,可以在所有NEON或VFP实现中读取它。在某些实现中,您还可以写入它。
如果该值为0,则NEON或VFP系统中唯一重要的状态是NEON和浮点寄存器、FPSCR和FPEXC的内容。
-
bit[30], EN 位。 所有NEON或VFP实现中,您都可以读取和写入它。
- 如果该值为1,则NEON单元(如果存在)和VFP(如果存在)被启用并正常运行。
- 如果该值为0,则NEON单元和VFP被禁用。当它们被禁用时,您可以读取或写入FPSID或FPEXC寄存器,但其他NEON或VFP指令将被视为未定义指令。
-
bit[29:0], 可能被特定的VFP实现所使用。您可以在不访问这些位的情况下使用VFP指令。
除非按照特定实现中的用途,否则不得更改这些位。
要在不影响其他位的情况下更改某些位,使用读-修改-写过程。
FPSID, the floating-point system ID register
FPSID是一个只读寄存器。您可以阅读NEON架构的信息
-
bits [31:24],ARM处理器表示,值位 0x41,即 ASCII 码的 A
-
bit [23],软件位
- 0 实现提供了浮点指令的硬件实现
- 1 实现仅支持浮点指令的软件仿真
在Armv8-A中,唯一允许的值是0b0。这个字段具有一个由实现定义的值。对该字段的访问是只读的。
-
bit[22:16],子架构版本号
- 000, VFPv1
- 001, VFPv2
- 010, VFPv3
- 011, VFPv3
- 100, VFPv3
-
bit[15:8], Arm官方定义的部件号
-
bit[7:4], Arm官方定义的变体号
-
bit[3:0],浮点实现的修订号
MVFR0/1, Media and VFP Feature Registers
MVFR0/1 是一个只读寄存器。它提供有关处理器上的VFP和SIMD架构的信息。即使在没有NEON单元或VFP的处理器上,该寄存器也是可用的。