changeset 105:7e3d59e56a53

save register ( incomplete )
author kono
date Tue, 18 Mar 2003 01:54:46 +0900
parents c21aeb12b78b
children 3618c0efe9d3
files Changes mc-code-ia32.c mc-code-powerpc.c mc-code.h mc-codegen.c mc-codegen.h mc-parse.c mc.h
diffstat 8 files changed, 182 insertions(+), 70 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Mon Mar 17 20:57:01 2003 +0900
+++ b/Changes	Tue Mar 18 01:54:46 2003 +0900
@@ -2250,3 +2250,30 @@
 
 input register のsaveを忘れている。
 input register の割当が逆順。
+
+Mon Mar 17 23:38:14 JST 2003
+
+あぁ、そうか。input-register のアドレスを取ったときは、
+それをLVARに変えないとだめ。
+
+なんだけど、途中で分かっても、loop で前に戻ることがあるので、
+手遅れです。ということは、one path ではできないね。
+
+むぅ... function call の save_input_register も同じ「手遅れ」
+の問題があるのね。function argument は、すでに parse されて
+いて、その引数は、register に固定されてしまっている。
+save_input_register で、save するコードを出しても、
+そちらを見るようには出来てない。(どうすればいいんだ?)
+
+function callの先頭で、引数を全部stackにsaveしてしまえば、
+このあたりの問題は解決する。けど、あんまりな気もするね。
+でも、stmw も使えるしな...
+
+結局、input_register は、LVAR のまま処理して、可能ならば
+register を使うって方がいいんじゃないかなぁ.... でも、
+そうすると、今まで書いたコードは、ほとんど無駄かぁ...
+
+いずれにせよ、あんまり簡単な解決はないね。
+
+
+
--- a/mc-code-ia32.c	Mon Mar 17 20:57:01 2003 +0900
+++ b/mc-code-ia32.c	Tue Mar 18 01:54:46 2003 +0900
@@ -198,15 +198,15 @@
 }
 
 int 
-get_input_register_var(int i)
+get_input_register_var(int i,NMTBL *nptr)
 {
     i =  virtual(i+REG_ESI);
     regs[i]=regv[i]=1;
-    return list2(REGISTER,i);
+    return list3(REGISTER,i,(int)nptr);
 }
 
 int 
-get_input_fregister_var(int i)
+get_input_fregister_var(int i,NMTBL *nptr)
 {
     error(-1);
     return -1;
@@ -341,21 +341,21 @@
 
 
 int
-get_register_var(void)
+get_register_var(NMTBL *nptr)
 {
     int i;
     for(i=REG_ESI;i<REG_ESP;i++) {
         if (! regs[i]) {    /* 使われていないなら */
             regs[i]=1;      /* そのレジスタを使うことを宣言し */
             regv[i]=0;
-            return list2(REGISTER,i); /* その場所を表す番号を返す */
+            return list3(REGISTER,i,(int)nptr); /* その場所を表す番号を返す */
         }
     }
     return list2(LVAR,new_lvar(size_of_int));
 }
 
 int
-get_fregister_var(void)
+get_fregister_var(NMTBL *nptr)
 {
     return list2(LVAR,new_lvar(size_of_double));
 }
@@ -890,9 +890,10 @@
 int
 function(int e1)
 {
-    int e2,e3,e4,e5,nargs,t;
+    int e2,e3,e4,e5,nargs,t,ret_type;
     NMTBL *n;
     int save,saved;
+    ret_type = cadddr(e1);
 #ifdef SAVE_STACKS
     code_save_stacks();
 #endif
@@ -962,14 +963,14 @@
         free_register(save);
     }
     regv[save]=0;
-    if (fnptr->ty==DOUBLE||fnptr->ty==FLOAT) {
+    if (ret_type==DOUBLE||ret_type==FLOAT) {
 	fregv[freg]=1; regv[creg]=0;
-    } else if (fnptr->ty==VOID) {
+    } else if (ret_type==VOID) {
 	fregv[freg]=0; regv[creg]=0;
     } else {
 	fregv[freg]=0; regv[creg]=1;
     }
-    return fnptr->ty;
+    return ret_type;
 }
 
 void
--- a/mc-code-powerpc.c	Mon Mar 17 20:57:01 2003 +0900
+++ b/mc-code-powerpc.c	Tue Mar 18 01:54:46 2003 +0900
@@ -262,17 +262,17 @@
 }
 
 int
