随着AVX的推出,英特尔将VEX编码方案引入了英特尔64和IA-32架构。该编码方案主要用于AVX指令。我想知道是否可以混合使用VEX编码指令和现在称为“传统SSE”的指令。
我提出这个问题的主要原因是代码大小。请考虑以下两条说明:
shufps xmm0, xmm0, 0
vshufps xmm0, xmm0, xmm0, 0
我通常使用第一个“广播”标量值到XMM寄存器中的所有位置。现在,指令集表明这两者之间的唯一区别(在这种情况下)是VEX编码的那个清除了YMM寄存器的较高(> = 128)位。假设我不需要,在这种情况下使用VEX编码版本有什么好处?第一条指令需要4个字节(0FC6C000
),第二条指令需要5个(C5F8C6C000
)。
提前感谢所有答案。
答案 0 :(得分:11)
在当前实现中,如果(至少)上半部分已被重置(VZEROUPPER或VZEROALL),则使用传统SSE指令不会受到惩罚。
如Agner Fog: optimizing subroutines in assembly中第128页所详述,使用传统SSE指令而(某些)上半部分正在使用时会带来性能损失。当进入YMM寄存器在中间分开的状态时,以及在离开该状态时再次发生这种惩罚。
混合使用VEX编码的128位指令和传统SSE指令不是问题。
答案 1 :(得分:0)
这不安全。根据{{3}},VEX.128版本将YMM寄存器的上半部分归零,而旧版SSE版本则不归零。最糟糕的事情:一些汇编程序(如gasm)可能会在创建目标文件时(当应用-mavx标志时)将SHUFPS转换为VSHUFPS。我发现使用汇编文件完全相同的问题。