Mercurial > hg > CbC > old > device
changeset 524:135afeb2e134 first-inline-work
inline first work. no constant propagation.
author | kono |
---|---|
date | Wed, 28 Dec 2005 11:07:17 +0900 |
parents | 009289571b54 |
children | d84cea14dbdc |
files | Changes mc-codegen.c mc-inline.c test/too-long-argument.c |
diffstat | 4 files changed, 79 insertions(+), 19 deletions(-) [+] |
line wrap: on
line diff
--- a/Changes Tue Dec 27 17:57:24 2005 +0900 +++ b/Changes Wed Dec 28 11:07:17 2005 +0900 @@ -7491,6 +7491,21 @@ } みたいな感じ? + Wed Dec 28 00:31:30 JST 2005 + +違うね。 + + pexpr() { + e1=cadr(e); + switch(car(e)) { + case CASE: + ... parse=list(CASE,parse,hoge,hoge); break; + } + } + parse = reverse0(parse); + +みたいな感じか。 + Sat Dec 24 21:00:17 JST 2005 pfdecl で、inline を生成するんだけど、そこで引数のn->dspが arg_register @@ -7610,4 +7625,20 @@ みたいな? - +Tue Dec 27 18:17:55 JST 2005 + +inline をstaticとして扱うoptionがあった方がいいかもね。 + +あ、そうか。inline で new_lvar したら、あとでfreeしないと。 +ということは、keep track しないとまずいのね。 + +## 94: i += k; + la r3,lo16(-32)(r30) + lwz r3,lo16(0)(r3) + li r11,3 + +当然、const arg でないとconstantに置き換えてはいけないわけね。 +address を取られた場合も同様。ということは、has_address みたいな +attribute も必要なわけだ。 + +ま、それはあとで。
--- a/mc-codegen.c Tue Dec 27 17:57:24 2005 +0900 +++ b/mc-codegen.c Wed Dec 28 11:07:17 2005 +0900 @@ -2813,6 +2813,8 @@ if (!inmode) ndsp = fwdlabel(); // で、inmode の時は? + // 名前のまま、nptr で取っておいて、その場で解決する + // scope は関数ローカルになる break; case ADECL: // funcion arguments if(!integral(type0)&&type0>0&&(car(type0)==FUNCTION||car(type0)==CODE)) { @@ -3016,7 +3018,7 @@ ass = assign_expr0( (n->sc==REGISTER||n->sc==DREGISTER||n->sc==FREGISTER||n->sc==LREGISTER)? list3(n->sc,n->dsp,(int)n): - list3(LVAR,n->dsp+offset,0), + list3(n->sc,n->dsp+offset,(int)n), e,t,type); init_vars = list2(ass,init_vars); } else if(mode==SFDINIT) {
--- a/mc-inline.c Tue Dec 27 17:57:24 2005 +0900 +++ b/mc-inline.c Wed Dec 28 11:07:17 2005 +0900 @@ -306,6 +306,7 @@ g_expr(correct_type(e,cadr(fnptr->ty))); t = type_value(cadr(fnptr->ty)); if (ret_reg_mode==0) { + // return value register is not fixed ret_reg_mode=1; ret_register = code_get_fixed_creg(USE_CREG,t); } else { @@ -578,7 +579,7 @@ v = get_dregister_var(n,1); break; default: if (scalar(n->ty)) - v = get_dregister_var(n,1); + v = get_register_var(n); else error(TYERR); } @@ -611,37 +612,43 @@ static int p_do(int e) { - return list4(ST_DO,pexpr(cadr(e)),pexpr(caddr(e)),pexpr(cadddr(e))); + int e2 = pexpr(caddr(e)); + int e3 = pexpr(cadddr(e)); + return list4(ST_DO,pexpr(cadr(e)),e2,e3); } static int p_while(int e) { - return list4(ST_WHILE,pexpr(cadr(e)),pexpr(caddr(e)),pexpr(cadddr(e))); + int e2 = pexpr(caddr(e)); + int e3 = pexpr(cadddr(e)); + return list4(ST_WHILE,pexpr(cadr(e)),e2,e3); } static int p_for(int e) { int e1=caddr(e); - int p0=car(e1); - int p1=cadr(e1); - int p2=caddr(e1); - int p3=cadddr(e1); - return list3(ST_FOR,pexpr(cadr(e)), - list4(pexpr(p0),pexpr(p1),pexpr(p2),pexpr(p3))); + int p0=pexpr(car(e1)); + int p1=pexpr(cadr(e1)); + int p2=pexpr(caddr(e1)); + int p3=pexpr(cadddr(e1)); + return list3(ST_FOR,pexpr(cadr(e)), list4(p0,p1,p2,p3)); } static int p_switch(int e) { - return list4(ST_SWITCH,pexpr(cadr(e)),pexpr(caddr(e)),pexpr(cadddr(e))); + int e2 = pexpr(caddr(e)); + int e3 = pexpr(cadddr(e)); + return list4(ST_SWITCH,pexpr(cadr(e)),e2,e3); } static int p_comp(int e) { - return list3(ST_COMP,pexpr(cadr(e)),pexpr(caddr(e))); + int e1=pexpr(caddr(e)); + return list3(ST_COMP,pexpr(cadr(e)),e1); } static int @@ -675,7 +682,8 @@ static int p_return(int e) { - return list3(ST_RETURN,pexpr(cadr(e)),pexpr(caddr(e))); + int e1=pexpr(caddr(e)); + return list3(ST_RETURN,pexpr(cadr(e)),e1); } static int @@ -1024,7 +1032,7 @@ // for (e3 = e1 = caddr(e); e3; e3 = cadr(e3)) { t=caddr(e3); // type e4 = car(e3); - if (is_const(e4) /* ||(is_memory(e3)&&is_readonly(e3)) */ ) { + if (0 && is_const(e4) /* ||(is_memory(e3)&&is_readonly(e3)) */ ) { heap[pdisp+narg]=e4; } else { arg = heap[pdisp+narg]=list3(LVAR,new_lvar(size(t)),0); @@ -1042,6 +1050,7 @@ g_expr0(e2); else g_expr_u(e2); + checkret(); fwddef(retlabel); control=1;
--- a/test/too-long-argument.c Tue Dec 27 17:57:24 2005 +0900 +++ b/test/too-long-argument.c Wed Dec 28 11:07:17 2005 +0900 @@ -1,5 +1,7 @@ #include <stdio.h> +#undef WRONGNUMBER + typedef code (*CCC)( int f1,int f2,int f3,int f4,int f5,int f6,int f7,int f8,int f9,int fa,int fb,int fc,int fd,int fe,int ff, code(*ret)(int), @@ -29,31 +31,45 @@ code tcode4(int x,int y,CCC junction,code(*ret)(int),void *env) { - - // goto junction(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,ret,env); +#ifdef WRONGNUMBER goto junction(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,ret,env); +#else + goto junction(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,ret,env); +#endif } code tcode0(int x,int y,code(*junction)(int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,code(*)(int),void *),code(*ret)(int),void *env) { - - // goto junction(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,ret,env); +#ifdef WRONGNUMBER goto junction(0,1,2,3,4,5,6,7,8,9,10,11,12,13,ret,env); +#else + goto junction(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,ret,env); +#endif } int main0() { +#ifdef WRONGNUMBER + goto tcode2(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, + return,environment); +#else goto tcode2(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14, return,environment); +#endif } int main1() { +#ifdef WRONGNUMBER + goto tcode1(0,1,2,3,4,5,6,7,8,9,10,11,12,13, + return,environment); +#else goto tcode1(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14, return,environment); +#endif } int @@ -76,3 +92,5 @@ main0(); main1(); } + +//