changeset 207:8a3516f6eb66

*** empty log message ***
author kono
date Wed, 21 Apr 2004 14:26:47 +0900
parents 4170cefb48f6
children 70b1da1864f6
files .gdbinit Changes mc-code-powerpc.c mc.h
diffstat 4 files changed, 209 insertions(+), 161 deletions(-) [+]
line wrap: on
line diff
--- a/.gdbinit	Thu Apr 15 07:25:38 2004 +0900
+++ b/.gdbinit	Wed Apr 21 14:26:47 2004 +0900
@@ -1,6 +1,6 @@
 tb main
-# run  -s -ob00.s mc-parse.c
-run -s -Itest/ test/code-gen-all.c
+run  -s -ob00.s mc-parse.c
+# run -s -Itest/ test/code-gen-all.c
 define regs 
 printf "pc =%08x lr =%08x r0 =%08x r1 =%08x r3= %08x r4= %08x\n",$pc,$lr,$r0,$r1,$r3,$r4
 printf "r10=%08x r11=%08x r12=%08x r13=%08x r14=%08x r15=%08x\n",$r10,$r11,$r12,$r13,$r14,$r15
--- a/Changes	Thu Apr 15 07:25:38 2004 +0900
+++ b/Changes	Wed Apr 21 14:26:47 2004 +0900
@@ -3929,3 +3929,9 @@
 use_int とかで lreg は解放して良いんじゃない?
 
 creg =0 で free_register(creg) が呼ばれているね。困ったな。
+
+Sat Apr 17 17:01:02 JST 2004
+
+long long register で、regsと regv をそろえる
+必要はない。regs は普通に用意して、regv ではなくて、
+lreg_hとlreg_lみたいな感じにする。
--- a/mc-code-powerpc.c	Thu Apr 15 07:25:38 2004 +0900
+++ b/mc-code-powerpc.c	Wed Apr 21 14:26:47 2004 +0900
@@ -67,19 +67,20 @@
 #define MIN_TMP_FREG 1
 #define MAX_TMP_FREG 14
 
-#define RET_REGISTER regv[3]
-#define RET_FREGISTER regv[(1+FREG_OFFSET)]
-#define RET_LREGISTER_L 4    /* low word */
-#define RET_LREGISTER_H 3    /* high word */
-static int lreg_ret;
-#define RET_LREGISTER lreg_ret 
-
 int MAX_REGISTER=30;             /* PowerPCのレジスタを10個まで使う*/
 int MAX_FREGISTER=31;
 #define  REAL_MAX_REGISTER 32    /* PowerPCのレジスタが32ということ*/
 #define  REAL_MAX_FREGISTER 32    /* PowerPCのレジスタが32ということ*/
+#define  REAL_MAX_LREGISTER 16
 
 #define FREG_OFFSET REAL_MAX_REGISTER
+#define LREG_OFFSET (REAL_MAX_REGISTER+REAL_MAX_FREGISTER)
+
+#define RET_REGISTER 3
+#define RET_FREGISTER (1+FREG_OFFSET)
+#define RET_LREGISTER_L 4    /* low word */
+#define RET_LREGISTER_H 3    /* high word */
+#define RET_LREGISTER LREG_OFFSET
 
 int MAX_INPUT_REGISTER_VAR = 11-MIN_TMP_REG;
 int MAX_CODE_INPUT_REGISTER_VAR = 11-MIN_TMP_REG;
@@ -88,13 +89,18 @@
 int MAX_CODE_INPUT_DREGISTER_VAR = 14-MIN_TMP_FREG;
 int MAX_CODE_INPUT_FREGISTER_VAR = 14-MIN_TMP_FREG;
 
