【发布时间】:2012-04-27 21:02:14
【问题描述】:
有没有办法检查 __m128i 变量中的所有位/字节/字等是否为 0?
在我的应用程序中,我必须检查 __m128i 变量中包含的所有整数是否为零。我必须提取它们并分别比较它们吗?
编辑:
我现在做的是:
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 是否全为零,而无需访问每个单独的元素,如果它们是则退出循环......
根据 Harold 的评论,这是解决方案:
__m128i idata = _mm_setr_epi32(i,j,k,l);
do{
//some code
}while( !_mm_testz_si128(idata, idata) );
如果idata 中每个 DW 的所有低位均为 0,这将退出循环...谢谢 harold!
【问题讨论】:
-
你不能使用
PCMPEQD来比较而不进行提取吗? -
XMM 寄存器是否附加了标志寄存器?如果是,则这些位之间必须有一个零标志。
-
查看
PTEST是否可以使用 SSE4,否则需要花费更多精力。 -
您不需要为
PTEST的第二个参数初始化一个虚拟参数,即您可以使用_mm_testz_si128(idata, idata)而不是_mm_testz_si128(idata, _mm_set1_epi32(0xFFFF))。
标签: c++ sse simd intrinsics