Search code examples
c++ssesimdintrinsics

Check XMM register for all zeroes


Is there a way to check if all bits/bytes/words etc. in a __m128i variable are 0?
In my app I have to check if all integers packed in a in a __m128i variable are zeroes. Will I have to extract them and compare each separately?


Edit:

What I am doing now is:

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);

What I need is to check if idata is all zeroes without having to access each individual element, and quit the loop if they are...


Based on Harold's comment this is the solution:

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

This will exit the loop if all low bits of each DW in idata are 0... thanks harold!


Solution

  • _mm_testz_si128 is SSE4.1 which isn't supported on some CPUs (e.g. Intel Atom, AMD Phenom)

    Here is an SSE2-compatible variant

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