2

我目前正在寫作a toy compiler作爲家庭作業,針對MIPS架構。MIPS編譯器中的寄存器 - 使用哪個?

有18個寄存器從高級語言翻譯時,其通常可用:s0s7其是被調用方保存,和t0t9其是呼叫者 - 保存。由於這18個寄存器可用,出現了一個問題:在執行函數翻譯時,我應該選擇哪個寄存器。

每一組都有其優點和缺點:

  1. 被叫方保存的寄存器必須保存到分別從堆的開頭和一個函數的結束,恢復。
  2. 調用者保存的寄存器必須分別在調用子例程之前和之後保存到堆棧並從堆棧中恢復。

很清楚,我認爲,如果我通過關於使用這些寄存器靜態策略 - 無論策略是,就像在調用者保存的那些寧願被調用函數保存寄存器 - 我不會因爲最有可能出現的最佳性能將會是不必要的寄存器加載/存儲。

那麼,有沒有使用這兩套寄存器的良好做法?

回答

2

這裏的比寒意的一個更好的解決方案,這將寄存器分配在更細的粒度:

首先,我們爲每個變量進行活性分析,並且:

  • 對於可變的活躍時間間隔,其中跨越函數調用:我們更喜歡被調用者保存的調用者保存的寄存器。
  • 對於其活躍區間不跨越函數調用的變量:優先於保存的被調用者保存的調用者。
2

在非葉子函數中優先保存被調用方保存的寄存器,在葉函數中更喜歡調用者保存的寄存器。

在葉子和一級別呼叫樹上,只有一個運氣,你不會有任何保存。