128/256 位是不是有 1 条指令移位?

Posted

技术标签:

【中文标题】128/256 位是不是有 1 条指令移位?【英文标题】:Is there a shift 128/256 bits by 1 instruction?128/256 位是否有 1 条指令移位? 【发布时间】:2020-11-20 21:23:53 【问题描述】:

我想我通过重写代码以在 movemask epi8 之前进行移位找到了解决方案,但是看起来我无法将 128/256 值移位 1 位。真的吗?搜索 sr 并查看 128 位指令显示在它们上执行 *8 的移位https://software.intel.com/sites/landingpage/IntrinsicsGuide/#expand=789,5534,5534&techs=SSE2&cats=Shift&text=sr

我最初打算使用它的目的是将数组向右移动 1 位并将它们与它们相加,但我想我需要在 movemask 之前这样做。我觉得很奇怪我不能做 128/256 位移 1

【问题讨论】:

【参考方案1】:

vpmovmskb 只关心最高位,所以如果你能以相反的顺序取出这些位,你可以向左移动

例如vpaddb,尽管元素大小无关紧要,因为如果位跨越字节边界就可以了,只要它们不到达下一个字节的 MSB。因此,您可以使用vpslld ymm, ymm, 4 或其他东西来启动第二个依赖链,而不是一个 7x vpaddb 链。此外,这为您提供了一个 uop,它可能能够在与 vpaddb/w/d 不同的端口上运行,在某些 CPU 上 vpadd* 不能像在 Skylake 上那样在每个矢量 ALU 端口上运行。

更正您不能在 64 位元素边界上轻松右移 1 位。

XMM/YMM 寄存器是 SIMD 向量,而不是 128 位整数。在 SSE/AVX/AVX-512 中,位级内容的最宽块大小是 64 位。除此之外,对于全向量 shuffle,它的字节粒度最小。

【讨论】:

我会称你为鹰眼,因为你正在回答我所有的装配问题 @EricStotch:只有少数用户在 SO 上关注simd 或 sse/avx 标签。

以上是关于128/256 位是不是有 1 条指令移位?的主要内容,如果未能解决你的问题,请参考以下文章

台达plc移位指令?

西门子plc循环移位指令的用法

汇编语言通用数据处理指令——位操作类指令

汇编语言通用数据处理指令——位操作类指令

如何知道在LDRH指令中哪些半字位(8位)要移位到Rd(目标寄存器)?

Intel 移位指令的陷阱(转)