-static int powerpc_regs[REAL_MAX_REGISTER+REAL_MAX_FREGISTER];
-static int regv[REAL_MAX_REGISTER+REAL_MAX_FREGISTER];
+static int powerpc_regs[REAL_MAX_REGISTER+REAL_MAX_FREGISTER+
+   REAL_MAX_LREGISTER];
+static int regv_h0[REAL_MAX_LREGISTER];
+static int regv_l0[REAL_MAX_LREGISTER];
+#define regv_h(i)  regv_h0[i-LREG_OFFSET]
+#define regv_l(i)  regv_l0[i-LREG_OFFSET]
 
 static int *regs  = powerpc_regs;
 
-#define CREG_REGISTER  regv[MAX_TMP_REG]
-#define FREG_FREGISTER regv[MAX_TMP_FREG+FREG_OFFSET]
+#define CREG_REGISTER  (MAX_TMP_REG)
+#define FREG_FREGISTER (MAX_TMP_FREG+FREG_OFFSET)
+#define LREG_LREGISTER (MAX_TMP_REG+LREG_OFFSET)
 
 
 static int max_reg_var, max_freg_var;
@@ -110,50 +116,54 @@
     "f30","f31"
 }; 
 
-#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)
+#define register_name(i)  reg_name[i]
+#define fregister_name(i) reg_name[i]
+#define lregister_name_low(i) reg_name[regv_l(i)]
+#define lregister_name_high(i) reg_name[regv_l(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 is_longlong_reg(i)  (LREG_OFFSET<=i&&i<LREG_OFFSET+REAL_MAX_LREGISTER)
 
 
 int use_int(int i) { 
-    if (lreg) {
-	free_register(lreg); lreg = 0;
-    }
     if (!is_int_reg(i)) {
+	if (lreg) { free_register(lreg); lreg = 0; }
 	if (!ireg) ireg = get_register();
 	i = ireg;
     }
+    if (!regs[i]) regs[i]=USING_REG;
     return i;
 }
 
 int use_float(int i) { 
-    if (!is_float_reg(i)) i = freg;
-    if (!regs[cadr(i)]) regs[cadr(i)]=1;
+    if (!is_float_reg(i)) {
+	if (lreg) { free_register(lreg); lreg = 0; }
+	if (!freg) freg = get_dregister(0);
+	i = freg;
+    }
+    if (!regs[i]) regs[i]=USING_REG;
     return i;
 }
 
 int use_double(int i) { 
-    if (!is_float_reg(i)) i = freg;
-    if (!regs[cadr(i)]) regs[cadr(i)]=1;
+    if (!is_float_reg(i)) {
+	if (lreg) { free_register(lreg); lreg = 0; }
+	if (!freg) freg = get_dregister(1);
+	i = freg;
+    }
+    if (!regs[i]) regs[i]=USING_REG;
     return i;
 }
 
 int use_longlong(int i) {
-    if (ireg) {
-	free_register(ireg); ireg = 0;
-    }
     if (!is_longlong_reg(i)) {
 	if (!lreg) lreg = get_lregister();
 	i = lreg;
     }
+    if (!regs[i]) regs[i]=USING_REG;
+    if (!regs[regv_l(i)]) regs[regv_l(i)]=USING_REG;
+    if (!regs[regv_h(i)]) regs[regv_h(i)]=USING_REG;
     return i;
 }
 
@@ -177,7 +187,7 @@
 static void code_save_stacks();
 static void code_save_input_registers();
 static void clear_ptr_cache_reg(int r);
-static void    set_creg(int,int);
+static void    set_ireg(int,int);
 static void    set_freg(int,int);
 static void    set_lreg(int,int);
 
@@ -336,15 +346,13 @@
 void
 code_init(void)
 {
-    int i;
     macro_define("__ppc__ 1\n");
     macro_define("__BIG_ENDIAN__ 1\n");
 //    macro_define("_BSD_CT_RUNE_T_ int\n");
     macro_define("__STDC__ 1\n");
     init_ptr_cache();
-    lreg_ret = glist3(LREGISTER, RET_LREGISTER_L,RET_LREGISTER_H);
-    for(i=0;i<MAX_REGISTER;i++) { regv[i]=glist2(REGISTER,i); }
-    for(i=0;i<MAX_FREGISTER;i++) { regv[i+FREG_OFFSET]=glist2(DREGISTER,i+FREG_OFFSET); }
+    regv_l(RET_LREGISTER) = RET_LREGISTER_L;
+    regv_h(RET_LREGISTER) = RET_LREGISTER_H;
 }
 
 void
