【发布时间】:2012-01-09 17:21:25
【问题描述】:
我目前正在写 a toy compiler 作为家庭作业,针对 MIPS 架构。
从高级语言翻译时通常有 18 个寄存器可用:s0 到 s7 是被调用者保存的,t0 到 t9 是调用者保存的。
有了这 18 个寄存器可用,一个问题出现了:在执行函数翻译时我应该更喜欢哪个寄存器。
各有优缺点:
- 被调用者保存的寄存器必须分别在函数的开始和结束时保存到堆栈中和从堆栈中恢复。
- 调用者保存的寄存器必须在调用子例程之前和之后分别保存到堆栈中和从堆栈中恢复。
我很清楚,如果我在使用这些寄存器时采用静态策略——无论策略是什么,比如更喜欢被调用者保存的寄存器而不是调用者保存的寄存器——我将不会获得最佳性能,因为很可能会有不必要的注册加载/存储。
那么,使用这两组寄存器有什么好的做法吗?
【问题讨论】:
标签: compiler-construction mips cpu-registers calling-convention