diff mc-code-powerpc.c @ 205:a50f90d0b63a

*** empty log message ***
author kono
date Thu, 15 Apr 2004 01:01:51 +0900
parents 4c614334f3d0
children 4170cefb48f6
line wrap: on
line diff
--- a/mc-code-powerpc.c	Tue Apr 13 12:26:56 2004 +0900
+++ b/mc-code-powerpc.c	Thu Apr 15 01:01:51 2004 +0900
@@ -33,7 +33,7 @@
 static int reg_save;
 static int freg_save;
 
-static int freg,ireg;
+static int freg,ireg,lreg;
 
 int size_of_int = 4;
 int size_of_short = 2;
@@ -42,13 +42,13 @@
 int size_of_longlong = 8;
 int endian = 1;
 
-int  reg_sp;   /* REGister Stack-Pointer */
-int reg_stack[MAX_MAX];  /* 実際のレジスタの領域 */
+static int  reg_sp;   /* REGister Stack-Pointer */
+static int reg_stack[MAX_MAX];  /* 実際のレジスタの領域 */
 
 /* floating point registers */
 
-int  freg_sp;  /* floating point REGister Stack-Pointer */
-int freg_stack[MAX_MAX]; /* 実際のレジスタの領域 */
+static int  freg_sp;  /* floating point REGister Stack-Pointer */
+static int freg_stack[MAX_MAX]; /* 実際のレジスタの領域 */
 
 #define REG_fp   1
 #define REG_sp   30
@@ -66,6 +66,8 @@
 
 #define RET_REGISTER 3
 #define RET_FREGISTER (1+FREG_OFFSET)
+#define RET_LREGISTER_L 4    /* low word */
+#define RET_LREGISTER_H 3    /* high word */
 
 int MAX_REGISTER=30;             /* PowerPCのレジスタを10個まで使う*/
 int MAX_FREGISTER=31;
@@ -84,14 +86,11 @@
 #define CREG_REGISTER  MAX_TMP_REG
 #define FREG_FREGISTER (MAX_TMP_FREG+FREG_OFFSET)
 
-int powerpc_regs[REAL_MAX_REGISTER+REAL_MAX_FREGISTER];
-int powerpc_regv[REAL_MAX_REGISTER+REAL_MAX_FREGISTER];
-
-int *regv  = powerpc_regv;
-int *regs  = powerpc_regs;
+static int powerpc_regs[REAL_MAX_REGISTER+REAL_MAX_FREGISTER];
+
+static int *regs  = powerpc_regs;
 
 static int max_reg_var, max_freg_var;
-static int cond_reg=-1,cond_freg=-1;
 
 static char *reg_name[] = {
     "r0","r1","r2","r3","r4","r5","r6","r7","r8","r9",
@@ -104,16 +103,27 @@
     "f30","f31"
 }; 
 
-#define register_name(i)  reg_name[i]
-#define fregister_name(i) reg_name[i]
-
-#define is_int_reg(i)  (0<=i&&i<REAL_MAX_REGISTER)
-#define is_float_reg(i)  (REAL_MAX_REGISTER<=i&&i<REAL_MAX_FREGISTER+REAL_MAX_REGISTER)
+#define register_name(i)  reg_name[cadr(i)]
+#define fregister_name(i) reg_name[cadr(i)]
+#define lregister_name_low(i) reg_name[cadr(i)]
+#define lregister_name_high(i) reg_name[caddr(i)]
+
+#define is_int_reg_0(i)  (0<=i&&i<REAL_MAX_REGISTER)
+#define is_float_reg_0(i)  (REAL_MAX_REGISTER<=i&&i<REAL_MAX_FREGISTER+REAL_MAX_REGISTER)
+
+#define is_int_reg(i)  (car(i)==REGISTER)
+#define is_float_reg(i)  (car(i)==DREGISTER)
+#define is_longlong_reg(i)  (car(i)==LREGISTER)
 
 
 int use_int(int i) { 
-    if (!is_int_reg(i)) i = ireg;
-    if (!regs[i]) regs[i]=1;
+    if (lreg) {
+	free_register(lreg); lreg = 0;
+    }
+    if (!is_int_reg(i)) {
+	if (!ireg) ireg = get_register();
+	i = lreg;
+    }
     return i;
 }
 
