Mercurial > hg > CbC > old > device
comparison mc-codegen.c @ 285:912b54949344
register assop const ( int/long )
author | kono |
---|---|
date | Tue, 01 Jun 2004 12:42:36 +0900 (2004-06-01) |
parents | ec1a68133f6a |
children | 179e22f166ef |
comparison
equal
deleted
inserted
replaced
284:ec1a68133f6a | 285:912b54949344 |
---|---|
1467 e2 = cadr(e1); | 1467 e2 = cadr(e1); |
1468 if (car(e2)==INDIRECT) e2=cadr(e2); | 1468 if (car(e2)==INDIRECT) e2=cadr(e2); |
1469 e3 = caddr(e1); | 1469 e3 = caddr(e1); |
1470 op = cadddr(e1); | 1470 op = cadddr(e1); |
1471 | 1471 |
1472 if (car(e2)==REGISTER) { | |
1473 if (code_const_op_p(op,e3)) { | |
1474 oprtc(op,cadr(e2),e3); | |
1475 } else { | |
1476 g_expr(e3); | |
1477 code_register_assop(cadr(e2),USE_CREG,op,byte); | |
1478 } | |
1479 if (use) { | |
1480 code_register(cadr(e2),USE_CREG); | |
1481 } | |
1482 return; | |
1483 } | |
1472 if (car(e3)==CONST) { | 1484 if (car(e3)==CONST) { |
1473 /* e2 = e2 op e3; */ | 1485 /* e2 = e2 op e3; */ |
1474 t = sign?INT:UNSIGNED; | 1486 t = sign?INT:UNSIGNED; |
1475 if (car(e2)==REGISTER||car(e2)==LVAR||car(e2)==GVAR) { | 1487 // oprtc expected |
1488 if (car(e2)==LVAR||car(e2)==GVAR) { | |
1476 g_expr(assign_expr0(e2,list3(op,rvalue_t(e2,t),e3),t,t)); | 1489 g_expr(assign_expr0(e2,list3(op,rvalue_t(e2,t),e3),t,t)); |
1477 return; | 1490 return; |
1478 } | 1491 } |
1479 /* new = &e2 */ | 1492 /* new = &e2 */ |
1480 /* *new = *new op e3 */ | 1493 /* *new = *new op e3 */ |
1482 g_expr_u(assign_expr0(n,list2(ADDRESS,e2),INT,INT)); | 1495 g_expr_u(assign_expr0(n,list2(ADDRESS,e2),INT,INT)); |
1483 g_expr(assign_expr0(list2(INDIRECT,n),list3(op,n,e3),t,t)); | 1496 g_expr(assign_expr0(list2(INDIRECT,n),list3(op,n,e3),t,t)); |
1484 free_lvar(cadr(n)); | 1497 free_lvar(cadr(n)); |
1485 return; | 1498 return; |
1486 } | 1499 } |
1487 | |
1488 g_expr(e3); | 1500 g_expr(e3); |
1489 if (car(e2)==REGISTER) { | |
1490 code_register_assop(cadr(e2),USE_CREG,op,byte); | |
1491 if (use) | |
1492 code_register(cadr(e2),USE_CREG); | |
1493 return; | |
1494 } | |
1495 emit_push(); | 1501 emit_push(); |
1496 g_expr(e2); | 1502 g_expr(e2); |
1497 code_assop(op,USE_CREG,byte,sign); | 1503 code_assop(op,USE_CREG,byte,sign); |
1498 return; | 1504 return; |
1499 } | 1505 } |
1546 e2 = cadr(e1); | 1552 e2 = cadr(e1); |
1547 if (car(e2)==INDIRECT) e2=cadr(e2); | 1553 if (car(e2)==INDIRECT) e2=cadr(e2); |
1548 e3 = caddr(e1); | 1554 e3 = caddr(e1); |
1549 op = cadddr(e1); | 1555 op = cadddr(e1); |
1550 | 1556 |
1557 if (code_lassop_p && car(e2)==LREGISTER) { | |
1558 if (code_lconst_op_p(op,e3)) { | |
1559 loprtc(op,cadr(e2),e3); | |
1560 } else { | |
1561 g_expr(e3); | |
1562 emit_lpush(); | |
1563 code_register_lassop(cadr(e2),op); | |
1564 } | |
1565 if (use) { | |
1566 code_lregister(cadr(e2),USE_CREG); | |
1567 } | |
1568 return; | |
1569 } | |
1551 if (!code_lassop_p||car(e3)==LCONST) { | 1570 if (!code_lassop_p||car(e3)==LCONST) { |
1552 /* e2 = e2 op e3; */ | 1571 /* e2 = e2 op e3; */ |
1553 t = long_sign(op); | 1572 t = long_sign(op); |
1554 if (car(e2)==LREGISTER||car(e2)==LVAR||car(e2)==GVAR) { | 1573 if (car(e2)==LVAR||car(e2)==GVAR) { |
1555 g_expr(assign_expr0(e2,list3(op,rvalue_t(e2,t),e3),t,t)); | 1574 g_expr(assign_expr0(e2,list3(op,rvalue_t(e2,t),e3),t,t)); |
1556 return; | 1575 return; |
1557 } | 1576 } |
1558 /* new = &e2 */ | 1577 /* new = &e2 */ |
1559 /* *new = *new op e3 */ | 1578 /* *new = *new op e3 */ |
1563 free_lvar(cadr(n)); | 1582 free_lvar(cadr(n)); |
1564 return; | 1583 return; |
1565 } | 1584 } |
1566 | 1585 |
1567 g_expr(e3); | 1586 g_expr(e3); |
1568 if (car(e2)==LREGISTER) { | |
1569 emit_lpush(); | |
1570 code_register_lassop(cadr(e2),op); | |
1571 if (use) | |
1572 code_lregister(cadr(e2),USE_CREG); | |
1573 return; | |
1574 } | |
1575 emit_lpush(); | 1587 emit_lpush(); |
1576 g_expr(e2); | 1588 g_expr(e2); |
1577 code_lassop(op,USE_CREG); | 1589 code_lassop(op,USE_CREG); |
1578 return; | 1590 return; |
1579 } | 1591 } |