Check XMM register for all zeroes

c++, intrinsics, simd, sse

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

Problem

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!

Original source

Related problems