`-march` 和指令集开关之间会不会有冲突?

Posted

技术标签:

【中文标题】`-march` 和指令集开关之间会不会有冲突?【英文标题】:Can there be conflict between `-march` and instruction set switches? 【发布时间】:2016-11-09 09:11:00 【问题描述】:

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

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

问题:

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

【问题讨论】:

【参考方案1】:

为什么 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 执行的操作。

【讨论】:

以上是关于`-march` 和指令集开关之间会不会有冲突?的主要内容,如果未能解决你的问题,请参考以下文章

计算机体系架构

发现同一依赖程序集的不同版本之间存在无法解决的冲突

x86汇编指令集

jdk32位跟jdk64位会冲突吗

Qt,2个QRadioButton集之间的冲突

如果 x86-64 中没有兼容模式开关,我是不是保证不会遇到非 64 位指令?