Renesas-RH850 CPU System - CPU - Coprocessor

Renesas学习笔记
CPU System : CPU - Coprocessor


1 浮点操作

浮点运算单元 (FPU) 作为 CPU 的协处理器运行,并执行浮点指令。可以使用单精度(32 位)或双精度(64 位)数据。此外,还可以在浮点类型和整数类型之间进行转换。此 CPU 的 FPU 符合 ANSI/IEEE 标准 754-2008(IEEE 浮点运算标准)。

1.1 浮点运算功能的配置

(a) 未实现
如果未实现浮点运算功能,则所有浮点指令都不能使用。如果尝试执行此类指令,会发生协处理器不可用异常。此外,所有浮点系统寄存器将变得不可访问,如果尝试使用 LDSR/STSR 指令访问任何寄存器,会发生协处理器不可用异常。

(b) 仅实现单精度
如果仅实现具有单精度的浮点运算功能,则只能使用分类为单精度的浮点指令。如果尝试执行分类为双精度的浮点指令,会发生协处理器不可用异常。所有浮点系统寄存器提供第 3.2.3.4 节,FPU 功能寄存器中描述的功能。

注意:

  • 1:单精度浮点指令是 RH850G4MH 用户手册:软件中描述为(单精度)的指令。
  • 2:双精度浮点指令是 RH850G4MH 用户手册:软件中描述为(双精度)的指令。

(c) 实现单精度和双精度
当实现单精度和双精度的浮点指令时,可以使用所有浮点指令。所有浮点系统寄存器提供第 3.2.3.4 节,FPU 功能寄存器中描述的功能。

1.2 数据类型

(a) 浮点格式
FPU 支持 32 位(单精度)和 64 位(双精度)的 IEEE754 浮点运算。
单精度浮点格式由 24 位有符号小数(s + f)和 8 位指数(e)组成。

双精度浮点格式由 53 位有符号小数(s + f)和 11 位指数(e)组成

浮点格式的数值包括以下三个区域。

  • 符号位 s
  • 指数:e = E + 偏移值
  • 小数:f = .b1b2…bP-1(小数点后的值)

单精度格式的偏移值为 127。双精度格式的偏移值为 1023。当不偏移时,指数值 E 的范围涵盖从 Emin 到 Emax 的所有整数,以及两个保留值,Emin -1(±0 或次正规数)和 Emax +1(±∞ 或 NaN:非数字)。除 0 外的数值根据单精度和双精度格式以一种格式表示。

浮点格式和参数值:

参数 单精度 双精度
最大指数值 (Emax) +127 +1023
最小指数值 (Emin) -126 -1022
指数偏置值 +127 +1023
指数长度(位数) 8 11
整数位 不可见 不可见
小数长度(位数) 23 52
格式长度(位数) 32 64

浮点数的最小值和最大值:

类型
单精度浮点数的最小值 1.40129846e – 45
单精度浮点数的最小值(normal) 1.17549435e – 38
单精度浮点数的最大值 3.40282347e + 38
双精度浮点数的最小值 4.9406564584124654e – 324
双精度浮点数的最小值(normal) 2.2250738585072014e – 308
双精度浮点数的最大值 1.7976931348623157e + 308

(b) 定点格式
定点数的值采用二进制补码格式。无符号定点格式中不存在符号位,所有位都表示整数值。

(c) 扩展浮点格式
此 CPU 支持 16 位(半精度)IEEE754 浮点格式作为存储数据的浮点格式。半精度浮点格式用于减少数据量;不支持算术运算。指令可以将单精度浮点格式数据转换为半精度浮点数据,反之亦然。半精度浮点格式由 11 位带符号小数(s + f)和 5 位指数(e)组成。

表 3.121 半精度浮点格式和参数值:

参数 半精度
最大指数值 (Emax) +15
最小指数值 (Emin) -14
指数偏置值 +15
指数长度(位数) 5
整数位 不可见
小数长度(位数) 10
格式长度(位数) 16

半精度浮点数的最小值和最大值:

类型
半精度浮点数的最小值 5.96046e – 8
半精度浮点数的最大值(正常值) 6.10352e – 5
半精度浮点数的最大值 65504
1.3 寄存器集

有关寄存器集的详细信息,请参见第 3.2.3.4 节,FPU 功能寄存器。

1.4 浮点指令

浮点指令分为单精度指令(single)和双精度指令(double)。有关浮点指令的详细信息,请参见《RH850G4MH 用户手册:软件》。

1.5 浮点操作异常

本节描述了 FPU 如何处理浮点操作异常。

