sim*_*let 0 c++ simd intrinsics avx avx2
我想要一个类似 的函数的实现_mm256_lzcnt_epi8(__m256i a),其中对于每个 8 位元素,都会计算和提取尾随零的数量。
在上一个实现对前导零进行计数的问题中,有一个使用查找表的解决方案。我想知道是否可以使用相同的方法来实现这一点。
请仅使用 AVX 和 AVX2,并且输入的行为0可以是未定义的。
AVX2:AVX 寄存器中 8 位元素上的 BitScanReverse 或 CountLeadingZeros
感谢您的帮助!
__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)
| 归档时间: |
|
| 查看次数: |
363 次 |
| 最近记录: |