@@ -372,7 +380,7 @@
 
 void
 code_gexpr(int e){
-    if (is_int_reg(creg) && creg!=ireg) error(-1);
+//     if (is_int_reg(creg) && creg!=ireg) error(-1);
 }
 
 
@@ -385,6 +393,7 @@
     int freg_var = 0;
     int type;
     int reg;
+    int i;
     int is_code0 = is_code(fnptr);
 
     while (args) {
@@ -394,33 +403,34 @@
         if (scalar(type)) {
             if ((reg = get_input_register_var(reg_var,n,is_code0))) {
                 n->sc = REGISTER;
-                n->dsp = reg;
-                regs[cadr(n->dsp)]= INPUT_REG;
+                n->dsp = cadr(reg);
+                regs[n->dsp]= INPUT_REG;
                 reg_var++;
                 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 = reg;
-                regs[cadr(n->dsp)]= INPUT_REG;
+                n->dsp = cadr(reg);
+                regs[n->dsp]= INPUT_REG;
                 freg_var++;
                 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 = reg;
-                regs[cadr(n->dsp)]= INPUT_REG;
+                n->dsp = cadr(reg);
+                regs[n->dsp]= INPUT_REG;
                 freg_var++;
                 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;
+                n->dsp = cadr(reg);
+                regs[i=n->dsp]= INPUT_REG;
+                regs[regv_l(i)]= INPUT_REG;
+                regs[regv_h(i)]= INPUT_REG;
                 reg_var+=2;
                 cadddr(args)=size(type);
             }
@@ -438,7 +448,7 @@
     for(i=MAX_TMP_REG;i>MIN_TMP_REG;i--) {
 	if (regs[i]) continue;  /* 使われている */
 	regs[i]=USING_REG;      /* そのレジスタを使うことを宣言し */
-	return regv[i];   /* その場所を表す番号を返す */
+	return i;   /* その場所を表す番号を返す */
     }
     /* PTR_CACHE をつぶす */
     for(i=MAX_TMP_REG;i>MIN_TMP_REG;i--) {
@@ -447,7 +457,7 @@
 	} else 
 	    continue;
 	regs[i]=USING_REG;      /* そのレジスタを使うことを宣言し */
-	return regv[i];   /* その場所を表す番号を返す */
+	return i;   /* その場所を表す番号を返す */
     }
     /* search register stack */
     for(i=0;i<reg_sp;i++) {
@@ -475,7 +485,7 @@
         if (! regs[reg]) {       /* 使われていないなら */
             regs[reg]=USING_REG; /* そのレジスタを使うことを宣言し */
 	    if (i>max_reg_var) max_reg_var=i;
-	    return regv[reg];   /* その場所を表す番号を返す */
+	    return reg;   /* その場所を表す番号を返す */
         }
     }
     /* 空いている場所がないなら、エラー (いったい誰が使ってるの?) */
@@ -496,7 +506,7 @@
     for(i=MAX_TMP_FREG+FREG_OFFSET;i>MIN_TMP_FREG+FREG_OFFSET;i--) {
 	if (regs[i]) continue;    /* 使われている */
 	regs[i]=USING_REG;      /* そのレジスタを使うことを宣言し */
-	return regv[i];   /* その場所を表す番号を返す */
+	return i;   /* その場所を表す番号を返す */
     }
     /* search register stack */
     for(i=0;i<freg_sp;i++) {
@@ -512,7 +522,7 @@
         if (! regs[reg]) {       /* 使われていないなら */
             regs[reg]=USING_REG; /* そのレジスタを使うことを宣言し */
 	    if (i>max_freg_var) max_freg_var=i;
-	    return regv[reg];   /* その場所を表す番号を返す */
+	    return reg;   /* その場所を表す番号を返す */
         }
     }
     /* 空いている場所がないなら、エラー (いったい誰が使ってるの?) */
@@ -527,40 +537,69 @@
 #endif
 
 int
+get_lregister0()
+{
+    int i;
+    for(i=LREG_OFFSET+1;i<REAL_MAX_LREGISTER+LREG_OFFSET;i++) {
+	if (regs[i]==0) {
+	    return i;
+	}
+    }
+    return -1;
+}
+
+int
 get_lregister()
 {
-    int h,l,h0,l0;
-    h = get_register(); h0 = cadr(h);
-    l = get_register(); l0 = cadr(l);
-    return glist3(LREGISTER,l0,h0);
+    int h,l,i;
+    i = get_lregister0();
+    if (i==-1) return -1;
+    if (regs[i]==0) {
+	h = get_register(); 
+	if (h==-1) return -1;
+	regv_h(i) = h;
+	l = get_register(); 
+	if (l==-1) { free_register(h); return -1; }
+	regv_l(i) = l;
+	regs[i]=USING_REG;
+	return i;
+    }
+    return -1;
 }
 
 int
 get_lregister_var(NMTBL *n)
 {
-    int i,j;
+    int i,j,ll;
     int max_reg_var_save=max_reg_var;
-    for(i=0;i<REG_VAR_BASE-REG_VAR_MIN;i++) {
-	if (! regs[REG_VAR_BASE-i]) {       /* 使われていないなら */
-	    /* そのレジスタを使うことを宣言し */
-	    regs[REG_VAR_BASE-i]=USING_REG; 
-	    if (i>max_reg_var) max_reg_var=i;
-	    for(j=0;j<REG_VAR_BASE-REG_VAR_MIN;j++) {
-		if (! regs[REG_VAR_BASE-j]) {       /* 使われていないなら */
-		    /* そのレジスタを使うことを宣言し */
-		    regs[REG_VAR_BASE-j]=USING_REG; 
-		    if (j>max_reg_var) max_reg_var=j;
-		    /* その場所を表す番号を返す */
-		    return list3(LREGISTER,
-			glist3(LREGISTER,REG_VAR_BASE-j,REG_VAR_BASE-i),
-			(int)n); 
+    ll = get_lregister0();
+    if (ll==-1) return -1;
+    if (regs[ll]==0) {
+	for(i=0;i<REG_VAR_BASE-REG_VAR_MIN;i++) {
+	    if (! regs[REG_VAR_BASE-i]) {       /* 使われていないなら */
+		/* そのレジスタを使うことを宣言し */
+		regs[REG_VAR_BASE-i]=USING_REG; 
+		if (i>max_reg_var) max_reg_var=i;
+		for(j=0;j<REG_VAR_BASE-REG_VAR_MIN;j++) {
+		    if (! regs[REG_VAR_BASE-j]) {       
+			/* 使われていないなら */
+			/* そのレジスタを使うことを宣言し */
+			regs[REG_VAR_BASE-j]=USING_REG; 
+			if (j>max_reg_var) max_reg_var=j;
+			/* その場所を表す番号を返す */
+			regv_l(ll) = REG_VAR_BASE-j;
+			regv_h(ll) = REG_VAR_BASE-i;
+			return list3(LREGISTER,ll,(int)n); 
+		    }
 		}
+		/* ひとつしかなかった */
+		regs[REG_VAR_BASE-i]=0; 
+		max_reg_var=max_reg_var_save;
+		goto not_found;
 	    }
-	    /* ひとつしかなかった */
-	    regs[REG_VAR_BASE-i]=0; 
-	    max_reg_var=max_reg_var_save;
 	}
     }
+not_found:
     return list2(LVAR,new_lvar(size_of_longlong));
 }
 
@@ -573,12 +612,10 @@
 
 void 
 free_register(int i) {    /* いらなくなったレジスタを開放 */
-    int j;
-    if (i==0) return;
-    j = cadr(i); regs[j]=0;
-    if (car(i)==LREGISTER) {
-	j = caddr(i); regs[j]=0;
-	free_glist3(i);
+    regs[i]=0;
+    if (is_longlong_reg(i)) {
+	regs[regv_l(i)]=0;
+	regs[regv_h(i)]=0;
     }
 }
 
@@ -592,20 +629,26 @@
 	if (i<0||i>=MAX_INPUT_DREGISTER_VAR) return 0;
 	i = i+MIN_TMP_FREG+FREG_OFFSET;
     }
-    return list3(DREGISTER,regv[i],(int)n);
+    return list3(DREGISTER,i,(int)n);
 }
 
 int
 get_input_lregister_var(int i,NMTBL *n,int is_code)
 {
-    if (is_code) {
-	if(!(i+1<REG_VAR_BASE-REG_VAR_MIN)) return 0;
-	i = REG_VAR_BASE-i;
-    } else {
-	if (i<0||i+1>=MAX_INPUT_REGISTER_VAR) return 0;
-	i = i+MIN_TMP_REG;
-    }
-    return list3(LREGISTER,list3(LREGISTER,i+1,i),(int)n);
+    int ll;
+    ll = get_lregister0();
+    if (i!=-1) {
+	if (is_code) {
+	    if(!(i+1<REG_VAR_BASE-REG_VAR_MIN)) return 0;
+	    i = REG_VAR_BASE-i;
+	} else {
+	    if (i<0||i+1>=MAX_INPUT_REGISTER_VAR) return 0;
+	    i = i+MIN_TMP_REG;
+	}
+	regv_l(ll)=i;
+	regv_h(ll)=i+1;
+    } else { error(-1); ll=LREG_OFFSET+2; }
+    return list3(LREGISTER,ll,(int)n);
 }
 
 int
@@ -618,7 +661,7 @@
 	if (i<0||i>=MAX_INPUT_REGISTER_VAR) return 0;
 	i = i+MIN_TMP_REG;
     }
-    return list3(REGISTER,regv[i],(int)n);
+    return list3(REGISTER,i,(int)n);
 }
 
 /* double register case? */
@@ -633,7 +676,7 @@
 	if (i<0||i>=MAX_INPUT_REGISTER_VAR+1) return 0;
 	i = i+MIN_TMP_REG;
     }
-    return list3(REGISTER,regv[i],(int)n);
+    return list3(REGISTER,i,(int)n);
 }
 
 int
