# HG changeset patch # User kono # Date 1058768017 -32400 # Node ID 33b39002ac580f9fc100e467fca845e512439f4f # Parent 17c6598617f8a633e6518855d89e6abb57974436 MIPS continue diff -r 17c6598617f8 -r 33b39002ac58 Changes --- a/Changes Sun Jul 20 16:45:09 2003 +0900 +++ b/Changes Mon Jul 21 15:13:37 2003 +0900 @@ -3139,3 +3139,16 @@ Mon Jul 14 14:25:23 JST 2003 なんか unsigned が通らなくなっているみたい。 + +Sun Jul 20 17:37:34 JST 2003 + +やっぱり dictionary は、書き直さないとだめだよな。 +それに関して、heap も修正した方が良い。このコード +はあんまりだものなぁ。 + +さて、あとは、オフセットだけど... めんど... + +Mon Jul 21 15:12:56 JST 2003 + +Frame pointer は使うの? 使った方がいいんじゃない? +PowerPC は使わなかったけど。 diff -r 17c6598617f8 -r 33b39002ac58 mc-code-mips.c --- a/mc-code-mips.c Sun Jul 20 16:45:09 2003 +0900 +++ b/mc-code-mips.c Mon Jul 21 15:13:37 2003 +0900 @@ -190,8 +190,9 @@ static FILE *asi; -int max_func_args; -int my_func_args; +static int max_func_args; +static int max_func_iargs; +static int my_func_args; #define ARG_LVAR_OFFSET 0x10000000 #define DOT_SIZE 1 @@ -250,8 +251,8 @@ #endif int lvar_offsetv = -disp+max_func_args*size_of_int+func_disp_offset; int r1_offsetv = -disp+max_func_args*size_of_int-reg_save+r1_offset; - printf(".set L_%d,%d\n",lvar_offset_label,lvar_offsetv); - printf(".set L_%d,%d\n",r1_offset_label,r1_offsetv); + printf("L_%d = %d\n",lvar_offset_label,lvar_offsetv); + printf("L_%d = %d\n",r1_offset_label,r1_offsetv); #if 0 printf("# function %s\n",fnptr->nm); l = ARG_LVAR_OFFSET; @@ -487,7 +488,7 @@ for(i=0;i=0) { code_dassign_lvar( - (freg_stack[i]=new_lvar(size_of_float)),reg,1); + (freg_stack[i]=new_lvar(size_of_float)),reg,0); freg_stack[i]= freg_stack[i]-REG_LVAR_OFFSET; return reg; } @@ -1448,6 +1449,7 @@ NMTBL *fn = 0; int jmp = 0; char *jrn; + int iargs=0; special_lvar = -1; ret_type = cadr(cadddr(e1)); @@ -1500,7 +1502,7 @@ use_var(arg); /* protect from input register free */ reg_arg_list = list2(arg,reg_arg_list); g_expr_u(assign_expr0(arg,e4,t,t)); - nargs ++ ; reg_arg++; + nargs ++ ; reg_arg++; iargs += size_of_int; continue; } else if (t==DOUBLE||t==FLOAT) { if (freg_arg>=MAX_INPUT_DREGISTER_VAR) { @@ -1519,10 +1521,12 @@ g_expr_u(assign_expr0(arg,e4,t,t)); /* XXX */ freg_arg++; nargs += size(t)/size_of_int; + if (t==DOUBLE) iargs += size(t); continue; } else if (car(t)==STRUCT||car(t)==UNION) { arg = list2(LVAR,caller_arg_offset_v(nargs)); nargs += struct_push(e4,t,arg); + iargs += ((size(t)+3)/size_of_int)*size_of_int; continue; } else { error(TYERR); @@ -1530,6 +1534,7 @@ ++nargs; } if (max_func_args=0 && max_freg_var<=3) max_freg_var=3; - reg_save = reg_save_offset(); - freg_save = 0; + reg_save = + (REAL_MAX_REGISTER-(REG_VAR_BASE-max_reg_var))*size_of_int; + freg_save = + (REAL_MAX_FREGISTER-(FREG_VAR_BASE-max_freg_var))*size_of_float; if (control) { code_set_return_register(1); @@ -2057,11 +2084,11 @@ } fprintf(asi,"L_%d=%d\n",r1_offset_label,0); fprintf(asi,"L_%d=%d\n",lvar_offset_label,0); - fprintf(asi,"L_%d=%d\n",mask_label,0); + fprintf(asi,"L_%d=0x%x\n",mask_label,code_mask_label()); fprintf(asi,"L_%d=%d\n",mask1_label,0); - fprintf(asi,"L_%d=%d\n",fmask_label ,0); + fprintf(asi,"L_%d=0x%x\n",fmask_label ,code_fmask_label()); fprintf(asi,"L_%d=%d\n",fmask1_label,0); - fprintf(asi,"L_%d=%d\n",cprestore_label ,0); + fprintf(asi,"L_%d=%d\n",cprestore_label ,max_func_iargs); disp &= -size_of_int; r1_offsetv = 0; @@ -2121,7 +2148,7 @@ gen_gdecl(char *n, int gpc) { if (stmode!=STATIC) - printf(".globl _%s\n",n); + printf("\t.globl _%s\n",n); } void @@ -2148,7 +2175,7 @@ if (chk) return; if (n->dsp != -1) { n->dsp = -1; /* initiallized flag */ - printf(".globl\t_%s\n",name); + /* printf(".globl\t_%s\n",name); */ data_mode(name); align(t); printf("_%s:\n",name); @@ -2171,7 +2198,7 @@ } } else if(t==DOUBLE) { d = dcadr(e); - printf("\t.word\t0x%x\n\t.word\t0x%x\n",code_d2(d),code_d1(d)); + printf("\t.word\t0x%x\n\t.word\t0x%x\n",code_d1(d),code_d2(d)); } else if(t==FLOAT) { f = dcadr(e); printf("\t.word\t0x%x\n",*(int *)&f); @@ -2289,6 +2316,13 @@ return d?"lfd":"lfs"; } +static +void code_dpfunc(char *f) +{ + if (max_func_iargs<16) max_func_iargs=16; + printf("\tjal %s\n",f); +} + void code_cmp_dregister(int e2,int d) { @@ -2299,7 +2333,8 @@ printf("\tli.d $6,%g\n",0.0); code_save_stacks(); move_dreg(4+DREG_OFFSET,freg); - printf("\tjal dpcmp\n"); + code_dpfunc("dpcmp"); + if (max_func_iargs<16) max_func_iargs=16; set_dreg(RET_DREGISTER,0); return; } else { @@ -2426,7 +2461,7 @@ if (d) { code_save_stacks(); move_dreg(4+DREG_OFFSET,freg); - printf("\tjal dpneg\n"); + code_dpfunc("dpneg"); set_dreg(RET_DREGISTER,0); } else { frn = fregister_name(freg); @@ -2438,7 +2473,7 @@ { code_save_stacks(); set_dreg(RET_DREGISTER,1); - printf("\tjal dptoli\n"); + code_dpfunc("dptoli"); set_creg(RET_REGISTER,0); regv[freg]=0; regv[creg]=1; @@ -2448,7 +2483,7 @@ { code_save_stacks(); set_creg(RET_REGISTER,1); - printf("\tjal litodp\n"); + code_dpfunc("litodp"); set_dreg(RET_DREGISTER,0); regv[freg]=1; regv[creg]=0; @@ -2458,7 +2493,7 @@ { code_save_stacks(); set_dreg(RET_DREGISTER,1); - printf("\tjal dptoul\n"); + code_dpfunc("dptoul"); set_creg(RET_REGISTER,0); regv[freg]=1; } @@ -2467,7 +2502,7 @@ { code_save_stacks(); set_creg(RET_REGISTER,1); - printf("\tjal ultodp\n"); + code_dpfunc("ultodp"); set_dreg(RET_DREGISTER,0); regv[freg]=1; } @@ -2475,14 +2510,14 @@ void code_d2f(int freg) { code_save_stacks(); set_dreg(RET_DREGISTER,1); - printf("\tjal dptofp\n"); + code_dpfunc("dptofp"); set_freg(RET_FREGISTER,0); } void code_f2d(int freg) { code_save_stacks(); set_freg(RET_FREGISTER,1); - printf("\tjal fptodp\n"); + code_dpfunc("fptodp"); set_dreg(RET_DREGISTER,0); } @@ -2540,7 +2575,7 @@ code_save_stacks(); set_dreg(RET_DREGISTER,1); code_drgvar(e2,d,RET_DREGISTER+2); - printf("\tjal dcmp\n"); + code_dpfunc("dcmp"); regv[dreg]=0; } else { frn=fregister_name(freg); @@ -2560,7 +2595,7 @@ code_save_stacks(); set_dreg(RET_DREGISTER,1); code_drgvar(e2,d,RET_DREGISTER+2); - printf("\tjal dcmp\n"); + code_dpfunc("dcmp"); regv[dreg]=0; } else { g=get_dregister(d); @@ -2580,7 +2615,7 @@ code_save_stacks(); set_dreg(RET_DREGISTER,1); move_dreg(RET_DREGISTER+2,e1); - printf("\tjal %s\n",opn); + code_dpfunc(opn); } else { frn=fregister_name(freg); grn=fregister_name(e1); @@ -2665,9 +2700,9 @@ printf("\tlw $5,%d(%s)\n",size_of_int,crn); printf("\tli.d $6,1.0\n"); if (caddr(e1)>0) - printf("\tjal dpadd\n"); + code_dpfunc("dpadd"); else - printf("\tjal dpsub\n"); + code_dpfunc("dpsub"); printf("\tsw $2,0(%s)\n",crn); printf("\tsw $3,%d(%s)\n",size_of_int,crn); creg = dreg; @@ -2707,9 +2742,9 @@ move_dreg(g,4+DREG_OFFSET); printf("\tli.d $6,1.0\n"); if (caddr(e1)>0) - printf("\tjal dpadd\n"); + code_dpfunc("dpadd"); else - printf("\tjal dpsub\n"); + code_dpfunc("dpsub"); set_dreg(RET_DREGISTER,0); printf("\tsw $2,0(%s)\n",crn); printf("\tsw $3,%d(%s)\n",size_of_int,crn); diff -r 17c6598617f8 -r 33b39002ac58 mc-code-powerpc.c --- a/mc-code-powerpc.c Sun Jul 20 16:45:09 2003 +0900 +++ b/mc-code-powerpc.c Mon Jul 21 15:13:37 2003 +0900 @@ -138,8 +138,8 @@ static void set_creg(int,int); static void set_freg(int,int); -int max_func_args; -int my_func_args; +static int max_func_args; +static int my_func_args; #define ARG_LVAR_OFFSET 0x10000000 /*