2014-09-04 140 views
6

如果我要揭露一臺機器特定指令給程序員,有兩種方法我可以這樣做:gcc內在vs內聯彙編:哪個更好?

  1. 定義一個新的內建/固有
  2. 公開相同的內聯彙編ASM()作爲它的一個運算類型的指令,我認爲沒有必要對ASM揮發性()

我已閱讀,內建讓編譯器照顧類型檢查,寄存器分配和「其他優化」等。但是編譯器甚至需要在asm()的情況下做到這一點,對吧?那麼使用asm()作爲一個指令的性能好處究竟是什麼?

如果涉及多個機器指令,等式如何變化?

支持內在性的「可移植性」理論是可以理解的,但我很好奇理解其中一個的性能優勢(如果有的話)。

+0

對於單個指令,我懷疑會有明顯的差異。 – Gene 2014-09-04 23:42:51

+4

Builtins。 GCC將您的內聯彙編逐字粘貼到代碼流中,並且關於它在內聯彙編上做的唯一分析是您設置寄存器限制的可行性。這意味着沒有機會將指令轉換成其他的東西,如果它在給定的情況下更加優化的話,或者如果它可以證明指令是無用的,則刪除它。 – 2014-09-04 23:57:52

+1

內聯彙編適用於當您比編譯器更好的瞭解時,並希望它不受阻礙,因此您可以按照自己想要的順序準確執行所需的指令,完全按照所需的寄存器執行。這通常是一個壞主意。 – Sneftel 2014-09-04 23:59:13

回答

6

我認爲這取決於你在做什麼。修改海灣合作委員會,並要求修改後的海灣合作委員會建立你的程序,除非你的海灣合作委員會補丁使其上游,這比單單使用內聯匯率更令人頭疼。

如果您要使用的指令的抽象含義與特定指令集架構無關,請添加內建/內部函數,以便使用它的相同代碼可以自動在所有目標上工作(回退到更復雜在沒有指令的目標上執行多條指令)可能是「正確的」選擇,但可能不現實。如果指令是非常特定於ISA的東西,不明顯,不關鍵性能等等(我正在考慮加載一個特殊的硬件寄存器,cpu模式寄存器,獲取模型信息等等,但我是當然你可以考慮其他的例子),那麼使用內聯彙編幾乎肯定是正確的解決方案。

即使您確實認爲內建是您的問題的「正確」解決方案,但出於實際原因需要採用內聯asm方法,仍然可以使用宏或靜態內聯函數以這種方式對其進行抽象很容易用後來的內在替換所有用途(或者在沒有指令的情況下在目標上執行後備實現)。