@@ -670,8 +713,9 @@
 {
     int i;
 #if LONGLONG_CODE
-    if (lreg) free_register(lreg); 
+    for(i=0;i<REAL_MAX_LREGISTER;i++) { regs[i+LREG_OFFSET]=0; }
     lreg = 0;
+    set_lreg(LREG_LREGISTER,0);
 #endif
     for(i=0;i<MAX_REGISTER;i++) { regs[i]=0; }
     for(i=0;i<MAX_FREGISTER;i++) { regs[i+FREG_OFFSET]=0; }
@@ -680,14 +724,14 @@
     set_freg(FREG_FREGISTER,0);
 #endif
     ireg = creg = get_register();
-    set_creg(CREG_REGISTER,0);
+    set_ireg(CREG_REGISTER,0);
     return;
 }
 
 void
 register_usage(char *s)
 {
-#if 0
+#if 1
     int i;
 #endif
     if (chk) return;
@@ -697,14 +741,28 @@
     if (freg) printf(" freg=%s",fregister_name(freg));
     if (lreg) printf(" lreg=%s,%s",lregister_name_high(lreg),
 	lregister_name_low(lreg));
-#if 0
+#if 1
     printf("\n# regs:");
-    for(i=0;i<MAX_REGISTER;i++) { printf("%d",regs[i]); }
+    for(i=0;i<MAX_REGISTER;i++) {  printf("%d ",regs[i]); }
+    printf(" stack ");
+    for(i=reg_sp;i>0;i--) {
+	if(reg_stack[i-1]>=0)
+	    printf(" %s",register_name(reg_stack[i]));
+    }
     printf("\n# freg:");
-    for(i=0;i<MAX_FREGISTER;i++) { printf("%d",regs[i+FREG_OFFSET]); }
-    for(i=reg_sp;i>=0;i--) {
-	if(reg_stack[i]>=0)
-	    printf(" %s",register_name(reg_stack[i]));
+    for(i=0;i<MAX_FREGISTER;i++) {  printf("%d ",regs[i+FREG_OFFSET]); }
+    printf(" stack ");
+    for(i=freg_sp;i>0;i--) {
+	if(freg_stack[i-1]>=0)
+	    printf(" %s",fregister_name(freg_stack[i]));
+    }
+    printf("\n# lreg:");
+    for(i=0;i<REAL_MAX_LREGISTER;i++) {  printf("%d ",regs[i+LREG_OFFSET]); }
+    printf(" stack ");
+    for(i=lreg_sp;i>0;i--) {
+	if(lreg_stack[i-1]>=0)
+	    printf(" %s",lregister_name_high(lreg_stack[i]));
+	    printf(",%s",lregister_name_low(lreg_stack[i]));
     }
 #endif
     printf("\n");
@@ -749,7 +807,7 @@
 	    regs[REG_VAR_BASE-i]=USING_REG; 
 	    if (i>max_reg_var) max_reg_var=i;
 	    /* その場所を表す番号を返す */
-	    return list3(REGISTER,glist2(REGISTER,REG_VAR_BASE-i),(int)n); 
+	    return list3(REGISTER,REG_VAR_BASE-i,(int)n); 
 	}
     }
     return list2(LVAR,new_lvar(size_of_int));
