Mercurial > hg > CbC > old > device
changeset 45:b9266c88495c
*** empty log message ***
author | kono |
---|---|
date | Thu, 13 Feb 2003 22:14:21 +0900 |
parents | c9293a6e40d2 |
children | b1c8ac8c308d |
files | Idea mc-nop-386.c mc-parse.c test/tmp7.c |
diffstat | 4 files changed, 76 insertions(+), 20 deletions(-) [+] |
line wrap: on
line diff
--- a/Idea Thu Feb 13 18:16:19 2003 +0900 +++ b/Idea Thu Feb 13 22:14:21 2003 +0900 @@ -1471,7 +1471,12 @@ temproal struct は再利用できるんだけど、dispの変更ができないので 新しく作るしかない。大きいときだけ新しく作るなんていうセコイ -技はあるけど。 +技はあるけど。(そうすると、帰って来た値へのポインタを使えなく +なるが.... 別にいいよね。戻り値それ自身を直接 return する +時もだいじょうぶなはず) + +結局、呼出側で、領域を確保して引き渡すことにしました。この方法だと、 +代入のときに二度コピーする必要もない。 register を使用しているかだけじゃなくて、実際にcreg/dregに 値があるかどうかを記憶する必要がある。 @@ -1483,3 +1488,21 @@ まぁねぇ。register の場所の確保と、寿命は別だから、それで いいんだけど、regs flag だけでなんとかならないのかな。 こういう変更ははまるが虚しい。 + +Thu Feb 13 18:37:36 JST 2003 + +さて、そろそろ jump にとりかかりますか。 + +構造体の引き渡しのシークエンスに使う局所変数の位置がgccと違う... + +そろそろ register は構造体にすべきだね。 + struct register { + int used; + int valued; + char *name; + char *wname; + char *bname; + int type; /* register variable or not */ + int number; + } +virtual/real は、どうする。
--- a/mc-nop-386.c Thu Feb 13 18:16:19 2003 +0900 +++ b/mc-nop-386.c Thu Feb 13 22:14:21 2003 +0900 @@ -335,16 +335,9 @@ return; real_v = virtual(real); move_op = regs[real_v]?"\txchg %s,%s\n":"\tmovl %s,%s\n"; -#define REGFLOW -#ifdef REGFLOW if (move || (regv[real_v])) { printf(move_op,reg_name[rname[virt]],reg_name[real]); } -#else - if (move || (regs[real_v])) { - printf(move_op,reg_name[rname[virt]],reg_name[real]); - } -#endif rname[real_v] = rname[virt]; rname[virt] = real; } @@ -889,8 +882,11 @@ /* otherwise we don't need this */ if (fix) printf("\tsubl $%d,%s\n",fix,register_name(to,0)); if(creg!=to) { - if (to==dreg) error(-1); - free_register(creg); creg=to; + if (to==dreg) + printf("\tmovl %s,%s\n",register_name(to,0),register_name(creg,0)); + else { + free_register(creg); creg=to; + } } regv[from]=regv[to]=regv[dreg]=0; regv[creg]=1;
--- a/mc-parse.c Thu Feb 13 18:16:19 2003 +0900 +++ b/mc-parse.c Thu Feb 13 22:14:21 2003 +0900 @@ -1018,6 +1018,8 @@ code_leave(n->nm,disp-odisp); } +static NMTBL *tmp_struct; + void fdecl(NMTBL *n) { @@ -1028,17 +1030,19 @@ fnptr=n; retlabel=fwdlabel(); retcont = 0; + tmp_struct = 0; - args=0; reg_var=0; fcheck(n); mode=ADECL; + if (sym!=LC) args=0; while (sym!=LC) { /* argument declaration !ANSI */ stmode=0; decl(); getsym(); } t=car(fnptr->ty); if (!scalar(t) && (car(t)==STRUCT||car(t)==UNION)) { + /* extra argument for struct return */ /* this extra dummy arguments are set at calling sequence */ str_ret.nm = "str_ret"; str_ret.sc = EMPTY; str_ret.dsp = 0; str_ret.ty = 0; @@ -1052,6 +1056,7 @@ } else { struct_return = 0; } + args=0; disp=0; init_vars=0; /* local variable declaration */ @@ -2165,7 +2170,7 @@ int expr15(int e1) { - int t,arglist,e; + int t,arglist,e,sz; /* function call */ @@ -2187,11 +2192,28 @@ if(type==CHAR) type=INT; else if(car(type)==STRUCT||car(type)==UNION) { /* make temporaly struct for return value */ - e = list2(LVAR,def(0)->dsp); + /* but it is better to see we can reuse old one */ + if (tmp_struct) { + sz = size(tmp_struct->ty); + if (sz>=size(type)) { + /* reuse it */ + } else if (tmp_struct->dsp-sz==disp) { + /* extendable */ + disp -= tmp_struct->dsp-sz; + tmp_struct->dsp = disp; + } else { + tmp_struct = def(0); + } + } else { + tmp_struct = def(0); + } + e = list2(LVAR,tmp_struct->dsp); + /* pass the pointer as an argument */ /* this is recognized by called function declaration */ + /* but I don't know this sequece is compatible with gcc */ + arglist=list3(list2(ADDRESS,e),arglist,list2(POINTER,type)); - /* return list3(COMMA,list3(FUNCTION,e1,arglist),rvalue(e)); */ } return list3(FUNCTION,e1,arglist); }
--- a/test/tmp7.c Thu Feb 13 18:16:19 2003 +0900 +++ b/test/tmp7.c Thu Feb 13 22:14:21 2003 +0900 @@ -7,19 +7,26 @@ void tmp(void); struct aa -main0(); +main0(int); struct aa -main0() +main0(int k) { int i; struct aa ccc; for(i=0;i<100;i++) ccc.a[i]=i; - ccc.a[55]=123; + ccc.a[55]=k; return ccc; } +struct aa +main3(struct aa arg) +{ + int j=++arg.a[55]; + return main0(j); +} + void main2(struct aa a1) { @@ -57,15 +64,23 @@ j = 3; - bbb = main0(); + bbb = main0(123); printf("copied main0 ccc.a[55] %d==123\n",bbb.a[55]); aap[2] = &bbb; - *aap[2] = main0(); + *aap[2] = main0(123); printf("complex copied main0 ccc.a[55] %d==123\n",bbb.a[55]); bbb.a[55]=0; - j = main0().a[55]; + j = main0(123).a[55]; printf("new main0 ccc.a[55] in temporal copy %d==123\n",j); + j = 552; + bbb = main3(bbb); + printf("main3 bbb.a[55] in temporal copy %d==552 %d==1\n",j,bbb.a[55]); + j = main3(bbb).a[55]; + printf("main3 bbb.a[55] in temporal copy %d==2 %d\n",j,bbb.a[53]); + j = main3(bbb).a[53]; + printf("main3 bbb.a[55] in temporal copy %d==2 %d\n",j,bbb.a[53]); + printf("%d==3\n",q.b); /* 3==3 */ r = q;