我有兴趣在添加无符号8位整数时识别溢出值,并将结果饱和到0xFF:
__m128i m1 = _mm_loadu_si128(/* 16 8-bit unsigned integers */);
__m128i m2 = _mm_loadu_si128(/* 16 8-bit unsigned integers */);
__m128i m3 = _mm_adds_epu8(m1, m2);
Run Code Online (Sandbox Code Playgroud)
我会感兴趣的是执行比这些无符号整数更少的比较,类似于_mm_cmplt_epi8签名:
__m128i mask = _mm_cmplt_epi8 (m3, m1);
m1 = _mm_or_si128(m3, mask);
Run Code Online (Sandbox Code Playgroud)
如果"epu8"等效可用,mask必须0xFF在那里m3[i] < m1[i](溢出!) 0x00 otherwise,我们将能够饱和m1使用"或",所以m1将持有另外的结果,其中有效的,0xFF它溢出.
问题是,_mm_cmplt_epi8执行符号比较,因此,例如,如果m1[i] = 0x70和m2[i] = 0x10,然后m3[i] = 0x80和mask[i] = 0xFF,这显然不是我的要求.
使用VS2012.
我希望采用另一种方法来执行此操作.谢谢!