Mercurial > hg > CbC > old > device
changeset 533:80b5058f0535 inline-code-gen-passed
inline code-gen test passed.
author | kono |
---|---|
date | Fri, 30 Dec 2005 18:33:55 +0900 |
parents | cecf5103679e |
children | 0f24e1dba811 |
files | Changes mc-codegen.c mc-inline.c mc-parse.c test/code-gen.c |
diffstat | 5 files changed, 203 insertions(+), 33 deletions(-) [+] |
line wrap: on
line diff
--- a/Changes Fri Dec 30 13:36:17 2005 +0900 +++ b/Changes Fri Dec 30 18:33:55 2005 +0900 @@ -7526,4 +7526,169 @@ あぁ、確かに goto のラベルは、inline の中ではlocal なscope にしないといけないのであった。で、どうすれば良いわけ? -うまく直せない。scope 関係を見直せば良 \ No newline at end of file +うまく直せない。scope 関係を見直せば良いんだけど.... enter_top_scope とか。 +マルチレベルscopeになるわけね。 + +ではなくて、parse してしまえば、single level scpe になるので、 +enter_scope して、st_label では、make_local_scope すれば良いらしい。 + +## 65: } while ( k < j); + la r11,lo16(-20)(r30) + la r10,lo16(-24)(r30) + cmpw cr2,r10,r11 + +なので、rvalue が取れてないみたいね。そう言われてみると、 +IVAR のravalue とかは無視してましたが、RVALUEみたいなのが +いるってこと? + +RINDIRECT で逃げようと思ったが、 + +## 40: if (i>j) return j; + li r11,-3 + lwz r11,lo16(0)(r11) + li r10,5 + lwz r10,lo16(0)(r10) + cmpw cr1,r10,r11 + ble cr1,L_37 + li r10,-3 + lwz r10,lo16(0)(r10) +## 41: else return i; + +const でreplaceする時がまずいな。RIVARみたいなのを作ると、 +ちょっとcaseが増えすぎるが... pindirect でいんちきするか。 + +(で、あとで、やっぱりだめで、const replace を諦めてるし) + +const で置換したIVARのアドレスを取られると気まずいなぁ。 + +このあたりはマルチパスでないとできない。まぁ、parse tree を +持っているので可能ではあるけど。 + +Sun Dec 25 20:24:02 JST 2005 + +さて、return を作らないとだめか。 + +なに、結局、 + + return value がないときは jump + return value がある時には、g_expr でjump + +にする? とりあえず。 + +pfdecl で struct_return は、なんとかしてるの? + +やっぱ、ret() で、 code_set_return_register(1); +は、だめじゃん。if 文の分岐で値を同じレジスタ +に置くためには.... ?: と同じ方法か。 + +code_get_fixed_creg ねぇ。 + t = code_get_fixed_creg(USE_CREG,d); + gen_jmp(e3=fwdlabel()); + fwddef(e2); + t1=g_expr0(cadddr(e1)); + code_set_fixed_creg(t,1,d); +ですか。 + +Mon Dec 26 10:54:29 JST 2005 + + .cstring とかのデータモードとglobalラベルが変。 + +これねぇ。string をconstに置くかどうかは arch によるわけだから、 +mc-code-*.c で解決するのが正しいわけだけど、emit_data に分散して +しまっているね。 + +Mon Dec 26 22:57:49 JST 2005 + +引数中の関数型の定義があまり正確でないらしい。型宣言のない +code segment の呼び出しで、間違った値を送ってしまう。 + +大きな構造体二種類を含む parallel assignment が 無限ループ +する。分割を小さくすると通る。 + +register のtargetがoverrapしている場合に、registerを free +してからsave_targetしているので同じregisterが再利用されて +しまって無限ループしているらしい。save_target で register +overlap を見るようにしたけど、ad-hoc じゃない? (ま、 +もともと今の実装が ad-hoc だし) + +ASSIGN_STRUCT_DIVDE ってDIVDEする大きさのlimitなのか。 +大きいのは逆にdivdeしないのか。 + +Mon Dec 26 23:18:06 JST 2005 + +そもそも、仮引数のユーザに名前と大きさを決めさせているんだ +から、順序はこっちで決めれば良い。その代わり、異なる名前で +仮引数を受けるのは許さないってのがいいかもね。とすると、code +segment の引数のdefault とかを考えるとかなり、不思議な感じ。 +なんか整合性の良い interface ってあるんだろうか? stack を含 +めて? + + goto hoge(i=1,j=3,...) + +みたいな? + +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 も必要なわけだ。 + +ま、それはあとで。 + +Wed Dec 28 17:29:59 JST 2005 + +skipspc() で、inmode の時に、cheap に書かれてしまうので、 +cheap 上の string をterminate しないうちに、skipspc() +してはいけないわけね。 + +なんだが、"hoge" "ahoge" のcaseに、inmode の ST_COMMENT +が干渉してしまうわけね。それは、まずいか。 + +やっぱり、STRING は、"" で一つにして、複数つながる +っていう構文にした方が良いね。 + + list(STRING,value,continue) + +みたいな感じ。でも、それだと変更が多い(何故か nptr にいれてた...) +ので、やっぱり、append しました。 + +Thu Dec 29 09:59:38 JST 2005 + +PowerPC の get_lregister が失敗するのが、まだ、微妙に残ってる。 +足りないはずないんだけどね。input register も探させちゃうか。 +そういえば、最初は input register は使わない方針だったけど、 +今は使ってもいいんじゃないの? + +Fri Dec 30 16:31:33 JST 2005 + +IVAR の置換だけど、 + +453 int lvar; +454 if (car(lvar=cadr(e))==IVAR) { +455 lvar=p_lvar(cadr(e)); // can be anything.... +456 switch(car(lvar)) { +(gdb) l +457 case LVAR: +458 return rvalue_t(lvar,cadddr(e)); + +だと、やっぱり、LVAR のindirect と干渉してしまう? + +indirect の型は、その場のtypeでは型変換が終ってしまっている +ので、その前のでないとだめ。そもそも型を渡さずに、 +UCINDIRECT とかを見るべきだよね。逆か? RINDIRECTを +一つにして型を持ち歩いた方がいいのか? + +配列のADDは、inline でどこに消えちゃったの? +って、あと一つまでいったか。 + +
--- a/mc-codegen.c Fri Dec 30 13:36:17 2005 +0900 +++ b/mc-codegen.c Fri Dec 30 18:33:55 2005 +0900 @@ -3252,7 +3252,7 @@ /* right value , get the value of the variable */ static int -indirect(int t,int e1) +indirect(int t,int e1,int type) { int e2,e3,e4,offset; e2 = e1; @@ -3271,7 +3271,7 @@ extern int rvalue(int e) { - int op,c,e1; + int op,c; NMTBL *n; int type0 = type_value(type); @@ -3332,10 +3332,9 @@ } return(list3(RLVAR+op,cadr(e),caddr(e))); case INDIRECT: - e1=cadr(e); - return(indirect(RINDIRECT+op,cadr(e))); + return(indirect(RINDIRECT+op,cadr(e),type0)); case IVAR: - return(indirect(RINDIRECT+op,e)); + return(indirect(RINDIRECT+op,e,type0)); default:return(e); /* idempotent case? */ } } @@ -3815,7 +3814,8 @@ return(e1); if (car(e)==CONST) { if(car(e1)==ADDRESS) { - if (car(cadr(e1))!=GVAR) { + if (car(cadr(e1))==IVAR) { + } else if (car(cadr(e1))!=GVAR) { // must be lvar if (car(cadr(e1))!=LVAR) error(-1); return(list2(ADDRESS,
--- a/mc-inline.c Fri Dec 30 13:36:17 2005 +0900 +++ b/mc-inline.c Fri Dec 30 18:33:55 2005 +0900 @@ -451,19 +451,24 @@ prindirect(int e) { int lvar; + int offset = caddr(e); if (car(lvar=cadr(e))==IVAR) { lvar=p_lvar(cadr(e)); // can be anything.... switch(car(lvar)) { case LVAR: + if(offset) { + return list3(car(e),lvar,offset); + } return rvalue_t(lvar,cadddr(e)); case REGISTER: case DREGISTER: case FREGISTER: case LREGISTER: case CONST: case FCONST: case DCONST: case LCONST: // should do type check + if (offset) error(-1); return lvar; } } - return list3(car(e),pexpr(cadr(e)),caddr(e)); + return list3(car(e),pexpr(cadr(e)),offset); } static int @@ -490,6 +495,7 @@ static int pbinop(int op,int e1,int e2) { + // we should call binop here, but we don't know the type... return list3(op,pexpr(e1),pexpr(e2)); }
--- a/mc-parse.c Fri Dec 30 13:36:17 2005 +0900 +++ b/mc-parse.c Fri Dec 30 18:33:55 2005 +0900 @@ -2516,19 +2516,18 @@ if (inmode) { parse = list3(ST_GOTO,parse, list2(FLABEL,(int)get_name(nptr0->nm,0,0))); - } else { - t = nptr0->sc; - if (t==EMPTY||t==EXTRN1||t==EXTRN) { - // error check? - nptr0->sc=EMPTY; - nptr0=l_top_search(nptr0->nm,0); - nptr0->sc = FLABEL; - nptr0->dsp = fwdlabel(); - } else if (!(t==FLABEL||t==BLABEL)) { - error(STERR); - } - gen_jmp(nptr0->dsp); } + t = nptr0->sc; + if (t==EMPTY||t==EXTRN1||t==EXTRN) { + // error check? + nptr0->sc=EMPTY; + nptr0=l_top_search(nptr0->nm,0); + nptr0->sc = FLABEL; + if (!inmode) nptr0->dsp = fwdlabel(); + } else if (!(t==FLABEL||t==BLABEL)) { + error(STERR); + } + if (!inmode) gen_jmp(nptr0->dsp); control=0; conv->sm_(); checksym(SM); @@ -2578,19 +2577,17 @@ checkret(); if (inmode) parse = list3(ST_LABEL,parse,(int)get_name(nptr->nm,0,0)); - else { - if(nptr->sc == FLABEL) { - // already used by goto with fwdlabel - fwddef(nptr->dsp); - } else if(nptr->sc != EMPTY && nptr->sc != EXTRN1) { - error(TYERR); // duplicate label - } else { - nptr->sc=EMPTY; - // define this label in top level scope - nptr1=l_top_search(nptr->nm,0); - nptr1->sc = BLABEL; - nptr1->dsp = backdef(); - } + if(nptr->sc == FLABEL) { + // already used by goto with fwdlabel + if (!inmode) fwddef(nptr->dsp); + } else if(nptr->sc != EMPTY && nptr->sc != EXTRN1) { + error(TYERR); // duplicate label + } else { + nptr->sc=EMPTY; + // define this label in top level scope + nptr1=l_top_search(nptr->nm,0); + nptr1->sc = BLABEL; + if (!inmode) nptr1->dsp = backdef(); } conv->label_(); getsym(0);