Given a __m128i
其中存储 16char
是,偶数索引车道指的是even车道(即 0、2、4、...、14 处的车道),奇数索引车道指的是odd车道(即 1、3、5、...15 处的车道)。
在我的应用程序中,偶数/奇数车道必须在给定范围内。例如,假设even_min
is 1, even_max
is 7, odd_min
是 5,并且odd_max
is 10:
# valid
vec1: [1, 5, 6, 10, 2, 6, 4, 6, 2, 7, 4, 9, 2, 7, 4, 8]
# invalid because 0-th (even) is greater than even_max
vec2: [8, 5, 6, 10, 2, 6, 4, 6, 2, 7, 4, 9, 2, 7, 4, 8]
如何更高效地检查是否有效?
我目前的解决方案很简单,分别查看两个比较结果:
__m128i even_min = _mm_set1_epi8(xxx);
__m128i even_max = _mm_set1_epi8(xxx);
__m128i even_mask =
_mm_set_epi8(0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1);
__m128i evenRange = _mm_and_si128(_mm_cmpge_epi8(vec, even_min),
_mm_cmple_epi8(vec, even_max));
bool isEvenOk = _mm_testc_si128(evenRange, even_mask);
// the code for checking odd bytes is similar
请注意,要比较无符号字符,请使用包括的条件,两个宏定义如下:
#define _mm_cmpge_epi8(a, b) _mm_cmpeq_epi8(_mm_max_epu8(a, b), a)
#define _mm_cmple_epi8(a, b) _mm_cmpge_epi8(b, a)