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 }