1

我试图弄清楚如何使用 sse _mm_shuffle_epi8 来压缩 128 位寄存器。

假设我有一个输入变量

__m128i target

基本上是8个16位,表示为:

a[0], a[1] ... a[7].  // each slot is 16 bits

我的输出称为:

__m128i output

现在我有一个大小为 8 的位向量:

char bit_mask // 8 bits, i-th bit each indicate if
              // the corresponding a[i] should be included

好的,如何根据bit_mask和输入目标得到最终结果?

假设我的位向量是:

[0 1 1 0 0 0 0 0]

那么我希望结果是:

output = [a1, a2 , ... ]

使用 _mm_shuffle_epi8 的任何已知方法?

假设我使用查找数组: _mm_shuffle_epi8(a, mask_lookup[bitvector]);

如何创建数组?

4

1 回答 1

4

简单且非常快,但需要 4KB 的表空间:

_mm_shuffle_epi8(a, mask_lookup[bitvector]);

您只需将所有 256 个可能的 shuffle 掩码存储在由位向量索引的表中。

于 2013-09-10T02:08:22.620 回答