备注¶
exp(double) 和我们的模拟器似乎存在问题。 我尚未能够追踪到它。 使用 Russell King 提供的模拟器不会出现此问题。
我在模拟器中也发现了一个奇怪之处。 我认为这并不严重,但会指出来。 ARM 调用约定要求在函数调用期间保留浮点寄存器 f4-f7。 编译器经常使用 stfe 指令在进入函数时将 f4 保存在堆栈上,并在返回之前使用 ldfe 指令将其恢复。
我正在查看一些代码,这些代码计算出一个 double 结果,将其存储在 f4 中,然后进行函数调用。 从函数调用返回后,f4 中的数字在模拟器中已转换为扩展值。
这是 stfe 指令的副作用。 f4 中的 double 必须转换为扩展,然后存储。 如果使用了 lfm/sfm 组合,则不会发生转换。 这具有性能方面的考虑。 函数调用的结果和 f4 在乘法中使用。 如果模拟器看到 double 和扩展的乘法,它会将 double 提升为扩展,然后在扩展精度中进行乘法。
此代码将导致此问题
double x, y, z; z = log(x)/log(y);
将计算 log(x) 的结果(double),在 f0 中返回,然后移动到 f4 以在 log(y) 调用中保留它。 由于用于在 log(y) 中保存 f4 的 stfe 指令,除法将在扩展精度中完成。