【发布时间】:2016-01-01 22:06:39
【问题描述】:
我有兴趣在添加无符号 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);
我有兴趣对这些无符号整数执行“小于”的比较,类似于有符号的 _mm_cmplt_epi8:
__m128i mask = _mm_cmplt_epi8 (m3, m1);
m1 = _mm_or_si128(m3, mask);
如果“epu8”等效项可用,mask 将有 0xFF 其中m3[i] < m1[i](溢出!),0x00 否则,我们将能够使用“或”钳制m1,所以m1 将在有效的地方保存加法结果,并在它溢出的地方保存0xFF。
问题是,_mm_cmplt_epi8 执行有符号比较,例如如果m1[i] = 0x70 和m2[i] = 0x10,那么m3[i] = 0x80 和mask[i] = 0xFF,这显然不是我需要的。
使用 VS2012。
我希望有另一种方法来执行此操作。谢谢!
【问题讨论】:
-
当然,
_mm_adds_epu8已经饱和了结果。确定此处未描述的计算需要饱和结果的位置。
标签: c++ x86 sse simd intrinsics