为什么PowerPC的stfs指令不能达到预期的效果?

时间:2019-11-08 15:55:48

标签: floating-point powerpc

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

我看着PowerPC Programming Environments Manual  看看是否可以对此有所启发。 C.7节描述了“不需要非正规化”和“需要非正规化”情况的转换步骤。 (请注意,||表示串联。)

conversion steps

然后继续说明:

  

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

这说明了为什么我得到了我得到的结果,但没有说明它如何有用。在我看来,如果再次从内存中加载值,将导致可怕的错误。

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

1 个答案:

答案 0 :(得分:2)

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

我可能会猜测部分原因是因为它可以快速,轻松地实现-stfs不必四舍五入,也不必去浮点数单元即可。它可以直接进入只有一个逻辑的负载存储单元,这种逻辑可以处理更简单的情况,在这种情况下,将位截断就足够了。