将 xmm 寄存器折叠成标量

Collapse xmm register into a scalar

我需要能够使用 or 运算将 4 个压缩整数折叠成一个组合整数。

最有效的方法是什么?请注意,压缩整数中的 1 永远不会有共同的位置,所以我认为无符号 "add" 也可以解决问题。

我看到了水平相加指令,但它是用于有符号相加的。

评论中提到的SSSE3方式,有2个phaddd会是这样的:

phaddd xmm0, xmm0
phaddd xmm0, xmm0

不幸的是,速度不是很快,SB 为 4 个周期,其他所有为 6 个周期(AMD 为 8 或 10 个)。

带有随机播放和正常添加的普通 SSE2 方式看起来像这样:(未测试)

pshufd xmm1, xmm0, 0x4E
paddd xmm0, xmm1
pshufd xmm1, xmm0, 0xB1
paddd xmm0, xmm1

除了 AMD 处理器外,这需要 4 个周期。缺点:代码比较大,需要临时寄存器。