Проверить регистр XMM для всех нулей

Есть ли способ проверить, все ли биты/байты/слова и т.д. в переменной __m128i равны 0?
В моем приложении я должен проверить, являются ли все целые числа, упакованные в в переменной __m128i, нулями. Должен ли я их извлекать и сравнивать отдельно?

Редактировать:


Сейчас я делаю следующее:
int next = 0;
do{
    //some code

    next = idata.m128i_i32[0] + idata.m128i_i32[1] + idata.m128i_i32[2] + idata.m128i_i32[3];
}while(next > 0);

Мне нужно проверить, не является ли идентификатор нулями без доступа к каждому отдельному элементу, и выйти из цикла, если они...

Основываясь на комментарии Гарольда, это решение:


__m128i idata = _mm_setr_epi32(i,j,k,l);
do{
    //some code
}while( !_mm_testz_si128(idata, idata) );

Это приведет к выходу из цикла, если все младшие бит каждого DW в idata равны 0... спасибо hraold!

Ответ 1

_mm_testz_si128 - это SSE4.1, который не поддерживается на некоторых процессорах (например, Intel Atom, AMD Phenom)

Вот вариант, совместимый с SSE2

inline bool isAllZeros(__m128i xmm) {
    return _mm_movemask_epi8(_mm_cmpeq_epi8(xmm, _mm_setzero_si128())) == 0xFFFF;
}

Ответ 2

Как и Павел Р. прокомментировал мой оригинальный пост:

"Вам не нужно инициализировать фиктивный аргумент для второго параметра PTEST, т.е. вместо _mm_testz_si128(idata, _mm_set1_epi32(0xFFFF)) вы можете просто проверить значение против самого себя."

PTEST выполняет всю работу с одной инструкцией.

Это помогло.