我試圖以有效的方式從128位寄存器中提取4個字節。問題是每個值都是一個32bit的{120,0,0,0,55,0,0,0,42,0,0,0,120,0,0,0}
。我想將128位轉換爲32位,格式爲{120,55,42,120}
。只用SSE2提取SSE混洗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有更好的版本嗎?
這是一個完美的答案。我怎樣才能使它兩次上升? :)這幫了我很多。你碰巧知道SSE4更好的方法嗎? –
@martins:對於SSSE3和更高版本,您只需要一個PSHUFB(這是您現有的代碼應該編譯的內容)。 –
@martins我對SSE> 2不太熟悉,也許我會試着去研究它。 –