- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
幻灯片1-BCMIHomepage
OPER 方法中包含汇编语言指令assem,一个操作数寄存器列表src 和一系列的结果寄存器dst,这些寄存器列表都可以是空的.方法OPER(assem, dst, src) 将构造跳转至下一条指令的操作,并且jumps()方法的返回值为null;OPER(assem, dst, src, jump) 还拥有目标标记列表并通过查找这个列表进行跳转 ? LABEL表示程序将要跳转的地点.其中包括一个assem,指明在汇编语言中如何找到标号,有一个label参数,用于确定使用那个标号符号 MOVE与OPER 很接近,但MOVE 必须进行数据转换.如果dst和src被分配给了同一个寄存器,MOVE指令将被删除Instr.Format(m) 将汇编指令转化成为字符串形式:m 是一个实现TempMap 接口的对象,在TempMap 接口中,存在一个方法可以为每个临时变量分配一个寄存器或者为不同的变量分配相同的寄存器 (给出名字) .请参阅 Temp.TempMap * 寄存器在OPER中的表示方式为:如果是系统寄存器则直接使用其名称.例如$a0.否则采用如下表示方法:`sn 或 `dn 或 `jn.其中n为一个数字.前面的字符s, d, j和OPER类中的src (源), dst (目的), jump (跳转) 相对应,后面的数字表示该寄存器列表中的第几个寄存器.表达的方法可以多样.例如下面的代码: emit(new OPER(oper + `d0, `s0, `s1, L(ret, null), L(t1, new TempList(t2, null)))); 也可以写成: emit(new OPER(oper + `d0, `d1, `d2, L(ret, L(t1, new TempList(t2, null))),null)); 这里d, s, j仅仅有概念上的意义.而在Assem.Instr中,函数Format负责对这种表示方法进行解析, 转换成真正意义上的寄存器名称(通过Temp.TempMap) * * * 第一步是根据汇编指令 (InstrList) 生成流图。包FlowGraph中封装了流图结构FlowGraph (抽象的) 和AssemFlowGraph (面向汇编指令的)。在AssemFlowGraph 中,每个结点代表一个汇编指令,边为可能的控制转移.并具体生成流图。 ? 第二步是进行活性分析。所谓活性分析,就是求出每个结点的out。首先,对每个结点的use和def初始化,这在flowgraph中已经提供,并且置in和out为空,然后不断迭代,直到in 和out不变为止。以上两步在RegAlloc.Liveness. calculateLiveness中实现。 ? 第三步是生成干扰图。考察控制和数据流图,可以画出一张干扰图。干扰图中的每个结点代表临时变量的值,每条边(t1, t2)代表了一对不能分配到同一个寄存器中的临时变量。它的抽象接口在RegAlloc.InterferenceGraph中实现生成干扰图的算法如下: 在任何定义变量a 且没有转移的指令中,其中非活跃变量包括b1,b2…bj, 添加干扰边(a,b1), …, (a,bj) 在转移指令a?c 中,其中非活跃变量为b1, …, bj,为每一个与c 不同的bi 添加干扰边(a, b1), … (a, bj) (move指令要特殊考虑) ? 第四步是根据干扰图分配寄存器。这其实是根据干扰图进行的一个着色 (coloring) 过程-使干扰图中相邻的两个结点着不同的颜色。它是NPC 问题,这里采用近似的贪心算法如下: 扫描干扰图中的每个结点,把已经分配好寄存器的变量推入堆栈,并删除从这些结点出发的边。(注意这时应把原来无向的干扰图看成有向的,即a?b 和b?a 不是同一条边。) 再扫描剩下结点 (设为n个),它们都是还没有被分配寄存器的 (不在堆栈中)。每次扫描找出一个出度最大且小于寄存器数目的结点。并删除那些不在堆栈中的结点指向这个结点的边. 然后把这个结点推入堆栈. 重复上述过程, 直到堆栈中装满了结点. 如果某次扫描找不到这样的结点, 说明寄存器溢出 (spill), 报错. (这里不进行额外处理了) 接下来为那n 个还没有分配寄存器的结点分配寄存器 (它们处在栈顶). 对弹出堆栈的某个结点node, 先设集合available为所有可供分配的寄存器, 然后对于在当前干扰图中每个条从node 出发到某个结点node1 的边, 从available 中删除node1 所代表的寄存器. 最后,再取剩下寄存器中的一个为node 分配. * * Li, Mu(@) Li, Mu(@) limu (@) limu (@) limu (@) l
文档评论(0)