哪些LLVM通行证负责浮动
我正在研究一个改变四舍五入模式(+ inf,-inf,nearest,或truncate)的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通道负责此优化,我可以禁用它们,因为目前我没有看到任何其他解决方法。
基本上,你不能这样做。 LLVM假定所有浮点操作都使用默认舍入模式,并且浮点控制寄存器从不读取或修改。
如果您有兴趣,最近在LLVM-dev邮件列表上讨论了这个问题。
同时,唯一可靠的解决方法是使用内联汇编,如asm!("addsd $0, $1"
。
Rust的标准库也假设你不修改舍入模式(特别是浮点和字符串之间转换的代码对此很敏感)。
链接地址: http://www.djcxy.com/p/85635.html