(a) 异常类型
当浮点操作或操作结果的处理无法使用常规方法完成时,会发生浮点操作异常。发生浮点操作异常时,会执行以下两种操作之一:

  • 启用异常时:在浮点配置/状态寄存器 (FPSR) 中设置原因位,并将处理(由软件完成)传递给异常处理程序例程。
  • 禁用异常时:在浮点配置/状态寄存器 (FPSR) 中设置保留位,并在 FPU 目标寄存器中存储适当的值(初始值),然后继续执行。

FPU 使用原因位、启用位和保留位(状态标志)来支持以下五种 IEEE754 定义的异常原因:

  • 不准确操作 (I)
  • 溢出 (O)
  • 下溢 (U)
  • 除以零 (Z)
  • 无效操作 (V)

第六种异常原因是未实现的操作 (E),当无法执行浮点操作时会引发异常。此异常需要软件处理。未实现的操作异常 (E) 在始终启用异常时发生,而不是通过使用属性、启用位或保留位来启用。

当相应的启用位设置时,启用 IEEE754 定义的五种异常 (V, Z, O, U, I)。发生异常时,如果设置了相应的启用位,FPU 会设置相应的原因位。如果可以确认异常,则将处理传递给异常处理程序例程。如果禁用异常,则设置相应的保留位,并且不将处理传递给异常处理程序例程。

(b) 异常处理
发生浮点操作异常时,FPSR 寄存器的原因位指示浮点操作异常的原因。

状态标志
每个 IEEE754 定义的异常都有相应的保留位。当禁止相应的异常但检测到异常条件时,将设置保留位。每当通过 LDSR 指令向 FPSR 寄存器写入新值时,保留位都会设置或重置。

如果启用位禁止了某个异常,FPU 会执行预定的处理。此处理提供一个初始值作为结果,而不是浮点操作结果。此初始值根据异常类型确定。对于溢出异常或下溢异常,初始值也会根据当前的舍入模式而有所不同。表 3.123 显示了每种 FPU IEEE754 定义的异常的初始值。

表 3.123 FPU IEEE754 定义的异常的初始值

区域 描述 舍入模式 初始值
V 无效操作 安静非数 (Q-NaN)
Z 除以零 符号正确的 ∞
O 溢出 RN 带有中间结果符号的 ∞
O 溢出 RZ 带有中间结果符号的最大规范化数
O 溢出 RP 正溢出:最大正规范化数
O 溢出 RM 负溢出:最大负规范化数
U 下溢*1 RN*2 带有中间结果符号的 0
U 下溢*1 RZ 带有中间结果符号的 0
U 下溢*1 RP 正下溢:最小正规范化数
U 下溢*1 RM 负下溢:0
I 不准确操作 舍入结果

注意事项

  • *1:如果 FPSR.FS 位被清除,在舍入结果中发生下溢时会发生未实现的操作异常 (E),不会发生下溢异常 (U)。如果设置了 FPSR 寄存器的 FS 位,冲刷结果用作初始值。
  • *2:如果舍入模式是 RN 并且设置了 FPSR 寄存器的 FN 位,冲刷将在更高精度的方向进行。有关详细信息,请参见第 3.2.6.1 (9) 节,冲刷到最近值。
1.6 异常详情

以下描述了每种 FPU 异常发生的条件和 FPU 的响应。

(a) 不准确异常 (I)
在以下情况下,FPU 检测到不准确异常:

  • 当舍入结果的精度降低时
  • 当舍入结果溢出且禁止溢出异常时
  • 当舍入结果下溢且禁止下溢异常时
  • 当作为非正规数的操作数被冲刷时,未检测到无效操作异常 (V) 或除以零异常 (Z),且其他操作数不是 Q-NaN

注意:如果 FPSR 寄存器的 FS 位被清除且操作结果下溢,则会发生未实现的操作异常 (E)。在这种情况下,不会检测到下溢异常,因此也不会检测到不准确异常。

启用异常时:目标寄存器的内容不会改变,源寄存器的内容会被保存,并且会发生不准确异常。

禁用异常时:如果没有其他异常发生,舍入结果或下溢或溢出的结果将存储在目标寄存器中。

(b) 无效操作异常 (V)
当操作数中的任一个或两个都是无效的时,会发生无效操作异常。

包含 S-NaN 的操作数的算术运算。条件移动指令 (CMOV)、绝对值 (ABS) 和算术取反 (NEG) 不被视为算术运算,但最小值 (MIN) 和最大值 (MAX) 被视为算术运算。

  • 乘法:±0 × ±∞ 或 ±∞ × ±0
  • 融合乘加:(±0 × ±∞) + c 或 (±∞ × ±0) + c。但仅在 c 不是 Q-NaN 时。
  • 加法/减法或乘加运算*1:不同符号的无穷大值相加或相同符号的无穷大值相减
  • 除法:±0 ÷ ±0 或 ±∞ ÷ ±∞
  • 开平方:当操作数小于 0 时
  • 当源超出整数范围时转换为整数。
  • 比较:当条件代码为 8 至 15 时,如果操作数无序(请参阅《RH850G4MH 用户手册:软件》中的“条件代码位及其逻辑反转的定义”表)。

