2012-10-09 2 views
4

가정하자 나는 어떻게 16 × 8 비트 __m128i 값 32 × 4 비트 정수를 추출 할

싶습니다

// ptr is a pointer to uint8_t array 
__m128i b = _mm_load_si128((const __m128i*) ptr); 
SSE2

를 사용하여 16 × 8 비트 부호없는 정수를로드하는 코드 줄을 가지고 b (각 16 비트)의 각 8 비트 부호없는 정수를 4 비트 상위 및 4 비트 하위 부분으로 나눕니다. 어떻게해야합니까?

답변

3

하단 부분을 가려서 상단 부분을 올바른 위치로 이동해야합니다. 바이트 시프트 SSE 명령이 없으므로 이동 후 위쪽 부분도 마스크 처리해야합니다.

__m128i b = _mm_load_si128((const __m128i*) ptr); 
__m128i mask = _mm_set1_epi8(0xf); 
__m128i lower = _mm_and_si128(b, mask); 
__m128i upper = _mm_and_si128(_mm_srli_epi16(b, 4), mask);