检查__m128i是否为零?

时间:2015-06-07 17:57:19

标签: c++ assembly sse intrinsics avx

我发现了这个问题:

Is an __m128i variable zero?

我曾经创建过以下示例:

int main(){

    __m128i intrinreg;
    intrinreg.m128i_i64[0] = 0;
    intrinreg.m128i_i64[1] = 6;

    __m128i zero = _mm_setzero_si128();

    if (0 == _mm_movemask_epi8(_mm_cmpeq_epi32(intrinreg, zero)))
    {
        std::cout << "true" << std::endl;
    }
    else{
        std::cout << "false" << std::endl;
    }
}

但是我是否将两个64位int组件设置为0或非零,我总是得到&#34; false&#34;打印出来?

1 个答案:

答案 0 :(得分:1)

由于您已标记AVX,我假设您有SSE4.1,在这种情况下您需要的指令是ptest,您可以从_mm_testz_si128_mm_test_all_zeros()获取。

bool test1, test2;
__m128i r1 = _mm_setzero_si128();
__m128i r2 = _mm_set1_epi64x(42);
test1 = _mm_testz_si128(r1,r1);
test2 = _mm_testz_si128(r2,r2);
printf("%d %d\n", test1, test2); //prints 1 0

如果您没有SSE4.1,请使用_mm_movemask_epi8(_mm_cmpeq_epi32(x,_mm_setzero_si128())) == 0xFFFF。这需要pcmpeqdpmovmskbtest

但是,ptest设置零标志(ZF),因此它只需要一条指令。有关详细信息,请参阅checking-if-two-sse-registers-are-not-both-zero-without-destroying-them