2012-01-04 138 views
5

我想在我的C代碼中編寫一些內聯ARM彙編。對於這段代碼,我需要使用一個或兩個以上的寄存器作爲輸入和輸出到函數。我知道如何使用clobber列表來告訴GCC我將使用一些額外的寄存器來執行我的計算。在GCC中使用內聯ARM彙編時優化使用的寄存器

但是,我相信,海灣合作委員會享有自由洗牌周圍寄存器用於優化時什麼。也就是說,我覺得使用固定寄存器進行計算是個不錯的主意。

什麼是使用一些額外的寄存器既不是輸入也不是我的內聯彙編的輸出,不使用固定的寄存器的最佳方式?

P.S.我的想法是使用虛擬輸出變量可能做的伎倆,但我不知道是什麼樣的,這將有奇怪的其他效果......

+0

我敢打賭這*可能是相當直接的,但我會讓C大師回答這個問題。 :-) – Noldorin 2012-01-04 00:25:08

+1

我知道你可以使用寄存器別名,並讓編譯器選擇要使用的寄存器,但不記得它的語法。或者你可以咬緊牙關,只需寫一個.s文件並單獨組裝,以獲得更大的靈活性。 – 2012-01-04 00:57:57

+1

@MichaelDorgan感謝您的意見。 我知道輸入和輸出寄存器是這樣工作的,但我還沒有看到它用於臨時寄存器.. 您的第二種解決方案有與我需要的相反的功能,它刪除了更多的優化選項(指定輸入和輸出寄存器)... – Madcowswe 2012-01-04 01:16:43

回答

5

好吧,我發現,備份的思想來源使用虛設輸出而不是硬寄存器:

4.8臨時寄存器: 人們有時也錯誤地使用臨時寄存器則會覆蓋。正確的方法是 彌補一個僞輸出,並且使用「= R」或「= & R」取決於所允許的重疊 與輸入。 GCC爲虛擬值分配一個寄存器。不同的是,GCC可以選擇一個方便的寄存器,因此它具有更多的靈活性。

從頁碼20的this pdf。

對於任何人誰是有意與海灣合作委員會this網站內聯彙編的詳細信息被證明是非常有益的。

+0

在AArch64上週我發現gcc生成了更好的代碼頂部和拖尾我的程序集,當我硬編碼(如實際寫入'add w2,%[input1],%[input2]') (比如'add%[fakeoutputastemp],%[input1],%[input2]')。 YMMV當然。我的情況:http://stackoverflow.com/questions/28325569/can-pretty-variable-names-be-used-for-registers-in-gcc-inline-assembly。如果您知道調用約定,您可以選擇不會導致arg被推入的臨時寄存器,也不會太高。 – ahcox 2015-02-07 20:19:06

相關問題