Floating point 为什么';t PowerPC&x27;s的stfs指令是否按预期运行?

Floating point 为什么';t PowerPC&x27;s的stfs指令是否按预期运行?,floating-point,powerpc,Floating Point,Powerpc,PowerPC的浮点寄存器只支持双精度格式,因此加载和存储单精度值需要转换。加载时从单次到双次的转换是有意义的,但是存储时从双次到单次的转换会造成一些混乱。它似乎正确地截断了单精度范围内的数字,以及NaN、无穷大和零,但对其他所有数字都进行了奇怪的移位,而不是像我预期的那样四舍五入到零或无穷大 来自PPC750 CPU的示例。首先列出了给出我预期结果的示例 double-precision input decimal approximation single-precision ou

PowerPC的浮点寄存器只支持双精度格式,因此加载和存储单精度值需要转换。加载时从单次到双次的转换是有意义的,但是存储时从双次到单次的转换会造成一些混乱。它似乎正确地截断了单精度范围内的数字,以及NaN、无穷大和零,但对其他所有数字都进行了奇怪的移位,而不是像我预期的那样四舍五入到零或无穷大

来自PPC750 CPU的示例。首先列出了给出我预期结果的示例

double-precision input    decimal approximation    single-precision output    decimal approximation

0x 400f ffff ffff ffff    3.99999999               0x 407f ffff               3.99999976
0x 7ff8 0000 0000 0000    QNaN                     0x 7fc0 0000               QNaN
0x 7ff0 0000 0000 0000    +inf                     0x 7f80 0000               +inf
0x 8000 0000 0000 0000    -0.0                     0x 8000 0000               -0.0
--------------------------------------------------------------------------------------------------
0x 8000 0000 0000 0001    -4.941e-324              0x 8080 0000               -1.175e-38
0x 00a0 0000 0000 0000    1.139e-305               0x 0500 0000               6.019e-36
0x 7fe0 1234 5678 9abc    9.028e+307               0x 7f00 91a2               1.709e+38
我看了看报纸 看看它是否能对此有所帮助。第C.7节描述了“无需反规范化”和“需反规范化”情况下的转换步骤。(请注意,此表示法中的
|
表示串联。)

然后它接着说:

请注意,如果要由单个精度存储器存储的值 浮点指令的大小大于最大值 以单一格式表示的数字,第一个案例提到“否 “需要非规范化”适用。然后,存储在WORD中的结果 定义明确的值,但在数值上不等于 源寄存器(即单个精度加载的结果 WORD中的浮点值与 原始源寄存器)

这解释了为什么我得到了我所做的结果,但这并不能解释这是如何有用。在我看来,如果再次从内存中加载这些值,可能会导致可怕的错误


为什么stfs指令不执行正常舍入?如何期望结果不会引起问题?

stfs文档中说“请注意,在执行stfs指令之前,要存储的值应为单精度格式。”这意味着要存储的寄存器内容应该是产生单精度值的某些先前指令的结果,例如
fmuls
(单精度浮点乘法)或
frsp
(四舍五入到单精度)


我冒昧地猜测,部分原因是因为它可以快速且容易地实现-
stfs
不必进行舍入,也不必使用浮点单位进行舍入。它可以直接转到负载存储单元,该单元只有处理简单情况的逻辑,在这种情况下,截断位就足够了。

我认为您对PowerPC设计者意图的理解是正确的。但检查指数并在必要时存储+/-零或+/-无穷大是否真的会慢得多?它必须已经在检查指数,以便找到单精度非规范范围内的数字,因此似乎少量的附加逻辑可以覆盖单精度范围外的数字。