Mercurial > hg > CbC > old > device
changeset 105:7e3d59e56a53
save register ( incomplete )
author | kono |
---|---|
date | Tue, 18 Mar 2003 01:54:46 +0900 |
parents | c21aeb12b78b |
children | 3618c0efe9d3 |
files | Changes mc-code-ia32.c mc-code-powerpc.c mc-code.h mc-codegen.c mc-codegen.h mc-parse.c mc.h |
diffstat | 8 files changed, 182 insertions(+), 70 deletions(-) [+] |
line wrap: on
line diff
--- a/Changes Mon Mar 17 20:57:01 2003 +0900 +++ b/Changes Tue Mar 18 01:54:46 2003 +0900 @@ -2250,3 +2250,30 @@ input register のsaveを忘れている。 input register の割当が逆順。 + +Mon Mar 17 23:38:14 JST 2003 + +あぁ、そうか。input-register のアドレスを取ったときは、 +それをLVARに変えないとだめ。 + +なんだけど、途中で分かっても、loop で前に戻ることがあるので、 +手遅れです。ということは、one path ではできないね。 + +むぅ... function call の save_input_register も同じ「手遅れ」 +の問題があるのね。function argument は、すでに parse されて +いて、その引数は、register に固定されてしまっている。 +save_input_register で、save するコードを出しても、 +そちらを見るようには出来てない。(どうすればいいんだ?) + +function callの先頭で、引数を全部stackにsaveしてしまえば、 +このあたりの問題は解決する。けど、あんまりな気もするね。 +でも、stmw も使えるしな... + +結局、input_register は、LVAR のまま処理して、可能ならば +register を使うって方がいいんじゃないかなぁ.... でも、 +そうすると、今まで書いたコードは、ほとんど無駄かぁ... + +いずれにせよ、あんまり簡単な解決はないね。 + + +
--- a/mc-code-ia32.c Mon Mar 17 20:57:01 2003 +0900 +++ b/mc-code-ia32.c Tue Mar 18 01:54:46 2003 +0900 @@ -198,15 +198,15 @@ } int -get_input_register_var(int i) +get_input_register_var(int i,NMTBL *nptr) { i = virtual(i+REG_ESI); regs[i]=regv[i]=1; - return list2(REGISTER,i); + return list3(REGISTER,i,(int)nptr); } int -get_input_fregister_var(int i) +get_input_fregister_var(int i,NMTBL *nptr) { error(-1); return -1; @@ -341,21 +341,21 @@ int -get_register_var(void) +get_register_var(NMTBL *nptr) { int i; for(i=REG_ESI;i<REG_ESP;i++) { if (! regs[i]) { /* 使われていないなら */ regs[i]=1; /* そのレジスタを使うことを宣言し */ regv[i]=0; - return list2(REGISTER,i); /* その場所を表す番号を返す */ + return list3(REGISTER,i,(int)nptr); /* その場所を表す番号を返す */ } } return list2(LVAR,new_lvar(size_of_int)); } int -get_fregister_var(void) +get_fregister_var(NMTBL *nptr) { return list2(LVAR,new_lvar(size_of_double)); } @@ -890,9 +890,10 @@ int function(int e1) { - int e2,e3,e4,e5,nargs,t; + int e2,e3,e4,e5,nargs,t,ret_type; NMTBL *n; int save,saved; + ret_type = cadddr(e1); #ifdef SAVE_STACKS code_save_stacks(); #endif @@ -962,14 +963,14 @@ free_register(save); } regv[save]=0; - if (fnptr->ty==DOUBLE||fnptr->ty==FLOAT) { + if (ret_type==DOUBLE||ret_type==FLOAT) { fregv[freg]=1; regv[creg]=0; - } else if (fnptr->ty==VOID) { + } else if (ret_type==VOID) { fregv[freg]=0; regv[creg]=0; } else { fregv[freg]=0; regv[creg]=1; } - return fnptr->ty; + return ret_type; } void
--- a/mc-code-powerpc.c Mon Mar 17 20:57:01 2003 +0900 +++ b/mc-code-powerpc.c Tue Mar 18 01:54:46 2003 +0900 @@ -262,17 +262,17 @@ } int -get_input_fregister_var(int i) +get_input_fregister_var(int i,NMTBL *n) { if (i<0||MAX_FREGISTER<i+MIN_TMP_FREG) error(-1); - return list2(DREGISTER,i+MIN_TMP_FREG); + return list3(DREGISTER,i+MIN_TMP_FREG,(int)n); } int -get_input_register_var(int i) +get_input_register_var(int i,NMTBL *n) { if (i<0||MAX_REGISTER<i+MIN_TMP_REG) error(-1); - return list2(REGISTER,i+MIN_TMP_REG); + return list3(REGISTER,i+MIN_TMP_REG,(int)n); } int @@ -371,7 +371,7 @@ int -get_register_var(void) +get_register_var(NMTBL *n) { int i; for(i=0;i<REG_VAR_BASE-REG_VAR_MIN;i++) { @@ -379,7 +379,7 @@ regs[REG_VAR_BASE-i]=USING_REG; /* そのレジスタを使うことを宣言し */ regv[REG_VAR_BASE-i]=0; if (i>max_reg_var) max_reg_var=i; - return list2(REGISTER,i); /* その場所を表す番号を返す */ + return list3(REGISTER,i,(int)n); /* その場所を表す番号を返す */ } } return list2(LVAR,new_lvar(size_of_int)); @@ -391,15 +391,15 @@ } int -get_fregister_var(void) +get_fregister_var(NMTBL *n) { int i; for(i=0;i<FREG_VAR_BASE-REG_VAR_MIN;i++) { if (! regs[FREG_VAR_BASE-i]) { /* 使われていないなら */ - regs[FREG_VAR_BASE-i]=USING_REG; /* そのレジスタを使うことを宣言し */ + regs[FREG_VAR_BASE-i]=USING_REG; /*そのレジスタを使うことを宣言し*/ regv[FREG_VAR_BASE-i]=0; if (i>max_freg_var) max_freg_var=i; - return list2(DREGISTER,i); /* その場所を表す番号を返す */ + return list3(DREGISTER,i,(int)n); /* その場所を表す番号を返す */ } } return list2(LVAR,new_lvar(size_of_double)); @@ -1037,33 +1037,72 @@ fregs[arg]=USING_REG; } +void +code_save_input_registers() +{ + int args; + NMTBL *n; + int reg; + int tag; + int lvar; + int t; + /* fnptr->dsp=list4(type,fnptr->dsp,(int)n,0); */ + + for(args = fnptr->dsp;args;args = cadr(args)) { + n = (NMTBL *)caddr(args); + tag = n->sc; + reg = n->dsp; + if (!n||n==&null_nptr) error(REG_ERR); + if (tag==REGISTER) { + /* regs[reg]==INPUT_REG case should be considered */ + n->dsp = new_lvar(size_of_int); + t = INT; + } else if (tag==DREGISTER) { + /* fregs[reg]==INPUT_REG case should be considered */ + n->dsp = new_lvar(size_of_double); + t = DOUBLE; + } else + continue; + n->sc = LVAR; + lvar = list2(LVAR,n->dsp); + g_expr_u(assign_expr0(list2(LVAR,n->dsp),list3(tag,reg,(int)n),t,t)); + if (tag==REGISTER) { + free_register(reg); + } else if (tag==DREGISTER) { + free_fregister(reg); + } + } +} + int function(int e1) { int e2,e3,e4,e5,nargs,t; int arg,reg_arg,freg_arg,arg_assign; - int reg_arg_list; + int reg_arg_list,ret_type; NMTBL *n; int jmp; char *jrn,*crn; + ret_type = cadddr(e1); code_save_stacks(); + code_save_input_registers(); /* now all input register vars are free */ e2 = cadr(e1); reg_arg_list = nargs = reg_arg = freg_arg = arg_assign = 0; - for (e3 = caddr(e1); e3; e3 = cadr(e3)) { + for (e3 = reverse0(caddr(e1)); e3; e3 = cadr(e3)) { t=caddr(e3); n=(NMTBL *)(e5=(cadr(e4 = car(e3)))); if(scalar(t)) { if (reg_arg>MAX_INPUT_REGISTER_VAR) { arg = list2(LVAR,arg_offset_v(nargs)); } else if (contains_in_list(e3,FUNCTION)) { - arg = get_register_var(); + arg = get_register_var(0); arg_assign = list2( - assign_expr0(get_input_register_var(reg_arg),arg,t,t), + assign_expr0(get_input_register_var(reg_arg,0),arg,t,t), arg_assign); } else { - arg = get_input_register_var(reg_arg); + arg = get_input_register_var(reg_arg,0); use_var(arg); /* protect from input register free */ } reg_arg_list = list2(arg,reg_arg_list); @@ -1074,12 +1113,12 @@ if (freg_arg>MAX_INPUT_DREGISTER_VAR) { arg = list2(LVAR,arg_offset_v(nargs)); } else if (contains_in_list(e3,FUNCTION)) { - arg = get_fregister_var(); + arg = get_fregister_var(0); arg_assign = list2( - assign_expr0(get_input_register_var(reg_arg),arg,t,t), + assign_expr0(get_input_register_var(reg_arg,0),arg,t,t), arg_assign); } else { - arg = get_input_fregister_var(freg_arg); + arg = get_input_fregister_var(freg_arg,0); use_var(arg); /* protect from input register free */ } reg_arg_list = list2(arg,reg_arg_list); @@ -1122,16 +1161,16 @@ if (car(reg_arg_list)==DREGISTER) free_fregister(cadr(reg_arg_list)); else if (car(reg_arg_list)==REGISTER) free_register(cadr(reg_arg_list)); } - if (fnptr->ty==DOUBLE||fnptr->ty==FLOAT) { + if (ret_type==DOUBLE||ret_type==FLOAT) { set_freg(RET_FREGISTER,0); fregv[freg]=1; regv[creg]=0; - } else if (fnptr->ty==VOID) { + } else if (ret_type==VOID) { fregv[freg]=0; regv[creg]=0; } else { set_creg(RET_REGISTER,0); fregv[freg]=0; regv[creg]=1; } - return fnptr->ty; + return ret_type; } void
--- a/mc-code.h Mon Mar 17 20:57:01 2003 +0900 +++ b/mc-code.h Tue Mar 18 01:54:46 2003 +0900 @@ -22,10 +22,10 @@ extern char *register_name(int i,int byte); extern void gexpr_code_init(void); extern int register_var(int r); -extern int get_register_var(void); -extern int get_fregister_var(void); -extern int get_input_register_var(int); -extern int get_input_fregister_var(int); +extern int get_register_var(NMTBL *n); +extern int get_fregister_var(NMTBL *n); +extern int get_input_register_var(int,NMTBL *); +extern int get_input_fregister_var(int,NMTBL *); extern void emit_push(void); extern void emit_push_x(int xreg); extern int emit_pop(int type);
--- a/mc-codegen.c Mon Mar 17 20:57:01 2003 +0900 +++ b/mc-codegen.c Tue Mar 18 01:54:46 2003 +0900 @@ -26,15 +26,16 @@ fregv calue in floating point register */ -void remove0(int *parent,int e) ; -void remove0_all(int *parent,int e) ; -int is_same_type(int e1,int e2); -void jump(int e1, int env); -void machinop(int e1); -void sassign(int e1); -void assign(int e1); -void assop(int e1); -int g_expr0(int e1); +static void remove0(int *parent,int e) ; +/* static void remove0_all(int *parent,int e) ; */ +static int is_same_type(int e1,int e2); +static void jump(int e1, int env); +static void machinop(int e1); +static void sassign(int e1); +static void assign(int e1); +static void assop(int e1); +static int g_expr0(int e1); +static int register_to_lvar(int e); void codegen_init() @@ -165,7 +166,10 @@ case DRINDIRECT: case FRINDIRECT: return rindirect(e1); case ADDRESS: - return g_expr0(e2); + if (car(e2)==REGISTER||car(e2)==DREGISTER) + return register_to_lvar(e2); + else + return g_expr0(e2); case MINUS: /* レジスタに対し、neglを実行すれば実現可能 */ g_expr0(e2); code_neg(); return INT; @@ -469,26 +473,61 @@ if (scalar(type)) { if(reg_var<max_input_register_var) { n->sc = REGISTER; - n->dsp = cadr(get_input_register_var(reg_var)); - regv[reg_var]= 1; - regs[reg_var]= INPUT_REG; + n->dsp = cadr(get_input_register_var(reg_var,n)); + regv[n->dsp]= 1; + regs[n->dsp]= INPUT_REG; reg_var++; - cadddr(fnptr->dsp)=size_of_int; + cadddr(args)=size_of_int; /* why we need this? */ } } else if ((type==FLOAT||type==DOUBLE)&&stmode==REGISTER) { if(freg_var<max_input_fregister_var) { n->sc = DREGISTER; - n->dsp = cadr(get_input_fregister_var(freg_var)); - fregv[reg_var]= 1; - fregs[reg_var]= INPUT_REG; + n->dsp = cadr(get_input_fregister_var(freg_var,n)); + fregv[n->dsp]= 1; + fregs[n->dsp]= INPUT_REG; freg_var++; - cadddr(fnptr->dsp)=size_of_double; + cadddr(args)=size_of_double; /* why we need this? */ } } args = cadr(args); } } +static int +register_to_lvar(int e) +{ + error(REG_ERR); + return 0; +#if 0 + 途中でレジスタからLVARに変更しても、間に合わない。 + + NMTBL *n = (NMTBL*)caddr(e); + int reg = cadr(e); + int tag = car(e); + int lvar; + int t; + if (!n||n==&null_nptr) error(REG_ERR); + if (tag==REGISTER) { + /* regs[reg]==INPUT_REG case should be considered */ + n->dsp = new_lvar(size_of_int); + t = INT; + } else if (tag==DREGISTER) { + /* fregs[reg]==INPUT_REG case should be considered */ + n->dsp = new_lvar(size_of_double); + t = DOUBLE; + } else error(-1); + n->sc = LVAR; + lvar = list2(LVAR,n->dsp); + g_expr_u(assign_expr0(list2(LVAR,n->dsp),list3(tag,reg,(int)n),t,t)); + if (tag==REGISTER) { + free_register(reg); + } else if (tag==DREGISTER) { + free_fregister(reg); + } + return g_expr0(lvar); +#endif +} + /* goto arguments list */ /* target list4(list2(tag,disp),cdr,ty,source_expr) */ /* source expr=listn(tag,...) */ @@ -543,12 +582,12 @@ int e1; /*新しいレジスタ(or スタック)を取得する*/ if (sz==size_of_int && (e1=get_register())!=-1) { - e1=list2(REGISTER,e1); + e1=list3(REGISTER,e1,0); *use=list3(t,*use,e1); g_expr_u(assign_expr0(e1,s,ty,ty)); *target = append4(*target,t,ty,e1); } else if (sz==size_of_double && (e1=get_fregister())!=-1) { - e1=list2(DREGISTER,e1); + e1=list3(DREGISTER,e1,0); *use=list3(t,*use,e1); g_expr_u(assign_expr0(e1,s,ty,ty)); *target = append4(*target,t,ty,e1); @@ -634,6 +673,7 @@ } } +/* void remove0_all(int *parent,int e) { @@ -646,6 +686,7 @@ } } } + */ int is_simple(int e1) @@ -715,11 +756,11 @@ e2 = car(e3); sz = size(ty=caddr(e3)); if (scalar(ty) && regs < MAX_CODE_INPUT_REGISTER_VAR) { - target=list4(get_input_register_var(regs++), + target=list4(get_input_register_var(regs++,0), target,ty,e2); } else if ((ty==DOUBLE||ty==FLOAT) && fregs < MAX_CODE_INPUT_DREGISTER_VAR) { - target=list4(get_input_fregister_var(fregs++), + target=list4(get_input_fregister_var(fregs++,0), target,ty,e2); } else { target=list4(list2(LVAR,0), target,ty,e2);
--- a/mc-codegen.h Mon Mar 17 20:57:01 2003 +0900 +++ b/mc-codegen.h Tue Mar 18 01:54:46 2003 +0900 @@ -27,8 +27,8 @@ /* function provided by mc-code-*.c */ -extern int get_register_var(void); -extern int get_fregister_var(void); +extern int get_register_var(NMTBL *); +extern int get_fregister_var(NMTBL *); /* function provided by mc-codegen.c */
--- a/mc-parse.c Mon Mar 17 20:57:01 2003 +0900 +++ b/mc-parse.c Tue Mar 18 01:54:46 2003 +0900 @@ -351,9 +351,6 @@ } } -static -NMTBL null_nptr; - static void decl(void) { @@ -811,9 +808,9 @@ case LDECL: if (stmode==REGISTER) { if(scalar(type)) { - ndsp = get_register_var(); + ndsp = get_register_var(n); } else if (type==FLOAT||type==DOUBLE) { - ndsp = get_fregister_var(); + ndsp = get_fregister_var(n); } else error(DCERR); nsc = car(ndsp); ndsp = cadr(ndsp); @@ -2042,12 +2039,12 @@ case INDIRECT: e=cadr(e); break; + case DREGISTER: + case REGISTER: case GVAR: case LVAR: e=list2(ADDRESS,e); break; - case FNAME: - return e; default:error(LVERR); } type=list2(POINTER,type); @@ -2170,8 +2167,13 @@ type=nptr->ty; getsym(); break; + case DREGISTER: + e1=list3(DREGISTER,nptr->dsp,(int)nptr); + type=nptr->ty; + getsym(); + break; case REGISTER: - e1=list2(REGISTER,nptr->dsp); + e1=list3(REGISTER,nptr->dsp,(int)nptr); type=nptr->ty; getsym(); break; @@ -2659,7 +2661,6 @@ } conv->funcall_(type); argtypes = caddr(type); - type = cadr(type); /* return type */ if (!integral(t=cadr(type))&&(car(t)==STRUCT||car(t)==UNION)) { /* skip return struct pointer */ if (argtypes==0) error(-1); @@ -2682,8 +2683,9 @@ checksym(RPAR); conv->funcall_args_(); if(car(t)==CODE) - return list3(FUNCTION,e1,arglist); + return list4(FUNCTION,e1,arglist,0); type=t; + type = cadr(type); /* return type */ if(type==CHAR) type=INT; else if(car(type)==STRUCT||car(type)==UNION) { /* make temporaly struct for return value */ @@ -2710,7 +2712,7 @@ append3(arglist,list2(ADDRESS,e),list2(POINTER,type)); } - return list3(FUNCTION,e1,arglist); + return list4(FUNCTION,e1,arglist,type); } static int @@ -3595,12 +3597,13 @@ } static int -macro_eval(int macrop,char *body,int history) +macro_eval(int macrop,char *body0,int history) { int c; int in_quote = 0; int in_wquote = 0; char *macro; + char *body = body0; int i; NMTBL *nptrm; c = 1;
--- a/mc.h Mon Mar 17 20:57:01 2003 +0900 +++ b/mc.h Tue Mar 18 01:54:46 2003 +0900 @@ -259,6 +259,7 @@ EXTERN NMTBL ntable[GSYMS+LSYMS]; EXTERN NMTBL *nptr,*gnptr; EXTERN NMTBL *fnptr; +EXTERN NMTBL null_nptr; EXTERN int typedefed,gtypedefed; EXTERN struct {int fd,ln;char *name0;FILE *fcb;} *filep,filestack[FILES];