PACKSSWB/PACKSSDW - 有符號飽和壓縮

操作碼

指令

說明

0F 63 /r

PACKSSWB mm1, mm2/m64

使用飽和運算將 mm1 中的 4 個與 mm2/m64 中的 4 個壓縮有符號字整數壓縮成 8 個壓縮有符號位元組整數,結果放入 mm1

66 0F 63 /r

PACKSSWB xmm1, xmm2/m128

使用飽和運算將 xmm1 中的 8 個與 xxm2/m128 中的 8 個壓縮有符號字整數壓縮成 16 個壓縮有符號位元組整數,結果放入 xxm1

0F 6B /r

PACKSSDW mm1, mm2/m64

使用飽和運算將 mm1 中的 2 個與 mm2/m64 中的 2 個壓縮有符號雙字整數壓縮成 4 個壓縮有符號字整數,結果放入 mm1

66 0F 6B /r

PACKSSDW xmm1, xmm2/m128

使用飽和運算將 xmm1 中的 4 個與 xxm2/m128 中的 4 個壓縮有符號雙字整數壓縮成 8 個壓縮有符號字整數,結果放入 xxm1

說明

使用飽和運算將壓縮有符號字整數壓縮成壓縮有符號位元組整數 (PACKSSWB),或是將壓縮有符號雙字整數壓縮成壓縮有符號字整數 (PACKSSDW)。PACKSSWB 指令將目標運算元(第一個運算元)中的 4 個有符號字與源運算元(第二個運算元)中的 4 個有符號字壓縮成 8 個有符號位元組,結果放入目標運算元。如果字的有符號值超出有符號位元組的範圍(即大於 7FH 或小於 80H),則分別將飽和位元組值 7FH 或 80H 儲存到目標運算元。

PACKSSDW 指令將目標運算元(第一個運算元)中的 2 個有符號雙字與源運算元(第二個運算元)中的 2 個有符號雙字壓縮成 4 個有符號字,結果放入目標運算元(請參閱“圖 3-4”)。如果雙字的有符號值超出有符號字的範圍(即大於 7FFFH 或小於 8000H),則分別將飽和位元組值 7FFFH 或 8000H 儲存到目標運算元。

PACKSSWB 與 PACKSSDW 指令的目標運算元必須是 MMX™ 技術暫存器;源運算元可以是 MMX 暫存器,也可以是四字記憶體位置。

使用有符號飽和運算壓縮源運算元與目標運算元中的有符號數據元素,結果寫入目標運算元。目標運算元是 XMM 暫存器。源運算元可以是 XMM 暫存器或 128 位記憶體運算元。

PACKSSWB 指令將源運算元中的八個有符號字與目標運算元中的八個有符號字壓縮成十六個有符號位元組,結果放入目標運算元。如果字的有符號值大於或小於有符號位元組的範圍,則對該值執行飽和運算(上溢時 7FH,下溢時 80H)。

PACKSSDW 指令將源運算元中的四個有符號雙字與目標運算元中的四個有符號雙字壓縮成八個有符號字,結果放入目標暫存器。如果雙字的有符號值大於或小於有符號字的範圍,則對該值執行飽和運算(上溢時 7FFFH,下溢時 8000H))。

圖 3-4. PACKSSDW 指令的操作

操作

PACKSSWB instruction with 64-bit operands
DEST[7..0] SaturateSignedWordToSignedByte DEST[15..0];
DEST[15..8] SaturateSignedWordToSignedByte DEST[31..16];
DEST[23..16] SaturateSignedWordToSignedByte DEST[47..32];
DEST[31..24] SaturateSignedWordToSignedByte DEST[63..48];
DEST[39..32] SaturateSignedWordToSignedByte SRC[15..0];
DEST[47..40] SaturateSignedWordToSignedByte SRC[31..16];
DEST[55..48] SaturateSignedWordToSignedByte SRC[47..32];
DEST[63..56] SaturateSignedWordToSignedByte SRC[63..48];

