1

是否有一条SSE指令可以将两个寄存器的高字和低字交错到另一个寄存器中?例如:

r[63-0]   = a[64-127]
r[64-127] = b[63-0]
4

1 回答 1

7

不,因为没有具有两个来源和不同目的地的 SSE 洗牌。但是,如果r与 , 相同a,则可以这样做shufpd。如果您需要保留 的值a

movapd r, a
shufpd r, b, 1

在最近的 µarches 中,它movapd是免费的并在 rename[*] 中处理,因此从执行核心的角度来看,这实际上是一条“单指令”。

如果 AVX 可用,您可以使用vshufpd.

[*] 重命名功能可能会饱和,在这种情况下,额外的 reg-reg 移动将表现得像正常的端口 0|1|5 操作——幸运的是,现实世界的代码几乎总是在其中一个端口上有一些气泡,所以此举往往仍然是“免费的”。

于 2013-07-10T18:00:16.177 回答