[英]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 錯誤80820和80833 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.