是否有x86指令或两个用于在XMM寄存器之间交换值;类似于XCHG指令?无法使用内存,临时寄存器或XOR副本。
答案 0 :(得分:1)
xchg
操作中的实际值是它在同步原语,自旋锁等中的使用。由于其隐式lock
前缀,它可能会施加重罚。当然没有人会使用SSE实现同步原语,但交换有任何优点吗?它有时可能有用,但是在32位模式下有8个SSE寄存器,在64位模式下有16个,为什么不只使用SSE临时寄存器?我不知道是否有任何x86-64处理器在其SIMD单元中使用寄存器重命名等(以消除错误的依赖性)。
你已经排除了使用xorps
(或_mm_xor_ps
内在函数),这在现代处理器上通常是一个无用的技巧 - 当然是通用寄存器,你已经排除了使用记忆我害怕,这就是你所有的可能性。总结一下:没有。
答案 1 :(得分:1)
使用PXOR
指令是在XMM寄存器之间交换内容的最短且最快的方式。此代码交换xmm0和xmm1之间的内容。
pxor xmm0, xmm1
pxor xmm1, xmm0
pxor xmm0, xmm1
那么,在哪里可以看到问题?
答案 2 :(得分:1)
以下是arithmetic swap的完全未经测试的代码:
vpsubd xmm0, xmm1
vpaddd xmm1, xmm0
vpsubd xmm0, xmm1, xmm0
与xor不同,减法不是可交换的,所以你最终得到的是不幸的最后一行,如果没有avx你就不能这样做(嗯,你可以,但是有一个临时寄存器然后你最好使用移动)。
在大多数处理器上使用暂存寄存器会更快(我想P4除外,但没有人关心P4,对吧?)。在较旧的处理器上,因为前两个移动可以在最新的处理器上并行执行,因为它们使用寄存器重命名处理前端的xmm reg-reg移动。注册重命名和纯粹使用重命名处理指令都不是新技巧,因为Pentium Pro和fxch
通常使用重命名来实现重命名。使用寄存器重命名实现xmm reg-reg移动是一个相当新的技巧,它在Ivy Bridge,Haswell,Bulldozer和Piledriver中。
通常你可以通过将它展开来摆脱循环中的交换。不在循环中的交换很少是必要的,甚至更少是瓶颈。