@@ -765,7 +823,7 @@
 	    if (i>max_freg_var) max_freg_var=i;
 	    /* その場所を表す番号を返す */
 	    return list3(DREGISTER,
-		glist2(DREGISTER,FREG_VAR_BASE-i+FREG_OFFSET),(int)n); 
+		FREG_VAR_BASE-i+FREG_OFFSET,(int)n); 
         }
     }
     return list2(LVAR,new_lvar(size_of_double));
@@ -795,28 +853,6 @@
     return xreg;
 }
 
-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 xreg;
-	}
-    } else {
-	xreg = freg_stack[freg_sp];
-	if (xreg<= -REG_LVAR_OFFSET) {
-	    return list2(LVAR,REG_LVAR_OFFSET+xreg);
-	} else {
-	    return xreg;
-	}
-    }
-    return xreg;
-}
-
 static int code_base;
 
 #define MAX_PTR_CACHE 10
@@ -881,7 +917,7 @@
     ptr_cache = p;         /* now the last one is the top */
     if (!caddr(p)) {
 	if((r=get_register())) {
-	    caddr(p)=r; regs[cadr(r)]=PTRC_REG;
+	    caddr(p)=r; regs[r]=PTRC_REG;
 	} else {
 	    error(-1);
 	    r=creg; /* this can't happen */
@@ -1269,7 +1305,7 @@
 	printf("\tbl L_%s$stub\n",memmove);
 	extern_define(memmove,0,FUNCTION,1);
         fix=0;
-	set_creg(RET_REGISTER,0);
+	set_ireg(RET_REGISTER,0);
 	if (creg!=to) {
 	    free_register(to); to = creg;
 	}
@@ -1323,15 +1359,16 @@
 }
 
 void
-set_creg(int reg,int mode)
+set_ireg(int reg,int mode)
 {
+    if (!is_int_reg(reg)) error(-1);
     if (reg!=creg) {
 	clear_ptr_cache_reg(reg);
 	if (ireg && reg!=ireg && mode) {
 	    printf("\tmr %s,%s\n",register_name(reg),register_name(ireg));
 	}
 	free_register(creg);
-	regs[cadr(creg)]=USING_REG;
+	regs[creg]=USING_REG;
     }
     creg = ireg = reg;
 }
@@ -1339,12 +1376,13 @@
 void
 set_freg(int reg,int mode)
 {
+    if (!is_float_reg(reg)) error(-1);
     if (reg!=creg) {
 	if (reg!=freg && mode) {
 	    printf("\tfmr %s,%s\n",fregister_name(reg),fregister_name(freg));
 	}
-	free_register(creg);
-	regs[cadr(freg)]=USING_REG;
+	if (creg!=ireg) free_register(creg);
+	regs[freg]=USING_REG;
     }
     creg = freg = reg;
 }
@@ -1352,6 +1390,7 @@
 void
 set_lreg(int reg,int mode)
 {
+    if (!is_longlong_reg(reg)) error(-1);
     if (reg!=creg) {
 	if (reg!=lreg && mode) {
 	    printf("\tmr %s,%s\n",
@@ -1359,23 +1398,21 @@
 	    printf("\tmr %s,%s\n",
 		lregister_name_high(reg),lregister_name_high(lreg));
 	}
-	regs[cadr(lreg)]=USING_REG;
-	regs[caddr(lreg)]=USING_REG;
-	free_register(creg);
+	regs[reg]=USING_REG;
+	regs[regv_l(reg)]=USING_REG;
+	regs[regv_h(reg)]=USING_REG;
+	if (creg!=ireg) free_register(creg);
     }
     creg = lreg = reg;
 }
 
 void
-use_var(int arg)
+use_reg(int arg)
 {
-    if (car(arg)==REGISTER)
-	regs[cadr(arg)]=USING_REG;
-    else if (car(arg)==DREGISTER)
-	regs[cadr(arg)]=USING_REG;
-    else if (car(arg)==LREGISTER) {
-	regs[cadr(arg)]=USING_REG;
-	regs[caddr(arg)]=USING_REG;
+    regs[arg]=USING_REG;
+    if (is_longlong_reg(arg)) {
+	regs[regv_l(arg)]=USING_REG;
+	regs[regv_h(arg)]=USING_REG;
     }
 }
 
@@ -1485,7 +1522,8 @@
 
     /* now all input register vars are free */
     code_save_stacks();
-    set_creg(CREG_REGISTER,0);
+    set_lreg(LREG_LREGISTER,0);
+    set_ireg(CREG_REGISTER,0);
     set_freg(FREG_FREGISTER,0);
 
     nargs = reg_arg = freg_arg = arg_assign = 0;
@@ -1504,7 +1542,7 @@
 	    } else {
 		arg = get_input_register_var(reg_arg,0,0); 
 	    }
-	    use_var(arg); /* protect from input register free */
+	    use_reg(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++;
@@ -1521,7 +1559,7 @@
 	    } else {
 		arg = get_input_lregister_var(reg_arg,0,0); 
 	    }
-	    use_var(arg); /* protect from input register free */
+	    use_reg(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++;
@@ -1551,8 +1589,8 @@
 		    /* else if (regs[r1]) error(-1); */
 		    r1=get_input_register_var_1(reg_arg+1,0,0);
 
-		    use_var(r0); /* protect from input register free */
-		    use_var(r1); /* protect from input register free */
+		    use_reg(r0); /* protect from input register free */
+		    use_reg(r1); /* protect from input register free */
 		    reg_arg_list = list2(r0,reg_arg_list);
 		    reg_arg_list = list2(r1,reg_arg_list);
 		    arg_assign = list2( assign_expr0(r0,e5,INT,INT), arg_assign);
@@ -1583,7 +1621,7 @@
 	    } else {
 		arg = get_input_dregister_var(freg_arg,0,0,1); 
 	    }
-	    use_var(arg); /* protect from input register free */
+	    use_reg(arg); /* protect from input register free */
 	    reg_arg_list = list2(arg,reg_arg_list);
 	    g_expr_u(assign_expr0(arg,e4,t,t)); /* XXX */
 	    freg_arg++;
@@ -1621,9 +1659,10 @@
 	set_freg(RET_FREGISTER,0);
     } else if (ret_type==ULONGLONG||ret_type==LONGLONG) {
 	set_lreg(RET_LREGISTER,0);
+	use_reg(RET_LREGISTER);
     } else if (ret_type==VOID) {
     } else {
-	set_creg(RET_REGISTER,0);
+	set_ireg(RET_REGISTER,0);
     }
     return ret_type;
 }
