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

Dan*_*zar 10 x86 assembly sse avx

随着AVX的推出,英特尔将VEX编码方案引入了英特尔64和IA-32架构.该编码方案主要用于AVX指令.我想知道是否可以混合使用VEX编码指令和现在称为"传统SSE"的指令.

我问这个问题的主要原因是代码大小.请考虑以下两条说明:

shufps xmm0, xmm0, 0
vshufps xmm0, xmm0, xmm0, 0
Run Code Online (Sandbox Code Playgroud)

我通常使用第一个"广播"标量值到XMM寄存器中的所有位置.现在,指令集表明这两者之间的唯一区别(在这种情况下)是VEX编码的一个清除了YMM寄存器的高位(> = 128).假设我不需要,在这种情况下使用VEX编码版本有什么好处?第一条指令需要4个字节(0FC6C000),第二条指令需要5个(C5F8C6C000).

提前感谢所有答案.

har*_*old 11

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

Agner Fog第128页详述:在汇编中优化子程序,使用传统SSE指令而(某些)上半部分正在使用时会带来性能损失.当进入YMM寄存器在中间分割的状态时,以及在离开该状态时再次发生这种惩罚.

混合使用VEX编码的128位指令和传统SSE指令不是问题.