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节描述了“不需要非正规化”和“需要非正规化”情况的转换步骤。 (请注意,||
表示串联。)
然后继续说明:
请注意,如果要由单精度存储存储的值 浮点指令的大小大于最大值 数字以单一格式表示,第一种情况是“否 需要非规范化”。然后将结果存储在WORD中 定义明确的值,但在数值上不等于 源寄存器(即单精度加载的结果 WORD中的浮点数不等于 原始的源寄存器)。
这说明了为什么我得到了我得到的结果,但没有说明它如何有用。在我看来,如果再次从内存中加载值,将导致可怕的错误。
为什么stfs指令不能执行正常的舍入?如何期望结果不会引起问题?
答案 0 :(得分:2)
stfs
文档说:“请注意,在执行 stfs 指令之前,要存储的值应为单精度格式。”这意味着寄存器的内容。被存储应该是某些产生单精度值的先验指令的结果,例如fmuls
(单精度浮点乘法)或frsp
(舍入到单精度)。>
我可能会猜测部分原因是因为它可以快速,轻松地实现-stfs
不必四舍五入,也不必去浮点数单元即可。它可以直接进入只有一个逻辑的负载存储单元,这种逻辑可以处理更简单的情况,在这种情况下,将位截断就足够了。