我正在使用以下命令编译示例程序:
$ gcc -march=i386 -mtune=i386 -mmmx -msse4 -m3dnow -m32 -o hello.exe hello.c
问题:
答案 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
。