【发布时间】:2012-06-07 15:00:17
【问题描述】:
随着 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)。
提前感谢所有答案。
【问题讨论】:
-
是否有任何 YMM 寄存器有上半部分被使用?
-
不,它没有。它们可以归零或随机化或其他,我不在乎。
-
那就好了。在当前的实现中,如果上半部分已被重置 (VZEROUPPER),则使用旧版 SSE 指令不会受到任何惩罚。
-
@harold 这应该是一个答案。谢谢!
-
是的,我想我会添加一些信息并将其转化为答案..