changeset 821:fe751ca164a2

i64 parse_mode fix...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 27 Nov 2010 03:46:55 +0900
parents 9598ecec0af5
children 8e7241d81f66
files mc-code-i64.c mc-codegen.c mc-parse.c
diffstat 3 files changed, 34 insertions(+), 26 deletions(-) [+]
line wrap: on
line diff
--- a/mc-code-i64.c	Fri Nov 26 19:38:40 2010 +0900
+++ b/mc-code-i64.c	Sat Nov 27 03:46:55 2010 +0900
@@ -1179,6 +1179,16 @@
     offset = disp;
     reg_in_arg = arg_size;
     printf("\t.set %s%d,%d\n",lpfx,lvar_offset_label,reg_in_arg);
+    if (!parse_mode && dots) {
+	int stype = type; int smode = mode;
+        type = INT;
+        mode = LDECL;
+        stmode = 0;
+	// lsearch defines local name
+        NMTBL *n = def(lsearch("__my_va_list",0),0);
+	n->dsp = offset;
+	type = stype; mode = smode;
+    }
 
     for(args = fnptr->dsp;args;args = cadr(args)) {
         n = ncadddr(args);
@@ -1221,6 +1231,7 @@
                 list3n(LVAR,offset,0),reg,LONGLONG,LONGLONG));
             offset+=SIZE_OF_LONGLONG;
             reg_var++;
+            free_register(cadr(reg));
         }
 	//  Intel64 keeps number of double value in %al
         while ((reg = get_input_dregister_var(freg_var,0,0,0))) {
@@ -1228,6 +1239,7 @@
                 list3n(LVAR,offset,0),reg,DOUBLE,DOUBLE));
             offset+=SIZE_OF_DOUBLE;
             freg_var++;
+            free_register(cadr(reg));
         }
     }
     // my_func_args = offset;
@@ -1246,6 +1258,7 @@
     int is_code0 = is_code(fnptr);
     int dots;
     arg_offset_v = 0;
+    int func_reg_arg_size = 0;
     function_type(fnptr->ty,&dots);
 
     if (dots && (in || !parse_mode)) {
@@ -1253,22 +1266,23 @@
         mode = LDECL;
         stmode = 0;
         n = def(lsearch("__my_va_list",0),0);
-        n->dsp = 0; // first argument
+	n->dsp = 0; // first argument
     }
     if (in) return;
+	// def in code_decl is useless, we have to recalcurate
 
     while (args) {
-        // we should use increment_arg
-        /* process in reverse order */
         n = ncadddr(args);
         type = n->ty;
+	int sz = size(type);
+	arg_offset_v = code_arg_alignment(arg_offset_v,n, type,sz, is_code0);
         if (type==LONGLONG||type==ULONGLONG) { // scalar includes LONGLONG, check first
             if ((reg = get_input_lregister_var(reg_var,n,is_code0))) {
 		n->sc = LREGISTER;
 		n->dsp = cadr(reg);
 		regs[n->dsp]= INPUT_REG;
 		reg_var+=1;
-		arg_offset_v += SIZE_OF_LONGLONG; // (caddr(args)=size(type));
+		func_reg_arg_size += SIZE_OF_LONGLONG ;
             }
         } else if (scalar(type)) { 
             if ((reg = get_input_register_var(reg_var,n,is_code0))) {
@@ -1276,7 +1290,7 @@
 		n->dsp = cadr(reg);
 		regs[n->dsp]= INPUT_REG;
                 reg_var++;
-                arg_offset_v += SIZE_OF_LONGLONG; // (caddr(args)=size(type));
+		func_reg_arg_size += SIZE_OF_LONGLONG ;
             }
         } else if (type==FLOAT) {
             if ((reg = get_input_dregister_var(freg_var,n,is_code0,0))) {
@@ -1284,7 +1298,7 @@
 		n->dsp = cadr(reg);
 		regs[n->dsp]= INPUT_REG;
                 freg_var++;
-                arg_offset_v += SIZE_OF_LONGLONG; // (caddr(args)=size(type));
+		func_reg_arg_size += SIZE_OF_LONGLONG ;
             }
         } else if (type==DOUBLE) {
             if ((reg = get_input_dregister_var(freg_var,n,is_code0,1))) {
@@ -1292,15 +1306,15 @@
 		n->dsp = cadr(reg);
 		regs[n->dsp]= INPUT_REG;
                 freg_var++;
-                arg_offset_v += SIZE_OF_LONGLONG; // (caddr(args)=size(type));
+		func_reg_arg_size += SIZE_OF_LONGLONG ;
             }
-        }
+	}
         args = cadr(args);
     }
     if (is_function(fnptr)) {
         if (dots) {
 		//  %al の値によって float を適切にloadする必要がある  sigh...
-                arg_offset_v =
+                func_reg_arg_size =
                     MAX_INPUT_REGISTER_VAR*SIZE_OF_LONGLONG +
                     MAX_INPUT_DREGISTER_VAR*SIZE_OF_DOUBLE;
 #ifndef __APPLE__
@@ -1308,7 +1322,8 @@
 		    arg_offset_v+ arg_offset);
 #endif
 	}
