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,它是怎么计算指令的花费的。

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License