将xmm寄存器折叠为标量

时间:2015-03-22 11:39:29

标签: assembly x86 sse simd intrinsics

我需要能够获取4个打包的整数,并使用或操作将它们一个在另一个上面折叠成一个组合整数。

最有效的方法是什么?注意,打包整数中的1将永远不会有一个共同的位置,所以我认为一个未签名的"添加"也可以做到这一点。

我看到了水平添加指令,但它是签名添加的。

1 个答案:

答案 0 :(得分:5)

评论中提到的SSSE3方式有2个phaddd,如下所示:

phaddd xmm0, xmm0
phaddd xmm0, xmm0

不幸的是,这不是很快,SB上有4个周期,其他所有内容都是6个周期(AMD为8个或10个)。

使用shuffle和普通添加的普通SSE2方式可能如下所示:(未经测试)

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

除AMD处理器外,其他任何操作都需要4个周期。缺点:代码规模较大,需要临时注册。