Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 检查m128i是否为零?_C++_Assembly_Sse_Intrinsics_Avx - Fatal编程技术网

C++ 检查m128i是否为零?

C++ 检查m128i是否为零?,c++,assembly,sse,intrinsics,avx,C++,Assembly,Sse,Intrinsics,Avx,我发现这个问题: 我用它来创建以下示例: 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::c

我发现这个问题:

我用它来创建以下示例:

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;
    }
}
intmain(){
__m128i intrinreg;
intrinreg.m128i_i64[0]=0;
intrinreg.m128i_i64[1]=6;
__m128i零=_mm_setzero_si128();
如果(0==_mm_movemask_epi8(_mm_cmpeq_epi32(intrinreg,零)))
{

std::cout既然您已经标记了AVX,我假设您有SSE4.1,在这种情况下,您想要的指令是
ptest
,您可以从
\u mm\u testz\u si128
\u mm\u test\u all\u zero()
获得

如果没有SSE4.1,则使用
\u-mm\u-movemask\u-epi8(\u-mm\u-cmpeq\u-epi32(x,\u-mm\u-setzero\u-si128())==0xFFFF
。这需要
pcmpeqd
pmovmkb
测试


但是,
ptest
设置了零标志(ZF),因此它只需要一条指令。有关更多详细信息,请参阅。

如果值为零,则与零的比较显然不能得到零。现在它打印“true”如果两个元素都不是零。如果上面返回的是所有128位是否都是零,那么将“6”交替为“0”应该会更改输出,是吗?如果将两个元素都设为零,则掩码应该为0xFFFFFF。为另一个问题给出的已接受答案实际上并没有回答另一个问题中提出的问题。表达式的计算结果为true on如果所有32位整数分量都不等于零,则需要使用Leonid Tsybert在其注释中给出的表达式:
\u mm\u movemask\u epi8(\u mm\u cmpeq\u epi32(x,zero))==0xFFFF
您还应该使用
\u mm\u cmpeq\u epi64
而不是
\u epi32
,但在这种情况下,您会得到相同的结果。
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