A F*_*Fog 7 floating-point gcc exception-handling compiler-optimization
我找不到任何 -fno-trapping-math 选项有效的示例。
我希望 -ftrapping-math 禁用可能影响是否生成陷阱的优化。例如,使用 x87 指令或 FMA 指令计算具有扩展精度的中间值可以防止发生溢出异常。-ftrapping-math 选项不会阻止这种情况。
公共子表达式消除可能会导致发生一个异常而不是两个异常,例如优化 1./x + 1./x = 2./x 在 x=0 时将生成一个陷阱而不是两个。-ftrapping-math 选项不会阻止这种情况。
请给出一些被 -fno-trapping-math 阻止的优化示例。
您能否推荐比 gcc 手册更好地解释不同浮点优化选项的任何文档,也许包含每个选项优化的代码的具体示例?可能适用于其他编译器。
一个简单的例子如下:
float foo()
{
float a = 0;
float nan = a/a;
return nan;
}
Run Code Online (Sandbox Code Playgroud)
使用 GCC 7.3 for x64 编译,位于-O3
:
foo():
pxor xmm0, xmm0
divss xmm0, xmm0
ret
Run Code Online (Sandbox Code Playgroud)
...这是不言自明的。请注意,它实际上是在做 div(尽管知道 0/0 是 nan),这并不是特别便宜!它必须这样做,因为您的代码可能试图故意引发浮点陷阱。
与-O3 -fno-signaling-nans -fno-trapping-math
:
foo():
movss xmm0, DWORD PTR .LC0[rip]
ret
.LC0:
.long 2143289344
Run Code Online (Sandbox Code Playgroud)
也就是说,“只需加载一个 NaN 并返回它”。这是相同的行为,只要你不依赖有一个 trap。
归档时间: |
|
查看次数: |
1111 次 |
最近记录: |