gcc 4.x不支持x87 FPU数学?

use*_*175 5 linux sse g++ libstdc++ x87

我一直在尝试从使用的源代码编译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
Run Code Online (Sandbox Code Playgroud)

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

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

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

真正的答案是在编译GCC时不使用任何 --with-fpmath开关.我对配置脚本switch语句感到困惑,认为它只支持sse或avx,而实际上是默认值(此开关中未提及的是"387").因此,请确保在运行configure时不使用--with-fpmath.我没有它重新编译GCC,它现在工作正常.

谢谢.

Chr*_*odd 6

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

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

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

编辑

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


use*_*175 1

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

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