【问题标题】:Registers in MIPS compilers — which to use?MIPS 编译器中的寄存器——使用哪个?
【发布时间】:2012-01-09 17:21:25
【问题描述】:

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

从高级语言翻译时通常有 18 个寄存器可用:s0s7 是被调用者保存的,t0t9 是调用者保存的。

有了这 18 个寄存器可用,一个问题出现了:在执行函数翻译时我应该更喜欢哪个寄存器。

各有优缺点:

  1. 被调用者保存的寄存器必须分别在函数的开始和结束时保存到堆栈中和从堆栈中恢复。
  2. 调用者保存的寄存器必须在调用子例程之前和之后分别保存到堆栈中和从堆栈中恢复。

我很清楚,如果我在使用这些寄存器时采用静态策略——无论策略是什么,比如更喜欢被调用者保存的寄存器而不是调用者保存的寄存器——我将不会获得最佳性能,因为很可能会有不必要的注册加载/存储。

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

【问题讨论】:

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


    【解决方案1】:

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

    在叶子和调用树的上一层,只有 一点 运气,你不会有任何保存。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-21
        相关资源
        最近更新 更多