【发布时间】:2015-08-07 10:24:58
【问题描述】:
我对 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));
有没有比这更漂亮的? 有没有更快的方法?
【问题讨论】: