__m128i变量是零吗?

时间:2011-11-03 03:18:10

标签: c++ c intel sse simd

如何测试__m128i变量在SSE-2及更早版本的处理器上是否具有任何非零值?

2 个答案:

答案 0 :(得分:12)

在SSE2中你可以这样做:

__m128i zero = _mm_setzero_si128();
if(_mm_movemask_epi8(_mm_cmpeq_epi32(x,zero)) == 0xFFFF)
{
    //the code...
}

这将测试四个int与零然后为每个字节返回一个掩码,因此每个对应int的位偏移将为0,4,8& 12,但如果设置了任何位,上面的测试将会捕获,如果你保留了掩码,你可以直接使用更精细的粒度部分。

答案 1 :(得分:4)

为了完整起见,使用SSE4可以使用_mm_testz_si128

const bool isAllZero = _mm_testz_si128(a,a);

所有位为零时,请注意 true