簡體   English   中英

檢查__m128i是否為零?

[英]Check whether __m128i is zero?

我發現了這個問題:

__m128i變量為零嗎?

我用來創建以下示例:

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還是非零,我總是得到“ false”的打印輸出?

由於已標記了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),因此只需要一條指令。 有關更多詳細信息,請參見檢查兩個sse寄存器是否都不為零而不破壞它們

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM