浮点单元
本章介绍浮点单元(FPU)。
1. 关于 FPU¶
带有 FPU 的 Cortex-M7 处理器是带浮点扩展(FPv5)的 ARMv7-M 架构的单精度和双精度变体的实现。
FPv5 扩展的特性包括:
- 在 FPv4-SP-D16-M 的现有数据处理指令中增加双精度操作数支持。
- 为双精度和单精度操作数增加一些新指令。
- 16 个双精度寄存器。这与 FPv4 相同,没有额外的寄存器。
- 使用 CPACR 对单精度和双精度支持进行软件使能控制。
- 在同时实现双精度和单精度支持时,两者不能独立使能。
- 与已包含 64 位数据类型支持的 FPv4 扩展相同的加载/存储指令支持。
下表给出了 Cortex-M7 处理器不同配置所支持的 ISA。
| 配置 | 支持的 ISA |
|---|---|
| 无浮点单元的处理器 | v7E-M |
| 单精度浮点处理器 | v7E-M + FPv5-SP-D16-M |
| 单精度和双精度浮点处理器 | v7E-M + FPv5-DP-D16-M |
FPU 提供的浮点计算功能符合 ANSI/IEEE Std 754-2008《IEEE 二进制浮点运算标准》,简称 IEEE 754 标准。
2. FPU 功能描述¶
本节介绍 FPU 支持的操作以及 FPU 产生的异常。
FPU 完全支持单精度和双精度的加、减、乘、除、乘加以及平方根运算。它还提供定点与浮点数据格式之间的转换,以及浮点常量指令。
FPU 提供一个扩展寄存器组,包含 32 个单精度寄存器。这些寄存器可以视为:
- 十六个 64 位双字寄存器,D0-D15。
- 三十二个 32 位单字寄存器,S0-S31。
- 上述两种视图的寄存器组合。
有关 FPU 的更多信息,请参见 Arm®v7-M 架构参考手册。
本节包含以下内容:
- 工作模式。
- 与 IEEE 754 标准的一致性。
- 异常。
工作模式由浮点状态与控制寄存器 FPSCR 控制。有关 FPSCR 的更多信息,请参见 ARMv7-M 架构参考手册。
2.1. 工作模式¶
FPU 提供三种工作模式以适应各种应用:
- 完全一致(Full-compliance)模式。
- 清零(Flush-to-zero)模式。
- 默认 NaN(Default NaN)模式。
完全一致模式
在完全一致模式下,FPU 在硬件中按照 IEEE 754 标准处理所有操作。
清零模式
置位 FPSCR.FZ 位即使能清零模式。在该模式下,FPU 在运算中将算术操作的所有次正规(subnormal)输入操作数视为零。由零操作数导致的异常会以适当方式发出信号。VABS、VNEG 和 VMOV 不被视为算术操作,不受清零模式影响。如果结果的数值很小,即按 IEEE 754 标准描述、在舍入前目标精度的幅值小于最小正规值,则该结果被替换为零。FPSCR.IDC 位指示何时发生输入清零。FPSCR.UFC 位指示何时发生结果清零。
默认 NaN 模式
置位 FPSCR.DN 位即使能默认 NaN 模式。在该模式下,任何涉及输入 NaN 或产生 NaN 结果的算术数据处理操作都返回默认 NaN。只有 VABS、VNEG 和 VMOV 操作会保持尾数位(fraction bits)的传播。所有其他算术操作都忽略输入 NaN 尾数位中的任何信息。
2.2. 与 IEEE 754 标准的一致性¶
当默认 NaN(DN)和清零(FZ)模式被禁用时,FPv5 功能在硬件中与 IEEE 754 标准一致,无需支持代码即可实现这种一致性。
有关 FP 架构与 IEEE 754 标准一致性的信息,请参见 Arm®v7-M 架构参考手册。
2.3. 异常¶
FPU 按照 FPv5 架构的要求,为每条指令在 FPSCR 寄存器中设置累积异常状态标志。FPU 不支持异常陷阱。处理器还具有六个输出引脚 FPIXC、FPUFC、FPOFC、FPDZC、FPIDC 和 FPIOC,每个引脚反映一个累积异常标志的状态。
处理器可以使用惰性堆叠(lazy stacking)来降低异常延迟。这意味着处理器在堆栈上为 FP 状态预留空间,但在需要之前不将该状态信息保存到堆栈。更多信息请参见 Arm®v7-M 架构参考手册。
3. FPU 编程模型¶
下表给出了实现 FPU 时 Cortex-M7 处理器中的浮点系统寄存器。这些寄存器在 Arm®v7-M 架构参考手册中描述。
| 地址 | 名称 | 类型 | 复位值 | 描述 |
|---|---|---|---|---|
| 0xE000EF34 | FPCCR | RW | 0xC0000000 | 上下文控制寄存器 |
| 0xE000EF38 | FPCAR | RW | - | 上下文地址寄存器 |
| 0xE000EF3C | FPDSCR | RW | 0x00000000 | 默认状态控制寄存器 |
| 0xE000EF40 | MVFR0 | RO | 0x10110021ᵃ | 媒体与 VFP 特性寄存器 0 |
| 0x10110221ᵇ | ||||
| 0xE000EF44 | MVFR1 | RO | 0x11000011ᵃ | 媒体与 VFP 特性寄存器 1 |
| 0x12000011ᵇ | ||||
| 0xE000EF48 | MVFR2 | RO | 0x00000040 | 媒体与 VFP 特性寄存器 2 |
a. 仅单精度 FPU。 b. 单精度和双精度 FPU。