我需要检查所有向量元素是否都为非零。目前我找到了以下解决方案。有更好的方法吗?我在Linux/x86_64上使用gcc 4.8.2,指令版本是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