PUNPCKHBW/PUNPCKHWD/PUNPCKHDQ/PUNPCKHQDQ -
擴充套件高位壓縮數據

操作碼

指令

說明

0F 68 /r

PUNPCKHBW mm, mm/m64

交叉組合 mmmm/m64 高位雙字中的位元組,將結果放入 mm

66 0F 68 /r

PUNPCKHBW xmm1, xmm2/m128

交叉組合 xmm1xmm2/m128 高位四字中的位元組,將結果放入 xmm1

0F 69 /r

PUNPCKHWD mm, mm/m64

交叉組合 mmmm/m64 高位雙字中的字,將結果放入 mm

66 0F 69 /r

PUNPCKHWD xmm1, xmm2/m128

交叉組合 xmm1xmm2/m128 高位四字的字,將結果放入 xmm1

0F 6A /r

PUNPCKHDQ mm, mm/m64

交叉組合 mmmm/m64 的高位雙字,將結果放入 mm

66 0F 6A /r

PUNPCKHDQ xmm1, xmm2/m128

交叉組合 xmm1xmm2/m128 高位四字中的雙字,將結果放入 xmm1

66 0F 6D /r

PUNPCKHQDQ xmm1, xmm2/m128

交叉組合 xmm1xmm2/m128 的高位四字,將結果放入 xmm1

說明

將目標運算元(第一個運算元)與源運算元(第二個運算元)的高位數據元素(位元組、字或雙字)展開並交叉組合,結果放入目標運算元。(圖 3-14 顯示 64 位運算元中的位元組擴充套件操作)。忽略低位數據元素。源運算元可以是 MMX™ 技術暫存器或 64 位記憶體位置,也可以是 XMM 暫存器或 128 位記憶體位置。目標運算元可以是 MMX 或 XMM 暫存器。如果源數據來自記憶體運算元,則從記憶體訪問完整 64 位或 128 位運算元,但指令分別只使用高 32 位或 64 位。

圖 3-14. PUNPCKHBW 指令操作

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];

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];
DEST[63-32] SRC[95-64];
DEST[95-64] DEST[127-96];
DEST[127-96] SRC[127-96];

PUNPCKHQDQ instruction:
DEST[63-0] DEST[127-64];
DEST[127-64] SRC[127-64];

英特爾(R) 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 段限制。

#SS(0) - 如果記憶體運算元有效地址超出 SS 段限制。

#UD - 如果 CR0 中的 EM 設定為 1。

#NM - 如果 CR0 中的 TS 設定為 1。

#MF - 如果存在未決的 x87 FPU 異常。

#PF(錯誤程式碼) - 如果發生頁錯誤。

#AC(0) - 如果啟用對齊檢查並在目前特權級別為 3 時進行未對齊的記憶體引用。

實地址模式異常

#GP(0) - 如果運算元的任何部分出現在 0 到 FFFFH 的有效地址空間之外。

#UD - 如果 CR0 中的 EM 設定為 1。

#NM - 如果 CR0 中的 TS 設定為 1。

#MF - 如果存在未決的 x87 FPU 異常。

虛 8086 模式異常

與“實地址模式”中的異常相同。

#PF(錯誤程式碼) - 頁錯誤。

#AC(0) - 如果在啟用對齊檢查的情況下進行未對齊的記憶體引用。

數值異常

無。

註釋

從記憶體運算元擴充套件時,具體的處理器版本可能只從 128 位運算元獲取相應的 64 位。此時仍將執行 16 位元組邊界對齊檢查以及正常的段檢查。