- 1、本文档共47页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理实践及应用PPT教学课件-第8章 代码生成
代码生成;本章要求;;代码生成器的作用;8.2 代码生成器设计中的问题;代码生成器的输入;代码生成器的输出:目标程序;存储管理;一个代码生成器的输入;指令地址的决定;指令选择;指令选择的例子;寄存器分配;寄存器分配(续);计算次序选择;代码生成的途径;8.3 目标机器; 机器指令形式(op destination, source)
ADD Rd,Rs // d+s
SUB Rd,Rs //d-s
MOV Rd,Rs //s ? d
机器指令开销 (cost),不同的操作开销不同
MOV R,M 开销 2
ADD #1 ,R 开销 2
MOV R0,R1 开销 1;目标机器的地址方式
;指令代价; 例:a:=b+c 的实现方式:
1. MOV R0 , b
ADD R0 , c
MOV a , R0 代价=6
2. MOV a , b
ADD a, c 代价=6
假定R0, R1和R2中分别存放a, b和c的地址, 采用:
3. MOV *R0, *R1
ADD *R0, *R2 代价=2
假定R1和R2中分别包含b和c的值, 并且b的值在这个赋值以后不再需要, 则还可有
4. ADD R1, R2
MOV a, R1 代价=3;8.4 代码生成器的产生方法;代码生成器的产生方法(续);下次引用信息(1);下次引用信息(2);下次引用信息(3);下次引用信息(4);下次引用信息(5);简单的代码生成器(1);简单的代码生成器(2);寄存器描述和地址描述;简单的代码生成算法;基本块结束的处理
在基本块的出口,用MOV指令把在寄存器中的活跃变量的值保存
值在寄存器中
这个值在出口活跃;;函数getreg:返回保存语句x := y op z的x值的场所L
简单的实现方法:基于下次引用信息
1. 如果名字y在寄存器中,此寄存器不含其它名字的值,并且y不活跃,且在执行x := y op z后没有下次引用,则返回y的这个寄存器作为L
2. 1失败时,如果有的话,返回一个空闲寄存器
3. 2不成功时,如果x在块中有下次引用,或op是必须使用寄存器的算符(如变址),则找一个已被占用的寄存器R
将R中的值根据存有的变量(可能不止一个)保存到内存单元中,并修改相关的地址描述
R的选择要考虑spill的代价
4. 如果x在本块中不再引用,或者找不到适当的被占用寄存器,则选择x的内存单元作为L;例:赋值语句d := ( a – b ) + ( a – c ) + ( a – c )
可以翻译成下面的三地址代码序列 :
t := a – b ; u := a – c ; v := t + u ; d := v + u
d在出口活跃,产生的代码序列:;上述代码的代价为12
可以在第一个指令后增加MOV R0 , R1,从而将代价减少为11(删去了MOV a , R1);条件语句的代码生成;条件码的描述的记录;练习:将下属赋值语句生成目标代码:;改变计算次序可以优化指令条数:;从DAG生成目标代码;例:赋值语句:X:=(A+B)-(E-(C+D))
的中间代码为:
T1:= A+B
T2:=C+D
T3:=E-T2
X:=T1-T3;重排序后的代码;8.5 目标代码生成器的设计;;
文档评论(0)