页数:33页文件大小:178.7 KB来源: 编译原理ppt课件
本课件讲解代码生成,说明代码生成器的输入、输出与目标代码的三种形式,给出基本块内的简单代码生成算法与寄存器分配原则,介绍待用信息、活跃信息的计算与待用信息链,并给出从 DAG 生成目标代码的方法与窥孔优化。
第十一章代码生成
第十一章代码生成(续)
目标代码一般有以下三种形式
如何使生成的目标代码较短
11.1基本问题
11.1基本问题(续)
11.1基本问题
11.2目标机器模型
如果op是一目运行符
如果op是一目运行符(续)
如果op是一目运行符
不考虑代码的执行效率,目标代码生成是不难的,例如:A:=(B+C)*D+E翻译为四元式:T1:=B+CT2:=T1*DT3:=T2+EA:=T311.3一个简单代码生成器
如果op是一目运行符(续)
假设只有一个寄存器可供使用•目标代码:LDR0,BADDR0,CSTR0,T1•假设T1,T2,T3在基本块之后不再引用:LDR0,BADDR0,CMULR0,DADDR0,ESTR0,A•四元式T1:=B+CT3:=T2+ET2:=T1*DA:=T3LDR0,T1MULR0,DSTR0,T2LDR0,T2ADDR0,ESTR0,T3LDR0,T3STR0,A
11.3一个简单代码生成器
11.3.1待用信息
11.3.1待用信息(续)
待用信息和活跃信息的表示:1(x,x)表示变量的待用信息和活跃信息。其中i表示待用信息,y表示活跃,^表示非待用和非活跃;2在符号表中,(x,x)→(x,x)表示后面的符号对代替前面的符号对;3不特别说明,所有说明变量在基本块出口之后均为非活跃变量。
11.3.1待用信息
计算待用信息和活跃信息的算法步骤:1.开始时,把基本块中各变量的符号表登记项中的待用信息栏填为“非待用”,并根据该变量在基本块出口之后是不是活跃的,把其中的活跃信息栏填为“活跃”或“非活跃”;
11.3.1待用信息(续)
基本块1.T
基本块1.T
附加在四元式上的待用/活跃信息表:(4)W:=V+U(3)V:=T+U(2)U:=A-C(1)T:=A-B(^,y)(^,^)(^,^)(4,y)(^,^)(4,y)(3,y)(^,^)(^,^)(3,y)(2,y)(^,^)序号四元式左值左操作数右操作数变量名初始状态→信息链(待用/活跃信息栏)→ (3,y)→ (^,^)→ (2,y)→ (1,y)→ (1,y)→ (2,y)→ (4,y)→ (^,^)→ (3,y)T(^,^)A(^,^)B(^,^)C(^,^)U(^,^)V(^,^)W(^,y)→ (^,^)→ (4,y)→ (^,^)
变量地址描述数组AVALUE
变量地址描述数组AVALUE(续)
变量地址描述数组AVALUE
代码生成算法:对每个四元式:i:A:=BopC,依次执行:1.以四元式:i:A:=BopC为参数,调用函数过程GETREG(i:A:=BopC),返回一个寄存器R,用作存放A的寄存器。2.利用AVALUE[B]和AVALUE[C],确定B和C现行值的存放位置B’和C’。如果其现行值在寄存器中,则把寄存器取作B’和C’
3.如果B’≠R
则生成目标代码:LD R, B’op R, C’否则生成目标代码op R, C’如果B’或C’为R,则删除AVALUE[B]或AVALUE[C]中的R。4.令AVALUE[A]={R}, RVALUE[R]={A}。
3.如果B’≠R(续)
3.如果B’≠R
寄存器分配:GETREG(i:A:=BopC)返回一个用来存放A的值的寄存器1如果B的现行值在某个寄存器Ri中,RVALUE[Ri]中只包含B,此外,或者B与A是同一个标识符,或者B的现行值在执行四元式A:=BopC之后不会再引用,则选取Ri为所需要的寄存器R,并转4;2如果有尚未分配的寄存器,则从中选取一个Ri为所需要的寄存器R,并转4;1尽可能用B独占的寄存器2后尽可能用空闲寄存器3抢占用非空闲寄存器
3.如果B’≠R(续)
3.如果B’≠R
对RVALUE[Ri]中每一变量M,如果M不是A,或者如果M是A又是C,但不是B并且B也不在RVALUE[Ri]中,则(1)如果AVALUE[M]不包含M,则生成目标代码STRi,M(2)如果M是B,或者M是C但同时B也在RVALUE[Ri]中,则令AVALUE[M]={M,Ri},否则令AVALUE[M]={M}(3)删除RVALUE[Ri]中的M4给出R,返回。
基本块1.T
中间代码目标代码RVALUE
中间代码目标代码RVALUE(续)
下载地址:{{downurl}}
{{{a}}}
{{#b}}{{{b}}}
{{/b}} {{/title}} {{#nolog}}登陆注册
{{/nolog}} {{#djsx}}点我刷新
{{/djsx}} {{#gocz}} {{/gocz}} {{#ffqr}} {{/ffqr}}