将xmm寄存器折叠为标量

Tho*_*mas 2 x86 assembly sse simd intrinsics

我需要能够获取4个打包整数,并使用或操作将它们一个堆叠在一起,形成一个组合整数.

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

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

har*_*old 5

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

phaddd xmm0, xmm0
phaddd xmm0, xmm0
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不是很快,SB上有4个周期,其他一切都是6个周期(AMD为8个或10个).

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

pshufd xmm1, xmm0, 0x4E
paddd xmm0, xmm1
pshufd xmm1, xmm0, 0xB1
paddd xmm0, xmm1
Run Code Online (Sandbox Code Playgroud)

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