2016-05-07 10 views
3

私はSSE2からNEONのポートで作業しています。ポートは初期段階であり、不正な結果が生じています。不正確な結果の理由の一部は_mm_shuffle_epi32と私が選択したNEON命令です。置換の_mm_shuffle_epi32をC式に変換しますか?

_mm_shuffle_epi32のドキュメントは、Microsoftから控えめな側にあります。 Intelのドキュメントが優れていますが、擬似コードのいくつかが何をしているのかはわかりません。

SELECT4(src, control) 
{ 
    CASE(control[1:0]) 
     0: tmp[31:0] := src[31:0] 
     1: tmp[31:0] := src[63:32] 
     2: tmp[31:0] := src[95:64] 
     3: tmp[31:0] := src[127:96] 
    ESAC 
    RETURN tmp[31:0] 
} 

dst[31:0] := SELECT4(a[127:0], imm8[1:0]) 
dst[63:32] := SELECT4(a[127:0], imm8[3:2]) 
dst[95:64] := SELECT4(a[127:0], imm8[5:4]) 
dst[127:96] := SELECT4(a[127:0], imm8[7:6]) 

何が_mm_shuffle_epi32のものかを想定しています。または、より正確には、即値によって値に適用された順列。私はそれを基本的なCとANDとORとして見る必要があると思います。

考えるとC文などのマクロ:

v2 = _mm_shuffle_epi32(v1, _MM_SHUFFLE(i1,i2,i3,i4)); 

結果のC式は、それが基本的なC文に繰り出さだときのように何を求めていますか?

答えて

4

4ビットの2ビットインデックスを保持する8ビット整数をアンパックする必要がない限り、AND/ORはありません。

_MM_SHUFFLEの定義を4つのargsに展開する代わりに、それらを梱包します。

それは

// dst = _mm_shuffle_epi32(src, _MM_SHUFFLE(d,c,b,a)) 
void pshufd(int dst[4], int src[4], int d,int c,int b,int a) 
{ // note that the _MM_SHUFFLE args are high-element-first order 
    dst[0] = src[a]; 
    dst[1] = src[b]; 
    dst[2] = src[c]; 
    dst[3] = src[d]; 
} 

ベクターは低い要素からインデックス化されているように= 0の低い要素は最下位アドレスにメモリに保存するものですが、値がレジスタにあるとき、あなたのようにそれらについて考えるべきものです[ 3 2 1 0 ]。この表記では、ベクトル右シフト(psrldqなど)は実際には右に移動します。

これは、の逆順で、_mm_set_epi32(3, 2, 1, 0)がargsを受け取る理由です。

+0

よろしくお願いいたします。それは理にかなっています。 – jww

+0

@jww:update:_MM_SHUFFLEと一致する順序でargsを配置します。ここで、マクロ引数はMSBからLSBになります。 '_mm_set'と同じで、' _mm_set'と同じです。 –

関連する問題