简体   繁体   English

检查__m128i是否为零?

[英]Check whether __m128i is zero?

I found this question: 我发现了这个问题:

Is an __m128i variable zero? __m128i变量为零吗?

Which I used to create the below example: 我用来创建以下示例:

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

but whether I set the two 64-bit int components to 0 or a non-zero, I always get "false" print out? 但是,无论我将两个64位int组件设置为0还是非零,我总是得到“ false”的打印输出?

Since you have tagged AVX I assume that you have SSE4.1 in which case the instruction you want is ptest which you can get from _mm_testz_si128 or _mm_test_all_zeros() . 由于已标记了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

If you don't have SSE4.1 then use _mm_movemask_epi8(_mm_cmpeq_epi32(x,_mm_setzero_si128())) == 0xFFFF . 如果没有SSE4.1,请使用_mm_movemask_epi8(_mm_cmpeq_epi32(x,_mm_setzero_si128())) == 0xFFFF This requires pcmpeqd , pmovmskb , and test . 这需要pcmpeqdpmovmskbtest

However, ptest sets the zero flag (ZF) so it only needs one instruction. 但是, ptest设置了零标志(ZF),因此只需要一条指令。 See checking-if-two-sse-registers-are-not-both-zero-without-destroying-them for more details. 有关更多详细信息,请参见检查两个sse寄存器是否都不为零而不破坏它们

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM