Sto cercando di estrarre 4 byte da un registro a 128 bit in modo efficiente. Il problema è che ogni valore è in uno sperato 32 bit {120,0,0,0,55,0,0,0,42,0,0,0,120,0,0,0}
. Voglio trasformare il 128 bit in 32 bit nel modulo {120,55,42,120}
.Estrazione di SSE mischiato a 32 bit con solo SSE2
Il codice "raw" è simile al seguente:
__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];
Il mio codice è 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];
Come posso fare questo in modo efficiente con SSE2. Esiste una versione migliore con SSSE3 o SSE4?
questa è una risposta perfetta. Come posso revocarlo due volte? :) questo mi ha aiutato molto Ti capita di conoscere un modo migliore con SSE4? –
@martins: con SSSE3 e versioni successive, si desidera solo un PSHUFB (che è ciò che il codice esistente deve compilare). –
@martins Non sono molto esperto in SSE> 2, forse cercherò di esaminarlo. –