操作碼 |
指令 |
說明 |
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 指令的行為如下所示:
不將任何數據寫入記憶體。從 x87 FPU 轉換到 MMX 技術狀態。針對頁錯誤以及同記憶體定址有關的異常可能仍會發出訊號(取決於具體實現的版本)。不保證發出斷點(程式碼或數據)訊號(取決於具體實現的版本)。如果目標記憶體區域對映成 UC 或 WP,則不保證實現(即屬於保留情況)這些記憶體型別的相關語義,並且同具體實現的版本有關。
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;
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。
與“實地址模式”中的異常相同
#PF(錯誤程式碼) - 頁錯誤(取決於具體實現的版本)。
#AC - 如果在目前特權級別為 3 時進行未對齊的記憶體引用。