注意 *1: 当乘法结果为无穷大或无穷大之间的加减法时。

启用异常时:目标寄存器的内容不会更改,源寄存器的内容会被保存,并且会发生无效操作异常。

禁用异常时:如果没有其他异常发生,并且目标为浮点格式,则在目标寄存器中存储 Q-NaN。如果目标为整数格式,请参阅每条指令的操作结果说明,以了解存储在目标寄存器中的值。

(c) 除以零异常 (Z)
当除数为 0 且被除数为除 0 以外的有限数时,会发生除以零异常。

启用异常时:目标寄存器的内容不会更改,源寄存器的内容会被保存,并且会发生除以零异常。

禁用异常时:如果没有其他异常发生,在目标寄存器中存储符号正确的无穷大数 (±∞)。

(d) 溢出异常 (O)
如果指数范围为无穷大,且舍入浮点结果大于目标格式的最大有限数,则检测到溢出异常。

启用异常时:目标寄存器的内容不会更改,源寄存器的内容会被保存,并且会发生溢出异常。

禁用异常时:如果没有其他异常发生,则在目标寄存器中存储由舍入模式和中间结果的符号确定的初始值(参见表 3.123,FPU IEEE754 定义的异常初始值)。

(e) 下溢异常 (U)
如果操作结果为 –2Emin 到 +2Emin(但不为零),则检测到下溢异常。

尽管 IEEE754 定义了几种检测下溢的方法,但无论要执行的处理是什么,应使用相同的方法来检测下溢。

以下两种方法可用于检测二进制浮点数的下溢。

  • 舍入并使用无限指数范围计算的结果不为零且在 ±2Emin 范围内。

  • 在舍入之前并使用无限指数范围和精度计算的结果不为零且在 ±2Emin 范围内。

在此 CPU 中,舍入前检测到下溢。或者,舍入结果如下之一,检测到不准确结果。

  • 当给定结果与指数范围和精度为无限时计算的结果不同时

在此 CPU 中,检测到不准确结果时的行为如下,具体取决于是否启用或禁用下溢异常:

启用异常时:当 FPSR 寄存器的 FS 位设置时,如果启用下溢异常,则会发生下溢异常 (U)。当 FPSR 寄存器的 FS 位设置时,如果未启用下溢异常但启用了不准确异常,则会发生不准确异常 (I)。

禁用异常时:如果设置了 FPSR 寄存器的 FS 位,则在目标寄存器中存储根据舍入模式和中间结果值确定的初始值(参见表 3.123,FPU IEEE754 定义的异常初始值)。

注意:如果未设置 FPSR 寄存器的 FS 位,则无论是否启用异常,都会发生未实现的操作异常 (E)。因为必须发生未实现的操作异常 (E),所以不会发生下溢异常 (U)。

(f) 未实现的操作异常 (E)
当检测到无法由硬件正确处理的异常操作数或异常结果时,会设置 E 位并发生未实现的操作异常 (E)。操作数和目标寄存器的内容不会更改。

如果设置了 FPSR 寄存器的 FS 位,则不会发生未实现的操作异常 (E)。

如果未设置 FPSR 寄存器的 FS 位,则在以下条件下会发生未实现的操作异常 (E)(CMOVF.D、CMOVF.S、CMPF.D、CMPF.S、CVTF.HS、ABSF.D、ABSF.S、MAXF.D、MAXF.S、MINF.D、MINF.S、NEGF.D 和 NEGF.S 指令除外)。

  • 当操作数是非正规数时
  • 当操作结果是非正规数或发生下溢时

注意:如果 FPSR 寄存器的 FS 位设置为 1,则无论在任何情况下都不会发生未实现的操作异常 (E)。

1.7 保存和恢复状态

当发生浮点操作异常时,PC 和 PSW 分别保存在 EIPC 和 EIPSW 寄存器中,异常原因代码保存在 EIIC 寄存器中。 浮点操作异常的异常原因代码为 71H。 当在处理浮点操作异常时确认 EI 级别异常时,会发生 EIPC 寄存器覆盖,从而阻止返回导致浮点操作异常发生的指令。当需要确认 EI 级别异常时,必须保存 EIPC、EIPSW 和 EIIC 寄存器的内容,例如保存到堆栈。 当在浮点操作异常处理程序例程中使用浮点指令时,如果发生另一个浮点操作异常,FPSR 和 FPEPC 寄存器将被覆盖。在这种情况下,应在浮点操作异常处理程序处理开始时保存 FPSR 和 FPEPC 寄存器,并在处理程序处理结束时恢复它们。 FPSR 寄存器的原因位仅保存一个启用的异常的结果。在任何情况下,之前的结果都会被保存,直到下一个启用的异常发生。

