[英]Temporality of ST64B and MOVDIR64B
x86_64 有一條指令movdir64b
,據我所知,這是一個 64 字節(高速緩存行)的非臨時副本(好吧,至少存儲是)。 AArch64 似乎有一個類似的指令st64b
,它執行相同大小的原子存儲。 但是,官方 ARMv9 文檔並不清楚st64b
是否也是非臨時存儲。
Intel 的movdir64b
指令集參考文檔要詳細得多,但我的研究還不夠深入,無法完全理解每個 memory 類型協議代表什么。
到目前為止,我可以推斷出,x86_64 指令movntdq
大致相當於stnp
,並且是寫組合。 由此看來,似乎movdir64b
就像一個原子存儲中的四個,因此我猜測st64b
。
這幾乎可以肯定是對實際情況的過度簡化(當然可能是錯誤的/不准確的),但這是到目前為止可以推斷出的。
可以將st64b
用作四個stnp
指令的原子序列,以這種方式作為高速緩存行的非臨時寫入嗎?
ST64B
/ ST64BV
/ ST64BV0
指令旨在有效地將工作項添加到支持此接口的 I/O 設備的工作隊列中。 當目標地址映射到 I/O 設備時,存儲被轉換為非發布的寫入事務,這意味着必須有一個包含狀態代碼的完成消息,如文檔中所述。 ST64B
指令簡單地丟棄狀態代碼,而其他兩條指令將其存儲在Xs
操作數指定的寄存器中。
如果您查看偽代碼,這些指令要求目標地址位於不可緩存的 memory 中:
if acctype == AccType_ATOMICLS64 && memattrs.memtype == MemType_Normal then
if memattrs.inner.attrs != MemAttr_NC || memattrs.outer.attrs != MemAttr_NC then
fault.statuscode = Fault_Exclusive;
return (fault, AddressDescriptor UNKNOWN);
否則,生成的狀態代碼為0xFFFFFFFF_FFFFFFFF
,如文檔中所述,它表示目標地址不支持原子 64 字節存儲。 請注意,這與表示失敗的狀態代碼 1 不同。 發生這種情況的原因有很多。 例如,目標設備的工作隊列已滿。
我從偽代碼的理解是,只要目標地址在不可緩存的 memory 中,這些指令就可以在正常的 memory 和設備 memory 上使用。你應該通過檢查狀態碼來實驗性地檢查它們是否真的在正常的 memory 上工作。
這些指令與 ARM 的STNP
和 x86 的MOVNTDQ
完全不同。 x86中對應的指令為MOVDIR64B
、 ENQCMD
、 ENQCMDS
。 盡管 ARM 和 x86 之間存在重大差異。 如果您打算在目的而非行為方面,那么您在這些說明之間進行的“心理等價”是可以的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.