SSE2:如何将_m128缩减为单词

时间:2009-11-13 11:29:55

标签: sse simd

将_m128(4个字a b c d)减少到一个单词的最佳方式(sse2)是什么? 我想要每个_m128组件的低部分:

int result = ( _m128.a & 0x000000ff ) <<  24
        | ( _m128.b & 0x000000ff ) << 16
        | ( _m128.c & 0x000000ff ) << 8
        | ( _m128.d & 0x000000ff ) << 0

有内在的吗?谢谢!

2 个答案:

答案 0 :(得分:2)

仅供参考,sse3内在函数_mm_shuffle_epi8完成工作:(在这种情况下使用掩码0x0004080c)

答案 1 :(得分:1)

SSE2答案需要多个指令:

unsigned benoit(__m128i x)
{
    __m128i zero = _mm_setzero_si128(), mask = _mm_set1_epi32(255);
    return _mm_cvtsi128_si32(
                _mm_packus_epi16(
                        _mm_packus_epi16(
                                _mm_and_si128(x, mask), zero), zero));
}

以上为5个机器操作,给定%xmm1的输入和%rax的输出:

 pxor     %xmm0, %xmm0
 pand     MASK, %xmm1
 packuswb %xmm0, %xmm1
 packuswb %xmm0, %xmm1
 movd     %xmm1, %rax

如果你想看到SSE2的一些不寻常的用途,包括高速位矩阵转置,字符串搜索和bitonic(GPGPU风格)排序,你可能想查看我的博客Coding on the edges

无论如何,希望有所帮助。