3

__m128i内容を含む 8 ビット値のレジスタがあります。

{-4,10,10,10,10,10,10,-4,-4,10,10,10,10,10,10,-4} 

ここで、レジスタ内の 8 つの 16 ビット値に変換したいと考えてい_m128iます。次のようになります。

{-4,10,10,10,10,10,10,-4}

可能な限り最小限の命令でこれをどのように可能にしますか? せいぜいSSSE3を使いたい。

4

2 に答える 2

4

16 個の値のうち最初の 8 個の値だけが必要で、残りの 8 個を無視すると仮定すると (指定したデータ例はややあいまいです)、次のように SSE2 で実行できます。

v = _mm_srai_epi16(_mm_unpacklo_epi8(v, v), 8);
于 2012-10-25T13:49:26.900 に答える
2

このように、1 つの SSE2 命令で実行できます (初期化を無視します)。

__m128i const zero = _mm_setzero_si128(); // (if you're in a loop pull this out)
__m128i       v;

v = _mm_unpacklo_epi8(v, zero);
于 2014-02-05T16:29:02.350 に答える