Assembly 可以在同一代码路径中混合使用传统SSE编码指令和VEX编码指令吗?

Assembly 可以在同一代码路径中混合使用传统SSE编码指令和VEX编码指令吗?,assembly,x86,sse,avx,Assembly,X86,Sse,Avx,随着AVX的推出,Intel将VEX编码方案引入Intel 64和IA-32体系结构。此编码方案主要用于AVX指令。我想知道混合使用VEX编码指令和现在所谓的“遗留SSE”指令是否可以 我问这个问题的主要原因是代码大小。考虑这两个指令: shufps xmm0, xmm0, 0 vshufps xmm0, xmm0, xmm0, 0 我通常使用第一种方法将标量值“广播”到XMM寄存器中的所有位置。现在,指令集表示这两个(在本例中)之间的唯一区别是,VEX编码的一个清除YMM寄存器的较高(>=1

随着AVX的推出,Intel将VEX编码方案引入Intel 64和IA-32体系结构。此编码方案主要用于AVX指令。我想知道混合使用VEX编码指令和现在所谓的“遗留SSE”指令是否可以

我问这个问题的主要原因是代码大小。考虑这两个指令:

shufps xmm0, xmm0, 0
vshufps xmm0, xmm0, xmm0, 0
我通常使用第一种方法将标量值“广播”到XMM寄存器中的所有位置。现在,指令集表示这两个(在本例中)之间的唯一区别是,VEX编码的一个清除YMM寄存器的较高(>=128)位。假设我不需要,在这种情况下使用VEX编码版本有什么好处?第一条指令占用4字节(
0fc6c00
),第二条指令占用-5字节(
c5f8c6c00


感谢您提前给出所有答案。

在当前的实现中,如果(至少)上半部分已重置(VZEROUPPER或VZEROALL),则使用传统SSE指令不会受到惩罚

如中第128页所述,在使用(部分)上半部分时使用传统SSE指令会导致性能损失。当进入YMM寄存器在中间分裂的状态时,当离开该状态时再次发生这种惩罚。
混合使用VEX编码的128位指令和传统SSE指令不是问题。

这不安全。根据,
VEX.128
version将YMM寄存器的上半部分归零,传统SSE版本则不归零。最糟糕的事情:一些汇编程序(如gas)在创建对象文件时(当应用了
-mavx
标志时),可能会将
SHUFPS
转换为
VSHUFPS
)。我在处理汇编文件时发现了完全相同的问题。

任何YMM寄存器都有使用的上半部分吗?不,没有。它们可以归零,也可以随机化,或者别的什么,我不在乎。那就好了。在当前实现中,如果上半部分已重置(VZEROUPPER),则使用旧版SSE指令不会受到惩罚。@harold这应该是一个答案。谢谢是的,我想我会添加一些信息,并将其转化为答案。另请参阅,与Haswell和Ice Lake mechanism相比,使用传统SSE指令时使用脏鞋面的惩罚不同,后者仅在转换时使用。
gcc-mavx-c foo.s
仍然按照编写的方式组装指令。有一个气体选项
-msse2avx
gcc
选项,除非您使用
-Wa,-msse2avx
)。GCC不会通过
-mavx
在我的系统上传递它,默认情况下它不会打开。如果有发行版在您没有明确使用它的情况下通过了gcc,我会感到惊讶,但我想这是合理的。