代码生成-南京大学计算机科学与技术系ppt课件.ppt

代码生成-南京大学计算机科学与技术系ppt课件.ppt

ID:58845681

大小:716.50 KB

页数:65页

时间:2020-09-30

代码生成-南京大学计算机科学与技术系ppt课件.ppt_第1页
代码生成-南京大学计算机科学与技术系ppt课件.ppt_第2页
代码生成-南京大学计算机科学与技术系ppt课件.ppt_第3页
代码生成-南京大学计算机科学与技术系ppt课件.ppt_第4页
代码生成-南京大学计算机科学与技术系ppt课件.ppt_第5页
资源描述:

《代码生成-南京大学计算机科学与技术系ppt课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、第八章代码生成南京大学计算机系赵建华代码生成器的位置根据中间表示生成代码代码生成器之前可能有一个优化组件代码生成器的三个任务指令选择:选择适当的指令实现IR语句寄存器分配和指派:把哪个值放在哪个寄存器中指令排序:按照什么顺序安排指令执行主要内容要解决的问题机器模型静态/栈式数据区分配基本块相关的代码生成简单的代码生成算法窥孔优化要解决的问题正确性:正确的机器指令易于实现、测试和维护输入IR的选择四元式、三元式、字节代码、堆栈机代码、后缀表示、抽象语法树、DAG图、…输出RISC、CISC;可重定向代码、汇编语言目标机模型使用三地址机器的模型指令加

2、载:LDdst,addr;把地址addr中的内容加载到dst所指寄存器。addr:内存地址/寄存器保存:STx,r;把寄存器r中的内容保存到x中。计算:OPdst,src1,src2;把src1和scr2中的值运算后将结果存放到dst中。无条件跳转:BRL;控制流转向标号L的指令条件跳转:Bcondr,L;对r中的值进行测试,如果为真则转向L。寻址模式变量x:指向分配x的内存位置a(r):地址是a的左值加上r中的值constant(r):寄存器中内容加上前面的常数即其地址;*r:寄存器r的内容为其地址*constant(r):r中内容加上常量所指

3、地址中存放的值为其地址常量#constant例子x=y-zLDR1,y//R1=yLDR2,z//R2=xSUBR1,R1,R2//R1=R1-R2STx,R1//x=R1b=a[i]LRR1,I//R1=iMULR1,R1,8//R1=R1*8LDR2,a(R1)//R2=contents(a+contents(R1))STb,R2//b=R2程序及指令的代价不同的目的有不同的度量最短编译时间、目标程序大小、运行时间、能耗不可判定一个目标程序是否最优我们假设:每个指令有固定的代价,设定为1加上运算分量寻址模式的代价LDR0,R1;代价为1LDR

4、0,M;代价是2LDR1,*100(R2);代价为2目标代码中的地址如何将IR中的名字转换成为目标代码中的地址不同的区域中的名字采用不同的寻址方式。如何为过程调用和返回生成代码静态分配栈式分配活动记录的静态分配每个过程静态地分配一个数据区域,开始位置用staticArea表示callcallee的实现STcallee.staticArea,#here+20//存放返回地址BRcallee.codeAreaCallee中的语句returnBR*callee.staticArea例子三地址代码action1callpaction2halt//p的代码

5、action3return活动记录栈式分配寄存器SP指向栈顶第一个过程(main)初始化栈区过程调用指令序列ADDSP,SP,#caller.recordSize//增加栈指针ST0(SP),#here+16//保存返回地址BRcallee.codeArea//转移到被调用者返回指令序列BR*0(SP)//被调用者执行,返回调用者SUPSP,SP,#caller.recordSize//调用者减低栈指针例子名字的运行时刻地址在三地址语句中使用名字(实际上是指向符号表条目)来引用变量语句x=0如果x分配在静态区域,且静态区开始位置为static。s

6、tatic[12]=0ST112#0如果x分配在栈区,且相对地址为12,则ST12(SP)#0基本块和流图中间代码的流图表示法中间代码划分成为基本块(basicblock)。控制流只能从第一个指令进入除基本块的最后一个指令外,控制流不会跳转/停机流图的结点是基本块。流图的边指明了哪些基本块可以跟在一个基本块之后运行流图可以作为优化的基础它指出了基本块之间的控制流可以根据流图了解到一个值是否会被使用等信息划分基本块的算法输入:三地址指令序列输出:基本块的列表方法:确定leader指令(基本块的第一个指令)第一个三地址指令任意一个条件或无条件转移指令

7、的目标指令紧跟在一个条件/无条件转移指令之后的指令确定基本块每个首指令对应于一个基本块:从首指令开始到下一个首指令基本块划分的例子第一个指令1跳转指令的目标3、2、13跳转指令的下一条指令10、12基本块:1-1;2-2;3-9;10-11;12-12;13-17后续使用信息变量值的使用三地址语句i向x赋值、如果j的运算分量为x,且从i开始有一条路径到达j,且路径上没有对x赋值,那么j就使用了i处计算得到的x的值。我们说x在语句i后的程序点上活跃即在程序执行完语句i的时刻,x中存放的值将被后面的语句使用不活跃是指变量中存放的值不会被使用,而不是变

8、量不会被使用;这些信息可以用于代码生成如果x在i处不活跃,且x占用了一个寄存器,我们可以把这个寄存器用于其它目的。确定基本块中的活跃性、

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。