MIPS编译器中的寄存器 - 可以使用哪些?

时间:2011-11-30 13:14:16

标签: compiler-construction mips cpu-registers calling-convention

我目前正在编写a toy compiler作为家庭作业,针对MIPS架构。

从高级语言翻译时,通常可以使用18个寄存器:s0s7被调用者保存,t0t9这些是呼叫者保存。

有了这18个寄存器,就会出现一个问题:在执行函数转换时,我应该选择哪个寄存器。

每一组都有其优点和缺点:

  1. Callee保存的寄存器必须分别保存到函数的开头和结尾并从堆栈中恢复。
  2. 调用者保存的寄存器必须分别在调用子例程之前和之后保存到堆栈中并从堆栈中恢复。
  3. 我很清楚,如果我采用静态策略来使用这些寄存器 - 无论策略是什么,比如更喜欢被调用者保存的寄存器更喜欢被调用者保存的寄存器 - 我将无法获得最佳性能,因为很可能没有必要注册加载/存储。

    那么,使用这两组寄存器有什么好的做法吗?

2 个答案:

答案 0 :(得分:2)

在非叶函数中首选callee保存的寄存器,更喜欢叶函数中调用者保存的寄存器。

在树叶和调用树的一个级别上,只有运气,您将无法进行任何保存。

答案 1 :(得分:2)

这是一个比chill更好的解决方案,它以更精细的粒度分配寄存器:

首先,我们对每个变量进行活跃度分析,并且:

  • 对于变量,其活动间隔跨越函数调用:我们更喜欢被调用者保存的寄存器而非调用者保存的寄存器。
  • 对于变量,其活跃时间间隔不跨越函数调用:更喜欢调用者保存的调用者,而不是被调用者保存的调用者。