11

随着 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 个字节 ( 0FC6C000),第二条指令占用 5 个字节 ( C5F8C6C000)。

提前感谢所有答案。

4

2 回答 2

12

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

如Agner Fog第 128 页所述:优化汇编中的子例程,在使用(某些)上半部分时使用旧版 SSE 指令会带来性能损失。这种惩罚在进入 YMM 寄存器在中间分裂的状态时发生一次,在离开该状态时再次发生。

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

于 2012-06-02T22:07:45.323 回答
-1

这不安全。根据英特尔的软件开发人员手册VEX.128版本将 YMM 寄存器的上半部分归零,而传统 SSE 版本则不会。最糟糕的事情:一些汇编器(如gas)可能会在创建目标文件时转换SHUFPSVSHUFPS(当-mavx应用标志时)。我发现使用程序集文件时存在完全相同的问题。

于 2017-01-13T01:21:21.377 回答