【发布时间】:2012-11-08 13:51:15
【问题描述】:
我正在尝试以有效的方式从 128 位寄存器中提取 4 个字节。问题是每个值都在一个单独的 32 位 {120,0,0,0,55,0,0,0,42,0,0,0,120,0,0,0} 中。我想以{120,55,42,120} 的形式将 128 位转换为 32 位。
“原始”代码如下所示:
__m128i byte_result_vec={120,0,0,0,55,0,0,0,42,0,0,0,120,0,0,0};
unsigned char * byte_result_array=(unsigned char*)&byte_result_vec;
result_array[x]=byte_result_array[0];
result_array[x+1]=byte_result_array[4];
result_array[x+2]=byte_result_array[8];
result_array[x+3]=byte_result_array[12];
我的 SSSE3 代码是:
unsigned int * byte_result_array=...;
__m128i byte_result_vec={120,0,0,0,55,0,0,0,42,0,0,0,120,0,0,0};
const __m128i eight_bit_shuffle_mask=_mm_set_epi8(1,1,1,1,1,1,1,1,1,1,1,1,0,4,8,12);
byte_result_vec=_mm_shuffle_epi8(byte_result_vec,eight_bit_shuffle_mask);
unsigned int * byte_result_array=(unsigned int*)&byte_result_vec;
result_array[x]=byte_result_array[0];
如何使用 SSE2 有效地做到这一点。 SSSE3 或 SSE4 有更好的版本吗?
【问题讨论】:
标签: c optimization sse