4

aを 1 ポジションずつ_mm_slli_epi64シフトするために使用しようとしています。_m128i私が理解していないのは、次のコードでは期待どおりにすべてゼロの出力が得られず、むしろ出力されること0x00010000000000000000000000000000です。何が間違っている可能性がありますか?

__m128i z = _mm_setr_epi8(0x80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
printblock("z = ", z);
z = _mm_slli_epi64(z, 1);
printblock("z = ", z);
return;
4

2 に答える 2

4

_mm_slli_epi64各 64 ビット整数を指定されたビット数だけ左にシフトします。に 2 つの 64 ビット整数があります__m128i

0x0000000000000000 0x0000000000000080

したがって、それぞれを左に 1 ビットずつシフトすると、次のようになります。

0x0000000000000000 0x0000000000000100
于 2013-11-08T14:29:41.513 に答える
3

まず第一に、最初の (左端の) オペランドをレジスタの最下位バイトに入れるため、レジスタを に設定しているのではなく、レジスタを に設定しているため、すべてゼロの結果が得られるべきではありません0x80...00x0...080_mm_setr_epi8

次に、シフト後の結果は0x0...0100です。出力ルーチンもおそらくバイト順を台無しにしており、その結果、奇妙な出力が得られます。

于 2013-11-08T14:30:36.997 に答える