我需要能够使用4个打包的整数,并使用or运算将它们彼此折叠成一个组合的整数。
最有效的方法是什么?请注意,打包整数中的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
除AMD处理器外,其他任何处理器都需要4个周期。缺点:代码要大得多,并且需要一个临时寄存器。
关于assembly - 将xmm寄存器折叠为标量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29193885/