假设你有一个uint64_t,只关心uint64_t中每个字节的高位.像这样:
uint32_t的:
0000 … 1000 0000 1000 0000 1000 0000 1000 0000 —> 0000 1111
有更快的方法比:
return ( ((x >> 56) & 128)+ ((x >> 49) & 64)+ ((x >> 42) & 32)+ ((x >> 35) & 16)+ ((x >> 28) & 8)+ ((x >> 21) & 4)+ ((x >> 14) & 2)+ ((x >> 7) & 1) )
又转移x,屏蔽,并为每个字节添加正确的位?这将编译到很多的程序集,我正在寻找一个更快的方式…我使用的机器只有SSE2指令,我没有找到有用的SIMD操作.
谢谢您的帮助.
解决方法
正如我在评论中提到的,pmovmskb做你想要的.以下是您可以如何使用它:
MMX SSE1:
movq mm0,input ; input can be r/m pmovmskb output,mm0 ; output must be r
SSE2:
movq xmm0,input pmovmskb output,xmm0
我抬头看新的方式
BMI2:
mov rax,0x8080808080808080 pext output,input,rax ; input must be r