# HG changeset patch # User kono # Date 1086149953 -32400 # Node ID 179e22f166efa8ef00df22b76c9501e00b68e9ec # Parent 912b54949344723ee4c44a4150575b9713f22a90 register assop fix diff -r 912b54949344 -r 179e22f166ef .gdbinit --- 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 diff -r 912b54949344 -r 179e22f166ef Changes --- 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 を呼んだ方がいいんだけど... && || とかどうする +かな。 diff -r 912b54949344 -r 179e22f166ef mc-code-ia32.c --- 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) diff -r 912b54949344 -r 179e22f166ef mc-codegen.c --- 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); diff -r 912b54949344 -r 179e22f166ef stdio.h --- 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