Compiler construction 检测单个语句引发的潜在FPU条件

Compiler construction 检测单个语句引发的潜在FPU条件,compiler-construction,posix,fpu,Compiler Construction,Posix,Fpu,我用它来寻找产生溢出、下溢、不精确结果等的语句 然而,我是否正确地假设编译器可以对我的代码重新排序,而不是实现我真正想要的效果?如果是这样,我将如何在fe*函数周围创建一个“屏障”(标准化方法的加分)?我可以在某个地方放置一个易失性块吗 如果可以的话,我会测试一下,但我不确定如何测试 例如: void some_function(double d) { float f; feclearexcept(FE_ALL_EXCEPT) f = d; /* will the relevant code

我用它来寻找产生溢出、下溢、不精确结果等的语句

然而,我是否正确地假设编译器可以对我的代码重新排序,而不是实现我真正想要的效果?如果是这样,我将如何在
fe*
函数周围创建一个“屏障”(标准化方法的加分)?我可以在某个地方放置一个易失性块吗

如果可以的话,我会测试一下,但我不确定如何测试

例如:

void some_function(double d) {
float f;

feclearexcept(FE_ALL_EXCEPT)
f = d; /* will the relevant code for this statement be inserted exactly here? */
if (fegetexcept(FE_ALL_EXCEPT))
    printf("FP condition raised during conversion from double to float.\n");
}

/* desired behaviour: */
some_function(DBL_MAX); /* should cause printf to execute */
some_function(FLT_MAX); /* should not cause printf to execute */
编辑:

同时,我正在使用volatile块来创建一个屏障

feclearexcept(FE_ALL_EXCEPT);

__asm__ volatile(
  "flds %2\n\t"
  "faddp\n\t"
  : "=&t" (result)
  : "f" (src1),
    "m" (src2)
);

if (fetestexcept(FE_ALL_EXCEPT))
  ...

有趣的问题!我发现我在讨论这个话题,它说

#pragma STDC FENV_ACCESS ON
将在C99兼容编译器上执行正确的操作…不包括gcc。不过,您似乎正确地使用了不稳定的解决方法


该页面指出了几个gcc错误,有一个测试程序演示了这个问题。

在错误报告中找到了很好的结果,我没有看到那个错误。不幸的是,在这种情况下,上的
#pragma STDC FENV_访问只能阻止编译器尝试折叠常量(以便将任何浮点条件公开给运行时环境);正如Richard所说,很可能无法真正表示浮点状态的使用和定义。真倒霉看起来某些内联程序集可能已就绪。