Any*_*orn 1 performance x86 assembly sse
是否有单个 SSE指令将两个寄存器的高字和低字交错到另一个寄存器中?例如:
r[63-0] = a[64-127]
r[64-127] = b[63-0]
Run Code Online (Sandbox Code Playgroud)
不,因为没有SSE shuffle有两个来源和一个不同的目的地.但是,如果r与,相同a,则可以执行此操作shufpd.如果您需要保留以下值a:
movapd r, a
shufpd r, b, 1
Run Code Online (Sandbox Code Playgroud)
在最近的μs中,它movapd是免费的并且在重命名[*]中处理,因此从执行核心的角度来看,这实际上是"单指令".
如果AVX可用,您可以使用vshufpd.
[*]可以使这种重命名功能饱和,在这种情况下,额外的reg-reg移动将像普通的端口0 | 1 | 5操作一样 - 幸运的是,真实世界的代码几乎总是在其中一个端口上有一些气泡,所以此举往往仍然是"自由的".