-get_input_fregister_var(int i)
+get_input_fregister_var(int i,NMTBL *n)
 {
     if (i<0||MAX_FREGISTER<i+MIN_TMP_FREG) error(-1);
-    return list2(DREGISTER,i+MIN_TMP_FREG);
+    return list3(DREGISTER,i+MIN_TMP_FREG,(int)n);
 }
 
 int
-get_input_register_var(int i)
+get_input_register_var(int i,NMTBL *n)
 {
     if (i<0||MAX_REGISTER<i+MIN_TMP_REG) error(-1);
-    return list2(REGISTER,i+MIN_TMP_REG);
+    return list3(REGISTER,i+MIN_TMP_REG,(int)n);
 }
 
 int
@@ -371,7 +371,7 @@
 
 
 int
-get_register_var(void)
+get_register_var(NMTBL *n)
 {
     int i;
     for(i=0;i<REG_VAR_BASE-REG_VAR_MIN;i++) {
@@ -379,7 +379,7 @@
             regs[REG_VAR_BASE-i]=USING_REG; /* そのレジスタを使うことを宣言し */
             regv[REG_VAR_BASE-i]=0;
 	    if (i>max_reg_var) max_reg_var=i;
-            return list2(REGISTER,i);       /* その場所を表す番号を返す */
+            return list3(REGISTER,i,(int)n); /* その場所を表す番号を返す */
         }
     }
     return list2(LVAR,new_lvar(size_of_int));
@@ -391,15 +391,15 @@
 }
 
 int
-get_fregister_var(void)
+get_fregister_var(NMTBL *n)
 {
     int i;
     for(i=0;i<FREG_VAR_BASE-REG_VAR_MIN;i++) {
         if (! regs[FREG_VAR_BASE-i]) {       /* 使われていないなら */
-            regs[FREG_VAR_BASE-i]=USING_REG; /* そのレジスタを使うことを宣言し */
+            regs[FREG_VAR_BASE-i]=USING_REG; /*そのレジスタを使うことを宣言し*/
             regv[FREG_VAR_BASE-i]=0;
 	    if (i>max_freg_var) max_freg_var=i;
-            return list2(DREGISTER,i);       /* その場所を表す番号を返す */
+            return list3(DREGISTER,i,(int)n); /* その場所を表す番号を返す */
         }
     }
     return list2(LVAR,new_lvar(size_of_double));
@@ -1037,33 +1037,72 @@
 	fregs[arg]=USING_REG;
 }
 
