__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を使いたい。
__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を使いたい。
16 個の値のうち最初の 8 個の値だけが必要で、残りの 8 個を無視すると仮定すると (指定したデータ例はややあいまいです)、次のように SSE2 で実行できます。
v = _mm_srai_epi16(_mm_unpacklo_epi8(v, v), 8);
このように、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);