當尋找在由Visual Studio(2015U2)在我看到的C代碼這個「手工優化」片被轉換回爲乘法/O2
(釋放)模式所產生的組件:x86_64:IMUL快於2倍SHL + 2x ADD?
int64_t calc(int64_t a) {
return (a << 6) + (a << 16) - a;
}
組裝:
imul rdx,qword ptr [a],1003Fh
所以我在想,如果這是真的比做得它是書面的方式,像快:
mov rbx,qword ptr [a]
mov rax,rbx
shl rax,6
mov rcx,rbx
shl rcx,10h
add rax,rcx
sub rax,rbx
我一直認爲乘法總是比幾班/增加慢?現代英特爾x86_64處理器不再是這種情況嗎?
「IMUL」通常是3-4個延遲的順序,每個時鐘的吞吐量爲1。所以,可能會更快。還要注意,至少最後3條指令相互依賴,這樣它本身就會產生一個等效的依賴鏈。 – Jester
過去一直很好:8086 IMUL花費了大約100個時鐘,具體取決於尋址模式,寄存器大小等。 –
如果您認爲內存中的負載是空閒的(因爲您必須等待它)*無論如何*)和寄存器「mov」可以被消除,「shl」可以並行執行,那麼理想情況下,移位代碼將與乘法一樣快。然而,它攻擊了很多功能單元,並且它更像是i-cache。 – EOF