ソース・オペランドには、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ビット操作のみ)アライメント・チェックがイネーブルにされて
いて、アライメントが合わないメモリ参照が行われた場合。
数値例外 なし。