1.8 冲刷非正规数

此 CPU 可以通过以下两种方式之一处理非正规数(小于最小规范化数的非常小的数):

  • 规范化操作数或操作结果并继续执行算术处理

  • 生成未实现的操作异常 (E) 并执行异常处理

执行基于软件的异常处理将获得更准确的结果,但获得结果所需的时间会根据输入值而有所不同。因此,在需要实时性能的控制系统中,这通常是不可接受的。在这种情况下,重要的是在一定时间内获得结果,而不是关注精度。

(a) 规范化非正规数并继续执行算术处理
通过将 FPSR 寄存器的 FS 位设置为 1,如果输入的操作数或获得的操作结果是非正规数,此 CPU 可以将操作数或操作结果规范化为特定值并继续执行算术处理。在此期间,操作结果中可能不会显示极小的数值差异。 对于操作数和操作结果,当设置 FS 位 (1) 时,非正规数被冲刷到的值如表 3.124 和表 3.125 所示。

可以通过参考 FPSR 寄存器的 IF 位检查输入操作数是否为非正规数,并且是否已被冲刷。可以通过参考 FPSR 寄存器的 U 位检查操作结果是否为非正规数,以及是否已被冲刷。

注意事项

  • 在需要实时性能的控制系统中,建议始终将 FPSR 寄存器的 FS 位设置为 1。
  • 如果将 FPSR 寄存器的 FS 位设置为 1,则在任何情况下都不会发生未实现的操作异常 (E)。
  • 通过使用舍入前的值来判断操作结果是否为非正规数。
  • FPSR 寄存器的 IF 位还会累计并指示导致浮点操作异常的冲刷指令信息。

(b) 生成未实现的操作异常 (E) 并执行异常处理
通过将 FPSR 寄存器的 FS 位清除为 0,如果输入的操作数是非正规数或操作结果为非正规数,则会发生未实现的操作异常 (E)。当发生未实现的操作异常时,在浮点操作异常处理例程中执行基于软件的逐步下溢处理,从而能够获得更准确的结果。但是,在这种情况下,由于软件处理负载,可能无法实现实时处理性能。

(c) 能处理非正规数的指令
以下指令即使在 FPSR 寄存器的 FS 位为 0 的情况下输入非正规数作为操作数,也可以执行而不会引发未实现的操作异常 (E):

  • 条件移动指令 (CMOV)、绝对值 (ABS)、算术取反 (NEG)
  • 最小值 (MIN)、最大值 (MAX)、比较 (CMPF)
  • 从半精度转换为单精度 (CVTF.HS)

(d) 不受非正规数冲刷影响的指令
对于以下指令,即使在 FPSR 寄存器的 FS 位为 1 的情况下输入非正规数作为操作数,也不会发生冲刷:

  • 条件移动指令 (CMOV)、绝对值 (ABS)、算术取反 (NEG)
  • 最小值 (MIN)、最大值 (MAX)、比较 (CMPF)
  • 从半精度转换为单精度 (CVTF.HS)
1.9 冲刷到最近值

此 CPU 提供了冲刷到最近值模式,这是一种在冲刷操作导致非正规数时以更高精度冲刷到最近值的功能。当舍入模式为 RN 且 FPSR 寄存器的 FN 位设置为 1 时,启用冲刷到最近值模式。当使用此模式时,FPU 根据操作结果的数量而不仅仅是符号来确定冲刷非正规数的值。此功能在 RN 以外的舍入模式下或对输入操作数进行冲刷时没有影响。

1.10 浮点操作结果的限制

此 CPU 的浮点操作结果存在限制。

(a) 当输入数据为 NaN(非数)时的操作指令结果
当输入数据为 NaN(非数)时,操作指令结果如下表 3.127 所示。

(b) 当操作数为 NaN(非数)时的转换指令结果
当操作数为 NaN(非数)时,转换的结果如下表 3.128 所示。

(c) MAXF 和 MINF 执行 0 比较时
当 reg1 和 reg2 均为 +0 或 –0 时,操作如下:

  • MINF.S、MINF.D:reg1 的值存储在 reg3 中。
  • MAXF.S、MAXF.D:reg2 的值存储在 reg3 中。

(d) 在精度指令 (RECIPF) 的情况下
RECIPF.S 和 RECIPF.D 的操作结果与 DIVF.S 和 DIVF.D 的 1/x 操作结果相同。