MASKMOVDQU - 帶掩碼移動未對齊的雙四字

操作碼

指令

說明

66 0F F7 /r

MASKMOVDQU xmm1, xmm2

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

說明

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

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

    不將任何數據寫入記憶體。不保證會發出斷點(程式碼或數據)訊號;不同的處理器版本可能會發出斷點訊號,也可能不會。針對頁錯誤以及同記憶體定址有關的異常可能仍會發出訊號(取決於具體實現的版本)。如果目標記憶體區域對映成 UC 或 WP,則不保證實現(即屬於保留情況)這些記憶體型別的相關語義,並且同具體實現的版本有關。

MASKMOVDQU 指令可用於改善需要逐位元組合併數據的演算法的效能。MASKMOVDQU 不應導致所有權讀取;否則,由於數據將使用位元組掩碼直接寫入,而不在儲存之前給舊數據分配空間,這樣會產生不必要的頻寬耗用。與“數據流單指令多數據擴充套件指令集”中的非臨時儲存指令相似,MASKMOVDQU 指令將快取層次結構的污染降到最低。它隱式使用弱序的寫入組合儲存 (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 14th bytes in source operand *;
IF (MASK[127] = 1)
THEN DEST[DI/EDI+15] SRC[127-120] ELSE * memory location unchanged *; FI;

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

void_mm_maskmoveu_si128(__m128i d, __m128i n, char * p)

保護模式異常

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

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

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

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

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

實地址模式異常

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

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

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

虛 8086 模式異常

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

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