5

我一直在尝试从源代码编译 gcc 4.x,--with-fpmath=387但我收到了这个错误:"Invalid --with-fpmath=387". 我查看了配置,发现它不支持这个选项(尽管文档仍然提到它是一个可能的选项):

case ${with_fpmath} in
  avx)
    tm_file="${tm_file} i386/avxmath.h"
    ;;
  sse)
    tm_file="${tm_file} i386/ssemath.h"
    ;;
  *)
    echo "Invalid --with-fpmath=$with_fpmath" 1>&2
    exit 1

基本上,我开始这一切是因为我需要为旧的目标平台提供可执行文件(实际上,它是旧的 Celeron,但没有任何 SSE2 指令,显然由DEFAULT使用 libstdc++ )。可执行文件在来自 libstdc++ 中复制例程的第一条指令 (movq XMM0,...) 处崩溃,并显示“非法指令”消息。有没有办法解决这个问题?我需要使用相当新的 g++ 才能移植我现有的代码库。

我想知道是否可以从旧版本中提供这些标头/源以支持常规 x87 指令,从而不引用 SSE 指令?

更新:请注意我说的是编译后的 libstdc++ 在目标代码中有 SSE2 指令,所以问题不在于 gcc 命令行参数。无论我在编译我的代码时向 gcc 提供什么,它都会与已经具有内置 SSE2 指令的 libstdc++ 链接。

真正的答案是在编译 GCC 时不要使用任何--with-fpmath 开关。我被configure script switch语句弄糊涂了,以为它只支持sse或avx,而事实上,默认值(这个开关中没有提到是“387”)。因此,请确保在运行配置时不要使用 --with-fpmath。我在没有它的情况下重新编译了 GCC,它现在可以正常工作了。

谢谢。

4

2 回答 2

5

告诉 gcc 为特定目标生成代码的参数是-march= CPU其中CPU是您想要的特定 cpu。对于旧的赛隆,您可能想要-march=pentium2-march=pentium3

要单独控制 fp 代码生成,使用较新版本的 gcc -mfpmath=- 在您的情况下,您需要-mfpmath=387.

所有这些以及许多其他内容都包含在gcc 文档中

编辑

为了使用这些标志来构建稍后将链接到程序的库(例如 libstdc++),您需要为库配置构建以使用适当的标志。libstdc++ 是作为 g++ 构建的一部分构建的,因此您需要进行自定义构建——您可以使用它configure CXXFLAGS=-mfpmath=387来设置额外的标志以在构建时使用。

于 2014-01-12T02:32:52.223 回答
0

请注意,问题是关于编译后的 libstdc++ 在目标代码中具有 SSE2 指令,因此问题与 gcc 命令行参数无关。无论我在编译我的代码时向 gcc 提供什么,它都会与已经具有内置 SSE2 指令的 libstdc++ 链接。

真正的答案是在编译 GCC 时不要使用任何 --with-fpmath 开关。我被configure script switch语句弄糊涂了,以为它只支持sse或avx,而事实上,默认值(这个开关中没有提到是“387”)。因此,请确保在运行配置时不要使用--with-fpmath 。我在没有它的情况下重新编译了 GCC,它现在可以正常工作了。

于 2014-03-10T14:05:59.353 回答