LCC编译器的源程序分析(53)指令的选择

来源:互联网 发布:淘宝关闭订单运费险 编辑:程序博客网 时间:2024/04/30 22:33
像下面的语句:
int nTest1 = 1;
选择什么样的汇编指令生成的呢?又是怎么样去选择指令的呢?在本例子里,LCC是选择下面的指令生成的:
#010 mov dword [ebp + -12], 1
 
现在就来分析选择指令过程的代码,先分析函数gen的代码:
#001 Node gen(Node forest) {
#002  int i;
#003  struct node sentinel;
#004  Node dummy, p;
#005 
#006  head = forest;
#007  for (p = forest; p; p = p->link) {
#008         assert(p->count == 0);
#009         if (generic(p->op) == CALL)
#010               docall(p);
#011         else if (   generic(p->op) == ASGN
#012         && generic(p->kids[1]->op) == CALL)
#013               docall(p->kids[1]);
#014         else if (generic(p->op) == ARG)
#015               (*IR->x.doarg)(p);
#016         rewrite(p);
#017         p->x.listed = 1;
#018  }
 
7行开始遍历整个代码森林。
16行里调用函数rewrite来分析选择什么指令最合适。它的代码如下:
#001 static void rewrite(Node p) {
#002  assert(p->x.inst == 0);
#003  prelabel(p);
#004  debug(dumptree(p));
#005  debug(fprint(stderr, "/n"));
#006  (*IR->x._label)(p);
#007  debug(dumpcover(p, 1, 0));
#008  reduce(p, 1);
#009 }
3行是生成前面的标号。
6行调用后端代码生成接口函数_label来计算指令选择。
下次再分析函数_label,它是怎么计算指令的花费的。
 
 
原创粉丝点击