2012-04-16 60 views
10

是否有方法检查__m128i变量中的所有位/字节/字等是否为0?
在我的应用程序中,我必须检查包含在__m128i变量中的所有整数是否为零。我需要提取它们并分别进行比较吗?

编辑: 检查所有零的XMM寄存器


我现在正在做的是:

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

我需要的是检查是否IDATA是全零,而无需访问每个元素,并退出循环,如果他们是...

基于哈罗德的评论是这样的解决方案:


__m128i idata = _mm_setr_epi32(i,j,k,l); 
do{ 
    //some code 
}while(!_mm_testz_si128(idata, idata)); 

如果idata中每个DW的低位都为0,则会退出循环...谢谢hraold!

+0

难道你不能使用'PCMPEQD'来进行比较而不提取吗? – dasblinkenlight 2012-04-16 14:14:01

+0

XMM寄存器是否附有标志寄存器?如果是,则这些位之间必须有一个零标志。 – 2012-04-16 14:15:12

+3

请参阅'PTEST'是否SSE4可用,否则它会花费更多的努力。 – harold 2012-04-16 14:20:36

回答

9

_mm_testz_si128是不支持某些CPU(如英特尔凌动,AMD羿龙)SSE4.1

下面是一个SSE2兼容变种

inline bool isAllZeros(__m128i xmm) { 
    return _mm_movemask_epi8(_mm_cmpeq_epi8(xmm, _mm_setzero_si128())) == 0xFFFF; 
} 
4

像保罗一样[R评价我的原发布:

“您不需要为PTEST的第二个参数初始化伪参数,即,而不是_mm_testz_si128(idata, _mm_set1_epi32(0xFFFF)),您可以对自己测试一个值。”

ptest用一条指令完成整个工作。

这有帮助。