Mercurial > hg > CbC > old > device
changeset 677:83459d1afa0d
adhoc fix of statement expression in ia32.
author | kono |
---|---|
date | Sun, 06 May 2007 20:31:42 +0900 |
parents | 5e71527f9fd6 |
children | 9b29f529743f |
files | Changes Makefile mc-code-ia32.c mc-parse.c |
diffstat | 4 files changed, 46 insertions(+), 17 deletions(-) [+] |
line wrap: on
line diff
--- a/Changes Sun May 06 18:48:13 2007 +0900 +++ b/Changes Sun May 06 20:31:42 2007 +0900 @@ -9354,3 +9354,21 @@ というタイミングか。それよりは、その時点でparse treeを展開した方が まだ、ましか... + +あるいは、docomp する時に、全てのレジスタ変数を使ったことに +しておくか... それでも、ia32 ではだめだけど。 + +inmode==INLINE+1 の時に、若干展開が異なる。gen_inline() +する方がいいのか? + +うーん、それも、いろいろ面倒なようだね。どうせ、やらなきゃ +いけないんだが。 + +とりあえず、ad-hoc に直したが、あとで、ちゃんと直さないと。 +(get_input_arg AS_SAVE で、register variable を使わなければ良い...) + +展開するしかないんだろうなぁ。 + + + +
--- a/Makefile Sun May 06 18:48:13 2007 +0900 +++ b/Makefile Sun May 06 20:31:42 2007 +0900 @@ -1,5 +1,5 @@ -# CC = gcc -std=c99 -CC = cc +CC = gcc -std=c99 +# CC = cc # -O3 MCFLAGS = -DUSE_CODE_KEYWORD CFLAGS = -g -O -Wall -I. $(MCFLAGS)
--- a/mc-code-ia32.c Sun May 06 18:48:13 2007 +0900 +++ b/mc-code-ia32.c Sun May 06 20:31:42 2007 +0900 @@ -1708,32 +1708,38 @@ { if(scalar(t)) { if (mode==AS_SAVE) { - return get_register_var(0); + return list3(LVAR,new_lvar(size(t)),0); + // return get_register_var(0); } else return list3(LVAR,caller_arg_offset_v(nargs),0); } else if (t==LONGLONG||t==ULONGLONG) { if (mode==AS_SAVE) { - return get_lregister_var(0); + return list3(LVAR,new_lvar(size(t)),0); + // return get_lregister_var(0); } else return list3(LVAR,caller_arg_offset_v(nargs),0); } else if (t==FLOAT) { if (mode==AS_SAVE) { - return get_dregister_var(0,0); + return list3(LVAR,new_lvar(size(t)),0); + // return get_dregister_var(0,0); } else return list3(LVAR,caller_arg_offset_v(nargs),0); } else if (t==DOUBLE) { if (mode==AS_SAVE) { - return get_dregister_var(0,1); + return list3(LVAR,new_lvar(size(t)),0); + // return get_dregister_var(0,1); } else return list3(LVAR,caller_arg_offset_v(nargs),0); } else if (t>=0&&(car(t)==STRUCT||car(t)==UNION)) { if (mode==AS_SAVE) { - return get_register_var(0); + return list3(LVAR,new_lvar(size(t)),0); + // return get_register_var(0); } else return list3(LVAR,caller_arg_offset_v(nargs),0); } else { error(-1); - return get_register_var(0); + return list3(LVAR,new_lvar(size(t)),0); + // return get_register_var(0); } }
--- a/mc-parse.c Sun May 06 18:48:13 2007 +0900 +++ b/mc-parse.c Sun May 06 20:31:42 2007 +0900 @@ -926,7 +926,7 @@ } else { conv->return_type_(type,n,sd); n = def(n,ctmode); - if (inmode && (mode==LDECL||mode==LLDECL)) { + if (inmode==INLINE && (mode==LDECL||mode==LLDECL)) { parse = list4(ST_DECL,parse,(int)n,list3(mode,stmode,ctmode)); } if (sym==ASS && n!=&null_nptr) { @@ -946,7 +946,7 @@ } conv->return_type_(type,n,1); def(n,ctmode); - if (inmode && mode==LDECL) { + if (inmode==INLINE && mode==LDECL) { parse = list4(ST_DECL,parse,(int)n,list3(mode,stmode,ctmode)); } if (sym==ASS && n!=&null_nptr) { @@ -2287,7 +2287,8 @@ pparse = parse; parse = 0; l1 = if0 = expr(0); } else { - l1 = bexpr((if0 = expr(0)),0,fwdlabel()); + if0 = expr(0); + l1 = bexpr(if0,0,fwdlabel()); } set_lfree(slfree); conv->if_then_(if0); @@ -3529,7 +3530,7 @@ e=expr0(); checksym(RPAR); type=INT; - if (inmode) + if (inmode==INLINE) return list2(BUILTINP,rvalue(e)); /* evalue it later */ else return list2(CONST,is_const(e)); @@ -3687,7 +3688,7 @@ nptr1->sc=EMPTY; nptr1=l_top_search(nptr->nm,0); nptr1->sc = FLABEL; - if (inmode!=INLINE) + if (!inmode) nptr1->dsp = fwdlabel(); else nptr1->dsp = --disp; @@ -3962,7 +3963,7 @@ nptr0->attr = 0; type = nptr0->ty = t; def(nptr0,0); - if (inmode) { + if (inmode==INLINE) { parse = list4(ST_DECL,parse,(int)nptr0, list3(mode,0,0)); } @@ -4011,20 +4012,24 @@ } else l2 = 0; // make it a simple call (by jmp) // register stack save now + // we cannot trust register variable (used as temorary) + // either, save these register is necessary... e1 = list3(COMMA,list3(LCALL,b,l2),lastexp); lastexp = 0; if (l) fwddef(l); control=cntl; #else + int smode=mode; // we already have parse tree mode, why don't we? int sparse = parse; parse=0; inmode = INLINE+1; // this does not work well... we need some work later docomp(1); - e1 = list3(COMMA,reverse0(parse),lastexp); + inmode = 0; mode=GDECL; + e1 = list3(COMMA,pexpr(reverse0(parse)),lastexp); + mode = smode; parse = sparse; lastexp = 0; - inmode = 0; #endif } } else { @@ -4109,7 +4114,7 @@ } } else { tmp_struct = def(0,0); - if (inmode) { + if (inmode==INLINE) { set_attr(tmp_struct,HAS_ADDRESS,1); parse = list4(ST_DECL,parse,(int)tmp_struct,list3(LDECL,0,0)); }