Compiler construction MIPS编译器中的寄存器&x2014;用哪一个?

Compiler construction MIPS编译器中的寄存器&x2014;用哪一个?,compiler-construction,mips,cpu-registers,calling-convention,Compiler Construction,Mips,Cpu Registers,Calling Convention,我目前正在写作业,目标是MIPS架构 从高级语言翻译时,通常有18个寄存器可用:s0到s7,它们被调用者保存,而t0到t9则被调用者保存 有了这18个寄存器,出现了一个问题:在执行函数的翻译时,我应该选择哪个寄存器 每一套都有其优缺点: 被调用方保存的寄存器必须分别在函数开始和结束时保存到堆栈中,并从堆栈中恢复 调用子例程之前和之后,调用方保存的寄存器必须分别保存到堆栈和从堆栈还原 我很清楚,如果我在使用这些寄存器时采用静态策略——不管策略是什么,比如优先选择被叫方保存的寄存器而不是被叫方保存的

我目前正在写作业,目标是MIPS架构

从高级语言翻译时,通常有18个寄存器可用:
s0
s7
,它们被调用者保存,而
t0
t9
则被调用者保存

有了这18个寄存器,出现了一个问题:在执行函数的翻译时,我应该选择哪个寄存器

每一套都有其优缺点:

  • 被调用方保存的寄存器必须分别在函数开始和结束时保存到堆栈中,并从堆栈中恢复
  • 调用子例程之前和之后,调用方保存的寄存器必须分别保存到堆栈和从堆栈还原
  • 我很清楚,如果我在使用这些寄存器时采用静态策略——不管策略是什么,比如优先选择被叫方保存的寄存器而不是被叫方保存的寄存器——我将不会获得最佳性能,因为很可能会有不必要的寄存器加载/存储


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

    在非叶函数中首选被调用者保存的寄存器,在叶函数中首选调用者保存的寄存器


    在叶子和调用树上的一级,只要运气好一点,您就不会有任何保存。

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

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

    • 对于活跃度间隔跨越函数调用的变量:我们更喜欢被调用方保存的寄存器,而不是调用方保存的寄存器
    • 对于活动间隔不跨函数调用的变量:首选调用方保存的变量,而不是被调用方保存的变量