Как проверить, имеет ли переменная __m128i
какое-либо ненулевое значение для процессоров SSE-2 и более ранних версий?
Является ли переменная __m128i нулевой?
Ответ 1
В SSE2 вы можете сделать:
__m128i zero = _mm_setzero_si128();
if(_mm_movemask_epi8(_mm_cmpeq_epi32(x,zero)) == 0xFFFF)
{
//the code...
}
это проверит четыре int vs zero, а затем вернет маску для каждого байта, поэтому ваши битовые смещения каждого соответствующего int
будут равны 0, 4, 8 и 12, но вышеприведенный тест поймает, если какой-либо бит set, то, если вы сохраните маску, вы можете работать с более мелкозернистыми деталями, если это необходимо.
Ответ 2
Для полноты, с SSE4 можно использовать _mm_testz_si128.
const bool isAllZero = _mm_testz_si128(a,a);
Обратите внимание, что это верно, когда все биты равны нулю.