Является ли переменная __m128i нулевой?

Как проверить, имеет ли переменная __m128i какое-либо ненулевое значение для процессоров SSE-2 и более ранних версий?

Ответ 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);

Обратите внимание, что это верно, когда все биты равны нулю.