@@ -2055,7 +2094,8 @@
 void
 code_enter1(int args)
 {
-    set_creg(CREG_REGISTER,0);
+    set_lreg(LREG_LREGISTER,0);
+    set_ireg(CREG_REGISTER,0);
     set_freg(FREG_FREGISTER,0);
 }
 
@@ -2101,7 +2141,8 @@
 enter1()
 {
     text_mode();
-    set_creg(CREG_REGISTER,0);
+    set_lreg(LREG_LREGISTER,0);
+    set_ireg(CREG_REGISTER,0);
     set_freg(FREG_FREGISTER,0);
 }
 
@@ -2196,7 +2237,7 @@
 	set_lreg(RET_LREGISTER,mode);
     } else if (cadr(fnptr->ty)==VOID) {
     } else {
-	set_creg(RET_REGISTER,mode);
+	set_ireg(RET_REGISTER,mode);
     }
 }
 
@@ -2211,8 +2252,9 @@
 	set_freg(reg,mode);
     } else if (type==LONGLONG||type==ULONGLONG) {
 	set_lreg(reg,mode);
+	use_reg(reg);
     } else {
-	set_creg(reg,mode);
+	set_ireg(reg,mode);
     }
 }
 
@@ -2674,7 +2716,7 @@
     i2d_lib_used = 1;
     clear_ptr_cache();
     code_save_stacks();
