c++ - 检查 __m128i 是否为零?

标签 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 还是非零,我总是会得到“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),因此它只需要一条指令。请参阅checking-if-two-sse-registers-are-not-both-zero-without-destroying-them了解更多详情。

关于c++ - 检查 __m128i 是否为零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30696708/

相关文章:

c++ - 为什么我的 WinCE 应用程序中没有 std::bad_alloc?

assembly - Cortex M0+ (SAMD21) 未执行待处理中断

c - 使用 SSE 将 4 个 float 乘以 4 个 float 的最有效方法是什么?

c++ - SSE 添加比 + 运算符慢

c++ - Boost::log:基于级别的不同格式(HTML 格式)

assembly - 为什么 x86 汇编中的第一个参数从偏移量 8 开始?

c++ - QScrollArea 中的自定义小部件仅在滚动时严重重绘

c++ - 使用模板切换 SSE 内在函数

c++ - 返回一个返回类型为 `std::string` 的本地字符数组

c++ - 在 Qt 5.x 中使用 GLEW