Chinaunix首页 | 论坛 | 博客
  • 博客访问: 263567
  • 博文数量: 52
  • 博客积分: 1379
  • 博客等级: 大尉
  • 技术积分: 525
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-18 17:34
文章分类

全部博文(52)

文章存档

2011年(48)

2010年(4)

分类: C/C++

2011-03-01 23:00:24

查找是否有某种类型的寄存器是空闲的

  1. /* find a free register of class 'rc'. If none, save one register */
  2. ST_FUNC int get_reg(int rc)
  3. {//
  4.     int r;
  5.     SValue *p;

  6.     /* find a free register */
  7.     for(r=0;r<NB_REGS;r++) {
  8.         if (reg_classes[r] & rc) {
  9.             for(p=vstack;p<=vtop;p++) {
  10.                 该寄存器被使用中
  11.                 if ((p->r & VT_VALMASK) == r ||
  12.                     (p->r2 & VT_VALMASK) == r)
  13.                     goto notfound;
  14.             }
  15.             return r;
  16.         }
  17.     notfound: ;
  18.     }
  19.     
  20.     /* no register left : free the first one on the stack (VERY
  21.        IMPORTANT to start from the bottom to ensure that we don't
  22.        spill registers used in gen_opi()) */
  23.     别替换正需要的一个寄存器,释放一个我们不可能在当前指令需要的寄存器
  24.     for(p=vstack;p<=vtop;p++) {
  25.         r = p->r & VT_VALMASK;
  26.         if (r < VT_CONST && (reg_classes[r] & rc))
  27.             goto save_found;
  28.         /* also look at second register (if long long) */
  29.         r = p->r2 & VT_VALMASK;
  30.         if (r < VT_CONST && (reg_classes[r] & rc)) {
  31.         save_found:
  32.             符合要求,把该寄存器值保存在栈上,再计算再次需要时恢复(这时r寄存器肯定又可用了)
  33.             save_reg(r);
  34.             return r;
  35.         }
  36.     }
  37.     /* Should never comes here */
  38.     return -1;
  39. }



阅读(1700) | 评论(0) | 转发(0) |
0

上一篇:store

下一篇:tcc_load_dll

给主人留下些什么吧!~~