Mercurial > hg > CbC > old > device
diff mc-codegen.c @ 286:179e22f166ef register-assop
register assop fix
author | kono |
---|---|
date | Wed, 02 Jun 2004 13:19:13 +0900 |
parents | 912b54949344 |
children | a0779a414855 |
line wrap: on
line diff
--- 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);