有了上述对寄存器和地址的描述,可给出寄存器分配和代码生成的具体算法为: 设GETREG是一个函数过程,它的参数是一个形如i: A:=B op C的四元式,每次调用GETREG(i: A:=B op C)则返回一个寄存器R,用以存放A的结果值。对如何给出寄存器R,要用到四元式i上的待用信息,以使寄存器分配合理,对每个四元式的代码生成都要调用函数GETREG。GETREG分配寄存器的算法为: ① 如果B的现行值在某寄存器Ri中,且该寄存器只包含B的值,或者B与A是同一标识符,或B在该四元式后不会再被引用,则可选取Ri作为所需的寄存器R,并转(4)。 ② 如果有尚未分配的寄存器,则从中选用一个Ri为所需的寄存器R,并转(4)。 ③ 从已分配的寄存器中选取一个Ri作为所需寄存器R,其选择原则为:占用该寄存器的变量值同时在主存中,或在基本块中引用的位置最远,这样对寄存器Ri所含的变量和变量在主存中的情况必须先做如下调整:即对RVALUE[Ri]中的每一变量M,如果M不是A且AVALUE[M]不包含M,则需完成以下处理。 a) 生成目标代码ST Ri,M;即把不是A的变量值由Ri中送入内存中。 b) 如果M不是B,则令AVALUE[M]={M},否则,令AVALUE[M]={M, Ri}。 c) 删除RVALUE[Ri]中的M。 ④ 给出R,返回。 |