软件浮点和x87或sse已禁用

时间:2019-03-18 16:27:58

标签: c++ gcc floating-point

我正在按照this question中的建议尝试在gcc下启用软件浮点,但遇到了障碍:

-msoft-float标志导致:

/usr/include/c++/4.8.2/bits/basic_string.h: In function ‘long double std::stold(const string&, std::size_t*)’:
/usr/include/c++/4.8.2/bits/basic_string.h:2857:47: error: x87 register return with x87 disabled
   stold(const string& __str, size_t* __idx = 0)
                                               ^

和-mno-sse原因:

/usr/include/c++/4.8.2/bits/basic_string.h: In function ‘float std::stof(const string&, std::size_t*)’:
/usr/include/c++/4.8.2/bits/basic_string.h:2849:46: error: SSE register return with SSE disabled
   stof(const string& __str, size_t* __idx = 0)
                                              ^

有一个couple of questions提到了此错误,但是与内核编程无关,这没有帮助。

basic_string中发生的所有事情都是函数返回浮点数或双精度数。为什么这会导致编译失败?

更重要的是,我该怎么办?

背景

我发现在两个不同平台上C ++应用程序的行为有所不同:

  • 英特尔(R)至强(R)CPU E5504
  • 英特尔(R)酷睿TM i5-3470 CPU

在两台计算机上本地编译的代码可在另一台计算机上运行,​​但 对于一种测试,其行为取决于代码在哪台计算机上运行。

说明 在计算机A上编译的可执行文件在复制以在Machnie B上运行时,其行为类似于在计算机B上编译的可执行文件,反之亦然。

它可以是未初始化的变量或许多其他东西,但是 我怀疑原因可能是非便携式使用浮点数。 也许一台机器对浮点组件的解释与另一台机器不同? 我想检验我的假设。 我以为如果可以强制程序使用(最好是严格的IEE 754)软件浮点数,它可能会确认或排除该问题。 它不是我的代码,我也不想完全重写它来测试它。重新编译是可以的。

与此相关,我问了一个单独的问题how-to-detect-differences-in-floating-point-behaviour-across-platforms,从另一侧解决了这个问题。

1 个答案:

答案 0 :(得分:2)

“为什么这会导致编译失败?”

因为定义了相关的ABI(x87 / x64),以便在硬件浮点寄存器中返回float值。您显然需要硬件浮点才能拥有该寄存器。

“更重要的是,我该怎么办?”

不多。与x87 / x64不同,ARM确实具有软FP ABI,因此-msoft-float确实可以在其中工作,这就是GCC仍然具有软FP的主要原因。