changeset 761:684dcbd0e170

i64 basic
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 17 Nov 2010 12:16:08 +0900
parents ac471ccd1cc8
children 236d49777503
files .gdbinit mc-code-i64.c
diffstat 2 files changed, 25 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/.gdbinit	Wed Nov 17 11:34:55 2010 +0900
+++ b/.gdbinit	Wed Nov 17 12:16:08 2010 +0900
@@ -18,10 +18,10 @@
 # r -s test/call.c
 # r -s test/static.c
 # r -s test/tmpa.c
-r -s test/code-gen-all.c
+# r -s test/code-gen-all.c
 # r -s mc-code-powerpc.c
 # r -s test/macro.c
-# r -s test/basic.c
+r -s test/basic.c
 # r -s test/strinit.c
 # r -s test/arg.c
 # r -s -DINLINE=inline test/strinit.c
--- a/mc-code-i64.c	Wed Nov 17 11:34:55 2010 +0900
+++ b/mc-code-i64.c	Wed Nov 17 12:16:08 2010 +0900
@@ -272,9 +272,9 @@
 
 int MAX_INPUT_REGISTER_VAR = 6;
 int MAX_CODE_INPUT_REGISTER_VAR = 6;
-int MAX_INPUT_DREGISTER_VAR = 6;
+int MAX_INPUT_DREGISTER_VAR = 8;
 // static int MAX_INPUT_FREGISTER_VAR = 0;
-int MAX_CODE_INPUT_DREGISTER_VAR = 6;
+int MAX_CODE_INPUT_DREGISTER_VAR = 8;
 
 static int  reg_sp;   /* REGister Stack-Pointer */
 static int reg_stack[MAX_MAX];  /* 実際のレジスタの領域 */
@@ -515,7 +515,7 @@
 #define code_disp_offset (16)
 
 #define arg_offset  (16)
-#define arg_offset1  (-48)
+#define arg_offset1  (0)
 #define ARG_LVAR_OFFSET 0x10000000
 
 #define code_disp_offset0 (-16)
@@ -969,7 +969,7 @@
     if(!(i<MAX_INPUT_DREGISTER_VAR)) return 0;
     i = FREG_OFFSET+i;
   }
-  return list3n(FREGISTER,i,nptr);
+  return list3n(d?DREGISTER:FREGISTER,i,nptr);
 }
 
 int 
