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

register assop const ( int/long )
author kono
date Tue, 01 Jun 2004 12:42:36 +0900 (2004-06-01)
parents 230a3b98b843
children a0779a414855
line wrap: on
line diff
--- a/mc-code-powerpc.c	Mon May 24 19:59:50 2004 +0900
+++ b/mc-code-powerpc.c	Tue Jun 01 12:42:36 2004 +0900
@@ -1885,10 +1885,12 @@
 	}
     }
 
+    arg_assign = 0;
     e2 = cadr(e1);
     if (car(e2) == FNAME) {	
 	fn=(NMTBL *)cadr(e2);
     } else {	
+#if 0
 	jmp = get_register_var(0);
 	if (car(jmp)!=REGISTER) error(-1);
 	reg_arg_list = list2(jmp,reg_arg_list);
@@ -1896,6 +1898,16 @@
 	if (!is_int_reg(creg)) error(-1);
 	code_register(creg,cadr(jmp));
         /* g_expr(assign_expr0(jmp,e2,INT,INT)); functions are lvalue */
+#else
+        if (car(e2)==INDIRECT) e2=cadr(e2); // (*func)(i) case
+	jmp = get_register_var(0);
+	if (car(jmp)!=REGISTER) error(-1);
+	reg_arg_list = list2(jmp,reg_arg_list);
+        if (!simple_arg(e2)) {
+            g_expr_u(assign_expr0(jmp,e2,INT,INT));
+        } else
+	    arg_assign = list2(assign_expr0(jmp,e2,INT,INT),arg_assign);
+#endif
     }
     /* first we execute complex argument to avoid interaction with
        input variables */
@@ -1968,7 +1980,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; 
@@ -2295,6 +2307,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("\tstb %s,0(%s)\n",crn,drn);
+    } else if (byte==SIZE_OF_SHORT) {
+	printf("\tsth %s,0(%s)\n",crn,drn);
+    } else {
+	printf("\tstw %s,0(%s)\n",crn,drn);
+    }
+    free_register(creg);
+    emit_pop_free(xreg);
+#else
     printf("# assop\n\tmr %s,%s\n",register_name(edx),register_name(creg));
     ld_indexx(byte,0,edx,creg,sign);
     tosop(op,creg,xreg);
@@ -2309,6 +2337,7 @@
     }
     free_register(edx);
     emit_pop_free(xreg);
+#endif
 }
 
 void
@@ -4531,6 +4560,7 @@
     emit_push();
     use_longlong(reg);
     if (regv_l(lreg)==edx || regv_h(lreg)==edx) {
+	// this can't happen
 	edx0 = get_register(); if(!edx0) error(-1);
 	printf("# lassop\n\tmr %s,%s\n",register_name(edx0),register_name(edx));
 	edx = edx0;