changeset 122:b884271bcab2 long-argument

input registers (long arguments )
author kono
date Mon, 24 Mar 2003 01:28:02 +0900
parents 00df510bc116
children 5f180dc8d84e
files Makefile mc-code-powerpc.c test/basic.c
diffstat 3 files changed, 26 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/Makefile	Sun Mar 23 23:10:48 2003 +0900
+++ b/Makefile	Mon Mar 24 01:28:02 2003 +0900
@@ -47,7 +47,7 @@
 	make check TARGET=test/tmp8
 	make check TARGET=test/tmp9
 
-check:
+check: $(MC)
 	-gcc $(TARGET).c -o b.out
 	-b.out > $(TARGET).gcc.out
 	-$(MC) -s $(TARGET).c
--- a/mc-code-powerpc.c	Sun Mar 23 23:10:48 2003 +0900
+++ b/mc-code-powerpc.c	Mon Mar 24 01:28:02 2003 +0900
@@ -53,14 +53,14 @@
 #define RET_FREGISTER 1
 
 int MAX_REGISTER=30;             /* PowerPCのレジスタを10個まで使う*/
-int MAX_FREGISTER=30;
+int MAX_FREGISTER=31;
 #define  REAL_MAX_REGISTER 32    /* PowerPCのレジスタが32ということ*/
 #define  REAL_MAX_FREGISTER 32    /* PowerPCのレジスタが32ということ*/
 
-int MAX_INPUT_REGISTER_VAR = 10-MIN_TMP_REG;
-int MAX_CODE_INPUT_REGISTER_VAR = 10-MIN_TMP_REG;
-int MAX_INPUT_DREGISTER_VAR = 13-MIN_TMP_FREG;
-int MAX_CODE_INPUT_DREGISTER_VAR = 13-MIN_TMP_FREG;
+int MAX_INPUT_REGISTER_VAR = 11-MIN_TMP_REG;
+int MAX_CODE_INPUT_REGISTER_VAR = 11-MIN_TMP_REG;
+int MAX_INPUT_DREGISTER_VAR = 14-MIN_TMP_FREG;
+int MAX_CODE_INPUT_DREGISTER_VAR = 14-MIN_TMP_FREG;
 
 #define CREG_REGISTER  MAX_TMP_REG
 #define FREG_FREGISTER MAX_TMP_FREG
@@ -146,13 +146,13 @@
                        <------r1_offset------------------------------>
                                       <------------lvar_offset------->
  r+  +------------+---+---------------+----------+--------------+----+    -
-      caller arg   xx   register save   local      callee arg     xx
+      callee arg   xx   register save   local      caller arg     xx
                           reg_save      disp       max_func_args*size_of_int
         lvar>0                         lvar<0       lvar>0x1000 0000
  */
-int arg_offset = 44; int arg_offset1 = 24; int disp_offset = -12;
-#define r1_offset 60 
-#define func_disp_offset (r1_offset-12)
+int arg_offset = 24; int arg_offset1 = 24; int disp_offset = -12;
+#define func_disp_offset 60
+#define r1_offset func_disp_offset+12 
 int code_disp_offset = 0; int jump_offset = 0;
 #define CODE_LVAR l+code_disp_offset
 #define FUNC_LVAR l+disp_offset
@@ -171,9 +171,9 @@
     l = ARG_LVAR_OFFSET;
 printf("# offset call0\t%d\n",CALLER_ARG);
     l = ARG_LVAR_OFFSET+max_func_args*size_of_int;
-printf("# offset calln\t%d\n",CALLER_ARG);
+printf("# offset calln\t%d %d\n",CALLER_ARG,max_func_args*size_of_int);
     l = disp;
-printf("# offset lvarn\t%d\n",FUNC_LVAR+lvar_offsetv);
+printf("# offset lvarn\t%d %d\n",FUNC_LVAR+lvar_offsetv,disp);
     l = 0;
 printf("# offset lvar0\t%d\n",FUNC_LVAR+lvar_offsetv);
     l = -reg_save;
@@ -182,7 +182,7 @@
     l = 0;
 printf("# offset carg0\t%d\n",CALLEE_ARG+r1_offsetv);
     l = my_func_args;
