Мне нужно проверить, что все векторные элементы отличны от нуля. До сих пор я нашел следующее решение. Есть лучший способ сделать это? Я использую gcc 4.8.2 в Linux/x86_64, инструкции до SSE4.2.
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));
}
Обновление: приведенный выше код скомпилирован следующим кодом ассемблера (при компиляции как не-встроенная функция):
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