4

_m128 (4 単語 abcd) を 1 単語に減らす最善の方法 ( s​​se2 ) は何ですか? 各 _m128 コンポーネントの下部が必要です。

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

そのための組み込み関数はありますか? ありがとう !

4

2 に答える 2

2

参考までに、sse3 組み込み関数_mm_shuffle_epi8がその役割を果たします: (この場合はマスク 0x0004080c を使用)

于 2009-11-18T17:27:52.253 に答える
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));
}

%xmm1 での入力と %rax での出力を考えると、上記は 5 つのマシン操作になります。

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

高速ビット マトリックス転置、文字列検索、ビットニック (GPGPU スタイル) 並べ替えなど、SSE2 の珍しい使用方法を確認したい場合は、私のブログ、エッジでのコーディング を参照してください。

とにかく、それが役立つことを願っています。

于 2012-04-20T05:17:41.520 に答える