|
|
|
|
@ -63,7 +63,7 @@ Lab4 的目标是在 Lab3 示例基础上,把“固定寄存器 + 栈槽”的
|
|
|
|
|
3. 每处理到一个新区间时,先移除已经结束的区间并释放其占用的物理寄存器。
|
|
|
|
|
4. 若存在空闲物理寄存器,则直接分配;若没有空闲寄存器,则比较当前区间与 `active` 中已有区间的结束位置,选择 spill 当前区间或 spill 一个结束更晚的旧区间。
|
|
|
|
|
5. 对 spill 的虚拟寄存器插入 reload/store 后,需要重新计算受影响区间,再继续后续分配与汇编落地。
|
|
|
|
|
- 说明:线性扫描通常更容易先做出一个可运行版本,在函数数量较多、实现周期较紧的课程环境中也较常见;但如果要把效果做得更好,仍然需要认真处理区间切分、调用点约束、callee/caller-saved 寄存器使用策略等问题。
|
|
|
|
|
- 说明:线性扫描通常更容易先做出一个可运行版本,作为寄存器分配的起点也比较常见;但如果要把效果做得更好,仍然需要认真处理区间切分、调用点约束、callee/caller-saved 寄存器使用策略等问题。
|
|
|
|
|
|
|
|
|
|
无论采用图着色还是线性扫描,都不应把寄存器分配理解为“把虚拟寄存器简单替换成物理寄存器名字”。真正完整的实现还需要和 spill/reload、栈帧布局、callee-saved 保存恢复以及最终汇编输出联动,否则后端仍然无法支撑完整 SysY 程序。
|
|
|
|
|
|
|
|
|
|
|