Mercurial > hg > CbC > old > device
diff mc-inline.c @ 527:6b0fd56848e6 inline-asm
inline continue....
asm, lvar free
author | kono |
---|---|
date | Wed, 28 Dec 2005 21:21:57 +0900 |
parents | 9ff5cd7afe2f |
children | d6fff671793a |
line wrap: on
line diff
--- a/mc-inline.c Wed Dec 28 15:45:39 2005 +0900 +++ b/mc-inline.c Wed Dec 28 21:21:57 2005 +0900 @@ -14,6 +14,8 @@ static int ret_register,ret_reg_mode; +static int inline_lvars; + /* Basic code generator from parse tree */ @@ -421,9 +423,11 @@ { int sz = is_memory(e1); int d = cadr(e1); - int d1; + int d1,e; if ((d1=(heap[pdisp+d]))) return d1; - return (heap[pdisp+d]=list3(LVAR,new_lvar(sz),0)); + e = heap[pdisp+d]=list3(LVAR,new_lvar(sz),0); + inline_lvars = glist2(e,inline_lvars); + return e; } static int @@ -458,6 +462,15 @@ } static int +pindirect(int e) +{ + int lvar; + if (car(lvar=cadr(e))==IVAR) + lvar=p_lvar(cadr(e)); // can be anything.... + return list3(car(e),pexpr(cadr(e)),caddr(e)); +} + +static int paddress(int e) { return list2(car(e),pexpr(cadr(e))); @@ -466,7 +479,7 @@ static int p_conv(int e1,int e2) { - return list3(CONV,pexpr(e1),e2); + return list3(CONV,pexpr(e2),e1); } static int @@ -595,6 +608,7 @@ default: v = list3(LVAR,new_lvar(size(n->ty)),(int)n); } + inline_lvars = glist2(v,inline_lvars); if (heap[pdisp+dsp]) error(-1); heap[pdisp+dsp]=v; return pexpr(cadr(e)); @@ -807,7 +821,7 @@ case INLINE: return p_inline(e1); case INDIRECT: - return prindirect(e1); + return pindirect(e1); case RINDIRECT: case URINDIRECT: case CRINDIRECT: case CURINDIRECT: case SRINDIRECT: case SURINDIRECT: @@ -1016,6 +1030,7 @@ int sdisp = pdisp; int sret_register = ret_register; int sret_reg_mode = ret_reg_mode; + int sinline_lvars = inline_lvars; int narg,arg; NMTBL *n = (NMTBL*)cadr(cadr(e)); @@ -1036,6 +1051,7 @@ retpending = 0; ret_reg_mode = 0; ret_register = 5555; + inline_lvars = 0; retlabel = fwdlabel(); enter_scope(); // to make label scope happy @@ -1056,6 +1072,7 @@ heap[pdisp+narg]=e4; } else { arg = heap[pdisp+narg]=list3(LVAR,new_lvar(size(t)),0); + inline_lvars = glist2(arg,inline_lvars); // should contain correct argument variable name if (anptr) printf("## var %s\n",anptr->nm); @@ -1082,12 +1099,26 @@ if (retcont) error(STERR); // inline can't handle return/environment leave_scope(); + while(inline_lvars) { + int e; + int l = car(inline_lvars); + switch(car(l)) { + case LVAR: free_lvar(cadr(l)); break; + case REGISTER: case DREGISTER: + case FREGISTER: case LREGISTER: + free_register(cadr(l)); + } + e = cadr(inline_lvars); + free_glist2(inline_lvars); + inline_lvars = e; + } fnptr = sfnptr; retlabel = sretlabel; retcont = sretcont; cslabel = scslabel; ret_register = sret_register; ret_reg_mode = sret_reg_mode; + inline_lvars = sinline_lvars; return ret_type; }