備註¶
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 指令,除法將在擴充套件精度中完成。