编译器代码生成中如何实现操作代码无感知的寄存器溢出处理?
编译器实现中寄存器溢出的透明化处理问题
我正在用访问者模式实现编译器,当前采用的通用代码生成算法如下:
regs:表示节点所需的寄存器数量top:返回下一个空闲寄存器的函数
generate(T,n) = if T is a leaf write ``load top(), T" if T is an internal node with children l and r then if regs(r) = 0 then { generate(l); write ``op top(), r" } else{ generate(l,n)//Stored in Rn generate(r,n+1)//Stored in Rn+1 write "op Rn, Rn+1" // result is stored in Rn push(R) }
当寄存器不足时,需要执行寄存器溢出操作。我采用贪心分配器策略:溢出最后使用的寄存器。比如生成右子节点r时如果没有可用寄存器,需要先把Rn压入栈,将r的结果存入Rn,之后再恢复溢出的变量来执行运算,完整流程如下:
generate(l,n)//Stored in Rn push Rn // push to stack generate(r,n)//Stored in Rn mov Rn R0 // move pop Rn // retrieve from stack write ``op Rn, R0" // result is stored in Rn
我尝试修改top函数,让它在有可用寄存器时直接返回,无可用时先压入最后使用的寄存器再返回,但问题来了:生成完l和r后,运算逻辑怎么知道要不要执行恢复溢出的操作?
我的核心需求是:如何在编译器中以编程方式实现这个逻辑,让运算代码无需感知寄存器溢出的细节?理想的代码形式如下:
generate(l,something())//Stored in Rn generate(r,something()) write ``op somethingelse(), againsomethingelse()" <--- 自动适配寄存器充足/不足的情况
内容的提问来源于stack exchange,提问作者Jon Snow
相关产品推荐
相关产品推荐

