将xmm寄存器折叠为标量



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

最有效的方法是什么?注意,压缩整数中的1永远不会有一个公共位置,所以我认为无符号的"加法"也可以做到这一点。

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

评论中提到的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

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

最新更新