我目前正在写作a toy compiler作为家庭作业,针对MIPS架构。MIPS编译器中的寄存器 - 使用哪个?
有18个寄存器从高级语言翻译时,其通常可用:s0
到s7
其是被调用方保存,和t0
到t9
其是呼叫者 - 保存。由于这18个寄存器可用,出现了一个问题:在执行函数翻译时,我应该选择哪个寄存器。
每一组都有其优点和缺点:
- 被叫方保存的寄存器必须保存到分别从堆的开头和一个函数的结束,恢复。
- 调用者保存的寄存器必须分别在调用子例程之前和之后保存到堆栈并从堆栈中恢复。
很清楚,我认为,如果我通过关于使用这些寄存器静态策略 - 无论策略是,就像在调用者保存的那些宁愿被调用函数保存寄存器 - 我不会因为最有可能出现的最佳性能将会是不必要的寄存器加载/存储。
那么,有没有使用这两套寄存器的良好做法?