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;
     }
 }