哪些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

上一篇: Which LLVM passes are responsible for floating

下一篇: Why Are Floating Point Numbers Inaccurate?