diff mc-code-mips.c @ 285:912b54949344

register assop const ( int/long )
author kono
date Tue, 01 Jun 2004 12:42:36 +0900
parents ec1a68133f6a
children a0779a414855
line wrap: on
line diff
--- a/mc-code-mips.c	Mon May 24 19:59:50 2004 +0900
+++ b/mc-code-mips.c	Tue Jun 01 12:42:36 2004 +0900
@@ -1968,13 +1968,13 @@
 static void
 code_call(int e2,NMTBL *fn,int jmp)
 {
-    char *jrn;
+    // char *jrn;
     if (fnptr->sc==CODE) {
 	if (car(e2) == FNAME) {
 	    printf("\tla\t$25,%s\n",fn->nm);
 	} else {
-	    jrn = register_name(cadr(jmp));
-	    printf("\tmove\t$25,%s\n",jrn);
+	    // jrn = register_name(cadr(jmp));
+	    // printf("\tmove\t$25,%s\n",jrn);
 	}
 	printf("\tjalr\t$25\n");
 	printf("\tlw\t$gp,$L_%d($sp)\n",cprestore_label);
@@ -1982,8 +1982,8 @@
 	if (car(e2) == FNAME) {
 	    printf("\tjal\t%s\n",fn->nm);
 	} else {
-	    jrn = register_name(cadr(jmp));
-	    printf("\tmove $25,%s\n",jrn);
+	    // jrn = register_name(cadr(jmp));
+	    // printf("\tmove $25,%s\n",jrn);
 	    printf("\tjal\t$31,$25\n");
 	}
     }
@@ -2016,17 +2016,19 @@
 	}
     }
 
+    arg_assign = 0;
     e2 = cadr(e1);
     if (car(e2) == FNAME) {	
 	fn=(NMTBL *)cadr(e2);
     } else {	
-	jmp = get_register_var(0);
-	if (car(jmp)!=REGISTER) error(-1);
-	reg_arg_list = list2(jmp,reg_arg_list);
-	g_expr(e2);
-	if (!is_int_reg(creg)) error(-1);
-	code_register(creg,cadr(jmp));
-        /* g_expr(assign_expr0(jmp,e2,INT,INT)); functions are lvalue */
+	if (car(e2)==INDIRECT) e2=cadr(e2); // (*func)(i) case
+	jmp = list2(REGISTER,25);
+	if (!simple_arg(e2)) {
+	    e3=get_register_var(0);
+	    g_expr_u(assign_expr0(e3,e2,INT,INT));
+	    e2=e3;
+	}
+	arg_assign = list2(assign_expr0(jmp,e2,INT,INT),arg_assign);
     }
     /* First we execute complex argument to avoid interaction with
        input variables. Remain the last complex argument in complex_. */
@@ -2100,7 +2102,7 @@
 	}
     }
 
-    nargs = reg_arg = freg_arg = arg_assign = 0;
+    nargs = reg_arg = freg_arg = 0;
     // calc stack arguments first, it may requires extra registers,
     // and we can still use input registers now.
     for (e3 = e1; e3; 
@@ -2433,6 +2435,22 @@
 
     use_int(creg);
     xrn = register_name(xreg = emit_pop(0));       /* pop e3 value */
+#if 1
+    set_ireg(edx,0);
+    ld_indexx(byte,0,creg,ireg,sign);
+    tosop(op,ireg,xreg);
+    crn = register_name(ireg);
+    drn = register_name(creg);
+    if (byte==1) {
+	printf("\tsb %s,0(%s)\n",crn,drn);
+    } else if (byte==SIZE_OF_SHORT) {
+	printf("\tsh %s,0(%s)\n",crn,drn);
+    } else {
+	printf("\tsw %s,0(%s)\n",crn,drn);
+    }
+    free_register(edx);
+    emit_pop_free(xreg);
+#else
     printf("# assop\n\tmove %s,%s\n",register_name(edx),register_name(creg));
     ld_indexx(byte,0,edx,creg,sign);
     tosop(op,creg,xreg);
@@ -2447,6 +2465,7 @@
     }
     free_register(edx);
     emit_pop_free(xreg);
+#endif
 }
 
 
@@ -2694,6 +2713,8 @@
     if (!asi) error(-1);
 }
 
+// should have pcond_const
+
 static void
 pcond(int op, int r2,int r1,int r0,int cond,int l1)
 {