@@ -130,6 +140,13 @@
 }
 
 int use_longlong(int i) {
+    if (ireg) {
+	free_register(ireg); ireg = 0;
+    }
+    if (!is_longlong_reg(i)) {
+	if (!lreg) lreg = get_lregister();
+	i = lreg;
+    }
     return i;
 }
 
@@ -303,7 +320,6 @@
     lvar_intro(e2);
     printf("\tla %s,",register_name(creg));
     lvar(e2);
-    regv[creg]=1;
 }
 
 void
@@ -326,17 +342,17 @@
 	new_reg = get_register();
 	old_reg = creg;
 	ireg = creg = new_reg;
+	free_register(old_reg);
+	free_register(dm);
     } else if (is_float_reg(creg)) {
 	dm = get_dregister(1);
 	new_reg = get_dregister(1);
 	old_reg = creg;
 	freg = creg = new_reg;
+	free_register(old_reg);
+	free_register(dm);
     }
-    free_register(old_reg);
-    free_register(dm);
 #endif
-    regv[creg]=0;
-    regv[freg]=0;
 }
 
 void
@@ -363,29 +379,35 @@
         if (scalar(type)) {
             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;
+                n->dsp = reg;
+                regs[cadr(n->dsp)]= INPUT_REG;
                 reg_var++;
-                cadddr(args)=size_of_int; /* why we need this? */
+                cadddr(args)=size_of_int;
             }
         } else if (type==FLOAT) {
             if ((reg = get_input_dregister_var(freg_var,n,is_code0,0))) {
                 n->sc = DREGISTER;
-                n->dsp = cadr(reg);
-                regv[n->dsp]= 1;
-                regs[n->dsp]= INPUT_REG;
+                n->dsp = reg;
+                regs[cadr(n->dsp)]= INPUT_REG;
                 freg_var++;
-                cadddr(args)=size(type); /* why we need this? */
+                cadddr(args)=size(type);
             }
         } else if (type==DOUBLE) {
             if ((reg = get_input_dregister_var(freg_var,n,is_code0,1))) {
                 n->sc = DREGISTER;
-                n->dsp = cadr(reg);
-                regv[n->dsp]= 1;
-                regs[n->dsp]= INPUT_REG;
+                n->dsp = reg;
+                regs[cadr(n->dsp)]= INPUT_REG;
                 freg_var++;
-                cadddr(args)=size(type); /* why we need this? */
+                cadddr(args)=size(type);
+            }
+        } else if (type==LONGLONG||type==ULONGLONG) {
+            if ((reg = get_input_lregister_var(reg_var,n,is_code0))) {
+                n->sc = LREGISTER;
+                n->dsp = reg;
+                regs[cadr(n->dsp)]= INPUT_REG;
+                regs[caddr(n->dsp)]= INPUT_REG;
+                reg_var+=2;
+                cadddr(args)=size(type);
             }
         }
         args = cadr(args);
@@ -401,7 +423,7 @@
     for(i=MAX_TMP_REG;i>MIN_TMP_REG;i--) {
 	if (regs[i]) continue;  /* 使われている */
 	regs[i]=USING_REG;      /* そのレジスタを使うことを宣言し */
-	return i;               /* その場所を表す番号を返す */
+	return glist2(REGISTER,i);   /* その場所を表す番号を返す */
     }
     /* PTR_CACHE をつぶす */
     for(i=MAX_TMP_REG;i>MIN_TMP_REG;i--) {
@@ -410,7 +432,7 @@
 	} else 
 	    continue;
 	regs[i]=USING_REG;      /* そのレジスタを使うことを宣言し */
-	return i;               /* その場所を表す番号を返す */
+	return glist2(REGISTER,i);   /* その場所を表す番号を返す */
     }
     /* search register stack */
     for(i=0;i<reg_sp;i++) {
@@ -425,9 +447,8 @@
         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; 
+	    return glist2(REGISTER,reg);   /* その場所を表す番号を返す */
         }
     }
     /* 空いている場所がないなら、エラー (いったい誰が使ってるの?) */
