効率的に128ビットレジスタから4バイトを抽出しようとしています。問題は、各値が32ビットの32ビット{120,0,0,0,55,0,0,0,42,0,0,0,120,0,0,0}
にあることです。私は128ビットを32ビットに変換したいのですが、それは{120,55,42,120}
という形式です。SSEを抽出するSSE2のみで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のより良いバージョンがありますか?
これは完璧な答えです。どうすれば2回upvoteできますか? :)これは私をたくさん助けました。 SSE4でより良い方法を知っていますか? –
@martins:SSSE3以降では、PSHUFB(既存のコードをコンパイルする必要がある)だけが必要です。 –
@martins私はSSE> 2に精通していませんが、おそらく私はそれを調べようとします。 –