• 検索結果がありません。

ソース・オペランドには、MMX®テクノロジ・レジスタまたは32ビットのメモリ・ロ ケーション、XMMレジスタまたは128ビットのメモリ・ロケーションを使用できる。

デスティネーション・オペランドは、MMXテクノロジ・レジスタまたはXMMレジ スタを使用できる。ソースデータが128ビット・メモリ・オペランドからのものであ る場合、プロセッサによっては、適切な64ビットだけがフェッチされる。ただし、こ の場合も、16バイト境界へのアライメントと通常のセグメント・チェックが適用され る。

PUNPCKLBW命令は、ソース・オペランドとデスティネーション・オペランドの下位

バイトをインタリーブする。PUNPCKLWD命令は、ソース・オペランドとデスティ ネーション・オペランドの下位ワードをインタリーブする。PUNPCKLDQ命令は、ソー ス・オペランドとデスティネーション・オペランドの下位ダブルワードをインタリー ブする。

上記の命令では、ソース・オペランドにすべてゼロを入れることにより、バイトから ワード、ワードからダブルワード、ダブルワードからクワッドワード、クワッドワー ドからダブル・クワッドワードへと、それぞれ変換することができる。ソース・オペ ランドがすべてゼロである場合、(デスティネーション・オペランドにストアされる)

結果は、デスティネーション・オペランドの元の値の上位データ要素がゼロ拡張され たものになる。例えば、PUNPCKLBW命令では、上位バイトがゼロ拡張され(すなわ ち、符号なしワード整数にアンパックされる)、PUNPCKLWD命令では、上位ワード がゼロ拡張される(符号なしダブルワード整数にアンパックされる)。

操作

PUNPCKLBW instruction with 64-bit operands:

DEST[63..56] ← SRC[31..24];

DEST[55..48] ← DEST[31..24];

DEST[47..40] ← SRC[23..16];

DEST[39..32] ← DEST[23..16];

DEST[31..24] ← SRC[15..8];

DEST[23..16] ← DEST[15..8];

DEST[15..8] ← SRC[7..0];

DEST[7..0] ← DEST[7..0];

Unpack Low Data(続き)

PUNPCKLDQ instruction with 64-bit operands:

DEST[63..32] ← SRC[31..0];

DEST[31..0] ← DEST[31..0];

PUNPCKLBW instruction with 128-bit operands:

DEST[7-0] ← DEST[7-0];

DEST[15-8] ← SRC[7-0];

DEST[23-16] ← DEST[15-8];

DEST[31-24] ← SRC[15-8];

DEST[39-32] ← DEST[23-16];

DEST[47-40] ← SRC[23-16];

DEST[55-48] ← DEST[31-24];

DEST[63-56] ← SRC[31-24];

DEST[71-64] ← DEST[39-32];

DEST[79-72] ← SRC[39-32];

DEST[87-80] ← DEST[47-40];

DEST[95-88] ← SRC[47-40];

DEST[103-96] ← DEST[55-48];

DEST[111-104] ← SRC[55-48];

DEST[119-112] ← DEST[63-56];

DEST[127-120] ← SRC[63-56];

PUNPCKLWD instruction with 128-bit operands:

DEST[15-0] ← DEST[15-0];

DEST[31-16] ← SRC[15-0];

DEST[47-32] ← DEST[31-16];

DEST[63-48] ← SRC[31-16];

DEST[79-64] ← DEST[47-32];

DEST[95-80] ← SRC[47-32];

DEST[111-96] ← DEST[63-48];

DEST[127-112] ← SRC[63-48];

PUNPCKLDQ instruction with 128-bit operands:

DEST[31-0] ← DEST[31-0];

DEST[63-32] ← SRC[31-0];

DEST[95-64] ← DEST[63-32];

DEST[127-96] ← SRC[63-32];

PUNPCKLQDQ

DEST[63-0] ← DEST[63-0];

DEST[127-64] ← SRC[63-0];

PUNPCKLBW/PUNPCKLWD/PUNPCKLDQ/PUNPCKLQDQ—

Unpack Low Data(続き)

同等のインテル® C/C++コンパイラ組み込み関数

PUNPCKLBW __m64 _mm_unpacklo_pi8 (__m64 m1, __m64 m2) PUNPCKLBW __m128i _mm_unpacklo_epi8 (__m128i m1, __m128i m2) PUNPCKLWD __m64 _mm_unpacklo_pi16 (__m64 m1, __m64 m2) PUNPCKLWD __m128i _mm_unpacklo_epi16 (__m128i m1, __m128i m2) PUNPCKLDQ __m64 _mm_unpacklo_pi32 (__m64 m1, __m64 m2) PUNPCKLDQ __m128i _mm_unpacklo_epi32 (__m128i m1, __m128i m2) PUNPCKLQDQ __m128i _mm_unpacklo_epi64 (__m128i m1, __m128i m2) 影響を受けるフラグ

なし。

保護モード例外

#GP(0) メモリ・オペランドの実効アドレスがCS、DS、ES、FS、またはGS セグメントの範囲外の場合。

(128 ビット操作のみ)セグメントに関係なく、メモリ・オペランド のアライメントが16バイトに合っていない場合。

#SS(0) メモリ・オペランドの実効アドレスがSSセグメントの範囲外の場合。

#UD CR0のEMがセットされた場合。

(128ビット操作のみ)CR4の OSFXSR が0の場合。

(128ビット操作のみ)CPUID 機能フラグ SSE2が0の場合。

#NM CR0のTSがセットされた場合。

#MF (64ビット操作のみ)未処理のx87 FPU例外がある場合。

#PF(フォルトコード) ページフォルトが発生した場合。

#AC(0) (64ビット操作のみ)現行特権レベルが3のときに、アライメント・

チェックがイネーブルにされていて、アライメントが合わないメモリ 参照が行われた場合。

実アドレスモード例外

#GP(0) オペランドの一部が0~FFFFH の実効アドレス空間の範囲外の場合。

(128 ビット操作のみ)セグメントに関係なく、メモリ・オペランド

Unpack Low Data(続き)

#MF (64ビット操作のみ)未処理のx87 FPU例外がある場合。

仮想8086モード例外

実アドレスモードと同じ例外。

#PF(フォルトコード) ページフォルトが発生した場合。

#AC(0) (64ビット操作のみ)アライメント・チェックがイネーブルにされて

いて、アライメントが合わないメモリ参照が行われた場合。

数値例外 なし。