Tôi đang cố gắng trích xuất 4 byte ra khỏi thanh ghi 128 bit một cách hiệu quả. Vấn đề là mỗi giá trị nằm trong 32 bit {120,0,0,0,55,0,0,0,42,0,0,0,120,0,0,0}
. Tôi muốn biến đổi 128 bit thành 32 bit thành dạng {120,55,42,120}
.Trích xuất SSE xáo trộn giá trị 32 bit chỉ với SSE2
Các "thô" mã trông giống như sau:
__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];
Mã của tôi SSSE3 là:
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];
Làm thế nào tôi có thể làm một cách hiệu quả này với SSE2. Có phiên bản tốt hơn với SSSE3 hay SSE4 không?
đây là câu trả lời hoàn hảo. Làm thế nào tôi có thể upvote nó hai lần? :) điều này đã giúp tôi rất nhiều. Bạn có biết cách nào tốt hơn với SSE4 không? –
@martins: với SSSE3 trở lên, bạn chỉ muốn có PSHUFB (đó là những gì mã hiện tại của bạn nên biên dịch). –
@martins Tôi không giỏi thạo SSE> 2, có lẽ tôi sẽ cố gắng xem xét nó. –