我目前正在寫作a toy compiler作爲家庭作業,針對MIPS架構。MIPS編譯器中的寄存器 - 使用哪個?
有18個寄存器從高級語言翻譯時,其通常可用:s0
到s7
其是被調用方保存,和t0
到t9
其是呼叫者 - 保存。由於這18個寄存器可用,出現了一個問題:在執行函數翻譯時,我應該選擇哪個寄存器。
每一組都有其優點和缺點:
- 被叫方保存的寄存器必須保存到分別從堆的開頭和一個函數的結束,恢復。
- 調用者保存的寄存器必須分別在調用子例程之前和之後保存到堆棧並從堆棧中恢復。
很清楚,我認爲,如果我通過關於使用這些寄存器靜態策略 - 無論策略是,就像在調用者保存的那些寧願被調用函數保存寄存器 - 我不會因爲最有可能出現的最佳性能將會是不必要的寄存器加載/存儲。
那麼,有沒有使用這兩套寄存器的良好做法?