我需要水平添加一个__m128i
16 x epi8值.XOP指令会使这个变得微不足道,但我没有这些指令.
目前的方法是:
hd = _mm_hadd_epi16(_mm_cvtepi8_epi16(sum), _mm_cvtepi8_epi16(_mm_shuffle_epi8(sum, swap)));
hd = _mm_hadd_epi16(hd, hd);
hd = _mm_hadd_epi16(hd, hd);
Run Code Online (Sandbox Code Playgroud)
SSE4.1有更好的方法吗?
您可以使用SSE2 _mm_sad_epu8
(psadbw
)执行此操作,例如:
inline uint32_t _mm_sum_epu8(const __m128i v)
{
__m128i vsum = _mm_sad_epu8(v, _mm_setzero_si128());
return _mm_extract_epi16(vsum, 0) + _mm_extract_epi16(vsum, 4);
}
Run Code Online (Sandbox Code Playgroud)