代码之家  ›  专栏  ›  技术社区  ›  elmattic

\u mm\u cmpgt\u epi64如何工作

  •  0
  • elmattic  · 技术社区  · 7 年前

    我用的是 _mm_cmpgt_epi64 内在实现128位加法,然后是256位加法。 看着这个内在的东西的结果,我很困惑。

    我不明白为什么计算面具是这样的。

    const __m128i mask = _mm_cmpgt_epi64(bflip, sumflip);
    

    下面是调试器的输出:

    (lldb) p/x bflip
    (__m128i) $1 = (0x00000001, 0x80000000, 0x00000000, 0x80000000)
    (lldb) p/x sumflip
    (__m128i) $2 = (0x00000000, 0x80000000, 0xffffffff, 0x7fffffff)
    (lldb) p/x mask
    (__m128i) $3 = (0xffffffff, 0xffffffff, 0x00000000, 0x00000000)
    

    63:0 )我没事。但为什么是第二条车道( 127:64 )不是也满了吗?

    在我看来 0x8000000000000000 &燃气轮机; 0x7fffffffffffffff .

    1 回复  |  直到 7 年前
        1
  •  1
  •   Peter Cordes    7 年前

    看起来是32位块打印,而不是64位,所以这很奇怪。

    但不管怎样,这是一个 signed two's complement 整数比较,如手册中所述: http://felixcloutier.com/x86/PCMPGTQ.html

    0x8000000000000000 是最负的64位整数,而 0x7fffffffffffffff 是最大的正数。

    const __m128i rangeshift = _mm_set1_epi64x(0x8000000000000000);
    const __m128i mask = _mm_cmpgt_epi64(_mm_xor_si128(bflip, rangeshift), _mm_xor_si128(sumflip, rangeshift));
    

    或使用AVX512F __mmask8 _mm512_cmp[eq|ge|gt|le|lt|neq]_epu64_mask( __m512i a, __m512i b)

    推荐文章