+void
+code_save_input_registers()
+{
+    int args;
+    NMTBL *n;
+    int reg;
+    int tag;
+    int lvar;
+    int t;
+    /* fnptr->dsp=list4(type,fnptr->dsp,(int)n,0); */
+
+    for(args = fnptr->dsp;args;args = cadr(args)) {
+	n = (NMTBL *)caddr(args);
+	tag = n->sc;
+	reg = n->dsp;
+	if (!n||n==&null_nptr) error(REG_ERR);
+	if (tag==REGISTER) {
+	    /* regs[reg]==INPUT_REG case should be considered */
+	    n->dsp = new_lvar(size_of_int);
+	    t = INT;
+	} else if (tag==DREGISTER) {
+	    /* fregs[reg]==INPUT_REG case should be considered */
+	    n->dsp = new_lvar(size_of_double);
+	    t = DOUBLE;
+	} else 
+	    continue;
+	n->sc  = LVAR;
+	lvar = list2(LVAR,n->dsp);
+	g_expr_u(assign_expr0(list2(LVAR,n->dsp),list3(tag,reg,(int)n),t,t));
+	if (tag==REGISTER) {
+	    free_register(reg);
+	} else if (tag==DREGISTER) {
+	    free_fregister(reg);
+	}
+    }
+}
+
 int
 function(int e1)
 {
     int e2,e3,e4,e5,nargs,t;
     int arg,reg_arg,freg_arg,arg_assign;
-    int reg_arg_list;
+    int reg_arg_list,ret_type;
     NMTBL *n;
     int jmp;
     char *jrn,*crn;
 
+    ret_type = cadddr(e1);
     code_save_stacks();
+    code_save_input_registers();
     /* now all input register vars are free */
     e2 = cadr(e1);
     reg_arg_list = nargs = reg_arg = freg_arg = arg_assign = 0;
-    for (e3 = caddr(e1); e3; e3 = cadr(e3)) {	
+    for (e3 = reverse0(caddr(e1)); e3; e3 = cadr(e3)) {	
 	t=caddr(e3);
 	n=(NMTBL *)(e5=(cadr(e4 = car(e3))));
 	if(scalar(t)) {
 	    if (reg_arg>MAX_INPUT_REGISTER_VAR) { 
 		arg = list2(LVAR,arg_offset_v(nargs));
 	    } else if (contains_in_list(e3,FUNCTION)) {
-		arg = get_register_var(); 
+		arg = get_register_var(0); 
 		arg_assign = list2(
-		    assign_expr0(get_input_register_var(reg_arg),arg,t,t),
+		    assign_expr0(get_input_register_var(reg_arg,0),arg,t,t),
 		    arg_assign);
 	    } else {
-		arg = get_input_register_var(reg_arg); 
+		arg = get_input_register_var(reg_arg,0); 
 		use_var(arg); /* protect from input register free */
 	    }
 	    reg_arg_list = list2(arg,reg_arg_list);
@@ -1074,12 +1113,12 @@
 	    if (freg_arg>MAX_INPUT_DREGISTER_VAR) {
 		arg = list2(LVAR,arg_offset_v(nargs));
 	    } else if (contains_in_list(e3,FUNCTION)) {
-		arg = get_fregister_var(); 
+		arg = get_fregister_var(0); 
 		arg_assign = list2(
-		    assign_expr0(get_input_register_var(reg_arg),arg,t,t),
+		    assign_expr0(get_input_register_var(reg_arg,0),arg,t,t),
 		    arg_assign);
 	    } else {
-		arg = get_input_fregister_var(freg_arg); 
+		arg = get_input_fregister_var(freg_arg,0); 
 		use_var(arg); /* protect from input register free */
 	    }
 	    reg_arg_list = list2(arg,reg_arg_list);
@@ -1122,16 +1161,16 @@
 	if (car(reg_arg_list)==DREGISTER) free_fregister(cadr(reg_arg_list));
 	else if (car(reg_arg_list)==REGISTER) free_register(cadr(reg_arg_list));
     }
-    if (fnptr->ty==DOUBLE||fnptr->ty==FLOAT) {
+    if (ret_type==DOUBLE||ret_type==FLOAT) {
 	set_freg(RET_FREGISTER,0);
         fregv[freg]=1; regv[creg]=0;
-    } else if (fnptr->ty==VOID) {
+    } else if (ret_type==VOID) {
         fregv[freg]=0; regv[creg]=0;
     } else {
 	set_creg(RET_REGISTER,0);
         fregv[freg]=0; regv[creg]=1;
     }
-    return fnptr->ty;
+    return ret_type;
 }
 
 void
--- a/mc-code.h	Mon Mar 17 20:57:01 2003 +0900
+++ b/mc-code.h	Tue Mar 18 01:54:46 2003 +0900
@@ -22,10 +22,10 @@
 extern char *register_name(int i,int byte);
 extern void gexpr_code_init(void);
 extern int register_var(int r);
-extern int get_register_var(void);
-extern int get_fregister_var(void);
-extern int get_input_register_var(int);
-extern int get_input_fregister_var(int);
+extern int get_register_var(NMTBL *n);
+extern int get_fregister_var(NMTBL *n);
+extern int get_input_register_var(int,NMTBL *);
+extern int get_input_fregister_var(int,NMTBL *);
 extern void emit_push(void);
 extern void emit_push_x(int xreg);
 extern int emit_pop(int type);
--- a/mc-codegen.c	Mon Mar 17 20:57:01 2003 +0900
+++ b/mc-codegen.c	Tue Mar 18 01:54:46 2003 +0900
@@ -26,15 +26,16 @@
     fregv   calue in floating point register
  */
 
-void remove0(int *parent,int e) ;
-void remove0_all(int *parent,int e) ;
-int is_same_type(int e1,int e2);
-void jump(int e1, int env);
-void machinop(int e1);
-void sassign(int e1);
-void assign(int e1);
-void assop(int e1);
-int g_expr0(int e1);
+static void remove0(int *parent,int e) ;
+/* static void remove0_all(int *parent,int e) ; */
+static int is_same_type(int e1,int e2);
+static void jump(int e1, int env);
+static void machinop(int e1);
+static void sassign(int e1);
+static void assign(int e1);
+static void assop(int e1);
+static int g_expr0(int e1);
+static int register_to_lvar(int e);
 
 void
 codegen_init()
@@ -165,7 +166,10 @@
     case DRINDIRECT: case FRINDIRECT:
 	return rindirect(e1);
     case ADDRESS:
-	return g_expr0(e2);
+	if (car(e2)==REGISTER||car(e2)==DREGISTER)
+	    return register_to_lvar(e2);
+	else
+	    return g_expr0(e2);
     case MINUS:  /* レジスタに対し、neglを実行すれば実現可能 */
 	g_expr0(e2); code_neg();
 	return INT;
@@ -469,26 +473,61 @@
         if (scalar(type)) {
             if(reg_var<max_input_register_var) {
                 n->sc = REGISTER;
-		n->dsp = cadr(get_input_register_var(reg_var));
-		regv[reg_var]= 1;
-		regs[reg_var]= INPUT_REG;
+		n->dsp = cadr(get_input_register_var(reg_var,n));
+		regv[n->dsp]= 1;
+		regs[n->dsp]= INPUT_REG;
                 reg_var++;
-                cadddr(fnptr->dsp)=size_of_int;
+                cadddr(args)=size_of_int; /* why we need this? */
             }
         } else if ((type==FLOAT||type==DOUBLE)&&stmode==REGISTER) {
             if(freg_var<max_input_fregister_var) {
                 n->sc = DREGISTER;
-		n->dsp = cadr(get_input_fregister_var(freg_var));
-		fregv[reg_var]= 1;
-		fregs[reg_var]= INPUT_REG;
+		n->dsp = cadr(get_input_fregister_var(freg_var,n));
+		fregv[n->dsp]= 1;
+		fregs[n->dsp]= INPUT_REG;
                 freg_var++;
-                cadddr(fnptr->dsp)=size_of_double;
+                cadddr(args)=size_of_double; /* why we need this? */
             }
         }
 	args = cadr(args);
     }
 }
 
+static int
+register_to_lvar(int e)
+{
+    error(REG_ERR);
+    return 0;
+#if 0
+    途中でレジスタからLVARに変更しても、間に合わない。
+
+    NMTBL *n = (NMTBL*)caddr(e);
+    int reg = cadr(e);
+    int tag = car(e);
+    int lvar;
+    int t;
+    if (!n||n==&null_nptr) error(REG_ERR);
+    if (tag==REGISTER) {
+	/* regs[reg]==INPUT_REG case should be considered */
+	n->dsp = new_lvar(size_of_int);
+        t = INT;
+    } else if (tag==DREGISTER) {
+	/* fregs[reg]==INPUT_REG case should be considered */
+	n->dsp = new_lvar(size_of_double);
+        t = DOUBLE;
+    } else error(-1);
+    n->sc  = LVAR;
+    lvar = list2(LVAR,n->dsp);
+    g_expr_u(assign_expr0(list2(LVAR,n->dsp),list3(tag,reg,(int)n),t,t));
+    if (tag==REGISTER) {
+	free_register(reg);
+    } else if (tag==DREGISTER) {
+	free_fregister(reg);
+    }
+    return g_expr0(lvar);
+#endif
+}
+
 /* goto arguments list                                      */
 /* target         list4(list2(tag,disp),cdr,ty,source_expr) */
 /*     source         expr=listn(tag,...)                   */
@@ -543,12 +582,12 @@
     int e1;
     /*新しいレジスタ(or スタック)を取得する*/
     if (sz==size_of_int && (e1=get_register())!=-1) {
-	e1=list2(REGISTER,e1);
+	e1=list3(REGISTER,e1,0);
 	*use=list3(t,*use,e1);
 	g_expr_u(assign_expr0(e1,s,ty,ty));
 	*target = append4(*target,t,ty,e1);
     } else if (sz==size_of_double && (e1=get_fregister())!=-1) {
-	e1=list2(DREGISTER,e1);
+	e1=list3(DREGISTER,e1,0);
 	*use=list3(t,*use,e1);
 	g_expr_u(assign_expr0(e1,s,ty,ty));
 	*target = append4(*target,t,ty,e1);
@@ -634,6 +673,7 @@
     }
 }
 
