두 개의 SSE 128 비트 레지스터를 16 비트 값으로로드합니다. 값은 다음과 같은 순서에 있습니다SSE 레지스터의 짝수 및 홀수 채널 섞기
src[0] = [E_7, E_6, E_5, E_4, E_3, E_2, E_1, E_0]
src[1] = [O_7, O_6, O_5, O_4, O_3, O_2, O_1, O_0]
당신은 SSE의 내장 함수를 사용하여이을 (할 수있는 좋은 방법이 있는지 알고 계십니까 :
src[0] = [E_3, O_3, E_2, O_2, E_1, O_1, E_0, O_0]
src[1] = [E_7, O_7, E_6, O_6, E_5, O_5, E_4, O_4]
이 무엇을 달성하고자하는 것은이 같은 순서입니다 SSE 4.2까지)?
128 비트 레지스터의 위쪽과 아래쪽 사이에 16 비트 값을 셔플 할 수 없기 때문에 당분간 막혔습니다.및 _mm_shufflehi_epi16
내장 함수 만 발견되었습니다.
업데이트 : 폴
감사합니다, 나는 16 비트 값에 대한 epi8 내장 함수를 사용하려고 생각했다.
shuffle_split = _mm_set_epi8(15, 14, 11, 10, 7, 6, 3, 2, 13, 12, 9, 8, 5, 4, 1, 0);
xtmp[0] = _mm_load_si128(src_vec);
xtmp[1] = _mm_load_si128(src_vec+1);
xtmp[0] = _mm_shuffle_epi8(xtmp[0], shuffle_split);
xtmp[1] = _mm_shuffle_epi8(xtmp[1], shuffle_split);
xsrc[0] = _mm_unpacklo_epi16(xtmp[0], xtmp[1]);
xsrc[0] = _mm_shuffle_epi8(xsrc[0], shuffle_split);
xsrc[1] = _mm_unpackhi_epi16(xtmp[0], xtmp[1]);
xsrc[1] = _mm_shuffle_epi8(xsrc[1], shuffle_split);
여전히 더 나은 솔루션이 있습니까 :
내 솔루션은 다음과 같다?
이 _mm_and_si128' /'_mm_srli_epi32'와''의 조합이 _mm_packus_epi32'은 그것을의 –
또는 두 개의 응용 프로그램을 할 것입니다 '_mm_shuffle_epi8' 적절한 permute 마스크와 함께. –
16 비트 요소의 경우에는 업데이트에서 제안한 것보다 더 좋은 해결책이 없을 수도 있지만 32 비트 요소의 경우 더 나은 방법이 있습니다. https://stackoverflow.com/q/45376193/3852630 및 https : /를 참조하십시오. /stackoverflow.com/a/45385216/3852630 – Ralf