1

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

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

问题:

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

1 回答 1

2

为什么 GCC 不抱怨启用 MMX、SSE4 和 3DNow 的开关!与所选架构 i386 不兼容?

因为选择的架构-march=除其他外指定了可用的指令集扩展;然后显式添加 MMX、SSE4 和 3DNow!到编译器将使用的扩展集。如果您认为 i386 是实现这些指令集扩展的以下架构的“基础”架构,那么这非常有意义。

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

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

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

是的,可能;这正是您要求它对每个-mmmx -msse4 -m3dnow.

于 2016-11-09T09:18:13.583 回答