是否有一条SSE指令可以将两个寄存器的高字和低字交错到另一个寄存器中?例如:
r[63-0] = a[64-127]
r[64-127] = b[63-0]
是否有一条SSE指令可以将两个寄存器的高字和低字交错到另一个寄存器中?例如:
r[63-0] = a[64-127]
r[64-127] = b[63-0]
不,因为没有具有两个来源和不同目的地的 SSE 洗牌。但是,如果r
与 , 相同a
,则可以这样做shufpd
。如果您需要保留 的值a
:
movapd r, a
shufpd r, b, 1
在最近的 µarches 中,它movapd
是免费的并在 rename[*] 中处理,因此从执行核心的角度来看,这实际上是一条“单指令”。
如果 AVX 可用,您可以使用vshufpd
.
[*] 重命名功能可能会饱和,在这种情况下,额外的 reg-reg 移动将表现得像正常的端口 0|1|5 操作——幸运的是,现实世界的代码几乎总是在其中一个端口上有一些气泡,所以此举往往仍然是“免费的”。