+/*
 void 
 remove0_all(int *parent,int e) 
 {
@@ -646,6 +686,7 @@
 	}
     }
 }
+ */
 
 int
 is_simple(int e1) 
@@ -715,11 +756,11 @@
 	e2 = car(e3); sz = size(ty=caddr(e3)); 
 	if (scalar(ty) && 
 		regs < MAX_CODE_INPUT_REGISTER_VAR) {
-	    target=list4(get_input_register_var(regs++), 
+	    target=list4(get_input_register_var(regs++,0), 
 		    target,ty,e2);
 	} else if ((ty==DOUBLE||ty==FLOAT) && 
 		fregs < MAX_CODE_INPUT_DREGISTER_VAR) {
-	    target=list4(get_input_fregister_var(fregs++), 
+	    target=list4(get_input_fregister_var(fregs++,0), 
 		    target,ty,e2);
 	} else {
 	    target=list4(list2(LVAR,0), target,ty,e2);
--- a/mc-codegen.h	Mon Mar 17 20:57:01 2003 +0900
+++ b/mc-codegen.h	Tue Mar 18 01:54:46 2003 +0900
@@ -27,8 +27,8 @@
 
 /* function provided by mc-code-*.c */
 
-extern int get_register_var(void);
-extern int get_fregister_var(void);
+extern int get_register_var(NMTBL *);
+extern int get_fregister_var(NMTBL *);
 
 /* function provided by mc-codegen.c */
 
--- a/mc-parse.c	Mon Mar 17 20:57:01 2003 +0900
+++ b/mc-parse.c	Tue Mar 18 01:54:46 2003 +0900
@@ -351,9 +351,6 @@
     }
 }
 
-static
-NMTBL null_nptr;
-
 static void
 decl(void)
 {
@@ -811,9 +808,9 @@
     case LDECL:
 	if (stmode==REGISTER) {
 	    if(scalar(type)) {
-		ndsp = get_register_var();
+		ndsp = get_register_var(n);
 	    } else if (type==FLOAT||type==DOUBLE) {
-		ndsp = get_fregister_var();
+		ndsp = get_fregister_var(n);
 	    } else error(DCERR);
 	    nsc = car(ndsp);
 	    ndsp = cadr(ndsp);
@@ -2042,12 +2039,12 @@
 	case INDIRECT:
 	    e=cadr(e);
 	    break;
+	case DREGISTER:
+	case REGISTER:
 	case GVAR:
 	case LVAR:
 	    e=list2(ADDRESS,e);
 	    break;
-	case FNAME:
-	    return e;
 	default:error(LVERR);
 	}
 	type=list2(POINTER,type);
@@ -2170,8 +2167,13 @@
 	    type=nptr->ty;
 	    getsym();
 	    break;
+	case DREGISTER:
+	    e1=list3(DREGISTER,nptr->dsp,(int)nptr);
+	    type=nptr->ty;
+	    getsym();
+	    break;
 	case REGISTER:
-	    e1=list2(REGISTER,nptr->dsp);
+	    e1=list3(REGISTER,nptr->dsp,(int)nptr);
 	    type=nptr->ty;
 	    getsym();
 	    break;
@@ -2659,7 +2661,6 @@
     }
     conv->funcall_(type);
     argtypes = caddr(type);
-    type = cadr(type); /* return type */
     if (!integral(t=cadr(type))&&(car(t)==STRUCT||car(t)==UNION)) {
 	/* skip return struct pointer */
 	if (argtypes==0) error(-1);
@@ -2682,8 +2683,9 @@
     checksym(RPAR);
     conv->funcall_args_();
     if(car(t)==CODE)
-	return list3(FUNCTION,e1,arglist);
+	return list4(FUNCTION,e1,arglist,0);
     type=t;
+    type = cadr(type); /* return type */
     if(type==CHAR) type=INT;
     else if(car(type)==STRUCT||car(type)==UNION) {
 	/* make temporaly struct for return value */
@@ -2710,7 +2712,7 @@
 
 	append3(arglist,list2(ADDRESS,e),list2(POINTER,type));
     }
-    return list3(FUNCTION,e1,arglist);
+    return list4(FUNCTION,e1,arglist,type);
 }
 
 static int
@@ -3595,12 +3597,13 @@
 }
 
 static int
-macro_eval(int macrop,char *body,int history)
+macro_eval(int macrop,char *body0,int history)
 {
     int c;
     int in_quote = 0;
     int in_wquote = 0;
     char *macro;
+    char *body = body0;
     int i;
     NMTBL *nptrm;
     c = 1;
--- a/mc.h	Mon Mar 17 20:57:01 2003 +0900
+++ b/mc.h	Tue Mar 18 01:54:46 2003 +0900
@@ -259,6 +259,7 @@
 EXTERN NMTBL ntable[GSYMS+LSYMS];
 EXTERN NMTBL *nptr,*gnptr;
 EXTERN NMTBL *fnptr;
+EXTERN NMTBL null_nptr;
 EXTERN int typedefed,gtypedefed;
 
 EXTERN struct {int fd,ln;char *name0;FILE *fcb;} *filep,filestack[FILES];