我正在开发一个Rust crate,它可以改变舍入模式(+inf、-inf、nearest或truncate)。
改变舍入模式的函数是使用内联汇编编写的:
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 passes负责此优化,我可以禁用它们,因为目前我没有看到其他解决方法。
rustc
的版本相关联。您使用的是哪个版本的rustc
?如果升级时出现问题,您介意吗? - Matthieu M.1.0/3.0
,那么当优化开启时,这将在编译时进行评估(即使用LLVM在编译时选择的任何舍入模式)。如果您以优化器无法看透的方式计算“三分之一”(例如解析命令行参数),那么问题变得更加困难。 - huon