如何防止“gcc -O3”生成过于现代的 x86 指令?

Kol*_*dez 2 c x86 assembly gcc

我有以下 C 文件

int foo (int input)
{
    if (input == 0)
        input = 1;
    
    return input;
}
Run Code Online (Sandbox Code Playgroud)

当我使用创建目标文件时gcc foo.c -m32 -Wa,-march=i486 -c,一切都很顺利。但是,当我-O3在命令中添加 a 时,出现以下错误:

/tmp/cc7br7gY.s: Assembler messages:
/tmp/cc7br7gY.s:12: Error: `cmove' is not supported on `i486'
Run Code Online (Sandbox Code Playgroud)

我是否必须为汇编优化器提供一个附加选项来告诉它我想要在 i486 上运行的指令?

gcc --version输出gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0

Has*_*kun 6

您并没有告诉编译器编译到架构,只是告诉汇编器(我不太确定您需要这样做)。

-m32 -march=i486如果您想要这样做,请传递一个平原(或根据需要使用任何其他拱门)。

  • 当我看到你传递 `-Wa,-march=i486` 时,我就这样问自己。正如我所说,我认为您实际上不需要这样做(虽然我没有检查,但我猜测 GCC 会在需要时自行将正确的值传递给汇编器)。 (3认同)
  • @Kolodez:不,单独的“-march = i486”不会自动将相应的选项传递给汇编器。但不应该需要它。将“-march”传递给汇编器的唯一效果是,如果您编写了目标体系结构不支持的指令,则汇编器会呕吐。这里编译器已经知道它不会发出任何此类指令。如果你想偏执,你可以添加“-Wa,-march=i486”,但除非编译器有错误,否则它不会做任何事情。 (3认同)
  • @Kolodez 这个答案是关于汇编代码的,其中编译器驱动程序基本上将源代码不变地传递给汇编器。它在这里不适用,而且通常也不需要(汇编程序员通常知道哪里支持哪些指令)。 (2认同)