【发布时间】:2019-06-07 16:28:30
【问题描述】:
AVX 指令集引入了 VPERMILPS,它似乎是 SHUFPS 的简化版本(适用于两个输入寄存器相同的情况)。
例如以下指令:
c5 f0 c6 c1 00 vshufps xmm0,xmm1,xmm1,0x0
可以替换为:
c4 e3 79 04 c1 00 vpermilps xmm0,xmm1,0x0
如您所见,VPERMILPS 版本多占用一个字节并执行相同的操作。根据指令表,两条指令都占用 1 个 CPU 周期,并且具有相同的吞吐量。
引入这种指令有什么意义?我错过了什么吗?
【问题讨论】:
-
vpermilps有三个“正交”选项:1. 压缩单压缩与压缩双压缩,2. 立即混洗控制整数与可变控制向量,以及 3. 128 位 xmm 与 256 位 ymm。选择不同的组合,这会产生 8 个不同版本的vpermilps。巧合的是,其中一个与vshufps具有相同的行为。因此,如果vpermilps xmm0,xmm1,0x0不存在,那将是不合逻辑的。尽管如此,人们可能更喜欢vshufps xmm0,xmm1,xmm1,0x0,它确实节省了一个字节。 (我不确定这条评论是否适合作为答案。) -
问题仍然存在,但是,为什么存在带有立即控制整数的
vpermilps,因为还有vshufpd。 -
回复:您的编辑:只有
shufps的 SSE 编码不会修改上层通道,是的,这不适用于vpermilps。但是您的示例是vshufps,它的上车道为零,并且可以复制和随机播放。我想这在不会导致 AVX/SSE 转换停滞(Haswell/Broadwell 除外)的 CPU 上可能很有用,例如用于插入 YMM 的 SSEpinsrd/q。如果您避免使用 xmm8..15 中的 REX 前缀,我想它还可以节省更多的代码字节来使用 SSE1 shufps。只是一个 2 字节的操作码 + modrm + imm8 = 总共 4 个字节,而 2 字节的 VEX + 操作码是 5 个。
标签: assembly x86 avx instruction-set