Я заинтересован в определении переполняющих значений при добавлении неподписанных 8-разрядных целых чисел, и насыщать результат 0xFF:SSE2 - сравнение встроенных функций целых числа без знака
__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 otherwise
, nd мы могли бы насытить m1
с помощью «или», поэтому m1
проведет с добавлением результат, где действительно, и 0xFF
, где он переполнен.
Проблема, _mm_cmplt_epi8
выполняет знаковое сравнение, так, например, если m1[i] = 0x70
и m2[i] = 0x10
, то m3[i] = 0x80
и mask[i] = 0xFF
, который, очевидно, не то, что я требую.
Использование VS2012.
Буду признателен за другой подход для выполнения этого. Благодаря!
Конечно, '_mm_adds_epu8' уже насыщен результат. Определение того, где насыщенные результаты необходимы для расчета, который здесь не описан. –