注释¶
我们的模拟器似乎在 exp(double) 方面存在问题。 我还没有能够追踪到它。 罗素·金提供的模拟器不会发生这种情况。
我还发现模拟器中有一个奇怪之处。 我认为这并不严重,但会指出它。 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 指令,除法将在扩展精度下完成。