我正在修改舍入模式(+ inf,-inf,最接近或截斷)的Rust箱子。哪些LLVM通道負責浮點優化?
是改變舍入模式的功能是使用內聯彙編語言編寫:
fn upward() {
let cw: u32 = 0;
unsafe {
asm!("stmxcsr $0;
mov $0, %eax;
or $$0x4000, %eax;
mov %eax, $0;
ldmxcsr $0;"
: "=*m"(&cw)
: "*m"(&cw)
: "{eax}"
);
}
}
當我編譯它按預期工作調試模式下的代碼,我得到0.3333333333337的三分之一向正無窮取整時,但是當我在發佈模式下編譯時,無論我設置了什麼舍入模式,我都會得到相同的結果。我想這種行爲是由於LLVM後端所做的優化。
如果我知道哪些LLVM通道負責此優化,我可以禁用它們,因爲目前我沒有看到任何其他解決方法。
恐怕這個信息可能非常依賴於LLVM的版本(可以自由添加/刪除通行證),並且因此與'rustc'版本綁定。你正在使用哪個版本的'rustc'?你介意升級時是否破壞? –
我每晚都使用Rust 1.10。我不介意它是否中斷。如果我明白是什麼導致了這種行爲,我可以用一點努力做一些解決方法。 –
經過一些閱讀後,我認爲有一些調度通行證正在move()函數調用之前移動divide指令。 (只是一個猜測),糾正我,如果我錯了。 –