如何将掩码寄存器的所有设置位向右移动?(到底部,最不重要的位置)。
例如:
__mmask16 mask = _mm512_cmpeq_epi32_mask(vload, vlimit); // mask = 1101110111011101
Run Code Online (Sandbox Code Playgroud)
如果我们将所有设置位向右移动,我们将得到:1101110111011101 -> 0000111111111111
我怎样才能有效地实现这一目标?
您可以在下面看到我如何尝试获得相同的结果,但效率很低:
__mmask16 mask = 56797;
// mask: 1101110111011101
__m512i vbrdcast = _mm512_maskz_broadcastd_epi32(mask, _mm_set1_epi32(~0));
// vbrdcast: -1 0 -1 -1 -1 0 -1 -1 -1 0 -1 -1 -1 0 -1 -1
__m512i vcompress = _mm512_maskz_compress_epi32(mask, vbrdcast);
// vcompress:-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 0 0 0
__mmask16 right_packed_mask = _mm512_movepi32_mask(vcompress);
// right_packed_mask: 0000111111111111
Run Code Online (Sandbox Code Playgroud)
做这个的最好方式是什么?