【发布时间】:2016-02-23 22:05:27
【问题描述】:
MOVMSKB 在将字节字段打包成位方面做得非常好。
但是我想做相反的事情。
我有一个 16 位的位字段,我想将其放入 XMM 寄存器中。
每位 1 个字节字段。
最好设置位应该设置每个字节字段的 MSB (0x80),但我可以接受一个设置位,导致字节字段中的 0xFF 结果。
我在https://software.intel.com/en-us/forums/intel-isa-extensions/topic/298374 上看到了以下选项:
movd mm0, eax
punpcklbw mm0, mm0
pshufw mm0, mm0, 0x00
pand mm0, [mask8040201008040201h]
pcmpeb mm0, [mask8040201008040201h]
但是,此代码仅适用于 MMX 寄存器,不能用于 XMM regs,因为 pshufw 不允许这样做。
我知道我可以使用PSHUFB,但那是 SSSE3,我想要 SSE2 代码,因为它需要在任何 AMD64 系统上工作。
有没有办法做到这一点是纯 SSE2 代码?
请不要使用内在函数,只需纯 intel x64 代码。
【问题讨论】:
-
对于那些对具有内在函数here it is 的 SSSE3(和 32 位的 AVX2)解决方案感兴趣的人。
-
@Zboson,SSSE3 只是一个简单的
SHUFB。
标签: assembly bit-manipulation sse sse2