Mercurial > hg > CbC > old > device
diff mc-code-mips.c @ 205:a50f90d0b63a
*** empty log message ***
author | kono |
---|---|
date | Thu, 15 Apr 2004 01:01:51 +0900 |
parents | 4c614334f3d0 |
children | 32f54ab63b35 |
line wrap: on
line diff
--- a/mc-code-mips.c Tue Apr 13 12:26:56 2004 +0900 +++ b/mc-code-mips.c Thu Apr 15 01:01:51 2004 +0900 @@ -101,21 +101,18 @@ #define FREG_FREGISTER (MAX_TMP_FREG+FREG_OFFSET) #define DREG_DREGISTER (2+DREG_OFFSET) -int powerpc_regs[REAL_MAX_REGISTER+REAL_MAX_FREGISTER+REAL_MAX_DREGISTER]; -int powerpc_regv[REAL_MAX_REGISTER+REAL_MAX_FREGISTER+REAL_MAX_DREGISTER]; - -int dreg_pair0[REAL_MAX_DREGISTER] = { +static int powerpc_regs[REAL_MAX_REGISTER+REAL_MAX_FREGISTER+REAL_MAX_DREGISTER]; + +static int dreg_pair0[REAL_MAX_DREGISTER] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30 }; -int dreg_pair1[REAL_MAX_DREGISTER] = { +static int dreg_pair1[REAL_MAX_DREGISTER] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 }; -int *regv = powerpc_regv; -int *regs = powerpc_regs; +static int *regs = powerpc_regs; static int max_reg_var, max_freg_var; -static int cond_reg=-1,cond_freg=-1,cond_dreg=-1; static char *reg_name[] = { "$0","$1","$2","$3","$4","$5","$6","$7","$8","$9", @@ -321,7 +318,6 @@ void code_lvar(int e2,int creg) { lvar_address(e2,creg); - regv[creg]=1; } void @@ -332,8 +328,6 @@ void gexpr_code_init(void){ - regv[creg]=0; - regv[freg]=0; } void @@ -361,7 +355,6 @@ if ((reg = get_input_register_var(reg_var,n,is_code0))) { n->sc = REGISTER; n->dsp = cadr(reg); - regv[n->dsp]= 1; regs[n->dsp]= INPUT_REG; reg_var++; cadddr(args)=size_of_int; /* why we need this? */ @@ -370,7 +363,6 @@ if ((reg = get_input_dregister_var(freg_var,n,is_code0,0))) { n->sc = FREGISTER; n->dsp = cadr(reg); - regv[n->dsp]= 1; regs[n->dsp]= INPUT_REG; freg_var++; cadddr(args)=size(type); /* why we need this? */ @@ -379,7 +371,6 @@ if ((reg = get_input_dregister_var(reg_var,n,is_code0,1))) { n->sc = DREGISTER; n->dsp = cadr(reg); - regv[n->dsp]= 1; regs[n->dsp]= INPUT_REG; reg_var+=2; cadddr(args)=size(type); /* why we need this? */ @@ -425,7 +416,6 @@ reg =REG_VAR_BASE-i; if (! regs[reg]) { /* 使われていないなら */ regs[reg]=USING_REG; /* そのレジスタを使うことを宣言し */ - regv[reg]=0; if (i>max_reg_var) max_reg_var=i; return reg; } @@ -512,7 +502,6 @@ reg =FREG_VAR_BASE-i+FREG_OFFSET; if (! regs[reg]) { /* 使われていないなら */ regs[reg]=USING_REG; /* そのレジスタを使うことを宣言し */ - regv[reg]=0; if (i>max_freg_var) max_freg_var=i; return reg; } @@ -546,6 +535,11 @@ #if LONGLONG_CODE int +get_lregister() { + return -1; +} + +int get_lregister_var(NMTBL *n) { return list2(LVAR,new_lvar(size_of_double)); @@ -566,11 +560,11 @@ if (i<0||MAX_FREGISTER+FREG_OFFSET+REAL_MAX_DREGISTER<i) error(-1); if (is_double_reg(i)) { i0 = dreg_pair0[i-DREG_OFFSET]; - regv[i0]=regs[i0]=0; + regs[i0]=0; i1 = dreg_pair1[i-DREG_OFFSET]; - regv[i1]=regs[i1]=0; + regs[i1]=0; } - regv[i]=regs[i]=0; + regs[i]=0; } int @@ -631,10 +625,10 @@ int i,count,fcount; fcount = count = 0; for(i=0;i<MAX_REGISTER;i++) { - if (! regs[i] && ! regv[i]) count++; + if (! regs[i]) count++; } for(i=0;i<MAX_FREGISTER;i++) { - if (! regs[i+FREG_OFFSET] && ! regv[i+FREG_OFFSET]) fcount++; + if (! regs[i+FREG_OFFSET]) fcount++; } printf("# free reg %d freg %d\n",count,fcount); return d?fcount:count; @@ -656,9 +650,9 @@ free_all_register(void) { int i; - for(i=0;i<MAX_REGISTER;i++) { regs[i]=0; regv[i]=0; } - for(i=0;i<MAX_FREGISTER;i++) { regs[i+FREG_OFFSET]=0; regv[i+FREG_OFFSET]=0; } - for(i=0;i<MAX_DREGISTER;i++) { regs[i+DREG_OFFSET]=0; regv[i+DREG_OFFSET]=0; } + for(i=0;i<MAX_REGISTER;i++) { regs[i]=0; } + for(i=0;i<MAX_FREGISTER;i++) { regs[i+FREG_OFFSET]=0; } + for(i=0;i<MAX_DREGISTER;i++) { regs[i+DREG_OFFSET]=0; } creg = get_register(); #if FLOAT_CODE freg = get_dregister(0); @@ -686,7 +680,6 @@ register_name(ireg),fregister_name(freg),dregister_name0(dreg)); #if 0 printf("\n# regs:"); - for(i=0;i<MAX_REGISTER;i++) { printf("%d",regv[i]); } printf(":"); for(i=0;i<MAX_REGISTER;i++) { printf("%d",regs[i]); } printf("\n# freg:"); @@ -711,18 +704,6 @@ while(dreg_sp > 0) { free_register(dreg_stack[--dreg_sp]); } - if (cond_freg!=-1) { - if(car(cond_freg)==FREGISTER) free_register(cadr(cond_freg)); - cond_freg=-1; - } - if (cond_dreg!=-1) { - if(car(cond_dreg)==DREGISTER) free_register(cadr(cond_dreg)); - cond_dreg=-1; - } - if (cond_reg!=-1) { - if(car(cond_reg)==REGISTER) free_register(cadr(cond_reg)); - cond_reg=-1; - } cmpreg = -1; text_mode(); gexpr_code_init(); @@ -742,12 +723,6 @@ } int -register_var(int r) { - return r; -} - - -int get_register_var(NMTBL *n) { int i; @@ -755,7 +730,6 @@ if (! regs[REG_VAR_BASE-i]) { /* 使われていないなら */ /* そのレジスタを使うことを宣言し */ regs[REG_VAR_BASE-i]=USING_REG; - regv[REG_VAR_BASE-i]=0; if (i>max_reg_var) max_reg_var=i; /* その場所を表す番号を返す */ return list3(REGISTER,REG_VAR_BASE-i,(int)n); @@ -778,9 +752,7 @@ if (! regs[j=(DREG_VAR_BASE-i+DREG_OFFSET)]) { /* 使われていないなら */ if (regs[dreg_pair0[j]] || regs[dreg_pair1[j]]) continue; regs[DREG_VAR_BASE-i+DREG_OFFSET]=USING_REG; /*そのレジスタを使うことを宣言し*/ - regv[DREG_VAR_BASE-i+DREG_OFFSET]=0; regs[dreg_pair0[j]] = regs[dreg_pair1[j]] = USING_REG; - regv[dreg_pair0[j]] = regv[dreg_pair1[j]] = 0; if (dreg_pair1[j]>max_reg_var) max_reg_var=dreg_pair1[j]; /* その場所を表す番号を返す */ return list3(DREGISTER,DREG_VAR_BASE-i+DREG_OFFSET,(int)n); @@ -791,7 +763,6 @@ for(i=0;i<FREG_VAR_BASE-FREG_VAR_MIN;i++) { if (! regs[FREG_VAR_BASE-i+FREG_OFFSET]) { /* 使われていないなら */ regs[FREG_VAR_BASE-i+FREG_OFFSET]=USING_REG; /*そのレジスタを使うことを宣言し*/ - regv[FREG_VAR_BASE-i+FREG_OFFSET]=0; if (i>max_freg_var) max_freg_var=i; /* その場所を表す番号を返す */ return list3(FREGISTER,FREG_VAR_BASE-i+FREG_OFFSET,(int)n); @@ -809,7 +780,6 @@ new_reg = get_register(); reg_stack[reg_sp++] = creg; /* push するかわりにレジスタを使う */ ireg = creg = new_reg; - regv[creg]=1; } int @@ -822,7 +792,6 @@ code_rlvar(REG_LVAR_OFFSET+xreg,reg); free_lvar(REG_LVAR_OFFSET+xreg); xreg = reg; - regv[creg]=1; } return xreg; } @@ -836,20 +805,17 @@ void code_gvar(int e1,int creg) { printf("\tla %s,%s\n",register_name(creg),((NMTBL*)cadr(e1))->nm); - regv[creg]=1; } void code_rgvar(int e1,int creg) { printf("\tlw %s,%s\n",register_name(creg),((NMTBL*)cadr(e1))->nm); - regv[creg]=1; } char *cload(int sign,int sz) { return sz==1?(sign?"lbu":"lb"):(sz==size_of_short?(sign?"lhu":"lh"):"lw");} char *cstore(int sz) { return sz==1?"sb":(sz==size_of_short)?"sh":"sw";} void code_crgvar(int e1,int creg,int sign,int sz){ printf("\t%s %s,%s\n",cload(sign,sz),register_name(creg),((NMTBL*)cadr(e1))->nm); - regv[creg]=1; } @@ -857,7 +823,6 @@ code_register(int e2,int creg) { if (creg!=e2) printf("\tmove %s,%s\n",register_name(creg),register_name(e2)); - regv[creg]=1; } @@ -865,7 +830,6 @@ code_rlvar(int e2,int reg) { printf("\tlw %s,",register_name(reg)); lvar(e2); - regv[creg]=1; } @@ -873,21 +837,18 @@ code_crlvar(int e2,int reg,int sign,int sz) { printf("\t%s %s,",cload(sign,sz),register_name(reg)); lvar(e2); - regv[reg]=1; } void code_fname(NMTBL *n,int creg) { printf("\tla %s,%s\n",register_name(creg),n->nm); - regv[creg]=1; } void code_const(int e2,int creg) { printf("\tli %s,%d\n",register_name(creg),e2); - regv[creg]=1; } @@ -924,7 +885,6 @@ register_name(cadr(e2)),register_name(cadr(e2)), dir); if (cadr(reg)!=e2) printf("\tmove %s,%s\n",register_name(cadr(reg)),register_name(e2)); - regv[reg]=1; return; } g_expr(e2); @@ -935,7 +895,7 @@ printf("\taddu %s,%s,%d\n",drn,drn,dir); printf("\t%s %s,0(%s)\n",cstore(sz),drn,xrn); i=creg;creg=dreg;dreg=i; - regv[creg]=1; ireg=creg; + ireg=creg; free_register(dreg); } @@ -948,7 +908,6 @@ printf("\tmove %s,%s\n",register_name(reg),register_name(cadr(e2))); printf("\taddu %s,%s,%d\n", register_name(cadr(e2)),register_name(cadr(e2)),dir); - regv[reg]=1; return; } g_expr(e2); @@ -963,7 +922,7 @@ i=creg;creg=dreg;dreg=i; free_register(nreg); free_register(dreg); - regv[creg]=1; ireg=creg; + ireg=creg; } @@ -1035,7 +994,6 @@ code_cmp_crgvar(int e1,int sz) { if (cmpreg==-1) cmpreg = get_register(); code_crgvar(cadr(e1),cmpreg,1,sz); - regv[cmpreg]=1; } @@ -1043,7 +1001,6 @@ code_cmp_crlvar(int e2,int sz) { if (cmpreg==-1) cmpreg = get_register(); code_crlvar(e2,cmpreg,1,sz); - regv[cmpreg]=1; } @@ -1051,7 +1008,6 @@ code_cmp_rgvar(int e1) { if (cmpreg==-1) cmpreg = get_register(); code_rgvar(e1,cmpreg); - regv[cmpreg]=1; } @@ -1059,7 +1015,6 @@ code_cmp_rlvar(int e2) { if (cmpreg==-1) cmpreg = get_register(); code_rlvar(e2,cmpreg); - regv[cmpreg]=1; } @@ -1067,7 +1022,6 @@ code_cmp_register(int e2) { cmpreg = e2; /* prevent cmpreg freeing */ - regv[cmpreg]=2; } @@ -1180,8 +1134,6 @@ } } free_register(dreg); - regv[from]=regv[to]=regv[dreg]=0; - regv[creg]=1; } int @@ -1467,15 +1419,11 @@ } if (ret_type==DOUBLE) { set_dreg(RET_DREGISTER,0); - regv[dreg]=1; regv[creg]=0; } else if (ret_type==FLOAT) { set_freg(RET_FREGISTER,0); - regv[freg]=1; regv[creg]=0; } else if (ret_type==VOID) { - regv[freg]=0; regv[creg]=0; } else { set_creg(RET_REGISTER,0); - regv[freg]=0; regv[creg]=1; } return ret_type; } @@ -1564,12 +1512,10 @@ dregister_name0(dreg),offset,crn); printf("\tlw %s,%d(%s)\n", dregister_name1(dreg),offset+size_of_int,crn); - regv[creg]=0; regv[dreg]=1; creg = dreg; return DOUBLE; } else { printf("\tl.s %s,%d(%s)\n", fregister_name(freg),offset,crn); - regv[creg]=0; regv[freg]=1; creg = freg; return FLOAT; } @@ -1634,7 +1580,6 @@ } else { printf("\tsw %s,0(%s)\n",crn,drn); } - regv[creg]=1; } @@ -1647,7 +1592,6 @@ creg = xreg; if (creg!=reg) printf("\tmove %s,%s\n",register_name(creg),register_name(reg)); - regv[creg]=1; } @@ -1657,9 +1601,8 @@ int xreg; int edx = get_register(); if(!edx) error(-1); xrn = register_name(xreg = emit_pop(0)); /* pop e3 value */ - regv[xreg]=regs[xreg]=1; + regs[xreg]=1; printf("# assop\n\tmr %s,%s\n",register_name(edx),register_name(creg)); - regv[edx]=1; ld_indexx(byte,0,edx,sign); tosop(op,xreg); crn = register_name(creg); @@ -1667,7 +1610,6 @@ printf("\t%s %s,0(%s)\n",cstore(byte),crn,drn); free_register(edx); emit_pop_free(xreg); - regv[creg]=1; } @@ -1683,22 +1625,18 @@ dx = get_register(); if (dx<0) error(-1); code_rlvar(oreg+REG_LVAR_OFFSET,dx); oreg = dx; - regv[oreg]=1; } switch(op) { case LSHIFT: case ULSHIFT: shift("sll",oreg); - regv[creg]=1; return; case RSHIFT: shift("srl",oreg); - regv[creg]=1; return; case URSHIFT: shift("sra",oreg); - regv[creg]=1; return; } orn = register_name(oreg); @@ -1744,7 +1682,6 @@ error(-1); } if(oreg!=creg) free_register(oreg); - regv[creg]=1; } @@ -1791,7 +1728,6 @@ creg = use_int(creg); printf("\tli %s,%d\n",register_name(creg),e); cmpreg = csreg; - regv[cmpreg]=2; /* prevent from freeing */ } void @@ -1859,10 +1795,7 @@ cond?"ne":"eq", register_name(creg),register_name(cmpreg), l); - if (regv[cmpreg]==1) { - free_register(cmpreg); cmpreg = -1; - } - regv[creg]=0; + free_register(cmpreg); cmpreg = -1; } void @@ -2320,7 +2253,6 @@ printf("\tfmr %s,%s\n",fregister_name(freg),fregister_name(e2)); } } - regv[freg]=1; } void code_dassign_gvar(int e2,int freg,int d) @@ -2333,7 +2265,6 @@ } else { printf("\ts.s %s,0(%s)\n",fregister_name(freg),n->nm); } - regv[freg]=1; } void code_dassign_lvar(int e2,int freg,int d) @@ -2348,7 +2279,6 @@ printf("\ts.s %s,",fregister_name(freg)); } lvar(e2); - regv[freg]=1; } void code_dassign(int e2,int freg,int d) @@ -2360,7 +2290,6 @@ } else { printf("\ts.s %s,0(%s)\n",fregister_name(freg),register_name(e2)); } - regv[freg]=1; } void @@ -2412,7 +2341,6 @@ frn = fregister_name(freg); printf("\tli.s %s,%g\n",frn,value); } - regv[freg]=1; } @@ -2436,8 +2364,6 @@ set_dreg(RET_DREGISTER,1); code_dpfunc("dptoli"); set_creg(RET_REGISTER,0); - regv[freg]=0; - regv[creg]=1; } void code_i2d(int creg0) @@ -2446,8 +2372,6 @@ set_creg(RET_REGISTER,1); code_dpfunc("litodp"); set_dreg(RET_DREGISTER,0); - regv[freg]=1; - regv[creg]=0; } void code_d2u(int freg0) @@ -2456,7 +2380,6 @@ set_dreg(RET_DREGISTER,1); code_dpfunc("dptoul"); set_creg(RET_REGISTER,0); - regv[freg]=1; } void code_u2d(int creg0) @@ -2465,7 +2388,6 @@ set_creg(RET_REGISTER,1); code_dpfunc("ultodp"); set_dreg(RET_DREGISTER,0); - regv[freg]=1; } void code_d2f(int freg) { @@ -2513,7 +2435,6 @@ } else { printf("\tl.s %s,%s\n",fregister_name(freg),name); } - regv[freg]=1; } @@ -2525,7 +2446,6 @@ } else { printf("\tl.s %s,",fregister_name(freg)); lvar(e2); } - regv[freg]=1; } void code_cmp_drgvar(int e2,int d) @@ -2537,14 +2457,12 @@ set_dreg(RET_DREGISTER,1); code_drgvar(e2,d,RET_DREGISTER+2); code_dpfunc("dcmp"); - regv[dreg]=0; } else { frn=fregister_name(freg); g=get_dregister(d); code_drgvar(e2,d,g); printf("\tfc.eq.s %s,%s\n",frn,fregister_name(g)); free_register(g); - regv[freg]=0; } } @@ -2557,13 +2475,11 @@ set_dreg(RET_DREGISTER,1); code_drgvar(e2,d,RET_DREGISTER+2); code_dpfunc("dcmp"); - regv[dreg]=0; } else { g=get_dregister(d); code_drlvar(e2,d,g); printf("\tc.eq.s %s,%s\n",frn,fregister_name(g)); free_register(g); - regv[freg]=0; } } @@ -2592,7 +2508,6 @@ void dtosop(int op,int e1) { - regv[freg]=1; switch(op) { case FADD: dtosop0("fadd",e1,0,0); return; case DADD: dtosop0("dpadd",e1,1,0); return; @@ -2638,7 +2553,6 @@ emit_dpop_free(xreg,d); creg = freg; } - regv[creg]=1; } @@ -2682,7 +2596,6 @@ free_register(g); creg = freg; } - regv[creg]=1; } void @@ -2727,7 +2640,6 @@ free_register(g); creg = freg; } - regv[creg]=1; } @@ -2774,7 +2686,7 @@ reg = get_dregister(d); code_drlvar(REG_LVAR_OFFSET+xreg,d,reg); free_lvar(REG_LVAR_OFFSET+xreg); - regv[reg]=1; xreg=reg; + xreg=reg; } return xreg; } @@ -2792,11 +2704,9 @@ if (d) { dreg_stack[dreg_sp++] = dreg; /* push するかわりにレジスタを使う */ creg = dreg = new_reg; - regv[dreg]=1; } else { freg_stack[freg_sp++] = freg; /* push するかわりにレジスタを使う */ creg = freg = new_reg; - regv[freg]=1; } }