我对 SSE 编码非常陌生:我想将 int32 类型的 _m128i[4] 的结果存储到 int8 类型的 _m128i 中。 (_m128i[j]._i32[k] 的值均在 (-127 和 + 127 之间)
我认为伪代码如下:
result._i8 = {
vec1._i8[0], vec1._i8[4], vec1._i8[8], vec1._i8[12],
vec2._i8[0], vec2._i8[4], vec2._i8[8], vec2._i8[12],
vec3._i8[0], vec3._i8[4], vec3._i8[8], vec3._i8[12],
vec4._i8[0], vec4._i8[4], vec4._i8[8], vec4._i8[12]};
我发现的唯一方法就是这种混乱的洗牌。
__m128i mmResult, mmResult0_3, mmResult4_7, mmResult8_11, mmResult12_15;
//some calculation ...
__m128i mmShuffler0_3 = _mm_set_epi8(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1,12, 8, 4, 0);
__m128i mmShuffler4_7 = _mm_set_epi8(-1, -1, -1, -1, -1, -1, -1, -1, 12, 8, 4, 0, -1, -1, -1, -1);
__m128i mmShuffler8_11 = _mm_set_epi8(-1, -1, -1, -1, 12, 8, 4, 0, -1, -1, -1, -1, -1, -1, -1, -1);
__m128i mmShuffler12_15 = _mm_set_epi8(12, 8, 4, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1);
mmResult0_3 = _mm_shuffle_epi8(mmResult0_3, mmShuffler0_3);
mmResult4_7 = _mm_shuffle_epi8(mmResult4_7, mmShuffler4_7);
mmResult8_11 = _mm_shuffle_epi8(mmResult8_11, mmShuffler8_11);
mmResult12_15 = _mm_shuffle_epi8(mmResult12_15, mmShuffler12_15);
mmResult = _mm_or_si128(_mm_or_si128(mmResult0_3, mmResult4_7), _mm_or_si128(mmResult8_11, mmResult12_15));
有没有做得更漂亮的方法?
有没有办法更快地做到这一点?