Является ли переменная __m128i нулевой? - PullRequest
11 голосов
/ 03 ноября 2011

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

Ответы [ 2 ]

12 голосов
/ 03 ноября 2011

В SSE2 вы можете сделать:

__m128i zero = _mm_setzero_si128();
if(_mm_movemask_epi8(_mm_cmpeq_epi32(x,zero)) == 0xFFFF)
{
    //the code...
}

это проверит четыре целых по отношению к нулю, а затем вернет маску для каждого байта, так что ваши смещения битов для каждого соответствующего int будут равны 0, 4, 8 и 12, но вышеприведенный тест перехватит, если какой-либо бит будет установите, тогда, если вы сохраните маску, вы можете работать с мелкозернистыми деталями напрямую, если это необходимо.

4 голосов
/ 09 марта 2016

Для полноты, с SSE4 можно использовать _mm_testz_si128 .

const bool isAllZero = _mm_testz_si128(a,a);

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

...