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

时间:2012-06-02 21:21:42

标签: assembly x86 sse avx

随着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)。

提前感谢所有答案。

2 个答案:

答案 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。我发现使用汇编文件完全相同的问题。