我正在开发一个更改舍入模式(+inf、-inf、最近或截断)的 Rust 板条箱。
更改舍入模式的函数是使用内联汇编编写的:
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 通道负责此优化,我可以禁用它们,因为目前我没有看到任何其他解决方法。