-printf("# offset cargn\t%d\n",CALLEE_ARG+r1_offsetv);
+printf("# offset cargn\t%d %d\n",CALLEE_ARG+r1_offsetv,my_func_args);
 }
 
 
@@ -487,8 +487,8 @@
             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); 
+	    /* その場所を表す番号を返す */
+	    return list3(REGISTER,REG_VAR_BASE-i,(int)n); 
         }
     }
     return list2(LVAR,new_lvar(size_of_int));
@@ -508,7 +508,8 @@
             regs[FREG_VAR_BASE-i]=USING_REG; /*そのレジスタを使うことを宣言し*/
             regv[FREG_VAR_BASE-i]=0;
 	    if (i>max_freg_var) max_freg_var=i;
-            return list3(DREGISTER,i,(int)n); /* その場所を表す番号を返す */
+	    /* その場所を表す番号を返す */
+	    return list3(DREGISTER,FREG_VAR_BASE-i,(int)n); 
         }
     }
     return list2(LVAR,new_lvar(size_of_double));
@@ -1246,8 +1247,10 @@
 	    if(t==FLOAT) { offset+=size_of_float; reg_offset+=1; }
 	    else if(t==DOUBLE) { offset+=size_of_double; reg_offset+=2; }
 	    else error(-1);
-	} else 
+	} else {
+	    offset += size(n->ty);
 	    continue;
+	}
 	n->sc  = LVAR;
 	lvar = list2(LVAR,n->dsp);
 	g_expr_u(assign_expr0(list2(LVAR,n->dsp),list3(tag,reg,(int)n),n->ty,t));
@@ -1312,7 +1315,7 @@
 	t=caddr(e3);
 	e4 = car(e3);
 	if(scalar(t)) {
-	    if (reg_arg>MAX_INPUT_REGISTER_VAR) { 
+	    if (reg_arg>=MAX_INPUT_REGISTER_VAR) { 
 		arg = list2(LVAR,caller_arg_offset_v(nargs));
 	    } else if (!simple_args(e3) && cadr(e3)) {
 		arg = get_register_var(0); 
@@ -1328,7 +1331,7 @@
 	    nargs ++ ; reg_arg++;
 	    continue;
 	} else if (t==DOUBLE||t==FLOAT) {
-	    if (reg_arg<MAX_INPUT_REGISTER_VAR+1) {
+	    if (reg_arg<MAX_INPUT_REGISTER_VAR) {
 		/* sigh... 
                    printf requies floating value in integer registers
                  */
@@ -1355,7 +1358,7 @@
 			INT,INT), arg_assign);
 		reg_arg += 2;
 	    }
-	    if (freg_arg>=4 && freg_arg<=MAX_INPUT_DREGISTER_VAR) { 
+	    if (freg_arg>=4 && freg_arg<MAX_INPUT_DREGISTER_VAR) { 
 		/* oh my god! 
                    it requies integer register and floating register and
                    stack value. You are crazy.
@@ -1365,7 +1368,7 @@
 			    get_input_fregister_var(freg_arg,0),t,t),
 		    arg_assign);
 	    }
-	    if (freg_arg>MAX_INPUT_DREGISTER_VAR) {
+	    if (freg_arg>=MAX_INPUT_DREGISTER_VAR) {
 		arg = list2(LVAR,caller_arg_offset_v(nargs));
 	    } else if (!simple_args(e3)) {
 		arg = get_fregister_var(0); 
@@ -1379,7 +1382,7 @@
 	    reg_arg_list = list2(arg,reg_arg_list);
 	    g_expr_u(assign_expr0(arg,e4,t,t)); /* XXX */
 	    freg_arg++;
-	    nargs += size_of_double/size_of_int;
+	    nargs += size(t)/size_of_int;
 	    continue;
 	} else if (car(t)==STRUCT||car(t)==UNION) {
 	    arg = list2(LVAR,caller_arg_offset_v(nargs));
--- a/test/basic.c	Sun Mar 23 23:10:48 2003 +0900
+++ b/test/basic.c	Mon Mar 24 01:28:02 2003 +0900
@@ -103,7 +103,7 @@
 double a0,double a1,double a2,double a3,double a4,double a5,double a6,double a7,double a8
 )
 {
-    printf("g: %g\n",
+    printf("f: %g\n",
 a0+a1+a2+a3+a4+a5+a6+a7+a8
     );
     return a8;