[英]Using register in inline assembler
我正在為OpenRISC優化C代碼,我想在寄存器中手動預先保存一些計算值,偽代碼看起來像這樣:
external loop
compute eight values (heavy calculations)
internal loop
use values computed above
當我查看GCC ABI for OpenRISC時,我看到了兩組寄存器:callee-saved和temporary? 我應該使用哪些寄存器來存儲這八個值? 我的意思是,哪些寄存器可以放在內聯asm的破壞列表中?
我需要hardoce寄存器,因為我們在自定義OpenRISC上運行可執行文件。
答案是:無論你喜歡什么。
如果使用被叫方保存寄存器,則編譯器會保存你(只要你將它們標記為慘敗)。
如果您使用臨時寄存器(也稱為調用者保存),那么如果您進行函數調用,編譯器將被強制保存它們。 請注意,編譯器也更喜歡將這些變量用於其他變量,因此如果你用掉了調用者保存的變量,那么它必須使用callee-save來處理其他變量,因此它可能最終會產生相同的差異。
在一天結束時,如果你正在進行繁重的計算,那么在開始之前將一些寄存器保存到堆棧中並不是什么大問題。
有些寄存器包含您不得覆蓋的重要值(例如堆棧指針)。 其他的,比如GOT表指針不那么重要,編譯器會在你完成時恢復它的值(只是確保在這個過程中你不需要它)。
實際上,您不需要自己解決:編譯器可以為您選擇寄存器:
int a, b, c;
asm volatile ("whatever" : "=&w" (a), "=&w" (b), "=&w" (c));
不需要變量,但它們必須分配寄存器,因此它們可以有效地為您想要的任何內容保留寄存器。 &
表示“早期破壞”,這意味着它們不能與輸入寄存器共享相同的寄存器(不是我的示例顯示的任何寄存器)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.