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 ,它是怎么计算指令的花费的。
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

caimouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值