我目前正在编写a toy compiler作为家庭作业,针对MIPS架构。
从高级语言翻译时,通常可以使用18个寄存器:s0
到s7
被调用者保存,t0
到t9
这些是呼叫者保存。
有了这18个寄存器,就会出现一个问题:在执行函数转换时,我应该选择哪个寄存器。
每一组都有其优点和缺点:
我很清楚,如果我采用静态策略来使用这些寄存器 - 无论策略是什么,比如更喜欢被调用者保存的寄存器更喜欢被调用者保存的寄存器 - 我将无法获得最佳性能,因为很可能没有必要注册加载/存储。
那么,使用这两组寄存器有什么好的做法吗?
答案 0 :(得分:2)
在非叶函数中首选callee保存的寄存器,更喜欢叶函数中调用者保存的寄存器。
在树叶和调用树的一个级别上,只有小运气,您将无法进行任何保存。
答案 1 :(得分:2)
这是一个比chill更好的解决方案,它以更精细的粒度分配寄存器:
首先,我们对每个变量进行活跃度分析,并且: