MASKMOVQ - 帶掩碼移動四字

操作碼

指令

說明

0F F7 /r

MASKMOVQ mm1, mm2

使用 mm1 中的位元組掩碼,有選擇地將 mm2 中的位元組寫入記憶體位置。

說明

從源運算元(第一個運算元)將所選的位元組儲存到 64 位記憶體位置。掩碼運算元(第二個運算元)選擇源運算元中要寫入記憶體的位元組。源運算元與掩碼運算元都是 MMX™ 技術暫存器。記憶體位置中第一個位元組的位置由 DI/EDI 與 DS 暫存器指定。(儲存地址的大小取決於地址大小屬性)。

源運算元中的每個位元組是否寫入記憶體中的相應位元組位置,由掩碼運算元中對應位元組的最高有效位確定:0 表示不寫入,1 表示寫入。

此指令會導致從 x87 FPU 轉換到 MMX 技術狀態(也就是說,會將 x87 FPU 棧頂指針設定為 0,x87 FPU 標記字設定為全 0 [有效])。

帶全 0 掩碼的 MASKMOVQ 指令的行為如下所示:

MASKMOVQ 指令可用於改善需要逐位元組合併數據的演算法的效能。它不應導致所有權讀取;否則,由於數據將使用位元組掩碼直接寫入,而不在儲存之前給舊數據分配空間,這樣會產生不必要的頻寬耗用。與“數據流單指令多數據擴充套件指令集”中的非臨時儲存指令相似,MASKMOVQ 指令將快取層次結構的污染降到最低。MASKMOVQ 隱式使用弱序的寫入組合儲存 (WC)。

弱序記憶體一致性模型產生的後果是,如果多個處理器可能會使用不同的記憶體型別來讀取/寫入 EDI 指定的相同記憶體位置,則應該使用邊界隔離操作,如 SFENCE 指令。

操作

IF (MASK[7] = 1)
THEN DEST[DI/EDI] SRC[7-0] ELSE * memory location unchanged *; FI;
IF (MASK[15] = 1)
THEN DEST[DI/EDI+1] SRC[15-8] ELSE * memory location unchanged *; FI;
* Repeat operation for 3rd through 6th bytes in source operand *;
IF (MASK[127] = 1)
THEN DEST[DI/EDI+15] SRC[63-56] ELSE * memory location unchanged *; FI;

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

void_mm_maskmove_si64(__m64d, __m64n, char * p)

保護模式異常

#GP(0) - CS、DS、ES、FS 或 GS 段中的記憶體運算元有效地址非法(即使掩碼為全 0)。

#SS(0) - SS 段中的地址非法(即使掩碼為全 0)。

#PF(錯誤程式碼) - 頁錯誤(取決於具體實現的版本)。

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

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

#UD - 如果 CR0 中的 EM 設定為 1。如果 CR4 中的 OSFXSR 是 0。如果 CPUID 功能標誌 SSE 是 0。如果 ModR/M 位元組的 Mod 欄位不是 11B。

#AC - 如果在目前特權級別為 3 時進行未對齊的記憶體引用。

實地址模式異常

中斷 13 - 如果運算元的任何部分出現在從 0 到 0FFFFH 的有效地址空間之外(即使掩碼為全 0)。

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

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

#UD - 如果 CR0 中的 EM 設定為 1。如果 CR4 中的 OSFXSR 是 0。如果 CPUID 功能標誌 SSE 是 0。

虛 8086 模式異常

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

#PF(錯誤程式碼) - 頁錯誤(取決於具體實現的版本)。

#AC - 如果在目前特權級別為 3 時進行未對齊的記憶體引用。