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

像下面的语句:
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 ,它是怎么计算指令的花费的。
 
 

你可能感兴趣的:(struct,汇编,编译器)