`-march`和指令集开关之间可能存在冲突吗?

时间:2016-11-09 09:11:00

标签: gcc gcc5 tdm-gcc

我正在使用以下命令编译示例程序:

$ gcc -march=i386 -mtune=i386 -mmmx -msse4 -m3dnow -m32 -o hello.exe hello.c

问题:

  1. GCC为什么不抱怨启用MMX,SSE4和3DNow的开关!与选择的架构i386不兼容?
  2. 编译器是否生成无法在i386上运行的可执行文件?

1 个答案:

答案 0 :(得分:2)

  

为什么GCC没有抱怨用于启用MMX,SSE4和3DNow的开关!与选择的架构i386不兼容?

因为使用-march=选择的体系结构指定了可用的指令集扩展;然后你明确添加MMX,SSE4和3DNow!到编译器将使用的扩展集。如果您认为i386是" base"实现这些指令集扩展的以下体系结构的体系结构,这非常有意义。

换句话说:-march=i386本身减少了所使用的指令集,包括扩展,以便生成的代码将在386处理器上运行。后面的选项(-mmmx等)添加到使用的指令集中。 -march=i386 -mmmx的组合确实没有意义,但如果你特别要求这种组合,那就是你得到的东西。在编译器中需要额外的逻辑来推断该组合是无意义的。

-march还设置了各种调整参数,至少对于x86。除非我弄错了,-mtune=i386是多余的。

  

编译器是否生成无法在i386上运行的可执行文件?

是的,可能;这正是你要求它对-mmmx -msse4 -m3dnow

中的每一个做的