changeset 286:179e22f166ef register-assop

register assop fix
author kono
date Wed, 02 Jun 2004 13:19:13 +0900
parents 912b54949344
children a0779a414855
files .gdbinit Changes mc-code-ia32.c mc-codegen.c stdio.h
diffstat 5 files changed, 39 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/.gdbinit	Tue Jun 01 12:42:36 2004 +0900
+++ b/.gdbinit	Wed Jun 02 13:19:13 2004 +0900
@@ -1,7 +1,7 @@
 tb main
-run  -s test/arg.c
+# run  -s test/arg.c
 # run  -s -ob00.s mc-parse.c
-# run -s test/code-gen-all.c
+run -s test/code-gen-all.c
 define regs 
 printf "pc =%08x lr =%08x r0 =%08x r1 =%08x r3= %08x r4= %08x\n",$pc,$lr,$r0,$r1,$r3,$r4
 printf "r10=%08x r11=%08x r12=%08x r13=%08x r14=%08x r15=%08x\n",$r10,$r11,$r12,$r13,$r14,$r15
--- a/Changes	Tue Jun 01 12:42:36 2004 +0900
+++ b/Changes	Wed Jun 02 13:19:13 2004 +0900
@@ -4590,3 +4590,10 @@
 
 register_assop は、いいんだけど、register_assop_const の
 コードが良くないね。
+
+Wed Jun  2 13:12:35 JST 2004
+
+rexpr に value option を付けて、
+   code_bool 
+では、rexpr,drexp を呼んだ方がいいんだけど... && || とかどうする
+かな。
--- a/mc-code-ia32.c	Tue Jun 01 12:42:36 2004 +0900
+++ b/mc-code-ia32.c	Wed Jun 02 13:19:13 2004 +0900
@@ -1311,7 +1311,8 @@
 void
 code_assign_register(int e2,int byte,int creg) {
     use_int(creg);
-    printf("\tmovl %s,%s\n",register_name(creg,0),register_name(e2,0));
+    if (creg!=e2)
+	printf("\tmovl %s,%s\n",register_name(creg,0),register_name(e2,0));
 }
 
 void
@@ -1330,7 +1331,7 @@
     creg = reg = e2;
     tosop(op,reg,xreg);
     creg = xreg;
-    printf("\tmovl %s,%s\n",register_name(reg,0),register_name(creg,0));
+    // printf("\tmovl %s,%s\n",register_name(reg,0),register_name(creg,0));
     regs[creg]=regv[creg]=1;
 }
 
@@ -2644,19 +2645,16 @@
     switch(op) {
     case LLSHIFT:
     case LULSHIFT:
-        printf("\tshldl $%d,%%eax,%%edx\n",vl);
-        printf("\tsall $%d,%%eax\n",vl);
-	check_lreg(reg);
+        printf("\tshldl $%d,%s,%s\n",vl,l_eax(reg),l_edx(reg));
+        printf("\tsall $%d,%s\n",vl,l_eax(reg));
 	return;
     case LRSHIFT:
-        printf("\tshrdl $%d,%%edx,%%eax\n",vl);
-        printf("\tsarl $%d,%%edx\n",vl);
-	check_lreg(reg);
+        printf("\tshrdl $%d,%s,%s\n",vl,l_edx(reg),l_eax(reg));
+        printf("\tsarl $%d,%s\n",vl,l_edx(reg));
 	return;
     case LURSHIFT:
-        printf("\tshrdl $%d,%%edx,%%eax\n",vl);
-        printf("\tshrl $%d,%%edx\n",vl);
-	check_lreg(reg);
+        printf("\tshrdl $%d,%s,%s\n",vl,l_edx(reg),l_eax(reg));
+        printf("\tshrl $%d,%s\n",vl,l_edx(reg));
 	return;
     }
     switch(op) {
@@ -2667,8 +2665,7 @@
     case LBOR:  opl=oph="orl"; break;
     default: error(-1);
     }
-    printf("\t%s $%d,%%eax\n\t%s $%d,%%edx\n",opl,vl,oph,vh);
-    check_lreg(reg);
+    printf("\t%s $%d,%s\n\t%s $%d,%s\n",opl,vl,l_eax(reg),oph,vh,l_edx(reg));
 }
 
 void emit_lpop_free(int e1)
--- a/mc-codegen.c	Tue Jun 01 12:42:36 2004 +0900
+++ b/mc-codegen.c	Wed Jun 02 13:19:13 2004 +0900
@@ -1554,23 +1554,28 @@
     e3 = caddr(e1);
     op = cadddr(e1);
 
-    if (code_lassop_p && car(e2)==LREGISTER) {
+    if (car(e2)==LREGISTER) {
         if (code_lconst_op_p(op,e3)) {
             loprtc(op,cadr(e2),e3);
-        } else {
+	    if (use) {
+		code_lregister(cadr(e2),USE_CREG);
+	    }
+	    return;
+	}
+        if (code_lassop_p) {
             g_expr(e3);
 	    emit_lpush();
             code_register_lassop(cadr(e2),op);
+	    if (use) {
+		code_lregister(cadr(e2),USE_CREG);
+	    }
+	    return;
         }
-        if (use) {
-            code_lregister(cadr(e2),USE_CREG);
-        }
-        return;
     }
     if (!code_lassop_p||car(e3)==LCONST) {
 	/*  e2 = e2 op e3; */
 	t = long_sign(op);
-	if (car(e2)==LVAR||car(e2)==GVAR) {
+	if (car(e2)==LREGISTER||car(e2)==LVAR||car(e2)==GVAR) {
 	    g_expr(assign_expr0(e2,list3(op,rvalue_t(e2,t),e3),t,t));
 	    return;
 	}
@@ -1584,6 +1589,13 @@
     }
 
     g_expr(e3);
+    if (car(e2)==LREGISTER) {
+        emit_lpush();
+        code_register_lassop(cadr(e2),op);
+        if (use)
+            code_lregister(cadr(e2),USE_CREG);
+        return;
+    }
     emit_lpush();
     g_expr(e2);
     code_lassop(op,USE_CREG);
--- a/stdio.h	Tue Jun 01 12:42:36 2004 +0900
+++ b/stdio.h	Wed Jun 02 13:19:13 2004 +0900
@@ -1,4 +1,4 @@
-#ifndef __micro_c__
+#ifndef __micro_c__aaa
 #include "/usr/include/stdio.h"
 long long strtoll(const char *, char **, int);
 #else