@@ -1186,7 +1186,7 @@
             }
         } else if (type==FLOAT) {
             if ((reg = get_input_dregister_var(freg_var,n,is_code0,0))) {
-                n->sc = DREGISTER;
+                n->sc = FREGISTER;
                 n->dsp = cadr(reg);
                 regs[n->dsp]= INPUT_REG;
                 freg_var++;
@@ -2040,6 +2040,8 @@
 static int
 get_input_arg(int t,int mode,int nargs,int reg_arg,int freg_arg)
 {
+    int arg = nargs - (reg_arg>MAX_INPUT_REGISTER_VAR?MAX_INPUT_REGISTER_VAR:reg_arg)*2 
+                    - (freg_arg>MAX_INPUT_DREGISTER_VAR?MAX_INPUT_DREGISTER_VAR:freg_arg)*2 ;
     t = type_value(t);
     if (t>=0&&(car(t)==BIT_FIELD)) {
         t = type_value(cadr(t));
@@ -2048,35 +2050,35 @@
         if (mode==AS_SAVE) {
             return get_register_var(0);
         } else if (reg_arg>=MAX_INPUT_REGISTER_VAR) {
-            return list3n(LVAR,caller_arg_offset_v(nargs),0);
+            return list3n(LVAR,caller_arg_offset_v(arg),0);
         } else
             return get_input_register_var(reg_arg,0,0);
     } else if (t==LONGLONG||t==ULONGLONG) {
         if (mode==AS_SAVE) {
             return get_lregister_var(0);
         } else if (reg_arg>=MAX_INPUT_REGISTER_VAR)  {
-            return list3n(LVAR,caller_arg_offset_v(nargs),0);
+            return list3n(LVAR,caller_arg_offset_v(arg),0);
         } else
             return get_input_lregister_var(reg_arg,0,0);
     } else if (t==FLOAT) {
         if (mode==AS_SAVE) {
             return get_dregister_var(0,0);
         } else if (freg_arg>=MAX_INPUT_DREGISTER_VAR) {
-            return list3n(LVAR,caller_arg_offset_v(nargs),0);
+            return list3n(LVAR,caller_arg_offset_v(arg),0);
         } else
             return get_input_dregister_var(freg_arg,0,0,0);
     } else if (t==DOUBLE) {
         if (mode==AS_SAVE) {
             return get_dregister_var(0,1);
         } else if (freg_arg>=MAX_INPUT_DREGISTER_VAR) {
-            return list3n(LVAR,caller_arg_offset_v(nargs),0);
+            return list3n(LVAR,caller_arg_offset_v(arg),0);
         } else
             return get_input_dregister_var(freg_arg,0,0,1);
     } else if (t>=0&&(car(t)==STRUCT||car(t)==UNION)) {
         if (mode==AS_SAVE) {
             return get_register_var(0);
         } else
-            return list3n(LVAR,caller_arg_offset_v(nargs),0);
+            return list3n(LVAR,caller_arg_offset_v(arg),0);
     } else {
         error(-1);
         return get_register_var(0);
@@ -2272,7 +2274,7 @@
             g_expr_u(assign_expr0(arg,e4,t,t));
         } else if (t==DOUBLE||t==FLOAT) {
             reg_arg_list = list2(arg,reg_arg_list);
-            if (car(arg)==DREGISTER) {
+            if (car(arg)==DREGISTER||car(arg)==FREGISTER) {
                 use_input_reg(cadr(arg),1); /* protect from input register free */
 		max_freg ++;
 	    }
@@ -3562,7 +3564,7 @@
 }
 
 static int
-code_dload_1(int d);
+code_dload_1(int d, int reg);
 
 static double d0 = 1.0;
 
@@ -3587,11 +3589,11 @@
 { 
     int lb;
     double value = dcadr(e2);
+    use_float(d,freg);
     if (value==1.0) {
-        set_freg(code_dload_1(d),0);
+        code_dload_1(d,freg);
         return;
     }
-    use_float(d,freg);
     if (value==0.0) {
         char *f = fregister_name(freg);
         if (d) {
@@ -3890,9 +3892,9 @@
 }
 
 static int
-code_dload_1(int d)
+code_dload_1(int d, int g)
 {
-    int r,g;
+    int r;
     char *drn,*grn;
     NMTBL *one;
     // load 1
@@ -3905,7 +3907,7 @@
     }
     r = get_ptr_cache(one);
     drn=register_name(r,0);
-    grn=fregister_name(g=get_dregister(d));
+    grn=fregister_name(g);
     printf("\tmovs%s 0(%s),%s\n",d?"d":"s",drn,grn);
     return g;
 }
@@ -3918,7 +3920,7 @@
 
     if (car(e2)==DREGISTER||car(e2)==FREGISTER) {
         crn=fregister_name(cadr(e2));
-        grn = fregister_name(g = code_dload_1(d));
+        grn = fregister_name(g = code_dload_1(d,get_dregister(d)));
         if (reg==USE_CREG) {
             reg=get_dregister(d); if (!reg) error(-1);
             set_freg(reg,0);
@@ -3936,7 +3938,7 @@
             set_freg(reg,0);
         }
         frn=fregister_name(reg);
-        grn = fregister_name(g = code_dload_1(d));
+        grn = fregister_name(g = code_dload_1(d,get_dregister(d)));
         printf("\t%s %s,0(%s)\n",fload(d),frn,crn);
         printf("\t%s %s,%s\n",ops,grn,frn);
         printf("\t%s %s,0(%s)\n",fstore(d),frn,crn);
@@ -3952,7 +3954,7 @@
 
     if (car(e2)==DREGISTER||car(e2)==FREGISTER) {
         crn=fregister_name(cadr(e2));
-        grn = fregister_name(g = code_dload_1(d));
+        grn = fregister_name(g = code_dload_1(d,get_dregister(d)));
         if (reg==USE_CREG) {
             reg=get_dregister(d); if (!reg) error(-1);
             set_freg(reg,0);
@@ -3970,7 +3972,7 @@
             set_freg(reg,0);
         }
         frn=fregister_name(reg);
-        grn = fregister_name(g = code_dload_1(d));
+        grn = fregister_name(g = code_dload_1(d,get_dregister(d)));
         printf("\t%s %s,0(%s)\n",fload(d),frn,crn);
         printf("\t%s %s,%s\n",ops,grn,frn);
         printf("\t%s %s,0(%s)\n",fstore(d),grn,crn);