【发布时间】:2012-11-20 12:57:50
【问题描述】:
我正在研究有关编译器中的寄存器分配的主题。一种广泛使用的寄存器分配算法是通过简化的迭代图着色。在 Andrew W. Appel 所著的 Modern Compiler Implementation in Java 一书中,关于寄存器分配状态的第 11 章:
干扰图中的每个节点代表一个临时值。
[...]
一些临时对象是预着色的 - 它们代表机器寄存器。例如,当跨模块边界与标准调用约定接口时,前端会生成这些。对于用于某些特定目的的每个实际寄存器,例如帧指针、标准参数 1 寄存器、标准参数 2 寄存器等,
Codegen或Frame模块应使用永久绑定到该寄存器的特定临时文件。 对于任何给定的颜色(即对于任何给定的机器寄存器)应该只有一个该颜色的预着色节点。
我不完全理解上面引用中的指示行。我可以想象有多个临时对象将使用相同的寄存器预着色的情况。例如,x86 mul 指令将结果存储在EDX:EAX 寄存器对中,但函数也会在EAX 寄存器中返回值。所以我有不同的临时工有相同的颜色。我会认为EAX的那些不同用途一定是不同的节点,还是我错了?
有人能解释一下突出显示的句子吗,可以举一些例子吗?
【问题讨论】:
标签: java assembly compiler-construction x86 register-allocation