-	code_save_input_registers(dots, arg_offset_v);
+	code_save_input_registers(dots, func_reg_arg_size );
+	arg_offset_v = func_reg_arg_size;
     }
 }
 
--- a/mc-codegen.c	Fri Nov 26 19:38:40 2010 +0900
+++ b/mc-codegen.c	Sat Nov 27 03:46:55 2010 +0900
@@ -3517,7 +3517,10 @@
 	    n->dsp = args++;
 	    n->sc = IVAR;
 	} else {
-	    args = code_arg_alignment(args,n,type0,sz, is_code(fnptr));
+	    // this is useless, because we cannot know this function is code or function now
+	    // args = code_arg_alignment(args,n,type0,sz, is_code(fnptr));
+	    n->dsp = (args += size(type));
+	    n->sc = LVAR;
 	}
 
 	caddr(fnptr->dsp)=sz;
@@ -3679,14 +3682,14 @@
 // generate constant on global memory
 //
 static int
-emit_name(int e,NMTBL *n) 
+emit_name(int e,NMTBL *n, int sz) 
 {
 	switch(car(e)) {
 	case CONST:
-	    if (lp64) emit_longlong(e); else emit_int(cadr(e));
+	    if (lp64 && sz>4) emit_longlong(e); else emit_int(cadr(e));
 	    return 1;
 	case LCONST:
-	    if (lp64) emit_longlong(e); else emit_int(lcadr(e));
+	    if (lp64 && sz>4) emit_longlong(e); else emit_int(lcadr(e));
 	    return 1;
 	case ADDRESS:
 	    if (car(cadr(e))==GVAR)
@@ -3755,7 +3758,7 @@
 	    emit_longlong(e); 
 	    return;
 	}
-	if (lp64 && emit_name(e,n)) return;
+	if (lp64 && emit_name(e,n,size(t))) return;
 	break;
     default:
 	if (t<0) error(-1);
@@ -3767,7 +3770,7 @@
 	if (car(t)!=POINTER&&car(t)!=ARRAY) error(-1);
     case INT: case UNSIGNED:   /* including address case */
     case ENUM:
-	if (emit_name(e,n)) return;
+	if (emit_name(e,n,size(t))) return;
     }
     error(INERR);
 }
--- a/mc-parse.c	Fri Nov 26 19:38:40 2010 +0900
+++ b/mc-parse.c	Sat Nov 27 03:46:55 2010 +0900
@@ -2065,16 +2065,6 @@
 extern void
 code_arguments_fix(NMTBL *fnptr)
 {
-#if 0
-    /* reverse all argument offset (with size) */
-    int t;
-    int arglist = fnptr->dsp;
-    for(t=arglist;t;t=cadr(t)) {
-	NMTBL *n=ncadddr(t);
-	if(n->sc==LVAR)
-	    n->dsp = -n->dsp-caddr(t);
-    }
-#endif
     arg_register(fnptr, inmode);
 }