我想从寄存器变量中提取 8 位 __mm256i src
8 个位置由另一个 __mm256i offset
指定由8个整数组成。
例如:如果 offset
是 [1,3,5,21,100,200,201,202]
,我想从 src
中获得第 1、3、5、100、200、201、202 位并将它们打包到 int8
.
这个问题类似于Extracting bits using bit manipulation ,但我想要一个带有 SIMD 指令的解决方案,因为它要快得多。
最佳答案
下面有一个例子:
uint8_t Select(__m256i offset, __m256i src)
{
__m256i permutedSrc = _mm256_permutevar8x32_epi32(src, _mm256_srli_epi32(offset, 5));
__m256i shift = _mm256_and_si256(offset, _mm256_set1_epi32(31));
__m256i bitmask = _mm256_sllv_epi32(_mm256_set1_epi32(1), shift);
__m256i mask = _mm256_cmpeq_epi32(_mm256_and_si256(permutedSrc, bitmask), _mm256_setzero_si256());
return ~_mm256_movemask_ps(_mm256_castsi256_ps(mask));
}
关于x86 - 使用 SIMD 提取位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46824559/