Я пытаюсь понять, как использовать 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 КБ табличного пространства:
_mm_shuffle_epi8(a, mask_lookup[bitvector]);
где вы просто сохраняете все 256 возможных масок тасования в таблице, индексируемой битовым вектором.
Других решений пока нет …