汇编 – 是否可以使用SSE和SSE2来生成128位宽的整数?

我想更多地了解SSE2的功能,并想知道是否可以制作支持加法,减法,XOR和乘法的128位宽整数?
最佳答案
SSE2没有进位标志,但是你可以很容易地计算进位,如进位=总和< a或carry = sum< b像this.但更糟糕的是,SSE2也没有64位比较,所以你必须使用一些变通方法,例如here

这是一个基于上述想法的未经测试的未经优化的C代码.

inline bool lessthan(__m128i a, __m128i b){
    a = _mm_xor_si128(a, _mm_set1_epi32(0x80000000));
    b = _mm_xor_si128(b, _mm_set1_epi32(0x80000000));
    __m128i t = _mm_cmplt_epi32(a, b);
    __m128i u = _mm_cmpgt_epi32(a, b);
    __m128i z = _mm_or_si128(t, _mm_shuffle_epi32(t, 177));
    z = _mm_andnot_si128(_mm_shuffle_epi32(u, 245),z);
    return _mm_cvtsi128_si32(z) & 1;
}

inline __m128i addi128(__m128i a, __m128i b)
{
    __m128i sum = _mm_add_epi64(a, b);
    __m128i mask = _mm_set1_epi64(0x8000000000000000);    
    if (lessthan(_mm_xor_si128(mask, sum), _mm_xor_si128(mask, a)))
    {
        __m128i ONE = _mm_setr_epi64(0, 1);
        sum = _mm_add_epi64(sum, ONE);
    }

    return sum;
}

正如您所看到的,代码需要更多指令,即使经过优化,它仍然比x86_64中的简单2指令add / adc(或x86中的4)更长

转载注明原文:汇编 – 是否可以使用SSE和SSE2来生成128位宽的整数? - 代码日志