@@ -448,7 +469,7 @@
     for(i=MAX_TMP_FREG+FREG_OFFSET;i>MIN_TMP_FREG+FREG_OFFSET;i--) {
 	if (regs[i]) continue;    /* 使われている */
 	regs[i]=USING_REG;      /* そのレジスタを使うことを宣言し */
-	return i;               /* その場所を表す番号を返す */
+	return glist2(DREGISTER,i);   /* その場所を表す番号を返す */
     }
     /* search register stack */
     for(i=0;i<freg_sp;i++) {
@@ -463,9 +484,8 @@
         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; 
+	    return glist2(DREGISTER,reg);   /* その場所を表す番号を返す */
         }
     }
     /* 空いている場所がないなら、エラー (いったい誰が使ってるの?) */
@@ -481,6 +501,16 @@
 
 #if LONGLONG_CODE
 int
+get_lregister()
+{
+    int h,l,h0,l0;
+    h = get_register(); h0 = cadr(h);
+    l = get_register(); l0 = cadr(l);
+    free_glist2(h); free_glist2(l);
+    return glist3(LREGISTER,l0,h0);
+}
+
+int
 get_lregister_var(NMTBL *n)
 {
     return list2(LVAR,new_lvar(size_of_longlong));
@@ -497,7 +527,7 @@
 void 
 free_register(int i) {    /* いらなくなったレジスタを開放 */
     if (i<0||MAX_FREGISTER+FREG_OFFSET<i) error(-1);
-    regv[i]=regs[i]=0;
+    regs[i]=0;
 }
 
 int
@@ -510,7 +540,20 @@
 	if (i<0||i>=MAX_INPUT_DREGISTER_VAR) return 0;
 	i = i+MIN_TMP_FREG+FREG_OFFSET;
     }
-    return list3(DREGISTER,i,(int)n);
+    return list3(DREGISTER,glist2(DREGISTER,i),(int)n);
+}
+
+int
+get_input_lregister_var(int i,NMTBL *n,int is_code)
+{
+    if (is_code) {
+	if(!(i<REG_VAR_BASE-REG_VAR_MIN)) return 0;
+	i = REG_VAR_BASE-i;
+    } else {
+	if (i<0||i>=MAX_INPUT_REGISTER_VAR) return 0;
+	i = i+MIN_TMP_REG;
+    }
+    return list3(LREGISTER,glist3(LREGISTER,i+1,i),(int)n);
 }
 
 int
@@ -523,7 +566,7 @@
 	if (i<0||i>=MAX_INPUT_REGISTER_VAR) return 0;
 	i = i+MIN_TMP_REG;
     }
-    return list3(REGISTER,i,(int)n);
+    return list3(REGISTER,glist2(REGISTER,i),(int)n);
 }
 
 /* double register case? */
@@ -538,7 +581,7 @@
 	if (i<0||i>=MAX_INPUT_REGISTER_VAR+1) return 0;
 	i = i+MIN_TMP_REG;
     }
-    return list3(REGISTER,i,(int)n);
+    return list3(REGISTER,glist2(REGISTER,i),(int)n);
 }
 
 int
@@ -547,16 +590,17 @@
     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;
 }
 
-int
+#if 0
+static int
 register_full(void)
 {
     int i;
@@ -567,13 +611,14 @@
     }
     return 1;    
 }
+#endif
 
 void
 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_REGISTER;i++) { regs[i]=0; }
+    for(i=0;i<MAX_FREGISTER;i++) { regs[i+FREG_OFFSET]=0; }
 #if FLOAT_CODE
     freg = get_dregister(1);
     set_freg(FREG_FREGISTER,0);
@@ -595,8 +640,6 @@
     printf(" creg=%s fgreg=%s",register_name(creg),fregister_name(freg));
 #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:");
     for(i=0;i<MAX_FREGISTER;i++) { printf("%d",regs[i+FREG_OFFSET]); }
@@ -617,15 +660,6 @@
     while(freg_sp > 0) {
 	free_register(freg_stack[--freg_sp]);
     }
