【问题标题】:Is it okay to mix legacy SSE encoded instructions and VEX encoded ones in the same code path?可以在同一代码路径中混合旧版 SSE 编码指令和 VEX 编码指令吗?
【发布时间】: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 这应该是一个答案。谢谢!
  • 是的,我想我会添加一些信息并将其转化为答案..

标签: assembly x86 sse avx


【解决方案1】:

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

Agner Fog: optimizing subroutines in assembly 第 128 页所述,在使用(某些)上半部分时使用旧版 SSE 指令会降低性能。这种惩罚在进入 YMM 寄存器在中间分裂的状态时发生一次,在离开该状态时再次发生。

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

【讨论】:

【解决方案2】:

这不安全。根据Intel's software developer manualVEX.128 版本将 YMM 寄存器的上半部分归零,旧版 SSE 版本不会。最糟糕的事情:一些汇编程序(如气体)可能会在创建目标文件时将SHUFPS 转换为VSHUFPS(当应用-mavx 标志时)。我在使用程序集文件时发现了完全相同的问题。

【讨论】:

  • gcc -mavx -c foo.s 仍然按照所写的方式组装指令。有一个 GAS 选项 -msse2avxas(1) man page不是 gcc 选项,除非您使用 -Wa,-msse2avx)。 GCC 不会在我的系统上使用-mavx 传递它,并且默认情况下它不是打开的。如果任何发行版在您没有明确使用它时通过它,我会感到惊讶,但我想这是合理的。
猜你喜欢
  • 2019-01-17
  • 2016-09-06
  • 1970-01-01
  • 2014-02-17
  • 2016-04-15
  • 1970-01-01
  • 2014-05-28
  • 2014-05-27
  • 1970-01-01
相关资源
最近更新 更多