Проверить регистр 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
выполняет всю работу с одной инструкцией.
Это помогло.