AVX2:AVX 寄存器中 8 位元素的 CountTrailingZeros

sim*_*let 0 c++ simd intrinsics avx avx2

我想要一个类似 的函数的实现_mm256_lzcnt_epi8(__m256i a),其中对于每个 8 位元素,都会计算和提取尾随零的数量。

在上一个实现对前导零进行计数的问题中,有一个使用查找表的解决方案。我想知道是否可以使用相同的方法来实现这一点。

请仅使用 AVX 和 AVX2,并且输入的行为0可以是未定义的。

AVX2:AVX 寄存器中 8 位元素上的 BitScanReverse 或 CountLeadingZeros

感谢您的帮助!

aqr*_*rit 6

__m128i ssse3_tzcnt_epi8(__m128i v) {
    const __m128i lut_lo = _mm_set_epi8(0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 8);
    const __m128i lut_hi = _mm_set_epi8(4, 5, 4, 6, 4, 5, 4, 7, 4, 5, 4, 6, 4, 5, 4, 8);
    const __m128i nibble_mask = _mm_set1_epi8(0x0F);
    __m128i t;

    t = _mm_and_si128(nibble_mask, v);
    v = _mm_and_si128(_mm_srli_epi16(v, 4), nibble_mask);
    t = _mm_shuffle_epi8(lut_lo, t);
    v = _mm_shuffle_epi8(lut_hi, v);
    v = _mm_min_epu8(v, t);
    return v;
}
Run Code Online (Sandbox Code Playgroud)