comparison mc-codegen.c @ 342:3e0b1183983d

else if to switch
author kono
date Sat, 26 Jun 2004 12:35:35 +0900
parents ca34f02b2056
children 11f8f2e6bb72
comparison
equal deleted inserted replaced
341:ca34f02b2056 342:3e0b1183983d
491 code_bool(e1,USE_CREG); /* type? */ 491 code_bool(e1,USE_CREG); /* type? */
492 return INT; 492 return INT;
493 } 493 }
494 } 494 }
495 495
496 #define dual_ops(op) \
497 (op==GT|| op==UGT|| op==GE|| op==UGE|| op==LT|| \
498 op==ULT|| op==LE|| op==ULE|| \
499 op==DOP+GT|| op==DOP+GE|| op==DOP+LT|| op==DOP+LE || \
500 op==FOP+GT|| op==FOP+GE|| op==FOP+LT|| op==FOP+LE || \
501 op==FOP+EQ|| op==FOP+NEQ || \
502 op==EQ|| op==NEQ|| op==DOP+EQ|| op==DOP+NEQ)
503
504 static int 496 static int
505 rop_dual(op) 497 rop_dual(op)
506 { 498 {
507 // x op y => y dual(op) x 499 // x op y => y dual(op) x
508 switch(op) { 500 switch(op) {
541 bexpr_u(int e1, char cond, int l1) 533 bexpr_u(int e1, char cond, int l1)
542 { 534 {
543 int op = car(e1); 535 int op = car(e1);
544 if (chk) return; 536 if (chk) return;
545 // gexpr_init(); 537 // gexpr_init();
546 if (dual_ops(op) && (car(caddr(e1))==CONST||(car(caddr(e1))==DCONST))) 538 switch(op) {
547 b_expr(list3(rop_dual(op),caddr(e1),cadr(e1)),cond,l1,0); 539 case GT: case UGT: case GE: case UGE: case LT:
548 else 540 case ULT: case LE: case ULE:
549 b_expr(e1,cond,l1,0); 541 case DOP+GT: case DOP+GE: case DOP+LT: case DOP+LE:
542 case FOP+GT: case FOP+GE: case FOP+LT: case FOP+LE:
543 case FOP+EQ: case FOP+NEQ:
544 case EQ: case NEQ: case DOP+EQ: case DOP+NEQ:
545 if ((car(caddr(e1))==CONST||(car(caddr(e1))==DCONST))) {
546 b_expr(list3(rop_dual(op),caddr(e1),cadr(e1)),cond,l1,0);
547 return;
548 }
549 }
550 b_expr(e1,cond,l1,0);
550 } 551 }
551 552
552 /* bexpr for value used */ 553 /* bexpr for value used */
553 554
554 extern void 555 extern void
756 int reg = cadr(e); 757 int reg = cadr(e);
757 int tag = car(e); 758 int tag = car(e);
758 int lvar; 759 int lvar;
759 int t; 760 int t;
760 if (!n||n==&null_nptr) error(REG_ERR); 761 if (!n||n==&null_nptr) error(REG_ERR);
761 if (tag==REGISTER) { 762 switch(tag) {
762 n->dsp = new_lvar(size_of_int); 763 case REGISTER:
763 t = INT; 764 n->dsp = new_lvar(size_of_int); t = INT; break;
764 } else if (tag==DREGISTER) { 765 case DREGISTER:
765 n->dsp = new_lvar(size_of_double); 766 n->dsp = new_lvar(size_of_double); t = DOUBLE; break;
766 t = DOUBLE; 767 case FREGISTER:
767 } else if (tag==FREGISTER) { 768 n->dsp = new_lvar(size_of_float); t = DOUBLE; break;
768 n->dsp = new_lvar(size_of_float); 769 case LREGISTER:
769 t = DOUBLE; 770 n->dsp = new_lvar(size_of_longlong); t = LONGLONG; break;
770 } else if (tag==LREGISTER) { 771 default:
771 n->dsp = new_lvar(size_of_longlong); 772 error(-1);
772 t = LONGLONG; 773 }
773 } else error(-1);
774 n->sc = LVAR; 774 n->sc = LVAR;
775 lvar = list2(LVAR,n->dsp); 775 lvar = list2(LVAR,n->dsp);
776 g_expr_u(assign_expr0(list2(LVAR,n->dsp),list3(tag,reg,(int)n),t,t)); 776 g_expr_u(assign_expr0(list2(LVAR,n->dsp),list3(tag,reg,(int)n),t,t));
777 if (tag==REGISTER||tag==DREGISTER||tag==FREGISTER||tag==LREGISTER) { 777 if (tag==REGISTER||tag==DREGISTER||tag==FREGISTER||tag==LREGISTER) {
778 free_register(reg); 778 free_register(reg);
1002 */ 1002 */
1003 1003
1004 static int 1004 static int
1005 is_simple(int e1) 1005 is_simple(int e1)
1006 { 1006 {
1007 return ( 1007 switch(e1) {
1008 e1==CONST || e1==FNAME || e1==LVAR || e1==REGISTER ||e1==DREGISTER || 1008 case FREGISTER: case LREGISTER:
1009 e1==FREGISTER || e1==LREGISTER || 1009 case GVAR: case RGVAR: case RLVAR: case CRLVAR: case CRGVAR:
1010 e1==GVAR || e1==RGVAR || e1==RLVAR || e1==CRLVAR || e1==CRGVAR || 1010 case DRLVAR: case FRLVAR: case LRLVAR:
1011 e1==DRLVAR || e1==FRLVAR || e1==LRLVAR || 1011 case CURLVAR: case SURLVAR: case CURGVAR: case SURGVAR:
1012 e1==CURLVAR || e1==SURLVAR || e1==CURGVAR || e1==SURGVAR 1012 return 1;
1013 ); 1013 }
1014 return 0;
1014 } 1015 }
1015 1016
1016 static int 1017 static int
1017 is_same_type(int e1,int e2) 1018 is_same_type(int e1,int e2)
1018 { 1019 {
1019 int ce1=car(e1); 1020 int ce1=car(e1);
1020 int ce2=car(e2); 1021 int ce2=car(e2);
1021 return ( 1022 if (ce1==LVAR) {
1022 (ce1==LVAR && (ce2==RLVAR||ce2==CRLVAR||ce2==FRLVAR||ce2==DRLVAR)) 1023 switch(ce2) {
1023 || (ce1==LVAR && (ce2==SRLVAR||ce2==SURLVAR||ce2==CURLVAR)) 1024 case RLVAR: case CRLVAR: case FRLVAR: case DRLVAR:
1024 || (ce2==LVAR && (ce1==RLVAR||ce1==CRLVAR||ce1==FRLVAR||ce1==DRLVAR)) 1025 case SRLVAR: case SURLVAR: case CURLVAR:
1025 || (ce2==LVAR && (ce1==SRLVAR||ce1==SURLVAR||ce1==CURLVAR)) 1026 return 1;
1026 || (ce2==LVAR && (ce1==LRLVAR)) 1027 }
1027 || (ce1==GVAR && (ce2==RGVAR||ce2==CRGVAR||ce2==FRGVAR||ce2==DRGVAR)) 1028 } else if (ce2==LVAR) {
1028 || (ce1==GVAR && (ce2==SRGVAR||ce2==SURGVAR||ce2==CURGVAR)) 1029 switch(ce1) {
1029 || (ce2==GVAR && (ce1==RGVAR||ce1==CRGVAR||ce1==FRGVAR||ce1==DRGVAR)) 1030 case RLVAR: case CRLVAR: case FRLVAR: case DRLVAR:
1030 || (ce2==GVAR && (ce1==SRGVAR||ce1==SURGVAR||ce1==CURGVAR)) 1031 case SRLVAR: case SURLVAR: case CURLVAR: case LRLVAR:
1031 || (ce2==GVAR && (ce1==LRGVAR)) 1032 return 1;
1032 ); 1033 }
1034 } else if (ce1==GVAR) {
1035 switch(ce2) {
1036 case RGVAR: case CRGVAR: case FRGVAR: case DRGVAR:
1037 case SRGVAR: case SURGVAR: case CURGVAR:
1038 return 1;
1039 }
1040 } else if (ce2==GVAR) {
1041 switch(ce1) {
1042 case RGVAR: case CRGVAR: case FRGVAR: case DRGVAR:
1043 case SRGVAR: case SURGVAR: case CURGVAR: case LRGVAR:
1044 return 1;
1045 }
1046 }
1047 return 0;
1033 } 1048 }
1034 1049
1035 static int 1050 static int
1036 is_memory(int e1) 1051 is_memory(int e1)
1037 { 1052 {
1038 int ce1=car(e1); 1053 int ce1=car(e1);
1039 return ( 1054 switch(car(ce1)) {
1040 ce1==LVAR ||ce1==RLVAR||ce1==CRLVAR || ce1==DRLVAR || ce1==LRLVAR || 1055 case LVAR : case RLVAR: case CRLVAR : case DRLVAR : case LRLVAR :
1041 ce1==GVAR ||ce1==RGVAR||ce1==CRGVAR || ce1==DRGVAR || ce1==LRGVAR || 1056 case GVAR : case RGVAR: case CRGVAR : case DRGVAR : case LRGVAR :
1042 ce1==FRLVAR || ce1==FRGVAR || 1057 case FRLVAR : case FRGVAR :
1043 ce1==CURGVAR ||ce1==SURGVAR||ce1==SRGVAR || 1058 case CURGVAR : case SURGVAR: case SRGVAR :
1044 ce1==REGISTER|| ce1==DREGISTER || ce1==FREGISTER || 1059 case REGISTER : case DREGISTER : case FREGISTER :
1045 ce1==LREGISTER 1060 case LREGISTER:
1046 ); 1061 return 1;
1062 }
1063 return 0;
1047 } 1064 }
1048 1065
1049 1066
1050 static void 1067 static void
1051 jump(int e1, int env) 1068 jump(int e1, int env)
1323 e4 = caddr(e1);e5=car(e4); 1340 e4 = caddr(e1);e5=car(e4);
1324 if (is_same_type(e2,e4)&&cadr(e2)==cadr(e4)) { 1341 if (is_same_type(e2,e4)&&cadr(e2)==cadr(e4)) {
1325 if (use) g_expr(e4); 1342 if (use) g_expr(e4);
1326 return; 1343 return;
1327 } 1344 }
1328 if (!use && ( 1345 if (!use) {
1329 (e5==REGISTER) || 1346 if (e5==REGISTER) {
1330 (car(e2)==REGISTER&&( 1347 assign_opt(e5,e2,e4,byte);
1331 e5== CRGVAR || e5== CRLVAR || e5== RGVAR || e5== RLVAR || 1348 return;
1332 e5== CURGVAR || e5== CURLVAR || 1349 } else if (car(e2)==REGISTER) {
1333 e5== SURGVAR || e5== SURLVAR || 1350 switch(e5) {
1334 e5== GVAR || e5== LVAR || 1351 case ADDRESS:
1335 e5== CONST || e5== FNAME || e5== STRING || 1352 if (!((car(cadr(e4))==STRING) || car(cadr(e4))==GVAR))
1336 (e5==ADDRESS&&car(cadr(e4))==STRING) || 1353 break;
1337 (e5==ADDRESS&&car(cadr(e4))==GVAR) )))) { 1354 case CRGVAR : case CRLVAR : case RGVAR : case RLVAR :
1338 assign_opt(e5,e2,e4,byte); 1355 case CURGVAR : case CURLVAR :
1339 return; 1356 case SURGVAR : case SURLVAR :
1357 case GVAR : case LVAR :
1358 case CONST : case FNAME : case STRING :
1359 assign_opt(e5,e2,e4,byte);
1360 return;
1361 }
1362 }
1340 } 1363 }
1341 switch(car(e2)) { 1364 switch(car(e2)) {
1342 case GVAR: /* i=3 */ 1365 case GVAR: /* i=3 */
1343 g_expr(e4); 1366 g_expr(e4);
1344 code_assign_gvar(e2,USE_CREG,byte); 1367 code_assign_gvar(e2,USE_CREG,byte);
1415 return; 1438 return;
1416 } 1439 }
1417 if (car(e1)==DASS) d=1; 1440 if (car(e1)==DASS) d=1;
1418 else if (car(e1)==FASS) d=0; 1441 else if (car(e1)==FASS) d=0;
1419 else error(-1); 1442 else error(-1);
1420 if (!use && ( 1443 if (!use) {
1421 (e5==DREGISTER) || (e5==FREGISTER) || 1444 switch(e5) {
1422 (car(e2)==DREGISTER&&(e5==DRGVAR||e5==DRLVAR||e5==DCONST))|| 1445 case DRGVAR: case DRLVAR: case DCONST:
1423 (car(e2)==FREGISTER&&(e5==FRGVAR||e5==FRLVAR||e5==FCONST)) 1446 if (car(e2)!=DREGISTER) break;
1424 )) { 1447 dassign_opt(e5,e2,e4,d); return;
1425 dassign_opt(e5,e2,e4,d); 1448 case FRGVAR: case FRLVAR: case FCONST:
1426 return; 1449 if (car(e2)!=FREGISTER) break;
1450 case DREGISTER: case FREGISTER:
1451 dassign_opt(e5,e2,e4,d); return;
1452 }
1427 } 1453 }
1428 switch(car(e2)) { 1454 switch(car(e2)) {
1429 case GVAR: 1455 case GVAR:
1430 g_expr(e4); 1456 g_expr(e4);
1431 code_dassign_gvar(e2,USE_CREG,d); 1457 code_dassign_gvar(e2,USE_CREG,d);
1536 1562
1537 static int 1563 static int
1538 double_value(int e2) 1564 double_value(int e2)
1539 { 1565 {
1540 if (type>0&&car(type)==BIT_FIELD) e2=rvalue(e2); 1566 if (type>0&&car(type)==BIT_FIELD) e2=rvalue(e2);
1541 if (0) ;
1542 #if FLOAT_CODE 1567 #if FLOAT_CODE
1568 switch(car(e2)) {
1569 case LCONST:
1543 #if LONGLONG_CODE 1570 #if LONGLONG_CODE
1544 else if (car(e2)==LCONST) e2 = dlist2(DCONST,(double)lcadr(e2)); 1571 e2 = dlist2(DCONST,(double)lcadr(e2)); break;
1545 #endif 1572 #endif
1546 else if (car(e2)==CONST) e2 = dlist2(DCONST,(double)cadr(e2)); 1573 case CONST:
1547 else if (car(e2)==FCONST) e2 = dlist2(DCONST,dcadr(e2)); 1574 e2 = dlist2(DCONST,(double)cadr(e2)); break;
1548 else if(type==DOUBLE) ; 1575 case FCONST:
1549 else if(type==FLOAT) e2 = list3(CONV,rvalue(e2),F2D); 1576 e2 = dlist2(DCONST,dcadr(e2)); break;
1550 else if(type==UNSIGNED) e2 = list3(CONV,rvalue(e2),U2D); 1577 default:
1551 else if(integral(type)) e2 = list3(CONV,rvalue(e2),I2D); 1578 switch(type) {
1552 else if(type==LONGLONG) e2 = list3(CONV,rvalue(e2),LL2D); 1579 case DOUBLE: break;
1553 else if(type==ULONGLONG) e2 = list3(CONV,rvalue(e2),ULL2D); 1580 case FLOAT: e2 = list3(CONV,rvalue(e2),F2D); break;
1554 else { error(TYERR); e2 = dlist2(DCONST,1.0); } 1581 case INT:
1582 case UNSIGNED: e2 = list3(CONV,rvalue(e2),U2D); break;
1583 case LONGLONG: e2 = list3(CONV,rvalue(e2),LL2D); break;
1584 case ULONGLONG: e2 = list3(CONV,rvalue(e2),ULL2D); break;
1585 default:
1586 if(integral(type)) e2 = list3(CONV,rvalue(e2),I2D);
1587 else { error(TYERR); e2 = dlist2(DCONST,1.0); }
1588 }
1589 }
1555 #else 1590 #else
1556 else { error(TYERR); type = DOUBLE; return list2(CONST,0); } 1591 error(TYERR); type = DOUBLE; return list2(CONST,0);
1557 #endif 1592 #endif
1558 type = DOUBLE; 1593 type = DOUBLE;
1559 return e2; 1594 return e2;
1560 } 1595 }
1561 1596
1566 if (0) ; 1601 if (0) ;
1567 #if FLOAT_CODE 1602 #if FLOAT_CODE
1568 #if LONGLONG_CODE 1603 #if LONGLONG_CODE
1569 else if (car(e2)==LCONST) e2 = dlist2(FCONST,(double)lcadr(e2)); 1604 else if (car(e2)==LCONST) e2 = dlist2(FCONST,(double)lcadr(e2));
1570 #endif 1605 #endif
1571 else if(type==LONGLONG) e2 = list3(CONV,rvalue(e2),LL2F);
1572 else if(type==ULONGLONG) e2 = list3(CONV,rvalue(e2),ULL2F);
1573 else if (car(e2)==CONST) e2 = dlist2(FCONST,(double)cadr(e2)); 1606 else if (car(e2)==CONST) e2 = dlist2(FCONST,(double)cadr(e2));
1574 else if (car(e2)==DCONST) e2 = dlist2(FCONST,dcadr(e2)); 1607 else if (car(e2)==DCONST) e2 = dlist2(FCONST,dcadr(e2));
1575 else if(type==FLOAT) ; 1608 else {
1576 else if(type==DOUBLE) e2 = list3(CONV,rvalue(e2),D2F); 1609 switch(type) {
1577 else if(type==UNSIGNED) e2 = list3(CONV,rvalue(e2),U2F); 1610 case LONGLONG: e2 = list3(CONV,rvalue(e2),LL2F); break;
1578 else if(integral(type)) e2 = list3(CONV,rvalue(e2),I2F); 1611 case ULONGLONG: e2 = list3(CONV,rvalue(e2),ULL2F); break;
1579 else { error(TYERR); e2 = dlist2(DCONST,1.0); } 1612 case FLOAT: break;
1613 case DOUBLE: e2 = list3(CONV,rvalue(e2),D2F); break;
1614 case INT:
1615 case UNSIGNED: e2 = list3(CONV,rvalue(e2),U2F); break;
1616 default:
1617 if(integral(type)) e2 = list3(CONV,rvalue(e2),I2F);
1618 else { error(TYERR); e2 = dlist2(DCONST,1.0); }
1619 }
1620 }
1580 #else 1621 #else
1581 else { error(TYERR); e2 = list2(CONST,0); } 1622 else { error(TYERR); e2 = list2(CONST,0); }
1582 #endif 1623 #endif
1583 type = FLOAT; 1624 type = FLOAT;
1584 return e2; 1625 return e2;
1593 else if (car(e2)==CONST) e2 = llist2(LCONST,(long long)cadr(e2)); 1634 else if (car(e2)==CONST) e2 = llist2(LCONST,(long long)cadr(e2));
1594 else if (car(e2)==LCONST) ; 1635 else if (car(e2)==LCONST) ;
1595 #if FLOAT_CODE 1636 #if FLOAT_CODE
1596 else if (car(e2)==DCONST||car(e2)==FCONST) 1637 else if (car(e2)==DCONST||car(e2)==FCONST)
1597 e2 = llist2(LCONST,(long long)dcadr(e2)); 1638 e2 = llist2(LCONST,(long long)dcadr(e2));
1598 else if(type==FLOAT) e2 = list3(CONV,rvalue(e2),F2LL); 1639 #endif
1599 else if(type==DOUBLE) e2 = list3(CONV,rvalue(e2),D2LL); 1640 else {
1600 #endif 1641 switch(type) {
1601 else if(type==UNSIGNED) e2 = list3(CONV,rvalue(e2),U2LL); 1642 case FLOAT: e2 = list3(CONV,rvalue(e2),F2LL); break;
1602 else if(type==LONGLONG) e2 = e2; 1643 case DOUBLE: e2 = list3(CONV,rvalue(e2),D2LL); break;
1603 else if(type==ULONGLONG) e2 = e2; 1644 case UNSIGNED: e2 = list3(CONV,rvalue(e2),U2LL); break;
1604 else if(integral(type)) e2 = list3(CONV,rvalue(e2),I2LL); 1645 case LONGLONG: break;
1605 else { error(TYERR); e2 = llist2(LCONST,0LL); } 1646 case ULONGLONG: break;
1647 default:
1648 if(integral(type)) e2 = list3(CONV,rvalue(e2),I2LL);
1649 else { error(TYERR); e2 = llist2(LCONST,0LL); }
1650 }
1651 }
1606 #else 1652 #else
1607 else { error(TYERR); e2 = list2(CONST,0); } 1653 else { error(TYERR); e2 = list2(CONST,0); }
1608 #endif 1654 #endif
1609 type = LONGLONG; 1655 type = LONGLONG;
1610 return e2; 1656 return e2;
1619 else if (car(e2)==CONST) e2 = llist2(LCONST,(unsigned long long)cadr(e2)); 1665 else if (car(e2)==CONST) e2 = llist2(LCONST,(unsigned long long)cadr(e2));
1620 else if (car(e2)==LCONST) ; 1666 else if (car(e2)==LCONST) ;
1621 #if FLOAT_CODE 1667 #if FLOAT_CODE
1622 else if (car(e2)==DCONST||car(e2)==FCONST) 1668 else if (car(e2)==DCONST||car(e2)==FCONST)
1623 e2 = llist2(LCONST,(unsigned long long)dcadr(e2)); 1669 e2 = llist2(LCONST,(unsigned long long)dcadr(e2));
1624 else if(type==FLOAT) e2 = list3(CONV,rvalue(e2),F2ULL); 1670 #endif
1625 else if(type==DOUBLE) e2 = list3(CONV,rvalue(e2),D2ULL); 1671 else {
1626 #endif 1672 switch(type) {
1627 else if(type==UNSIGNED) e2 = list3(CONV,rvalue(e2),U2ULL); 1673 case FLOAT: e2 = list3(CONV,rvalue(e2),F2ULL); break;
1628 else if(type==LONGLONG) ; 1674 case DOUBLE: e2 = list3(CONV,rvalue(e2),D2ULL); break;
1629 else if(type==ULONGLONG) ; 1675 case UNSIGNED: e2 = list3(CONV,rvalue(e2),U2ULL); break;
1630 else if(integral(type)) e2 = list3(CONV,rvalue(e2),I2ULL); 1676 case LONGLONG: break;
1631 else { error(TYERR); e2 = llist2(LCONST,0LL); } 1677 case ULONGLONG: break;
1678 default:
1679 if(integral(type)) e2 = list3(CONV,rvalue(e2),I2ULL);
1680 else { error(TYERR); e2 = llist2(LCONST,0LL); }
1681 }
1682 }
1632 #else 1683 #else
1633 else unsigned_value(e2); 1684 else unsigned_value(e2);
1634 #endif 1685 #endif
1635 type = ULONGLONG; 1686 type = ULONGLONG;
1636 return e2; 1687 return e2;
1638 1689
1639 static int 1690 static int
1640 int_value(int e2) 1691 int_value(int e2)
1641 { 1692 {
1642 if (type>0&&car(type)==BIT_FIELD) e2=rvalue(e2); 1693 if (type>0&&car(type)==BIT_FIELD) e2=rvalue(e2);
1694 if (0);
1695 else if(type>0&&car(type)==ARRAY) return e2;
1696 else if(scalar(type)) return e2;
1697 #if FLOAT_CODE
1698 else if (car(e2)==DCONST||car(e2)==FCONST) e2 = list2(CONST,(int)dcadr(e2));
1699 #endif
1700 #if LONGLONG_CODE
1701 else if (car(e2)==LCONST) e2 = list2(CONST,(int)lcadr(e2));
1702 #endif
1703 else {
1704 switch(type) {
1705 case FLOAT: e2 = list3(CONV,rvalue(e2),F2I); break;
1706 case DOUBLE: e2 = list3(CONV,rvalue(e2),D2I); break;
1707 case LONGLONG: e2 = list3(CONV,rvalue(e2),LL2I); break;
1708 case ULONGLONG: e2 = list3(CONV,rvalue(e2),ULL2I); break;
1709 default:
1710 error(TYERR); e2 = list2(CONST,1);
1711 }
1712 }
1713 type = INT;
1714 return e2;
1715 }
1716
1717 static int
1718 unsigned_value(int e2)
1719 {
1720 if (type>0&&car(type)==BIT_FIELD) e2=rvalue(e2);
1721 else if(type>0&&car(type)==ARRAY) return e2;
1643 if (0); 1722 if (0);
1644 else if(scalar(type)) return e2; 1723 else if(scalar(type)) return e2;
1645 #if FLOAT_CODE 1724 #if FLOAT_CODE
1646 else if (car(e2)==DCONST||car(e2)==FCONST) e2 = list2(CONST,(int)dcadr(e2)); 1725 else if (car(e2)==DCONST||car(e2)==FCONST) e2 = list2(CONST,(int)dcadr(e2));
1647 else if(type==FLOAT) e2 = list3(CONV,rvalue(e2),F2I);
1648 else if(type==DOUBLE) e2 = list3(CONV,rvalue(e2),D2I);
1649 #endif 1726 #endif
1650 #if LONGLONG_CODE 1727 #if LONGLONG_CODE
1651 else if (car(e2)==LCONST) e2 = list2(CONST,(int)lcadr(e2)); 1728 else if (car(e2)==LCONST) e2 = list2(CONST,(unsigned)lcadr(e2));
1652 else if(type==LONGLONG) e2 = list3(CONV,rvalue(e2),LL2I); 1729 #endif
1653 else if(type==ULONGLONG) e2 = list3(CONV,rvalue(e2),ULL2I); 1730 else {
1654 #endif 1731 switch(type) {
1655 else if(car(type)==ARRAY) return e2; 1732 case LONGLONG: e2 = list3(CONV,rvalue(e2),LL2U); break;
1656 else { error(TYERR); e2 = list2(CONST,1); } 1733 case ULONGLONG: e2 = list3(CONV,rvalue(e2),ULL2U); break;
1657 type = INT; 1734 case FLOAT: e2 = list3(CONV,rvalue(e2),F2U); break;
1658 return e2; 1735 case DOUBLE: e2 = list3(CONV,rvalue(e2),D2U); break;
1659 } 1736 default:
1660 1737 error(TYERR);
1661 static int 1738 }
1662 unsigned_value(int e2) 1739 }
1663 {
1664 if (type>0&&car(type)==BIT_FIELD) e2=rvalue(e2);
1665 if (0);
1666 else if(scalar(type)) return e2;
1667 #if FLOAT_CODE
1668 // else if (car(e2)==DCONST||car(e2)==FCONST) e2 = list2(CONST,(unsigned)dcadr(e2));
1669 else if (car(e2)==DCONST||car(e2)==FCONST) e2 = list2(CONST,(int)dcadr(e2));
1670 else if(type==FLOAT) e2 = list3(CONV,rvalue(e2),F2U);
1671 else if(type==DOUBLE) e2 = list3(CONV,rvalue(e2),D2U);
1672 #endif
1673 #if LONGLONG_CODE
1674 else if(type==LONGLONG) e2 = list3(CONV,rvalue(e2),LL2U);
1675 else if(type==ULONGLONG) e2 = list3(CONV,rvalue(e2),ULL2U);
1676 #endif
1677 else if(car(type)==ARRAY) return e2;
1678 else error(TYERR);
1679 type = UNSIGNED; 1740 type = UNSIGNED;
1680 return e2; 1741 return e2;
1681 } 1742 }
1682 1743
1683 /* assign statement */ 1744 /* assign statement */
1699 1760
1700 /* with conversion (will destroy type global variable) */ 1761 /* with conversion (will destroy type global variable) */
1701 1762
1702 extern int 1763 extern int
1703 assign_expr(int e1,int e2,int t) { 1764 assign_expr(int e1,int e2,int t) {
1704 if(t==VOID) 1765 switch(t) {
1705 error(TYERR); 1766 case VOID:
1706 if(t==CHAR||t==UCHAR) { 1767 break;
1768 case CHAR:case UCHAR:
1707 e2=(t==UCHAR)?unsigned_value(e2):int_value(e2); 1769 e2=(t==UCHAR)?unsigned_value(e2):int_value(e2);
1708 return(list3(CASS,e1,e2)); 1770 return(list3(CASS,e1,e2));
1709 } else if(t==SHORT||t==USHORT) { 1771 case SHORT:case USHORT:
1710 e2=(t==USHORT)?unsigned_value(e2):int_value(e2); 1772 e2=(t==USHORT)?unsigned_value(e2):int_value(e2);
1711 return(list3(SASS,e1,e2)); 1773 return(list3(SASS,e1,e2));
1712 #if FLOAT_CODE 1774 #if FLOAT_CODE
1713 } else if(t==DOUBLE) { 1775 case DOUBLE:
1714 e2=double_value(e2); 1776 e2=double_value(e2);
1715 return(list3(DASS,e1,e2)); 1777 return(list3(DASS,e1,e2));
1716 } else if(t==FLOAT) { 1778 case FLOAT:
1717 e2=float_value(e2); 1779 e2=float_value(e2);
1718 return(list3(FASS,e1,e2)); 1780 return(list3(FASS,e1,e2));
1719 #endif 1781 #endif
1720 #if LONGLONG_CODE 1782 #if LONGLONG_CODE
1721 } else if(t==LONGLONG) { 1783 case LONGLONG:
1722 e2=longlong_value(e2); 1784 e2=longlong_value(e2);
1723 return(list3(LASS,e1,e2)); 1785 return(list3(LASS,e1,e2));
1724 } else if(t==ULONGLONG) { 1786 case ULONGLONG:
1725 e2=ulonglong_value(e2); 1787 e2=ulonglong_value(e2);
1726 return(list3(LASS,e1,e2)); 1788 return(list3(LASS,e1,e2));
1727 #endif 1789 #endif
1728 } else if(scalar(t)) { 1790 default:
1729 e2=(t==UNSIGNED)?unsigned_value(e2):int_value(e2); 1791 if(scalar(t)) {
1730 return(list3(ASS,e1,e2)); 1792 e2=(t==UNSIGNED)?unsigned_value(e2):int_value(e2);
1731 } else if (car(t)==BIT_FIELD) { 1793 return(list3(ASS,e1,e2));
1732 e2 = correct_type(e2,cadr(t)); 1794 }
1733 return(list4(BASS,e1,e2,list2(BASS,t))); 1795 switch(car(t)) {
1734 } else if((car(t)==STRUCT||car(t)==UNION)) { 1796 case BIT_FIELD:
1735 if (size(t)!=size(type)) error(TYERR); 1797 e2 = correct_type(e2,cadr(t));
1736 type=t; 1798 return(list4(BASS,e1,e2,list2(BASS,t)));
1737 if(car(e2)==RSTRUCT && car(cadr(e2))==FUNCTION) { 1799 case STRUCT:case UNION:
1738 replace_return_struct(cadr(e2),e1); 1800 if (size(t)!=size(type)) error(TYERR);
1739 return cadr(e2); 1801 type=t;
1740 } else { 1802 if(car(e2)==RSTRUCT && car(cadr(e2))==FUNCTION) {
1741 return (list4(STASS,e1,e2,size(t))); 1803 replace_return_struct(cadr(e2),e1);
1742 } 1804 return cadr(e2);
1743 } else { 1805 } else {
1744 error(TYERR); return list3(ASS,e1,e2); 1806 return (list4(STASS,e1,e2,size(t)));
1745 } 1807 }
1808 }
1809 }
1810 error(TYERR); return list3(ASS,e1,e2);
1746 } 1811 }
1747 1812
1748 extern int 1813 extern int
1749 cond(int t,int e1,int e2,int e3) 1814 cond(int t,int e1,int e2,int e3)
1750 { 1815 {
1782 } 1847 }
1783 1848
1784 extern int 1849 extern int
1785 assop(int e1,int e2,int op,int t,int no_float) 1850 assop(int e1,int e2,int op,int t,int no_float)
1786 { 1851 {
1852 int ass,u = 0;
1787 if(!(integral(type)||type==FLOAT||type==DOUBLE|| 1853 if(!(integral(type)||type==FLOAT||type==DOUBLE||
1788 type==LONGLONG||type==ULONGLONG 1854 type==LONGLONG||type==ULONGLONG
1789 )) error(TYERR); 1855 )) error(TYERR);
1856 switch(t) {
1790 #if FLOAT_CODE 1857 #if FLOAT_CODE
1791 if (t==FLOAT) { 1858 case FLOAT:
1792 if (no_float) error(TYERR); 1859 if (no_float) error(TYERR);
1793 e2=float_value(e2); 1860 e2=float_value(e2);
1794 return(list4(FASSOP,e1,e2,op+FOP)); 1861 return(list4(FASSOP,e1,e2,op+FOP));
1795 } else if (t==DOUBLE) { 1862 case DOUBLE:
1796 if (no_float) error(TYERR); 1863 if (no_float) error(TYERR);
1797 e2=double_value(e2); 1864 e2=double_value(e2);
1798 return(list4(DASSOP,e1,e2,op+DOP)); 1865 return(list4(DASSOP,e1,e2,op+DOP));
1799 }
1800 #endif 1866 #endif
1801 #if LONGLONG_CODE 1867 #if LONGLONG_CODE
1802 if (t==LONGLONG) { 1868 case LONGLONG:
1803 e2=longlong_value(e2); 1869 e2=longlong_value(e2);
1804 return(list4(LASSOP,e1,e2,op+LOP)); 1870 return(list4(LASSOP,e1,e2,op+LOP));
1805 } else if (t==ULONGLONG) { 1871 case ULONGLONG:
1806 e2=ulonglong_value(e2); 1872 e2=ulonglong_value(e2);
1807 return(list4(LASSOP,e1,e2,op+LOP+((op==MUL+AS||op==DIV+AS)?US:0))); 1873 return(list4(LASSOP,e1,e2,op+LOP+((op==MUL+AS||op==DIV+AS)?US:0)));
1808 } 1874 #endif
1809 #endif 1875 case CHAR:
1810 if((t==UNSIGNED||t==UCHAR||t==USHORT||type==UNSIGNED)&& 1876 type= INT; ass = CASSOP; break;
1811 (op==MUL||op==DIV||op==MOD)) 1877 case SHORT:
1812 op=op+US; 1878 type= INT; ass = SASSOP; break;
1813 if((t==UNSIGNED||t==UCHAR||t==USHORT)&&(op==RSHIFT||op==LSHIFT)) 1879 case INT:
1814 op=op+US; 1880 type= INT; ass = ASSOP; break;
1815 if(t==CHAR) { 1881 case UCHAR:
1816 type= INT; 1882 type= UNSIGNED; ass = CUASSOP; u=1; break;
1817 return(list4(CASSOP,e1,e2,op)); 1883 case USHORT:
1818 } 1884 type= UNSIGNED; ass = SUASSOP; u=1; break;
1819 if(t==UCHAR) { 1885 case UNSIGNED:
1820 type= UNSIGNED; 1886 type= UNSIGNED; ass = ASSOP; u=1; break;
1821 return(list4(CUASSOP,e1,e2,op)); 1887 default:
1822 } 1888 if (t>0 && car(t)==BIT_FIELD) {
1823 if(t==SHORT) { 1889 e2 = correct_type(e2,cadr(t));
1824 type= INT; 1890 return(list4(BASSOP,e1,e2,list2(op,t)));
1825 return(list4(SASSOP,e1,e2,op)); 1891 }
1826 } 1892 }
1827 if(t==USHORT) { 1893 if (u) {
1828 type= UNSIGNED; 1894 if (op==RSHIFT||op==LSHIFT) op=op+US;
1829 return(list4(SUASSOP,e1,e2,op)); 1895 else {
1830 } 1896 switch(type) {
1831 if (t>0 && car(t)==BIT_FIELD) { 1897 case UCHAR: case USHORT: case UNSIGNED:
1832 e2 = correct_type(e2,cadr(t)); 1898 if (op==MUL||op==DIV||op==MOD) op=op+US;
1833 return(list4(BASSOP,e1,e2,list2(op,t))); 1899 }
1900 }
1834 } 1901 }
1835 type=t; 1902 type=t;
1836 if(integral(t)) return(list4(ASSOP,e1,e2,op)); 1903 if(integral(t)) return(list4(ass,e1,e2,op));
1837 /* pointer += ... */ 1904 /* pointer += ... */
1838 if((op!=ADD&&op!=SUB)||car(t)!=POINTER) error(TYERR); 1905 if((op!=ADD&&op!=SUB)||car(t)!=POINTER) error(TYERR);
1839 e2=binop(MUL,e2,list2(CONST,size(cadr(t))),INT,UNSIGNED); 1906 e2=binop(MUL,e2,list2(CONST,size(cadr(t))),INT,UNSIGNED);
1840 type=t; 1907 type=t;
1841 1908
1849 { 1916 {
1850 int e2,e3,byte,op,sign,size; 1917 int e2,e3,byte,op,sign,size;
1851 int n,t; 1918 int n,t;
1852 1919
1853 /* e2 op= e3 */ 1920 /* e2 op= e3 */
1854 if (car(e1) == CUASSOP) { 1921 switch(car(e1)) {
1855 byte = 1; sign = 0; size = 1; 1922 case CUASSOP: byte = 1; sign = 0; size = 1; break;
1856 } else if (car(e1) == CASSOP) { 1923 case CASSOP: byte = 1; sign = 1; size = 1; break;
1857 byte = 1; sign = 1; size = 1; 1924 case SUASSOP: byte = size_of_short; sign = 0; size = size_of_short; break;
1858 } else if (car(e1) == SUASSOP) { 1925 case SASSOP: byte = size_of_short; sign = 1; size = size_of_short; break;
1859 byte = size_of_short; sign = 0; size = size_of_short; 1926 default: byte = 0; sign = 1; size = size_of_int;
1860 } else if (car(e1) == SASSOP) {
1861 byte = size_of_short; sign = 1; size = size_of_short;
1862 } else {
1863 byte = 0; sign = 1; size = size_of_int;
1864 } 1927 }
1865 e2 = cadr(e1); 1928 e2 = cadr(e1);
1866 if (car(e2)==INDIRECT) e2=cadr(e2); 1929 if (car(e2)==INDIRECT) e2=cadr(e2);
1867 e3 = caddr(e1); 1930 e3 = caddr(e1);
1868 op = cadddr(e1); 1931 op = cadddr(e1);
2775 2838
2776 extern void 2839 extern void
2777 lcheck(int e) 2840 lcheck(int e)
2778 { 2841 {
2779 int t; 2842 int t;
2780 if(!(scalar(type)||type==DOUBLE||type==FLOAT|| 2843 if(scalar(type)) return;
2781 type==LONGLONG||type==ULONGLONG)|| 2844 switch(type) {
2782 (car(e)!=GVAR&&car(e)!=LVAR&&car(e)!=INDIRECT 2845 case DOUBLE: case FLOAT : case LONGLONG: case ULONGLONG:
2783 && car(e)!=REGISTER 2846 return;
2784 && car(e)!=DREGISTER 2847 default:
2785 && car(e)!=FREGISTER 2848 switch(car(e)) {
2786 && car(e)!=LREGISTER) 2849 case GVAR: case LVAR: case INDIRECT :
2787 ) 2850 case REGISTER : case DREGISTER : case FREGISTER : case LREGISTER:
2788 if ((t=car(type))<0 && t!=STRUCT && t!=UNION) 2851 return;
2789 error(LVERR); 2852 }
2853 }
2854 if ((t=car(type))<0 && t!=STRUCT && t!=UNION)
2855 error(LVERR);
2790 } 2856 }
2791 2857
2792 extern int 2858 extern int
2793 indop(int e) 2859 indop(int e)
2794 { 2860 {
2797 type=cadr(type); 2863 type=cadr(type);
2798 else if(car(type)==CODE || car(type)==FUNCTION) 2864 else if(car(type)==CODE || car(type)==FUNCTION)
2799 type=type; 2865 type=type;
2800 else error(TYERR); 2866 else error(TYERR);
2801 } else 2867 } else
2802 type= CHAR; 2868 type= CHAR; // ?!
2803 if(car(e)==ADDRESS) 2869 if(car(e)==ADDRESS)
2804 return(cadr(e)); 2870 return(cadr(e));
2805 return(list2(INDIRECT,e)); 2871 return(list2(INDIRECT,e));
2806 } 2872 }
2807 2873