我正在研究编译器中寄存器分配的主题。广泛使用的寄存器分配算法是通过简化的迭代图着色。在Andrew W. Appel的书中 Modern Compiler Implementation in Java ,关于注册分配状态的第11章:
干扰图中的每个节点都代表一个临时值。
[...]
某些临时预着色 - 它们代表机器寄存器。例如,当跨越模块边界与标准调用约定接口时,前端生成这些。对于用于某些特定目的的每个实际寄存器,例如帧指针,标准参数-1寄存器,标准参数2寄存器等,
Codegen
或Frame
模块应该使用永久绑定到该寄存器的特定临时文件。 对于任何给定的颜色(即,对于任何给定的机器寄存器),应该只有一个该颜色的预着色节点。
我不完全理解上面引用中的指示行。我可以想象有多个临时工具会被同一个寄存器预先着色的情况。例如,x86 mul
指令将结果存储在EDX:EAX
寄存器对中,但函数也返回EAX
寄存器中的值。所以我有不同的临时颜色。我认为EAX
的那些不同用途必须是不同的节点,或者我错了吗?
有人可以解释突出显示的句子,可能会有一些例子吗?
答案 0 :(得分:0)
在本书中,您的想法是,您将拥有一个临时EAX,您可以将mul
和返回值一起使用。当某个值需要在给定的寄存器中时,您将生成从包含该值的临时值移动到表示该寄存器的临时值;类似地,一旦某个值到达特定寄存器(例如,函数已返回),您将生成从寄存器临时的移动到临时的移动,该临时将保持该值。见书中的图11.7。