Mercurial > hg > CbC > old > device
changeset 187:dffcccf8b1cb
nested COND
author | kono |
---|---|
date | Mon, 01 Dec 2003 19:06:30 +0900 |
parents | 6391432ca002 |
children | 4303255fc3cf |
files | Changes mc-code-ia32.c mc-code-powerpc.c mc-code.h mc-codegen.c mc-parse.c |
diffstat | 6 files changed, 60 insertions(+), 51 deletions(-) [+] |
line wrap: on
line diff
--- a/Changes Mon Dec 01 15:36:22 2003 +0900 +++ b/Changes Mon Dec 01 19:06:30 2003 +0900 @@ -3674,4 +3674,29 @@ 結構、実装が変わるから、code-$(ARCH) に移した方がいいかな。 - +なんか、arg_reording() が、 + PowerPC + fnptr->dsp = arg_reorder(reverse0(sarg),reverse0(fnptr->dsp)); + IA32 + fnptr->dsp = arg_reorder(sarg,fnptr->dsp); +ということになっているみたい。おんなじ順序じゃないのね。どうしようかな。 +これは、わかりました。 + + case COND: /* a?0:1 should consider non-brach instruction */ + case DCOND: + case FCOND: + d = (car(e1)==COND?INT:car(e1)==DCOND?DOUBLE:FLOAT); + e2=fwdlabel(); + b_expr(cadr(e1),0,e2,0); + g_expr0(caddr(e1)); + t = creg; + jmp(e3=fwdlabel()); + fwddef(e2); + g_expr0(cadddr(e1)); + code_set_fixed_creg(t,1,d); + fwddef(e3); + return d; + +なんだけど、t のcregが、ia32 ではvirtual register なので、変更される +ことがある。(こまったもんだね) +
--- a/mc-code-ia32.c Mon Dec 01 15:36:22 2003 +0900 +++ b/mc-code-ia32.c Mon Dec 01 19:06:30 2003 +0900 @@ -557,7 +557,7 @@ xreg = freg_stack[freg_sp]; if (xreg<= -REG_LVAR_OFFSET) { return list2(LVAR,REG_LVAR_OFFSET+xreg); - else { + } else { return list2(DREGISTER,xreg); } } @@ -565,28 +565,6 @@ } -int -stack_top(int type) -{ - int xreg; - if (type==INT) { - xreg = reg_stack[reg_sp]; - if (xreg<= -REG_LVAR_OFFSET) { - return list2(LVAR,REG_LVAR_OFFSET+xreg); - } else { - return list2(REGISTER,xreg); - } - } else { - xreg = freg_stack[freg_sp]; - if (xreg<= -REG_LVAR_OFFSET) { - return list2(LVAR,REG_LVAR_OFFSET+xreg); - else { - return list2(DREGISTER,xreg); - } - } - return xreg; -} - void code_label(int labelno) @@ -1507,12 +1485,21 @@ free_all_register(); } +int +code_get_fixed_creg(int reg,int type) { + if (type==FLOAT||type==DOUBLE) { + return 0; + } else { + return rname[reg]; + } +} void -code_set_fixed_creg(int mode,int type) { +code_set_fixed_creg(int reg,int mode,int type) { if (type==FLOAT||type==DOUBLE) { - } else - use_register(creg,REG_EAX,mode); + } else { + use_register(creg,reg,mode); + } } void
--- a/mc-code-powerpc.c Mon Dec 01 15:36:22 2003 +0900 +++ b/mc-code-powerpc.c Mon Dec 01 19:06:30 2003 +0900 @@ -1999,20 +1999,17 @@ } } +int +code_get_fixed_creg(int reg,int type) { + return creg; +} + void -code_set_fixed_creg(int mode,int type) { +code_set_fixed_creg(int reg,int mode,int type) { if (type==FLOAT||type==DOUBLE) { - if (cond_freg== -1) { - cond_freg = get_dregister_var(0,1); - if(car(cond_freg)!=DREGISTER) error(-1); - } - set_freg(cadr(cond_freg),mode); + set_freg(reg,mode); } else { - if (cond_reg== -1) { - cond_reg = get_register_var(0); - if(car(cond_reg)!=REGISTER) error(-1); - } - set_creg(cadr(cond_reg),mode); + set_creg(reg,mode); } }
--- a/mc-code.h Mon Dec 01 15:36:22 2003 +0900 +++ b/mc-code.h Mon Dec 01 19:06:30 2003 +0900 @@ -88,7 +88,8 @@ extern void drexpr(int e1, int e2,int l1, int op); extern void jcond(int l, char cond); extern void jmp(int l); -extern void code_set_fixed_creg(int mode,int type); +extern int code_get_fixed_creg(int reg,int type); +extern void code_set_fixed_creg(int reg,int mode,int type); extern void code_set_return_register(int mode); extern void text_mode(void); extern void global_table(void);
--- a/mc-codegen.c Mon Dec 01 15:36:22 2003 +0900 +++ b/mc-codegen.c Mon Dec 01 19:06:30 2003 +0900 @@ -287,16 +287,14 @@ 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); - t = g_expr0(caddr(e1)); - code_set_fixed_creg(1,t); + g_expr0(caddr(e1)); + t = code_get_fixed_creg(creg,d); jmp(e3=fwdlabel()); fwddef(e2); - code_set_fixed_creg(0,d); - t = g_expr0(cadddr(e1)); - code_set_fixed_creg(1,t); + g_expr0(cadddr(e1)); + code_set_fixed_creg(t,1,d); fwddef(e3); - return t; + return d; case STASS: sassign(e1); return RSTRUCT;
--- a/mc-parse.c Mon Dec 01 15:36:22 2003 +0900 +++ b/mc-parse.c Mon Dec 01 19:06:30 2003 +0900 @@ -1411,7 +1411,7 @@ fdecl(NMTBL *n) { int sd = stypedecl; - int sarg; + int arglist; if(!chk) enter(n->nm); fnptr=n; retlabel=fwdlabel(); @@ -1424,15 +1424,16 @@ n->sc = FUNCTION; mode=ADECL; if (sym!=LC) { - sarg = fnptr->dsp; + arglist = fnptr->dsp; fnptr->dsp =args=0; while (sym!=LC) { /* argument declaration !ANSI */ stmode=0; decl(); getsym(0); } - fnptr->dsp = arg_reorder(reverse0(sarg),reverse0(fnptr->dsp)); - } else - fnptr->dsp=reverse0(fnptr->dsp); + // arglist is set by adecl() and is reversed. + fnptr->dsp = arg_reorder(arglist,fnptr->dsp); + } + fnptr->dsp=reverse0(fnptr->dsp); fdecl_struct(fnptr->ty); /* insert extra argument for struct passing */ disp=0; arg_register(fnptr);