PACKSSDW instruction with 64-bit operands
DEST[15..0] SaturateSignedDoublewordToSignedWord DEST[31..0];
DEST[31..16] SaturateSignedDoublewordToSignedWord DEST[63..32];
DEST[47..32] SaturateSignedDoublewordToSignedWord SRC[31..0];
DEST[63..48] SaturateSignedDoublewordToSignedWord SRC[63..32];

PACKSSWB instruction with 128-bit operands
DEST[7-0] SaturateSignedWordToSignedByte (DEST[15-0]);
DEST[15-8] SaturateSignedWordToSignedByte (DEST[31-16]);
DEST[23-16] SaturateSignedWordToSignedByte (DEST[47-32]);
DEST[31-24] SaturateSignedWordToSignedByte (DEST[63-48]);
DEST[39-32] SaturateSignedWordToSignedByte (DEST[79-64]);
DEST[47-40] SaturateSignedWordToSignedByte (DEST[95-80]);
DEST[55-48] SaturateSignedWordToSignedByte (DEST[111-96]);
DEST[63-56] SaturateSignedWordToSignedByte (DEST[127-112]);
DEST[71-64] SaturateSignedWordToSignedByte (SRC[15-0]);
DEST[79-72] SaturateSignedWordToSignedByte (SRC[31-16]);
DEST[87-80] SaturateSignedWordToSignedByte (SRC[47-32]);
DEST[95-88] SaturateSignedWordToSignedByte (SRC[63-48]);
DEST[103-96] SaturateSignedWordToSignedByte (SRC[79-64]);
DEST[111-104] SaturateSignedWordToSignedByte (SRC[95-80]);
DEST[119-112] SaturateSignedWordToSignedByte (SRC[111-96]);
DEST[127-120] SaturateSignedWordToSignedByte (SRC[127-112]);

PACKSSDW instruction with 128-bit operands
DEST[15-0] SaturateSignedDwordToSignedWord (DEST[31-0]);
DEST[31-16] SaturateSignedDwordToSignedWord (DEST[63-32]);
DEST[47-32] SaturateSignedDwordToSignedWord (DEST[95-64]);
DEST[63-48] SaturateSignedDwordToSignedWord (DEST[127-96]);
DEST[79-64] SaturateSignedDwordToSignedWord (SRC[31-0]);
DEST[95-80] SaturateSignedDwordToSignedWord (SRC[63-32]);
DEST[111-96] SaturateSignedDwordToSignedWord (SRC[95-64]);
DEST[127-112] SaturateSignedDwordToSignedWord (SRC[127-96]);

英特爾(R) C++ 編譯器等價內部函式

__m64 _mm_packs_pi16(__m64 m1, __m64 m2)
__m64 _mm_packs_pi32 (__m64 m1, __m64 m2)

影響的標誌

無。

保護模式異常

#GP(0) - 如果記憶體運算元有效地址超出 CS、DS、ES、FS 或 GS 段限制。(僅限 128 位操作)。如果記憶體運算元未對齊 16 位元組邊界,不論是哪一段。

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

#UD - 如果 CR0 中的 EM 設定為 1。(僅限 128 位操作)。如果 CR4 中的 OSFXSR 是 0。(僅限 128 位操作)。如果 CPUID 功能標誌 SSE-2 為 0。

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

#MF(僅限 64 位操作)- 如果存在未決的 x87 FPU 異常。

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

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

實地址模式異常

#GP(0)(僅限 128 位操作)- 如果記憶體運算元未對齊 16 位元組邊界,不論是哪一段。如果運算元的任何部分出現在 0 到 FFFFH 的有效地址空間之外。

#UD - 如果 CR0 中的 EM 設定為 1。(僅限 128 位操作)。如果 CR4 中的 OSFXSR 是 0。(僅限 128 位操作)。如果 CPUID 功能標誌 SSE-2 為 0。

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

#MF(僅限 64 位操作)- 如果存在未決的 x87 FPU 異常。

虛 8086 模式異常

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

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

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