As @harold https://stackoverflow.com/users/555045/harold在上面的评论中说,你可以很容易地做到这一点, e.g.
#include <stdio.h>
#include <tmmintrin.h>
static __m128i pack_16_to_8(const __m128i v)
{
const __m128i vperm = _mm_setr_epi8(0, 2, 4, 6, 8, 10, 12, 14, -1, -1, -1, -1, -1, -1, -1, -1);
return _mm_shuffle_epi8(v, vperm);
}
int main(void)
{
const __m128i v = _mm_setr_epi16(1, 2, 3, 4, 5, 6, 7, 8);
printf("%vhd -> %vd\n", v, pack_16_to_8(v));
return 0;
}
编译并运行:
$ gcc -Wall -mssse3 pack_16_to_8.c && ./a.out
1 2 3 4 5 6 7 8 -> 1 2 3 4 5 6 7 8 0 0 0 0 0 0 0 0