【发布时间】:2019-07-11 14:33:59
【问题描述】:
我需要将一个 16 位字移动八次到 xmm 寄存器中以进行 SSE 操作
E. g.: 我想将 16 位字 ABCD 处理到 xmm0 寄存器,这样最终结果看起来像
ABCD | ABCD | ABCD | ABCD | ABCD | ABCD | ABCD | ABCD
我想这样做以便稍后使用paddw 操作。到目前为止,我已经找到了 pushfd 操作,它可以做我想做的事情,但只适用于双字(32 位)。 pshufw 仅适用于 - 如果我没记错的话 - 64 位寄存器。是否有我正在寻找的操作,还是我必须以某种方式使用多个 pshufw 来模拟它?
【问题讨论】:
-
您的目标是哪个 SSE 版本?
-
另外,如果您只想做一个
paddw并且您的输入/输出在内存中不是连续的,那么使用标量指令添加它们可能会更好。 -
@Jester 之后我将通过
paddw指令循环。 -
如果你的
ABCD是一个常量你可以做mov eax, 0xABCDABCD; movd xmm0, eax; pshufd xmm0, xmm0, 0显然你也可以从内存中加载它。 -
movd xmm0, ecx; pshuflw xmm0, xmm0, 0; pshufd xmm0, xmm0, 0。或者imul ecx, ecx, 0x00010001; movd xmm0, ecx; pshufd xmm0, xmm0, 0(假设ecx的前16 位为零)。注意我没有检查延迟和吞吐量,只是抛出想法:)