title: SIMD/SSE: How to check that all vector elements are non-zero
body: <p>I need to check that all vector elements are non-zero. So far I found following solution. Is there a better way to do this? I am using gcc 4.8.2 on Linux/x86_64, instructions up to SSE4.2.</p>
  
  <pre><code>typedef char ChrVect __attribute__((vector_size(16), aligned(16)));
  
  inline bool testNonzero(ChrVect vect)
  {
      const ChrVect vzero = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
      return (0 == (__int128_t)(vzero == vect));
  }
  </code></pre>
  
  <p><strong>Update:</strong> code above is compiled to following assembler code (when compiled as non-inline function):</p>
  
  <pre><code>movdqa  %xmm0, -24(%rsp)
  pxor    %xmm0, %xmm0
  pcmpeqb -24(%rsp), %xmm0
  movdqa  %xmm0, -24(%rsp)
  movq    -24(%rsp), %rax
  orq -16(%rsp), %rax
  sete    %al
  ret
  </code></pre>