ソース・オペランドは、MMX®テクノロジ・レジスタまたは64ビットのメモリ・ロ ケーション、XMMレジスタまたは128ビットのメモリ・ロケーションが使用できる。
デスティネーション・オペランドには、MMXテクノロジ・レジスタまたはXMMレ ジスタを使用できる。ソースデータが64ビットのメモリ・オペランドからであるとき は、64ビット・オペランドすべてがメモリからアクセスされるが、命令は上位32ビッ トだけを使用する。ソースデータが128ビット・メモリ・オペランドからのものであ る場合、プロセッサによっては、適切な64ビットだけがフェッチされる。ただし、こ の場合も、16バイト境界へのアライメントと通常のセグメント・チェックが適用され る。
PUNPCKHBW命令は、ソース・オペランドとデスティネーション・オペランドの上
位バイトをインタリーブする。PUNPCKHWD命令は、ソース・オペランドとデスティ ネーション・オペランドの上位ワードをインタリーブする。PUNPCKHDQ命令は、
ソース・オペランドとデスティネーション・オペランドの上位ダブルワードをインタ リーブし、PUNPCKHQDQ命令は、ソース・オペランドとデスティネーション・オペ ランドの上位クワッドワードをインタリーブする。
上記の命令では、ソース・オペランドにすべてゼロを入れることにより、バイトから ワード、ワードからダブルワード、ダブルワードからクワッドワード、クワッドワー ドからダブル・クワッドワードへと、それぞれ変換することができる。ソース・オペ ランドがすべてゼロである場合、(デスティネーション・オペランドにストアされる)
結果は、デスティネーション・オペランドの元の値の上位データ要素がゼロ拡張され たものになる。例えば、PUNPCKHBW命令では、上位バイトがゼロ拡張され(すな わち、符号なしワード整数にアンパックされる)、PUNPCKHWD命令では、上位ワー ドがゼロ拡張される(符号なしダブルワード整数にアンパックされる)。
操作
PUNPCKHBW instruction with 64-bit operands:
DEST[7..0] ← DEST[39..32];
DEST[15..8] ← SRC[39..32];
DEST[23..16] ← DEST[47..40];
DEST[31..24] ← SRC[47..40];
DEST[39..32] ← DEST[55..48];
DEST[47..40] ← SRC[55..48];
DEST[55..48] ← DEST[63..56];
DEST[63..56] ← SRC[63..56];
PUNPCKHBW/PUNPCKHWD/PUNPCKHDQ/PUNPCKHQDQ—
Unpack High Data(続き)
PUNPCKHW instruction with 64-bit operands:
DEST[15..0] ← DEST[47..32];
DEST[31..16] ← SRC[47..32];
DEST[47..32] ← DEST[63..48];
DEST[63..48] ← SRC[63..48];
PUNPCKHDQ instruction with 64-bit operands:
DEST[31..0] ← DEST[63..32]
DEST[63..32] ← SRC[63..32];
PUNPCKHBW instruction with 128-bit operands:
DEST[7-0] ← DEST[71-64];
DEST[15-8] ← SRC[71-64];
DEST[23-16] ← DEST[79-72];
DEST[31-24] ← SRC[79-72];
DEST[39-32] ← DEST[87-80];
DEST[47-40] ← SRC[87-80];
DEST[55-48] ← DEST[95-88];
DEST[63-56] ← SRC[95-88];
DEST[71-64] ← DEST[103-96];
DEST[79-72] ← SRC[103-96];
DEST[87-80] ← DEST[111-104];
DEST[95-88] ← SRC[111-104];
DEST[103-96] ← DEST[119-112];
DEST[111-104] ← SRC[119-112];
DEST[119-112] ← DEST[127-120];
DEST[127-120] ← SRC[127-120];
PUNPCKHWD instruction with 128-bit operands:
DEST[15-0] ← DEST[79-64];
DEST[31-16] ← SRC[79-64];
DEST[47-32] ← DEST[95-80];
DEST[63-48] ← SRC[95-80];
DEST[79-64] ← DEST[111-96];
DEST[95-80] ← SRC[111-96];
DEST[111-96] ← DEST[127-112];
DEST[127-112] ← SRC[127-112];
PUNPCKHDQ instruction with 128-bit operands:
DEST[31-0] ← DEST[95-64];
Unpack High Data(続き)
同等のインテル® C/C++コンパイラ組み込み関数
PUNPCKHBW __m64 _mm_unpackhi_pi8(__m64 m1, __m64 m2) PUNPCKHBW __m128i _mm_unpackhi_epi8(__m128i m1, __m128i m2) PUNPCKHWD __m64 _mm_unpackhi_pi16(__m64 m1,__m64 m2) PUNPCKHWD __m128i _mm_unpackhi_epi16(__m128i m1,__m128i m2) PUNPCKHDQ __m64 _mm_unpackhi_pi32(__m64 m1, __m64 m2) PUNPCKHDQ __m128i _mm_unpackhi_epi32(__m128i m1, __m128i m2) PUNPCKHQDQ __m128i _mm_unpackhi_epi64 ( __m128i a, __m128i b) 影響を受けるフラグ
なし。
保護モード例外
#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 ビット操作のみ)セグメントに関係なく、メモリ・オペランド のアライメントが16バイトに合っていない場合。
#UD CR0のEMがセットされた場合。
(128ビット操作のみ)CR4の OSFXSR が0の場合。
(128ビット操作のみ)CPUID 機能フラグ SSE2が0の場合。
#NM CR0のTSがセットされた場合。
PUNPCKHBW/PUNPCKHWD/PUNPCKHDQ/PUNPCKHQDQ—
Unpack High Data(続き)
#MF (64ビット操作のみ)未処理のx87 FPU例外がある場合。
仮想8086モード例外
実アドレスモードと同じ例外。
#PF(フォルトコード) ページフォルトが発生した場合。
#AC(0) (64ビット操作のみ)アライメント・チェックがイネーブルにされて
いて、アライメントが合わないメモリ参照が行われた場合。
数値例外 なし。