-    if (cond_freg!=-1) { 
-	if(car(cond_freg)==DREGISTER) free_register(cadr(cond_freg)); 
-	else if(car(cond_freg)==FREGISTER) free_register(cadr(cond_freg)); 
-	cond_freg=-1; 
-    }
-    if (cond_reg!=-1)  { 
-	if(car(cond_reg)==REGISTER) free_register(cadr(cond_reg)); 
-	cond_reg=-1;  
-    }
     text_mode();
     gexpr_code_init();
     register_usage("gexpr_init");
@@ -642,11 +676,6 @@
     text_mode();
 }
 
-int
-register_var(int r) {
-    return r;
-}
-
 
 int
 get_register_var(NMTBL *n)
@@ -656,7 +685,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); 
@@ -677,7 +705,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(DREGISTER,FREG_VAR_BASE-i+FREG_OFFSET,(int)n); 
@@ -694,7 +721,6 @@
     new_reg = get_register();
     reg_stack[reg_sp++] = creg;     /* push するかわりにレジスタを使う */
     ireg = creg = new_reg;
-    regv[creg]=1;
 }
 
 int
@@ -707,7 +733,6 @@
         code_rlvar(REG_LVAR_OFFSET+xreg,reg);
 	free_lvar(REG_LVAR_OFFSET+xreg);
 	xreg = reg;
-	regv[creg]=1;
     }
     return xreg;
 }
@@ -839,7 +864,6 @@
     r = get_ptr_cache((NMTBL*)cadr(e1));
     if(r!=creg)
 	printf("\tmr %s,%s\n",register_name(creg),register_name(r));
-    regv[creg]=1;
     return;
 }
 
@@ -848,7 +872,6 @@
     if (!is_int_reg(creg)) error(-1);
     printf("\tlwz %s,0(%s)\n",register_name(creg),
                              register_name(get_ptr_cache((NMTBL*)cadr(e1))));
-    regv[creg]=1;
 }
 
 void
@@ -858,7 +881,6 @@
                              register_name(get_ptr_cache((NMTBL*)cadr(e1))));
     if (sign)
 	printf("\t%s %s,%s\n",cext(sz),crn,crn);
-    regv[creg]=1;
 }
 
 
@@ -867,7 +889,6 @@
 code_register(int e2,int creg) {
     if (creg!=e2)
 	printf("\tmr %s,%s\n",register_name(creg),register_name(e2));
-    regv[creg]=1;
 }
 
 
@@ -877,7 +898,6 @@
     if (!is_int_reg(reg)) error(-1);
     printf("\tlwz %s,",register_name(reg));
     lvar(e2);
-    regv[creg]=1;
 }
 
 void
@@ -887,7 +907,6 @@
     lvar(e2);
     if (sign)
 	printf("\t%s %s,%s\n",cext(sz),register_name(reg),register_name(reg));
-    regv[creg]=1;
 }
 
 
@@ -900,7 +919,6 @@
     r = get_ptr_cache(n);
     if(r!=creg)
 	printf("\tmr %s,%s\n",register_name(creg),register_name(r));
-    regv[creg]=1;
     return;
 }
 
@@ -914,7 +932,6 @@
 	printf("\tlis %s,ha16(%d)\n",crn,e2);
 	printf("\taddi %s,%s,lo16(%d)\n",crn,crn,e2);
     }
-    regv[creg]=1;
 }
 
 
@@ -946,7 +963,6 @@
 		register_name(cadr(e2)),register_name(cadr(e2)), dir);
 	if (cadr(reg)!=e2)
 	    printf("\tmr %s,%s\n",register_name(cadr(reg)),register_name(e2));
-	regv[reg]=1;
 	return;
     } 
     g_expr(e2);
@@ -959,7 +975,7 @@
     printf("\taddi %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);
 }
 
@@ -972,7 +988,6 @@
 	printf("\tmr %s,%s\n",register_name(reg),register_name(cadr(e2)));
 	printf("\taddi %s,%s,%d\n", 
 	    register_name(cadr(e2)),register_name(cadr(e2)),dir);
-	regv[reg]=1;
 	return;
     } 
     g_expr(e2);
@@ -989,7 +1004,7 @@
     i=creg;creg=dreg;dreg=i; 
     free_register(nreg);
     free_register(dreg);
