簡體   English   中英

為什么將 32 位寄存器移動到堆棧然后從堆棧移動到 xmm 寄存器?

[英]Why move 32-bit register to stack then from stack to xmm register?

我正在 64 位機器上使用gcc -m32進行編譯。

以下有什么區別? 請注意,這是 AT&T 語法。

# this
movd  %edx, %xmm0

# and this
movl  %edx, (%esp)
movd  (%esp), %xmm0

機器狀態的唯一區別是第二個版本在堆棧1上留下了一個副本。

由於某種原因,GCC 的默認調整會在內存中反彈。 (最近的 GCC 可能已經在某些情況下修復了這個問題)。 大多數情況下,包括 AMD 在內的大多數 CPU 上的情況通常更糟,盡管 AMD 的優化手冊確實推薦了它。 請參閱 GCC 錯誤8082080833 re:GCC 的整數 <-> xmm 策略一般。

與存儲和加載 uop 相比,使用movd將花費 1 個 ALU uop,因此前端的 uops 較少,但后端的 uops不同,因此根據周圍的代碼,存儲/重新加載策略可以減輕壓力特定的執行端口。

ALU movd延遲優於所有 CPU 上的存儲/重新加載,因此存儲/重新加載的唯一優勢是可能的吞吐量。

Agner Fog在他為 Bulldozer(具有最慢movd %edx, %xmm0的 CPU)的microarch pdf 中

在我的測量中,整數單元和浮點/向量單元之間的傳輸延遲比 AMD 的軟件優化指南中指定的要長得多。 盡管如此,我無法確認按照該指南中的建議,通過內存中間體將數據從通用寄存器移動到向量寄存器會更快。


腳注 1:如果您真的想要那樣,單獨的商店通常仍然是實現該狀態的更好選擇。 相同的 uops 數和更低的延遲(尤其是在 Intel CPU 上。AMD Bulldozer / Steamroller 的movd (x)mm, r32/r64有 10 / 5 個周期延遲movd (x)mm, r32/r64 1 個周期。)

movd %edx, %xmm0         # ALU int -> xmm transfer
movl %edx, (%esp)        # and store a copy if you want it

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM