为什么GCC更喜欢FP指令的AVX版本?

为什么GCC更喜欢FP指令的AVX版本?,gcc,assembly,x86-64,Gcc,Assembly,X86 64,在为具有AVX的CPU编译时(例如使用-march=sandy bridge),GCC似乎总是更喜欢简单标量浮点指令的AVX版本,而不是SSE版本。例如,它使用vmulsd而不是mulsd 我想知道,是否有任何与性能相关的特殊原因,或者只是GCC的一些实现细节使得它更容易/更自然地安排此类指令?从我所拥有的源代码(主要是Agner的指令表)中可以看出,AVX和SSE指令的性能似乎是相同的。我知道AVX指令是三个操作数,但GCC似乎总是只使用与源操作数之一相同的目标寄存器。VEX编码版本清除高位,

在为具有AVX的CPU编译时(例如使用
-march=sandy bridge
),GCC似乎总是更喜欢简单标量浮点指令的AVX版本,而不是SSE版本。例如,它使用
vmulsd
而不是
mulsd


我想知道,是否有任何与性能相关的特殊原因,或者只是GCC的一些实现细节使得它更容易/更自然地安排此类指令?从我所拥有的源代码(主要是Agner的指令表)中可以看出,AVX和SSE指令的性能似乎是相同的。我知道AVX指令是三个操作数,但GCC似乎总是只使用与源操作数之一相同的目标寄存器。

VEX编码版本清除高位,从而减少依赖性。如果256位VEX指令与SSE指令混合,则可能会发生不好的情况。在编译器中打开AVX将强制所有内容都进行VEX,这样您就可以安全地混合标量、128位和256位代码,而不会出现任何问题。此外,GCC不应该总是对目标和源使用相同的寄存器。如果禁用了优化,或者代码不需要使用同一个操作数两次,则可能会出现这种情况。尝试类似于
a1=a0+b0;b1=a0-b0。其中至少有一个需要在不合适的地方完成。投票决定作为副本关闭。事实并非如此,但潜在的原因是相同的,而且这种联系是显而易见的。基本上,这个问题不需要单独的答案,所以可以标记为重复。