-    regv[creg]=1; ireg=creg;
+    ireg=creg;
 }
 
 
@@ -1060,7 +1075,6 @@
     r = get_ptr_cache((NMTBL*)cadr(e1));
     printf("\t%s %s,0(%s)\n",cload(sz),crn,register_name(r));
     printf("\tcmpwi cr0,%s,0\n",crn);
-    regv[creg]=0;
 }
 
 
@@ -1071,7 +1085,6 @@
     printf("\t%s %s,",cload(sz),crn);
     lvar(e2);
     code_cmp_register(creg);
-    regv[creg]=0;
 }
 
 
@@ -1083,7 +1096,6 @@
     r = get_ptr_cache((NMTBL*)cadr(e1));
     printf("\tlwz %s,0(%s)\n",crn,register_name(r));
     code_cmp_register(creg);
-    regv[creg]=0;
 }
 
 
@@ -1094,7 +1106,6 @@
     printf("\tlwz %s,",crn);
     lvar(e2);
     code_cmp_register(creg);
-    regv[creg]=0;
 }
 
 
@@ -1216,8 +1227,6 @@
 	}
     }
     free_register(dreg);
-    regv[from]=regv[to]=regv[dreg]=0;
-    regv[creg]=1;
 }
 
 int
@@ -1516,12 +1525,9 @@
     }
     if (ret_type==DOUBLE||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;
 }
@@ -1610,7 +1616,6 @@
     crn=register_name(creg);
     printf("\t%s %s,%d(%s)\n",fload(d),
 	fregister_name(freg),offset,crn);
-    regv[creg]=0; regv[freg]=1;
     creg = freg;
     return DOUBLE;
 }
@@ -1677,7 +1682,6 @@
     } else {
 	printf("\tstw %s,0(%s)\n",crn,drn);
     }
-    regv[creg]=1;
 }
 
 
@@ -1690,7 +1694,6 @@
     creg = xreg;
     if (creg!=reg)
 	printf("\tmr %s,%s\n",register_name(creg),register_name(reg));
-    regv[creg]=1;
 }
 
 
@@ -1700,9 +1703,7 @@
     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;
     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);
@@ -1716,7 +1717,6 @@
     }
     free_register(edx);
     emit_pop_free(xreg);
-    regv[creg]=1;
 }
 
 
@@ -1732,22 +1732,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("slw",oreg);
-	regv[creg]=1;
 	return;
     case RSHIFT:
 	shift("sraw",oreg);
-	regv[creg]=1;
 	return;
     case URSHIFT:
 	shift("srw",oreg);
-	regv[creg]=1;
 	return;
     }
     orn = register_name(oreg);
@@ -1803,7 +1799,6 @@
 	error(-1);
     }
     if(oreg!=creg) free_register(oreg);
-    regv[creg]=1;
 }
 
 int 
@@ -2408,7 +2403,6 @@
 	if (is_int_reg(e2)) error(-1);
 	printf("\tfmr %s,%s\n",fregister_name(freg),fregister_name(e2));
     }
-    regv[freg]=1;
 }
 
 void code_dassign_gvar(int e2,int freg,int d)
@@ -2417,7 +2411,6 @@
     r = get_ptr_cache((NMTBL*)cadr(e2));
     if (!is_float_reg(freg)) error(-1);
     printf("\t%s %s,0(%s)\n",fstore(d),fregister_name(freg),register_name(r));
-    regv[freg]=1;
 }
 
 void code_dassign_lvar(int e2,int freg,int d)
@@ -2426,14 +2419,12 @@
     if (!is_float_reg(freg)) error(-1);
     printf("\t%s %s,",fstore(d),fregister_name(freg));
     lvar(e2);
-    regv[freg]=1;
 }
 
 void code_dassign(int e2,int freg,int d)
 { 
     if (!is_float_reg(freg)) error(-1);
     printf("\t%s %s,0(%s)\n",fstore(d),fregister_name(freg),register_name(e2));
-    regv[freg]=1;
 }
 
 void
@@ -2512,7 +2503,6 @@
 	printf("\tlfs %s,0(%s)\n",frn,rrn);
     }
     free_register(r);
-    regv[freg]=1;
 }
 
 
@@ -2541,7 +2531,6 @@
     printf("\tstfd  %s,",frn); lvar(e2);
     lvar_intro(e2+size_of_double-size_of_int);
     printf("\tlwz %s,",crn); lvar(e2+size_of_double-size_of_int);
-    regv[creg]=1;
 }
 
 static int i2d_lib_used=0;
@@ -2580,7 +2569,6 @@
     set_creg(RET_REGISTER,1);
     printf("\tbl i2d_\n");
     set_freg(RET_FREGISTER,0);
-    regv[freg]=1;
 }
 
 static int d2u_lib_used=0;
@@ -2627,7 +2615,6 @@
     set_freg(RET_FREGISTER,1);
     printf("\tbl d2u_\n");
     set_creg(RET_REGISTER,0);
-    regv[freg]=1;
 }
 
 static int u2d_lib_used=0;
@@ -2665,7 +2652,6 @@
     set_creg(RET_REGISTER,1);
     printf("\tbl u2d_\n");
     set_freg(FREG_FREGISTER,0);
-    regv[freg]=1;
 }
 
 void code_d2f(int freg) { }
@@ -2680,7 +2666,6 @@
     int r;
     r = get_ptr_cache((NMTBL*)cadr(e2));
     printf("\t%s %s,0(%s)\n",fload(d),fregister_name(freg),register_name(r));
-    regv[freg]=1;
 }
 
 
@@ -2688,7 +2673,6 @@
 { 
     lvar_intro(e2);
     printf("\t%s %s,",fload(d),fregister_name(freg)); lvar(e2);
-    regv[freg]=1;
 }
 
 void code_cmp_drgvar(int e2,int d)
@@ -2701,7 +2685,6 @@
     printf("\t%s %s,0(%s)\n",fload(1),grn,register_name(r));
     printf("\tfcmpu cr0,%s,%s\n",frn,grn);
     free_register(g);
-    regv[freg]=0;
 }
 
 void code_cmp_drlvar(int e2,int d)
@@ -2714,7 +2697,6 @@
     printf("\t%s %s,",fload(1),grn); lvar(e2);
     printf("\tfcmpu cr0,%s,%s\n",frn,grn);
     free_register(g);
-    regv[freg]=0;
 }
 
 void dtosop(int op,int e1)
@@ -2722,7 +2704,6 @@
     char *opn="";
     char *frn=fregister_name(freg);
     char *grn=fregister_name(e1);
-    regv[freg]=1;
     switch(op) {
     case FADD:
     case DADD: opn="fadd"; break;
@@ -2746,7 +2727,6 @@
 	error(-1); return;
     }
     printf("\t%s %s,%s,%s\n",opn,frn,frn,grn);
-    regv[freg]=1;
     free_register(e1);
 }
 
@@ -2762,7 +2742,6 @@
     dtosop(op,xreg);
     printf("\t%s %s,0(%s)\n",fstore(d),frn,crn);
     emit_dpop_free(xreg,d);
-    regv[freg]=1;
 }
 
 
@@ -2795,8 +2774,6 @@
     if (!is_float_reg(freg)) error(-1);
     printf("\t%s %s,0(%s)\n",fstore(d),frn,crn);
     free_register(g);
-    regv[freg]=1;
-    regv[ireg]=0;
     creg = freg;
 }
 
@@ -2829,8 +2806,6 @@
     if (!is_float_reg(freg)) error(-1);
     printf("\t%s %s,0(%s)\n",fstore(d),grn,crn);
     free_register(g);
-    regv[freg]=1;
-    regv[ireg]=0;
     creg = freg;
 }
 
@@ -2867,7 +2842,7 @@
 	reg = get_dregister(d);
         code_drlvar(REG_LVAR_OFFSET+xreg,1,reg);
 	free_lvar(REG_LVAR_OFFSET+xreg);
-	regv[reg]=1; xreg=reg;
+	xreg=reg;
     }
     return xreg;
 }
@@ -2884,7 +2859,6 @@
     new_reg = get_dregister(1);
     freg_stack[freg_sp++] = freg;     /* push するかわりにレジスタを使う */
     creg = freg = new_reg;
-    regv[freg]=1;
 }
 
 #endif