Mercurial > hg > CbC > old > device
changeset 160:1f440a2790fb
*** empty log message ***
author | kono |
---|---|
date | Sun, 23 Nov 2003 19:54:02 +0900 |
parents | b80e9737c3ce |
children | cc2fc5c0dfe5 |
files | Changes mc-code-powerpc.c mc-codegen.c mc-parse.c |
diffstat | 4 files changed, 200 insertions(+), 69 deletions(-) [+] |
line wrap: on
line diff
--- a/Changes Thu Aug 14 02:40:39 2003 +0900 +++ b/Changes Sun Nov 23 19:54:02 2003 +0900 @@ -3382,3 +3382,100 @@ 720 0.370u 0.010s 0:00.37 102.7% 0+0k 0+0io 88pf+0w + ++jessica+kono time ./a.out 0 +720 +1.190u 0.010s 0:01.51 79.4% 0+0k 0+0io 0pf+0w ++jessica+kono time ./a.out 1 +719 +1.700u 0.000s 0:01.78 95.5% 0+0k 0+0io 0pf+0w ++jessica+kono time ./a.out 2 +470 +0.630u 0.000s 0:00.66 95.4% 0+0k 0+0io 0pf+0w ++jessica+kono time ./a.out 3 +720 +0.790u 0.000s 0:00.81 97.5% 0+0k 0+0io 0pf+0w ++jessica+kono time ./a.out 4 +0.000u 0.000s 0:00.00 0.0% 0+0k 0+0io 0pf+0w + ++jessica+kono gcc test/conv1.c ++jessica+kono time ./a.out 0 +720 +0.960u 0.000s 0:00.97 98.9% 0+0k 0+2io 0pf+0w ++jessica+kono gcc -O test/conv1.c ++jessica+kono time ./a.out 0 +720 +0.470u 0.000s 0:00.48 97.9% 0+0k 0+0io 0pf+0w ++jessica+kono gcc -O6 test/conv1.c ++jessica+kono time ./a.out 0 +720 +0.260u 0.000s 0:00.26 100.0% 0+0k 0+0io 0pf+0w + +Mon Sep 1 13:49:43 JST 2003 + +short がやっぱり欲しいよね。long long はともかく... +そこまでいくと、ANSI-C 対応にできるんだが。long long +は難しい? + +short は、そんなに難しくないはず。あとは、 + statement を含めたtreeの処理 + 変換系の完成 +この二つだな。GCC に組み込むのは無理だろう。 + +属性文法みたいな手法が使えればね。 + +あと、struct のtag。やっぱりword table を作り直さないと。 + +Wed Sep 10 21:53:16 JST 2003 + +short や unsigned short の前に、 +なんか unsigned char もないんですけど。 + +Wed Oct 8 22:43:17 JST 2003 + +(また、一カ月、触ってないのか...) + +無名 code はあった方がいいんじゃない? + + code *a(int i); + a = code(int j) { } + +みたいな感じ? C にはないけどね。もともと、名前を消費する +方だからあった方がいいかも。でも、実行時に作られるわけじゃない。 +それに、こういうものを作ると closure だと思われるような +気もする。closure みたいなものは「自分で管理する」ってのが +CbC の思想だろ? + +そういえば、static なcodeはあった方がいいんじゃない? + + static code func() { .... } + +か。それはそうだな。 + +Fri Oct 10 13:08:01 JST 2003 + +link register をうまく使うにはcontinuationに +指定するだけではダメで、 + goto hoge(....,next); +code next.. +みたいなのがあった方がいいんじゃない? + +goto の後のステートメントは無名codeになればいいんだよね。 + +stack を使わないサブルーチンみたいなものか。単なるcall +になるわけね。それもいいかも。 + +Sat Nov 22 15:51:36 JST 2003 + +構造体のfieldの定義のnptrは、大域の名前テーブルから +取り除かないといけない。でも、取り除いていしまうと、 +構造体からのポインタがずれちゃうので、まずい。 + +filed専用の領域を作るのだと、複数の構造体が同じ +field名を持つときにちょっと困る。構造体のタイプに +埋め込むのがいいんだけど... + +そうすると、構造体のfiledかどうかをgetsymがチェック +するときにちょっと困る。 + +
--- a/mc-code-powerpc.c Thu Aug 14 02:40:39 2003 +0900 +++ b/mc-code-powerpc.c Sun Nov 23 19:54:02 2003 +0900 @@ -786,6 +786,15 @@ regv[creg]=1; } +void +code_srgvar(int e1,int creg){ + char *crn = register_name(creg); + printf("\tlhz %s,0(%s)\n",crn, + register_name(get_ptr_cache((NMTBL*)cadr(e1)))); + printf("\textsh %s,%s\n",crn,crn); + regv[creg]=1; +} + void code_register(int e2,int creg) { @@ -814,6 +823,15 @@ regv[creg]=1; } +void +code_srlvar(int e2,int reg) { + lvar_intro(e2); + printf("\tlhz %s,",register_name(reg)); + lvar(e2); + printf("\textsh %s,%s\n",register_name(reg),register_name(reg)); + regv[creg]=1; +} + void code_fname(NMTBL *n,int creg) { @@ -1108,6 +1126,16 @@ regv[creg]=0; } +void +code_cmp_srlvar(int e2) { + char *crn = register_name(creg); + lvar_intro(e2); + printf("\tlhz %s,",crn); + lvar(e2); + code_cmp_register(creg); + regv[creg]=0; +} + void code_cmp_rgvar(int e1) {
--- a/mc-codegen.c Thu Aug 14 02:40:39 2003 +0900 +++ b/mc-codegen.c Sun Nov 23 19:54:02 2003 +0900 @@ -265,22 +265,10 @@ creg=use_float(creg); dmachinop(e1,0); return FLOAT; - case COND: - e2=fwdlabel(); - b_expr(cadr(e1),0,e2,0); - code_set_fixed_creg(0,INT); - t = g_expr0(caddr(e1)); - code_set_fixed_creg(1,t); - jmp(e3=fwdlabel()); - fwddef(e2); - code_set_fixed_creg(0,INT); - t = g_expr0(cadddr(e1)); - code_set_fixed_creg(1,t); - fwddef(e3); - return t; + case COND: /* a?0:1 should consider non-brach instruction */ case DCOND: case FCOND: - d = (car(e1)==DCOND?DOUBLE:FLOAT); + d = (car(e1)==COND?INT:car(e1)==DCOND?DOUBLE:FLOAT); e2=fwdlabel(); b_expr(cadr(e1),0,e2,0); code_set_fixed_creg(0,d);
--- a/mc-parse.c Thu Aug 14 02:40:39 2003 +0900 +++ b/mc-parse.c Sun Nov 23 19:54:02 2003 +0900 @@ -362,13 +362,9 @@ } static void -decl(void) +strage_class() { - NMTBL *n; - int t,sd; - if (mode==GDECL) { typedefed=0; } - - if(sym==STATIC) { + if(sym==STATIC) { if(mode==LDECL) { getsym(); conv->static_(); @@ -402,6 +398,15 @@ } else error(DCERR); } +} + +static void +decl(void) +{ + NMTBL *n; + int t,sd; + if (mode==GDECL) { typedefed=0; } + strage_class(); if((t=typespec())==0) return; if(sym==SM) { conv->return_type_(t,0,stypedecl); @@ -469,6 +474,9 @@ case UNSIGNED: t = UNSIGNED; if(getsym()==INT) getsym(); + else if (sym==CHAR) { getsym(); t = sym; } + else if (sym==SHORT) { getsym(); t = sym; } + else if (sym==LONGLONG) {getsym(); t = sym; } break; case SHORT: t=INT; @@ -796,13 +804,19 @@ return n; } } - if (n->sc!=EMPTY && - !((n->sc&~1)==EXTRN)&& - (mode!=ADECL || n->sc!=LVAR || n->ty!=INT) && - (mode!=ADECL || n->sc!=REGISTER || n->ty!=INT) && - ((mode!=GSDECL&&mode!=LSDECL) || n->sc!=FIELD || n->dsp!=disp) && - ((mode!=GUDECL&&mode!=LUDECL) || n->sc!=FIELD || n->dsp!=0) ) - error(DCERR); + if (n->sc!=EMPTY && !((n->sc&~1)==EXTRN)) { + if (mode==ADECL) { + if (n->sc==LVAR && n->ty==INT); + else if ( n->sc==REGISTER && n->ty==INT); + else error(DCERR); + } else if (mode==GSDECL||mode==LSDECL) { + if (n->sc==FIELD && n->dsp==disp); + else error(DCERR); + } else if (mode==GUDECL||mode==LUDECL) { + if (n->sc==FIELD && n->dsp==0); + else error(DCERR); + } else error(DCERR); + } sz = size(n->ty = type); switch(mode) { case GDECL: @@ -1045,6 +1059,19 @@ } static int +sdecl_field() +{ + int tags = 0; + while (getsym() != RC) { + decl(); + tags = list3(type,tags,(int)nptr); + } + if (sdecl_f) conv->rc_(); + getsym(); + return reverse0(tags); +} + +static int sdecl(int s) { int smode,sdisp,type0=0; @@ -1067,15 +1094,8 @@ if (sdecl_f) conv->lc_(); if (nptr0->sc != EMPTY) error(DCERR); nptr0->sc = TAG; - tags = 0; - nptr0->ty = list4(s,-1,tags,(int)nptr0); - while (getsym() != RC) { - decl(); - tags = list3(type,tags,(int)nptr); - } - if (sdecl_f) conv->rc_(); - getsym(); - tags=reverse0(tags); + nptr0->ty = list4(s,-1,0,(int)nptr0); + tags = sdecl_field(); heap[nptr0->ty+2]=tags; rplacad(type0 = nptr0->ty,disp); } else { @@ -1090,14 +1110,7 @@ type0 = list4(s,disp,tags,(int)nptr0); } else if(sym==LC) { if (sdecl_f) conv->lc_(); - tags = 0; - while(getsym() != RC) { - decl(); - tags = list3(type,tags,(int)nptr); - } - if (sdecl_f) conv->rc_(); - getsym(); - tags=reverse0(tags); + tags = sdecl_field(); type0 = list4(s,disp,tags,0); } else error(DCERR); @@ -1894,8 +1907,15 @@ type= INT; return(list4(CASSOP,e1,e2,op)); } + /* + if(t==SHORT) { + type= INT; + return(list4(SASSOP,e1,e2,op)); + } + */ type=t; if(integral(t)) return(list4(ASSOP,e1,e2,op)); + /* pointer += ... */ if((op!=ADD&&op!=SUB)||car(t)!=POINTER) error(TYERR); e2=binop(MUL,e2,list2(CONST,size(cadr(t))),INT,UNSIGNED); type=t; @@ -1912,7 +1932,7 @@ int e1,e2,e3,t; e1=expr3(); - if(sym==COND) { + if(sym==COND) { // e1?e2:e3 conv->cond_(); e1=rvalue(e1); getsym(); @@ -1924,10 +1944,7 @@ e3=rvalue(expr2()); conv->cond_end_(); if(car(e1)==CONST) { - if(cadr(e1)) { - type=t;return e2; - } else - return e3; + if(cadr(e1)) {type=t;return e2;} else return e3; } if(type==DOUBLE||t==DOUBLE) { e2=double_value(e2,t); @@ -1955,7 +1972,7 @@ int e,e1; e=expr4(); - while(sym==LOR) { + while(sym==LOR) { /* || */ conv->op_(sym); e=rvalue(e); getsym(); @@ -1974,7 +1991,7 @@ int e,e1; e=expr5(); - while(sym==LAND) { + while(sym==LAND) { /* && */ conv->op_(sym); e=rvalue(e); getsym(); @@ -1993,7 +2010,7 @@ int e1,e2,t; e1=expr6(); - while(sym==BOR) { + while(sym==BOR) { /* & */ conv->op_(sym); e1=rvalue(e1); t=type; @@ -2010,7 +2027,7 @@ int e1,e2,t; e1=expr7(); - while(sym==EOR) { + while(sym==EOR) { /* ^ */ conv->op_(sym); e1=rvalue(e1); t=type; @@ -2027,7 +2044,7 @@ int e1,e2,t; e1=expr8(); - while(sym==BAND) { + while(sym==BAND) { /* & */ conv->op_(sym); e1=rvalue(e1); t=type; @@ -2068,13 +2085,13 @@ t=type; getsym(); e2=rvalue(expr10()); - if(t==INT&&type==INT) - e1=binop(op,e1,e2,t,type); - else if(t==DOUBLE||type==DOUBLE|| + if(t==DOUBLE||type==DOUBLE|| t==FLOAT||type==FLOAT) /* binop will handle op+DOP */ e1=binop(op,e1,e2,t,type); - else + else if(t==INT&&type==INT) /* signed case */ + e1=binop(op,e1,e2,t,type); + else /* LONGONG? */ e1=binop(op+US,e1,e2,t,type); type= INT; } @@ -2156,12 +2173,12 @@ error(TYERR); return(list3(PREINC,e, op==INC?size(cadr(type)):-size(cadr(type)) )); - case MUL: + case MUL: /* *p */ conv->prefix_(sym); getsym(); e=rvalue(expr13()); return(indop(e)); - case BAND: + case BAND: /* &p */ conv->prefix_(sym); getsym(); switch(car(e=expr13())) { @@ -2181,7 +2198,7 @@ } type=list2(POINTER,type); return e; - case SUB: + case SUB: /* -p */ conv->prefix_(sym); getsym(); e=rvalue(expr13()); @@ -2192,14 +2209,14 @@ if(!integral(type)) error(TYERR); return(car(e)==CONST?list2(CONST,-cadr(e)):list2(MINUS,e)); - case BNOT: + case BNOT: /* ~p */ conv->prefix_(sym); getsym(); e=rvalue(expr13()); if(!integral(type)) error(TYERR); return(car(e)==CONST?list2(CONST,~cadr(e)):list2(BNOT,e)); - case LNOT: + case LNOT: /* !p */ conv->prefix_(sym); getsym(); e=rvalue(expr13()); @@ -2221,7 +2238,7 @@ e=expr0(); checksym(RPAR); expr16(e); - if(sym==INC||sym==DEC) { + if(sym==INC||sym==DEC) { /* ??? */ getsym(); if(type==CHAR) type=INT; else if(!scalar(type)&&type!=FLOAT&&type!=DOUBLE) @@ -2373,7 +2390,7 @@ break; case LPAR: conv->lpar_(); - if(typeid(getsym())) { + if(typeid(getsym())) { /* cast */ t=typename(); conv->return_type_(t,0,0); conv->rpar_(); @@ -2405,7 +2422,7 @@ int e2,t; while(1) { - if(sym==LBRA) { + if(sym==LBRA) { /* a[3] */ conv->lbra_(sym); e1=rvalue(e1); t=type; @@ -2415,7 +2432,7 @@ conv->rbra_(sym); e1=binop(ADD,e1,e2,t,type); e1=indop(e1); - } else if(sym==LPAR) e1=expr15(e1); + } else if(sym==LPAR) e1=expr15(e1); /* f() */ else { if(sym==PERIOD) { conv->op_(sym);e1=strop(e1); } else if(sym==ARROW) { conv->op_(sym);e1=strop(indop(rvalue(e1))); @@ -2493,6 +2510,7 @@ return e; } else if(t!=POINTER) error(TYERR); } + /* int case */ switch(car(e)) { case GVAR: return(list2(RGVAR,cadr(e))); @@ -2544,7 +2562,7 @@ strop(int e) { getsym(); - if (sym!=IDENT||nptr->sc!=FIELD) error(TYERR); + if (sym!=IDENT||nptr->sc!=FIELD) error(TYERR); /* ??? */ conv->id_(sym,nptr); if (integral(type)||(car(type)!=STRUCT && car(type)!=UNION)) e=rvalue(e); @@ -2886,7 +2904,7 @@ /* pass the pointer as an argument */ /* this is recognized by called function declaration */ - /* but I don't know this sequece is compatible with gcc */ + /* but I don't know this sequence is compatible with gcc */ append3(arglist,list2(ADDRESS,e),list2(POINTER,type)); }