-    set_creg(RET_REGISTER,1);
+    set_ireg(RET_REGISTER,1);
     printf("\tbl i2d_\n");
     set_freg(RET_FREGISTER,0);
 }
@@ -2722,7 +2764,7 @@
     d2u_lib_used=1;
     set_freg(RET_FREGISTER,1);
     printf("\tbl d2u_\n");
-    set_creg(RET_REGISTER,0);
+    set_ireg(RET_REGISTER,0);
 }
 
 static int u2d_lib_used=0;
@@ -2757,7 +2799,7 @@
     code_save_stacks();
     clear_ptr_cache();
     u2d_lib_used = 1;
-    set_creg(RET_REGISTER,1);
+    set_ireg(RET_REGISTER,1);
     printf("\tbl u2d_\n");
     set_freg(FREG_FREGISTER,0);
 }
@@ -3030,19 +3072,19 @@
 
 }
 
-static long long ll = 1LL;
+static long long ll0 = 1LL;
 
 static int 
 code_l1(long long d)
 {
-    int *i = (int *)&ll; int *j = (int *)&d;
+    int *i = (int *)&ll0; int *j = (int *)&d;
     return (i[1] == 1)?j[1]:j[0];
 }
 
 static int 
 code_l2(long long d)
 {
-    int *i = (int *)&ll; int *j = (int *)&d;
+    int *i = (int *)&ll0; int *j = (int *)&d;
     return (i[1] == 1)?j[0]:j[1];
 }
 
--- a/mc.h	Thu Apr 15 07:25:38 2004 +0900
+++ b/mc.h	Wed Apr 21 14:26:47 2004 +0900
@@ -196,7 +196,7 @@
 #define FRINDIRECT	(FOP+RINDIRECT)
 #define DRINDIRECT	(DOP+RINDIRECT)
 #define LRINDIRECT	(LOP+RINDIRECT)
-#define LURINDIRECT	(LOP+CURINDIRECT)
+#define LURINDIRECT	(LOP+URINDIRECT)
 #define RSTRUCT	27
 #define CONV	28