我需要能够获取4个打包的整数,并使用或操作将它们一个在另一个上面折叠成一个组合整数。
最有效的方法是什么?注意,打包整数中的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个周期。缺点:代码规模较大,需要临时注册。