Mercurial > hg > CbC > old > device
comparison mc-code-spu.c @ 680:f536897fa3cb
*** empty log message ***
author | kono |
---|---|
date | Sun, 29 Jul 2007 23:09:38 +0900 |
parents | 7c42cf329666 |
children | e5a498eab0f4 |
comparison
equal
deleted
inserted
replaced
679:c62ba4e606ce | 680:f536897fa3cb |
---|---|
89 | 89 |
90 | 90 |
91 | 91 |
92 static void dconst(int l,int h,double value); | 92 static void dconst(int l,int h,double value); |
93 static void code_assign_input_double_long(int e1,int e2) ; | 93 static void code_assign_input_double_long(int e1,int e2) ; |
94 static void code_assign_input_double_reg(int e1,int e2) ; | |
94 static void code_assign_input_float_int(int e1,int e2) ; | 95 static void code_assign_input_float_int(int e1,int e2) ; |
95 #endif | 96 #endif |
96 static void use_input_reg(int reg,int mode); | 97 static void use_input_reg(int reg,int mode); |
97 static void ascii(char *s); | 98 static void ascii(char *s); |
98 | 99 |
481 | 482 |
482 static void | 483 static void |
483 lvar(int l,char *cext) | 484 lvar(int l,char *cext) |
484 { | 485 { |
485 if (large_lvar) { | 486 if (large_lvar) { |
486 printf("[%s, 0]%s\n",register_name(large_lvar),cext); | 487 //printf("[%s, 0]%s\n##lvar0\n",register_name(large_lvar),cext); |
488 printf("0(%s)\n##lvar0\n",register_name(large_lvar)); | |
487 free_register(large_lvar); | 489 free_register(large_lvar); |
488 return; | 490 return; |
489 } | 491 } |
490 if (is_code(fnptr)) { | 492 if (is_code(fnptr)) { |
491 if (l>=ARG_LVAR_OFFSET) { /* caller's arguments */ | 493 if (l>=ARG_LVAR_OFFSET) { /* caller's arguments */ |
492 printf("[sp, %d]%s\n",CODE_CALLER_ARG(l-ARG_LVAR_OFFSET),cext); | 494 //printf("[sp, %d]%s\n##lvar1\n",CODE_CALLER_ARG(l-ARG_LVAR_OFFSET),cext); |
493 } else | 495 printf("%d($sp)\n##lvar1\n",CODE_CALLER_ARG(l-ARG_LVAR_OFFSET)); |
494 printf("[fp, %d]%s\n",CODE_LVAR(l),cext); | 496 //} else |
495 } else if (l<0) { /* local variable */ | 497 // printf("[fp, %d]%s\n",CODE_LVAR(l),cext); |
496 //printf("[fp, #%d+.L%d]%s\n",FUNC_LVAR(l),lvar_offset_label,cext); | 498 printf("%d($sp)\n",CODE_LVAR(l)); |
499 } | |
500 } else if (l<0) { /* local variable */ | |
501 //printf("[fp, #%d+.L%d]%s\n##lvar2\n",FUNC_LVAR(l),lvar_offset_label,cext); | |
497 printf(".LC%d+%d($sp)\n",lvar_offset_label,FUNC_LVAR(l)); | 502 printf(".LC%d+%d($sp)\n",lvar_offset_label,FUNC_LVAR(l)); |
498 } else if (l>=ARG_LVAR_OFFSET) { /* caller's arguments */ | 503 } else if (l>=ARG_LVAR_OFFSET) { /* caller's arguments */ |
499 printf("[sp, %d]%s\n",CALLER_ARG(l-ARG_LVAR_OFFSET),cext); | 504 printf("%d($sp)%s\n",CALLER_ARG(l-ARG_LVAR_OFFSET),cext); |
500 } else { /* callee's arguments */ | 505 } else { /* callee's arguments */ |
501 printf("[fp, %d]%s\n",CALLEE_ARG(l),cext); | 506 printf("%d($sp)%s\n",CALLEE_ARG(l),cext); |
502 } | 507 } |
503 } | 508 } |
504 | 509 |
505 static void | 510 static void |
506 lvar_address(int l,int creg) | 511 lvar_address(int l,int creg) |
507 { | 512 { |
516 code_add(creg,CODE_LVAR(l),REG_fp); | 521 code_add(creg,CODE_LVAR(l),REG_fp); |
517 } else if (l<0) { /* local variable */ | 522 } else if (l<0) { /* local variable */ |
518 // printf("\tsfi\t%s, fp, %d\n",register_name(creg), FUNC_LVAR(l)); | 523 // printf("\tsfi\t%s, fp, %d\n",register_name(creg), FUNC_LVAR(l)); |
519 trn = register_name(tmp = get_register()); | 524 trn = register_name(tmp = get_register()); |
520 //disp = search_const(LVAR,glist2(lvar_offset_label,FUNC_LVAR(l)),&label); | 525 //disp = search_const(LVAR,glist2(lvar_offset_label,FUNC_LVAR(l)),&label); |
521 printf("\tlqd\t%s, %d($sp)\n",trn,(disp*4)); | 526 //printf("\tlqdhoge\t%s, %d($sp)\n",trn,(disp*4)); |
522 printf("\tadd\t%s, fp, %s\n",register_name(creg),trn); | 527 printf("\tlqd\t%s, 64($sp)\n",trn); |
528 printf("\ta\t%s, $sp, %s\n",register_name(creg),trn); | |
523 } else if (l>=ARG_LVAR_OFFSET) { /* caller's arguments */ | 529 } else if (l>=ARG_LVAR_OFFSET) { /* caller's arguments */ |
524 code_add(creg,CALLER_ARG(l-ARG_LVAR_OFFSET),REG_sp); | 530 code_add(creg,CALLER_ARG(l-ARG_LVAR_OFFSET),REG_sp); |
525 } else { /* callee's arguments */ | 531 } else { /* callee's arguments */ |
526 code_add(creg,CALLEE_ARG(l),REG_fp); | 532 code_add(creg,CALLEE_ARG(l),REG_fp); |
527 } | 533 } |
1244 { | 1250 { |
1245 //int label,disp; | 1251 //int label,disp; |
1246 int disp; | 1252 int disp; |
1247 char *rrn = register_name(r); | 1253 char *rrn = register_name(r); |
1248 //disp = search_const(GVAR,(int)nptr,&label); | 1254 //disp = search_const(GVAR,(int)nptr,&label); |
1249 printf("\tlqd\t%s, %d($sp)\n",rrn,(disp*4)); | 1255 printf("\tlqd\t%s, %d($sp)\n",rrn,(nptr->sc)*16); |
1250 } | 1256 } |
1251 | 1257 |
1252 #define mask8(d,bit) (d & (255 << bit)) | 1258 #define mask8(d,bit) (d & (255 << bit)) |
1253 | 1259 |
1254 /* | 1260 /* |
1360 | 1366 |
1361 use_int(reg); | 1367 use_int(reg); |
1362 crn = register_name(reg); | 1368 crn = register_name(reg); |
1363 if ((s=make_const(e2,&p1,&p2,&p3,CONST))) { | 1369 if ((s=make_const(e2,&p1,&p2,&p3,CONST))) { |
1364 add = s>0?"a":"sf"; | 1370 add = s>0?"a":"sf"; |
1365 mov = s>0?"il":"mvn"; | 1371 mov = s>0?"il":"ori"; |
1366 printf("\t%s\t%s, %d\n",mov,crn,p1); | 1372 printf("\t%s\t%s, %s, %d\n",mov,crn,crn,p1); |
1367 if (p2) printf("\t%s\t%s, %s, %d\n",add,crn,crn,p2); | 1373 if (p2) printf("\t%s\t%s, %s, %d\n",add,crn,crn,p2); |
1368 if (p3) printf("\t%s\t%s, %s, %d\n",add,crn,crn,p3); | 1374 if (p3) printf("\t%s\t%s, %s, %d\n",add,crn,crn,p3); |
1369 } else { | 1375 } else { |
1370 //disp = search_const(CONST,e2,&label); | 1376 //disp = search_const(CONST,e2,&label); |
1371 printf("\tlqd\t%s, %d($sp)\n",crn,(disp*4)); | 1377 printf("\tlqd\t%s, %d($sp)\n",crn,(disp*4)); |
1395 ***********************************************************/ | 1401 ***********************************************************/ |
1396 use_int(reg); | 1402 use_int(reg); |
1397 crn = register_name(reg); | 1403 crn = register_name(reg); |
1398 if (-32768<e2&&e2<32768) | 1404 if (-32768<e2&&e2<32768) |
1399 printf("\til %s,%d\n",crn,e2); | 1405 printf("\til %s,%d\n",crn,e2); |
1400 else if(32767<e2&&e2<262143) | 1406 else if(32767<e2&&e2<262144) |
1401 printf("\tila %s,%d\n",crn,e2); | 1407 printf("\tila %s,%d\n",crn,e2); |
1402 else if(262143<e2) { | 1408 else if(262143<e2) { |
1403 printf("\t ilhu %s,%d\n",crn,e2/16^4); | 1409 printf("\t ilhu\t%s,%d\n",crn,e2/65536); |
1404 printf("\t iohl %s,%d\n",crn,e2%16^4); | 1410 printf("\t iohl %s,%d\n",crn,e2%65536); |
1405 } else { | 1411 } else { |
1406 r = (~e2 >> 16) & 0xffff; | 1412 r = (~e2 >> 16) & 0xffff; |
1407 r += 1; | 1413 r += 1; |
1408 r = -r; | 1414 r = -r; |
1409 printf("\tilhu %s,%d\n",crn,r); | 1415 printf("\tilhu\t%s,%d\n",crn,r); |
1410 if(e2 > -262143) | 1416 if((e2&0xffff) > -262143) |
1411 printf("\tiohl %s,%d\n",crn, (e2&0xffff)); | 1417 printf("\tiohl %s,%d\n",crn, (e2&0xffff)); |
1412 else | 1418 else |
1413 printf("\tori %s,%s,%d\n",crn,crn,(e2&0xffff)); | 1419 printf("\tori %s,%s,%d\n",crn,crn,(e2&0xffff)); |
1414 } | 1420 } |
1415 } | 1421 } |
1417 static void | 1423 static void |
1418 code_add(int reg,int offset,int r) | 1424 code_add(int reg,int offset,int r) |
1419 { | 1425 { |
1420 char *crn = register_name(reg); | 1426 char *crn = register_name(reg); |
1421 char *rrn = register_name(r); | 1427 char *rrn = register_name(r); |
1422 char *drn; | 1428 char *rn2 = register_name(r+1); |
1429 char *drn; | |
1423 int dreg; | 1430 int dreg; |
1424 int s,p1,p2,p3; | 1431 int s,p1,p2,p3,h; |
1425 char *add; | 1432 char *add; |
1426 //int label,disp; | 1433 //int label,disp; |
1427 int disp; | 1434 int disp; |
1428 if (offset==0) { | 1435 if (offset==0) { |
1429 if(r!=reg) | 1436 if(r!=reg) |
1430 printf("\tori\t%s, %s, 0\n",crn,rrn); | 1437 printf("\tori\t%s, %s, 0\n",crn,rrn); |
1431 } else if ((s=make_const(offset,&p1,&p2,&p3,0))) { | 1438 } else if ((s=make_const(offset,&p1,&p2,&p3,0))) { |
1432 add = s>0?"a":"sfi"; | 1439 add = s>0?"a":"sf"; |
1433 printf("\t%s\t%s, %s, %d\n",add,crn,rrn,p1); | 1440 //printf("\t%s\t%s, %s, %d\n",add,crn,rrn,p1); |
1434 if (p2) printf("\t%s\t%s, %s, %d\n",add,crn,crn,p2); | 1441 if (-32768<(p1+p2+p3)&&(p1+p2+p3)<32768) |
1435 if (p3) printf("\t%s\t%s, %s, %d\n",add,crn,crn,p3); | 1442 printf("\til\t%s,%d\n",rn2,(p1+p2+p3)); |
1443 else if( (p1+p2+p3) > 32767 && (p1+p2+p3) < 262144) | |
1444 printf("\tila\t%s, %d\n",rn2,p1+p2+p3); | |
1445 else if( (p1+p2+p3) > 262143) { | |
1446 printf("\tilhu\t%s, %d\n",rn2,(p1+p2+p3)/65536); | |
1447 printf("\tiohl\t%s, %d\n",rn2,(p1+p2+p3)%65536); | |
1448 } else { | |
1449 h = (~(p1+p2+p3) >> 16) & 0xffff; | |
1450 h += 1; | |
1451 h = -h; | |
1452 printf("\tilhu\t%s,%d\n",crn,h); | |
1453 if(((p1+p2)&0xffff) > -262143) | |
1454 printf("\tiohl %s,%d\n",crn, ((p1+p2)&0xffff)); | |
1455 else | |
1456 printf("\tori %s,%s,%d\n",crn,crn,((p1+p2)&0xffff)); | |
1457 | |
1458 } | |
1459 | |
1460 printf("\t%s\t%s, %s, %s\n", add, crn, rrn ,rn2); | |
1461 //if (p2) printf("\t%s\t%s, %s, %s\n",add,crn,rrn,rrn+1); | |
1462 //if (p3) printf("\t%s\t%s, %s, %d\n",add,crn,crn,p3); | |
1436 } else { | 1463 } else { |
1437 //disp = search_const(CONST,offset,&label); | 1464 //disp = search_const(CONST,offset,&label); |
1438 drn = register_name(dreg = get_register()); | 1465 drn = register_name(dreg = get_register()); |
1439 printf("\tlqd\t%s, %d($sp)\n",drn,(disp*4)); | 1466 printf("\tlqd\t%s, %d($sp)\n",drn,(disp*4)); |
1440 printf("\ta\t%s, %s, %s\n",crn,drn,rrn); | 1467 printf("\ta\t%s, %s, %s\n",crn,drn,rrn); |
1447 code_ld(char *ld,int reg,int offset,int r,char *cext) | 1474 code_ld(char *ld,int reg,int offset,int r,char *cext) |
1448 { | 1475 { |
1449 char *crn = register_name(reg); | 1476 char *crn = register_name(reg); |
1450 char *rrn = register_name(r); | 1477 char *rrn = register_name(r); |
1451 if (-1024<offset&&offset<1024) { | 1478 if (-1024<offset&&offset<1024) { |
1452 printf("\t%s\t%s, [%s, %d]%s\n",ld,crn,rrn,offset,cext); | 1479 printf("\t%s\t%s, %d(%s)\n",ld,crn,offset,rrn); |
1453 } else { | 1480 } else { |
1454 code_add(reg,offset,r); | 1481 code_add(reg,offset,r); |
1455 printf("\t%s\t%s, [%s, 0]%s\n",ld,crn,crn,cext); | 1482 printf("\t%s\t%s, 0(%s) %s\n",ld,crn,crn,cext); |
1456 } | 1483 } |
1457 } | 1484 } |
1458 | 1485 |
1459 static void | 1486 static void |
1460 code_ldf(char *ld,char *crn,int offset,int r,char *cext) | 1487 code_ldf(char *ld,char *crn,int offset,int r,char *cext) |
1461 { | 1488 { |
1462 //char *rrn = register_name(r); | 1489 char *rrn = register_name(r); |
1463 char *orn; | 1490 char *orn; |
1464 int reg; | 1491 int reg; |
1465 if (-1024<offset&&offset<1024) { | 1492 if (-1024<offset&&offset<1024) { |
1466 printf("\t%s\t%s, %d(%s)\n",ld,crn,(offset*4),cext); | 1493 printf("\t%s\t%s, %d(%s)\n",ld,crn,(offset*4),rrn); |
1467 } else { | 1494 } else { |
1468 orn = register_name(reg=get_register()); | 1495 orn = register_name(reg=get_register()); |
1469 code_add(reg,offset,r); | 1496 code_add(reg,offset,r); |
1470 //printf("\t%s\t%s, [%s, 0]%s\n",ld,crn,orn,cext); | 1497 //printf("\t%s\t%s, [%s, 0]%s\n",ld,crn,orn,cext); |
1471 printf("hoge\n"); | |
1472 free_register(reg); | 1498 free_register(reg); |
1473 } | 1499 } |
1474 } | 1500 } |
1475 | 1501 |
1476 | 1502 |
1477 #define cload(sz,sign) \ | 1503 #define cload(sz,sign) \ |
1478 (sz==1?(sign?"lqx":"lqa"):sz==SIZE_OF_SHORT?(sign?"lqx":"lqa"):"lqd") | 1504 (sz==1?(sign?"lqd":"lqd"):sz==SIZE_OF_SHORT?(sign?"lqd":"lqd"):"lqd") |
1479 | 1505 |
1480 | 1506 |
1481 #define cext(sign,sz,reg) | 1507 #define cext(sign,sz,reg) |
1482 | 1508 |
1483 static char * | 1509 static char * |
1529 code_rlvar(int e2,int reg) { | 1555 code_rlvar(int e2,int reg) { |
1530 use_int(reg); | 1556 use_int(reg); |
1531 lvar_intro(e2); | 1557 lvar_intro(e2); |
1532 printf("\tlqd\t%s, ",register_name(reg)); | 1558 printf("\tlqd\t%s, ",register_name(reg)); |
1533 e2 *= 4; | 1559 e2 *= 4; |
1534 lvar(e2,""); | 1560 lvar(e2,""); |
1535 } | 1561 } |
1536 | 1562 |
1537 extern void | 1563 extern void |
1538 code_i2c(int reg) | 1564 code_i2c(int reg) |
1539 { | 1565 { |
1546 | 1572 |
1547 extern void | 1573 extern void |
1548 code_u2uc(int reg) | 1574 code_u2uc(int reg) |
1549 { | 1575 { |
1550 use_int(reg); | 1576 use_int(reg); |
1551 printf("and\t%s, %s, #255\n",register_name(reg),register_name(reg)); | 1577 printf("\tandbi\t%s, %s, 255\n",register_name(reg),register_name(reg)); |
1552 } | 1578 } |
1553 | 1579 |
1554 extern void | 1580 extern void |
1555 code_u2us(int reg) | 1581 code_u2us(int reg) |
1556 { | 1582 { |
1583 // &! ということらしい、だけど16711680とかは使えない。よってilhuとかで16711680をレジスタに格納して | |
1584 // and rt,rs,ra でandを行えば良いが、!はどうすんだ? | |
1557 use_int(reg); | 1585 use_int(reg); |
1558 printf("bic\t%s, %s, #16711680\n",register_name(reg),register_name(reg)); | 1586 //printf("bic\t%s, %s, #16711680\n",register_name(reg),register_name(reg)); |
1559 printf("bic\t%s, %s, #-16777216\n",register_name(reg),register_name(reg)); | 1587 printf("\tilhu\t%s,255\n", register_name(reg+1)); |
1588 printf("\tand\t%s,%s,%s\n",register_name(reg),register_name(reg),register_name(reg+1)); | |
1589 //printf("bic\t%s, %s, #-16777216\n",register_name(reg),register_name(reg)); | |
1590 printf("\tilhu\t%s,-256\n", register_name(reg+1)); | |
1591 printf("\tand\t%s,%s,%s\n",register_name(reg),register_name(reg),register_name(reg+1)); | |
1560 } | 1592 } |
1561 | 1593 |
1562 void | 1594 void |
1563 code_crlvar(int e2,int reg,int sign,int sz) { | 1595 code_crlvar(int e2,int reg,int sign,int sz) { |
1564 use_int(reg); | 1596 use_int(reg); |
1589 } | 1621 } |
1590 | 1622 |
1591 void | 1623 void |
1592 code_neg(int creg) { | 1624 code_neg(int creg) { |
1593 use_int(creg); | 1625 use_int(creg); |
1594 printf("\trsb\t%s, %s, #0\n", register_name(creg), register_name(creg)); | 1626 //printf("\trsb\t%s, %s, #0\n", register_name(creg), register_name(creg)); |
1627 printf("\tsfi\t%s, %s, 0\n", register_name(creg), register_name(creg)); | |
1595 } | 1628 } |
1596 | 1629 |
1597 | 1630 |
1598 void | 1631 void |
1599 code_not(int creg) { | 1632 code_not(int creg) { |
1600 use_int(creg); | 1633 use_int(creg); |
1601 printf("\tmvn\t%s, %s\n", | 1634 printf("\tori\t%s, %s, 0\n", |
1602 register_name(creg), register_name(creg)); | 1635 register_name(creg), register_name(creg)); |
1603 } | 1636 } |
1604 | 1637 |
1605 | 1638 |
1606 void | 1639 void |
1607 code_lnot(int creg) { | 1640 code_lnot(int creg) { |
1608 use_int(creg); | 1641 use_int(creg); |
1609 | 1642 |
1610 printf("\tcmp\t%s, #0\n", register_name(creg)); | 1643 //printf("\tcmp\t%s, #0\n", register_name(creg)); |
1611 printf("\tmovne\t%s, #0\n", register_name(creg)); | 1644 printf("\tceqbi\t%s,%s,0\n",register_name(creg),register_name(creg)); |
1612 printf("\tmoveq\t%s, #1\n", register_name(creg)); | 1645 //printf("\tmovnehoge\t%s, #0\n", register_name(creg)); |
1646 //printf("\tmoveq\t%s, #1\n", register_name(creg)); | |
1613 } | 1647 } |
1614 | 1648 |
1615 void | 1649 void |
1616 code_preinc(int e1,int e2,int dir,int sign,int sz,int reg) { | 1650 code_preinc(int e1,int e2,int dir,int sign,int sz,int reg) { |
1617 char *xrn,*drn; | 1651 char *xrn,*drn; |
1687 void | 1721 void |
1688 code_environment(int creg) { | 1722 code_environment(int creg) { |
1689 /* save frame pointer */ | 1723 /* save frame pointer */ |
1690 if (is_code(fnptr)) { | 1724 if (is_code(fnptr)) { |
1691 use_int(creg); | 1725 use_int(creg); |
1692 printf("\tmov\t%s, fp\n",register_name(creg)); | 1726 //printf("\tmov\t%s, fp\n",register_name(creg)); |
1693 } else { | 1727 printf("\tori\t%s, fp, 0\n",register_name(creg)); |
1728 } else { | |
1694 //int disp,label; | 1729 //int disp,label; |
1695 int disp; | 1730 int disp; |
1696 char *trn = register_name(REG_ip); | 1731 char *trn = register_name(REG_ip); |
1697 use_int(creg); | 1732 use_int(creg); |
1698 //disp = search_const(LVAR,glist2(lvar_offset_label,FUNC_LVAR(0)),&label); | 1733 //disp = search_const(LVAR,glist2(lvar_offset_label,FUNC_LVAR(0)),&label); |
1699 printf("\tlqa\t%s, %d\n",trn,disp); | 1734 printf("\tlqa\t%s, %d\n",trn,disp); |
1700 printf("\ta\t%s, fp, %s\n",register_name(creg),trn); | 1735 printf("\ta\t%s, $sp, %s\n",register_name(creg),trn); |
1701 } | 1736 } |
1702 } | 1737 } |
1703 | 1738 |
1704 static int rexpr_bool(int e1, int reg); | 1739 static int rexpr_bool(int e1, int reg); |
1705 #if LONGLONG_CODE | 1740 #if LONGLONG_CODE |
1716 #endif | 1751 #endif |
1717 b_expr(e1,1,e2=fwdlabel(),1); /* including > < ... */ | 1752 b_expr(e1,1,e2=fwdlabel(),1); /* including > < ... */ |
1718 if (use) { | 1753 if (use) { |
1719 use_int(reg); | 1754 use_int(reg); |
1720 xrn = register_name(reg); | 1755 xrn = register_name(reg); |
1721 printf("\tmov\t%s, #0\n",xrn); | 1756 //printf("\tmov\t%s, #0\n",xrn); |
1757 printf("\til\t%s, 0\n",xrn); | |
1722 gen_jmp(e3=fwdlabel()); | 1758 gen_jmp(e3=fwdlabel()); |
1723 fwddef(e2); | 1759 fwddef(e2); |
1724 printf("\tmov\t%s, #1\n",xrn); | 1760 //printf("\tmov\t%s, #1\n",xrn); |
1761 printf("\til\t%s, 1\n",xrn); | |
1725 fwddef(e3); | 1762 fwddef(e3); |
1726 } else { | 1763 } else { |
1727 fwddef(e2); | 1764 fwddef(e2); |
1728 } | 1765 } |
1729 } | 1766 } |
1733 code_cmp_crgvar(int e1,int reg,int sz,int label,int cond) { | 1770 code_cmp_crgvar(int e1,int reg,int sz,int label,int cond) { |
1734 use_int(reg); | 1771 use_int(reg); |
1735 code_ld(cload(sz,0),reg,cadr(e1),get_ptr_cache((NMTBL*)caddr(e1)), | 1772 code_ld(cload(sz,0),reg,cadr(e1),get_ptr_cache((NMTBL*)caddr(e1)), |
1736 cext_at(sz,0)); | 1773 cext_at(sz,0)); |
1737 cext(0,sz,r); | 1774 cext(0,sz,r); |
1738 printf("\tcmp\t%s, #0\n",register_name(reg)); | 1775 printf("\tceqi\t%s, %s, 0\n",register_name(reg), register_name(reg)); |
1739 jcond(label,cond); | 1776 jcond(label,cond); |
1740 } | 1777 } |
1741 | 1778 |
1742 | 1779 |
1743 void | 1780 void |
1744 code_cmp_crlvar(int e2,int reg, int sz,int label,int cond) { | 1781 code_cmp_crlvar(int e2,int reg, int sz,int label,int cond) { |
1745 char *crn; | 1782 char *crn; |
1746 use_int(reg); | 1783 use_int(reg); |
1747 crn = register_name(reg); | 1784 crn = register_name(reg); |
1748 lvar_intro(e2); | 1785 lvar_intro(e2); |
1749 printf("\t%s\t%s, ",cload(sz,0),crn); | 1786 printf("\t%s\t%s,hoge2 ",cload(sz,0),crn); |
1750 lvar(e2,cext_at(sz,0)); | 1787 lvar(e2,cext_at(sz,0)); |
1751 cext(0,sz,reg); | 1788 cext(0,sz,reg); |
1752 code_cmp_register(reg,label,cond); | 1789 code_cmp_register(reg,label,cond); |
1753 } | 1790 } |
1754 | 1791 |
1775 | 1812 |
1776 | 1813 |
1777 void | 1814 void |
1778 code_cmp_register(int e2,int label,int cond) { | 1815 code_cmp_register(int e2,int label,int cond) { |
1779 use_int(e2); | 1816 use_int(e2); |
1780 printf("\tcmp\t%s, #0\n",register_name(e2)); | 1817 printf("\tceqi\t%s, %s, 0\n",register_name(e2), register_name(e2)); |
1781 jcond(label,cond); | 1818 jcond(label,cond); |
1782 } | 1819 } |
1783 | 1820 |
1784 | 1821 |
1785 void | 1822 void |
1832 case 1: case -1: | 1869 case 1: case -1: |
1833 printf("\tlqd\t%s, %d(%s)\n",drn,(offset*4),trn); | 1870 printf("\tlqd\t%s, %d(%s)\n",drn,(offset*4),trn); |
1834 printf("\tstqd\t%s,%d(%s)\n",drn,(offset*4),trn); | 1871 printf("\tstqd\t%s,%d(%s)\n",drn,(offset*4),trn); |
1835 break; | 1872 break; |
1836 case 2: case -2: | 1873 case 2: case -2: |
1837 printf("\tlqx\t%s, [%s,#%d]\n",drn,frn,offset); | 1874 printf("\tlqd\t%s, %d(%s)\n",drn,(offset*4),trn); |
1838 printf("\tstqx\t%s, [%s,#%d]\n",drn,trn,offset); | 1875 printf("\tstqd\t%s,%d(%s)\n",drn,(offset*4),trn); |
1839 break; | 1876 break; |
1840 case 4: case -4: | 1877 case 4: case -4: |
1841 printf("\tlqa\t%s, [%s,#%d]\n",drn,frn,offset); | 1878 printf("\tlqd\t%s, %d(%s)\n",drn,(offset*4),trn); |
1842 printf("\tstqa\t%s, [%s,#%d]\n",drn,trn,offset); | 1879 printf("\tstqd\t%s,%d(%s)\n",drn,(offset*4),trn); |
1843 break; | 1880 break; |
1844 default: | 1881 default: |
1845 if (length <0) { | 1882 if (length <0) { |
1846 if (length > -MAX_COPY_LEN) { | 1883 if (length > -MAX_COPY_LEN) { |
1847 for(;length<=-4;length+=4,offset-=4) | 1884 for(;length<=-4;length+=4,offset-=4) |
1865 code_save_stacks(); | 1902 code_save_stacks(); |
1866 parallel_rassign(list3(1,list3(2,0,from),to)); | 1903 parallel_rassign(list3(1,list3(2,0,from),to)); |
1867 code_const(length>0?length:-length,3); | 1904 code_const(length>0?length:-length,3); |
1868 /* overlap must be allowed */ | 1905 /* overlap must be allowed */ |
1869 // offset have to be ignored */ | 1906 // offset have to be ignored */ |
1870 printf("\thbra\t%s\n",memmove); | 1907 //printf("\thbra\t%s\n",memmove); |
1871 extern_define(memmove,0,FUNCTION,1); | 1908 extern_define(memmove,0,FUNCTION,1); |
1872 set_ireg(RET_REGISTER,0); | 1909 set_ireg(RET_REGISTER,0); |
1873 if (creg!=to) { | 1910 if (creg!=to) { |
1874 free_register(to); to = creg; | 1911 free_register(to); to = creg; |
1875 } | 1912 } |
1916 if (length<MAX_COPY_LEN) { | 1953 if (length<MAX_COPY_LEN) { |
1917 sreg = get_register(); if (!sreg) error(-1); | 1954 sreg = get_register(); if (!sreg) error(-1); |
1918 srn = register_name(sreg); | 1955 srn = register_name(sreg); |
1919 code_lvar(arg_disp,dreg); | 1956 code_lvar(arg_disp,dreg); |
1920 for(count=0;count<length;count+=SIZE_OF_INT) { | 1957 for(count=0;count<length;count+=SIZE_OF_INT) { |
1921 printf("\tlqd\t%s, [%s, #%d]\n",srn,crn,count+on_register*SIZE_OF_INT); | 1958 printf("\tlqd\t%s, %d(%s)\n",srn,count+on_register*SIZE_OF_INT,crn); |
1922 printf("\tstr\t%s, [%s, #%d]\n",srn,drn,count); | 1959 printf("\tstqd\t%s, %d(%s)\n",srn,count,drn); |
1923 } | 1960 } |
1924 free_register(sreg); | 1961 free_register(sreg); |
1925 if (on_register) { | 1962 if (on_register) { |
1926 if (creg<=MAX_INPUT_REGISTER_VAR) { | 1963 if (creg<=MAX_INPUT_REGISTER_VAR) { |
1927 code_register(creg,REG_ip); | 1964 code_register(creg,REG_ip); |
1945 } | 1982 } |
1946 if (dreg!=-1) free_register(dreg); | 1983 if (dreg!=-1) free_register(dreg); |
1947 } | 1984 } |
1948 for (count=0,arg_reg; on_register-->0; arg_reg++,count+=SIZE_OF_INT) { | 1985 for (count=0,arg_reg; on_register-->0; arg_reg++,count+=SIZE_OF_INT) { |
1949 // len0 = (len0>2)?0:len0; | 1986 // len0 = (len0>2)?0:len0; |
1950 printf("\t%s\t%s, [%s, #%d]\n", cload(0,0), | 1987 printf("\t%s\t%s, %d(%s)\n", cload(0,0), |
1951 register_name(arg_reg), crn,count); | 1988 register_name(arg_reg), count,crn); |
1952 use_input_reg(arg_reg,1); | 1989 use_input_reg(arg_reg,1); |
1953 } | 1990 } |
1954 return length/SIZE_OF_INT; | 1991 return length/SIZE_OF_INT; |
1955 } | 1992 } |
1956 | 1993 |
2240 default: | 2277 default: |
2241 g_expr(rvalue_t(e2,DOUBLE)); | 2278 g_expr(rvalue_t(e2,DOUBLE)); |
2242 reg = freg; | 2279 reg = freg; |
2243 case DREGISTER: | 2280 case DREGISTER: |
2244 if (car(e2)==DREGISTER) reg = cadr(e2); | 2281 if (car(e2)==DREGISTER) reg = cadr(e2); |
2245 printf("\tstqd\t%s, [sp, #-8]!\n",register_name(reg)); | 2282 //printf("\tstqd\t%s, #sp, #-8]!\n",register_name(reg)); |
2246 printf("\tldmfd\tsp!, {%s, %s}\n",lregister_name_low(r),lregister_name_high(r)); | 2283 //printf("\tstqd\t%s, #sp, #-8]!\n",register_name(reg)); |
2284 //printf("\tldmfd\tsp!, {%s, %s}\n",lregister_name_low(r),lregister_name_high(r)); | |
2285 printf("\tstqd\t%s, -8($sp)\n",register_name(reg)); | |
2286 printf("\tstqd\t%s, -8($sp)\n",register_name(reg)); | |
2287 printf("\tlqx\t$sp,%s, %s\n",lregister_name_low(r),lregister_name_high(r)); | |
2247 } | 2288 } |
2248 if (tmp!=-1) free_lvar(tmp); | 2289 if (tmp!=-1) free_lvar(tmp); |
2290 #endif | |
2291 } | |
2292 | |
2293 static void | |
2294 code_assign_input_double_reg(int e1,int e2) { | |
2295 #if FLOAT_CODE | |
2296 int r,tmp=-1,reg=0; | |
2297 double value; | |
2298 if(car(e1)!=REGISTER) { error(-1); return;} | |
2299 r = cadr(e1); | |
2300 switch(car(e2)) { | |
2301 case DCONST: | |
2302 value = dcadr(e2); | |
2303 dconst(r,r,value); | |
2304 break; | |
2305 case DRGVAR: | |
2306 code_lrgvar(e2,r); | |
2307 break; | |
2308 case DRLVAR: | |
2309 code_lrlvar(cadr(e2),r); | |
2310 break; | |
2311 default: | |
2312 g_expr(rvalue_t(e2,DOUBLE)); | |
2313 reg = freg; | |
2314 } | |
2315 if(tmp!=-1) free_lvar(tmp); | |
2249 #endif | 2316 #endif |
2250 } | 2317 } |
2251 | 2318 |
2252 static int | 2319 static int |
2253 compute_complex_arg(int e3,int reg_arg_list,int arg) { | 2320 compute_complex_arg(int e3,int reg_arg_list,int arg) { |
2339 code_call(int e2,NMTBL *fn,int jmp) | 2406 code_call(int e2,NMTBL *fn,int jmp) |
2340 { | 2407 { |
2341 if (car(e2) == FNAME) { | 2408 if (car(e2) == FNAME) { |
2342 printf("\tbrsl\t$lr,%s\n",fn->nm); | 2409 printf("\tbrsl\t$lr,%s\n",fn->nm); |
2343 } else { | 2410 } else { |
2344 printf("\tmov\tlr, pc\n"); | 2411 //printf("\tmov\tlr, pc\n"); |
2345 printf("\tmov\tpc, %s\n",register_name(cadr(jmp))); | 2412 printf("\tori\t$sp,%s,0\n",register_name(cadr(jmp))); |
2413 printf("\tori\t$sp, %s,0\n",register_name(cadr(jmp))); | |
2346 } | 2414 } |
2347 } | 2415 } |
2348 | 2416 |
2349 int | 2417 int |
2350 function(int e1) | 2418 function(int e1) |
2503 } | 2571 } |
2504 reg_arg_list = list2(arg,reg_arg_list); | 2572 reg_arg_list = list2(arg,reg_arg_list); |
2505 g_expr_u(assign_expr0(arg,e4,t,t)); | 2573 g_expr_u(assign_expr0(arg,e4,t,t)); |
2506 } else if (t==DOUBLE) { | 2574 } else if (t==DOUBLE) { |
2507 reg_arg_list = list2(arg,reg_arg_list); | 2575 reg_arg_list = list2(arg,reg_arg_list); |
2508 if (car(arg)==LREGISTER) { | 2576 if (car(arg)==REGISTER) { |
2509 use_input_reg(cadr(arg),1); | 2577 use_input_reg(cadr(arg),1); |
2510 code_assign_input_double_long(arg, e4); | 2578 //code_assign_input_double_long(arg, e4); |
2579 code_assign_input_double_reg(arg, e4); | |
2511 } else { | 2580 } else { |
2512 g_expr_u(assign_expr0(arg,e4,t,t)); | 2581 g_expr_u(assign_expr0(arg,e4,t,t)); |
2513 } | 2582 } |
2514 } else if (t==FLOAT) { | 2583 } else if (t==FLOAT) { |
2515 reg_arg_list = list2(arg,reg_arg_list); | 2584 reg_arg_list = list2(arg,reg_arg_list); |
2565 char *crn; | 2634 char *crn; |
2566 | 2635 |
2567 g_expr(list3(BAND,list3(ADD,e1,list2(CONST,15)),list2(CONST,~15))); | 2636 g_expr(list3(BAND,list3(ADD,e1,list2(CONST,15)),list2(CONST,~15))); |
2568 use_int(reg); | 2637 use_int(reg); |
2569 crn = register_name(reg); | 2638 crn = register_name(reg); |
2570 printf("\trsb\tsp, %s, sp\n",crn); | 2639 //printf("\tsfi\t$sp, %s, $sp\n",crn); |
2571 if (!max_func_arg_label) max_func_arg_label = fwdlabel(); | 2640 if (!max_func_arg_label) max_func_arg_label = fwdlabel(); |
2572 code_label_value(max_func_arg_label ,REG_ip); | 2641 code_label_value(max_func_arg_label ,REG_ip); |
2573 printf("\ta\t%s, sp, ip\n",crn); | 2642 printf("\ta\t%s, $sp, $sp\n",crn); |
2574 } | 2643 } |
2575 | 2644 |
2576 void | 2645 void |
2577 code_frame_pointer(int e3) { | 2646 code_frame_pointer(int e3) { |
2578 use_int(e3); | 2647 use_int(e3); |
2579 printf("\tmov\tfp, %s\n",register_name(e3)); | 2648 //printf("\tmov\tfp, %s\n",register_name(e3)); |
2649 printf("\tori\t$sp,%s\n",register_name(e3)); | |
2580 } | 2650 } |
2581 | 2651 |
2582 int | 2652 int |
2583 code_frame_pointer_register() | 2653 code_frame_pointer_register() |
2584 { | 2654 { |
2593 int disp; | 2663 int disp; |
2594 if (is_function(fnptr) && ! env) { | 2664 if (is_function(fnptr) && ! env) { |
2595 trn = register_name(REG_ip); | 2665 trn = register_name(REG_ip); |
2596 //disp = search_const(LVAR,glist2(lvar_offset_label,FUNC_LVAR(0)),&label); | 2666 //disp = search_const(LVAR,glist2(lvar_offset_label,FUNC_LVAR(0)),&label); |
2597 printf("\tlqd\t%s, %d($sp)\n",trn,disp); | 2667 printf("\tlqd\t%s, %d($sp)\n",trn,disp); |
2598 printf("\ta\tfp, fp, %s\n",trn); | 2668 printf("\ta\t$sp, $sp, %s\n",trn); |
2599 } | 2669 } |
2600 } | 2670 } |
2601 | 2671 |
2602 static void | 2672 static void |
2603 code_unfix_frame_pointer() | 2673 code_unfix_frame_pointer() |
2616 void | 2686 void |
2617 code_jmp(char *s) { | 2687 code_jmp(char *s) { |
2618 // jump to continuation means use all register variable | 2688 // jump to continuation means use all register variable |
2619 max_reg_var = REG_VAR_MAX-REG_VAR_MIN; | 2689 max_reg_var = REG_VAR_MAX-REG_VAR_MIN; |
2620 max_reg_var = FREG_VAR_MAX-FREG_VAR_MIN; | 2690 max_reg_var = FREG_VAR_MAX-FREG_VAR_MIN; |
2621 printf("\thogebr\t%s\n",s); | 2691 printf("\tbr\t%s\n",s); |
2622 control=0; | 2692 control=0; |
2623 } | 2693 } |
2624 | 2694 |
2625 void | 2695 void |
2626 code_indirect_jmp(int e2) { | 2696 code_indirect_jmp(int e2) { |
2627 // jump to continuation means use all register variable | 2697 // jump to continuation means use all register variable |
2628 max_reg_var = REG_VAR_MAX-REG_VAR_MIN; | 2698 max_reg_var = REG_VAR_MAX-REG_VAR_MIN; |
2629 max_reg_var = FREG_VAR_MAX-FREG_VAR_MIN; | 2699 max_reg_var = FREG_VAR_MAX-FREG_VAR_MIN; |
2630 use_int(e2); | 2700 use_int(e2); |
2631 printf("\tmov\tpc, %s @ indirect jump\n",register_name(e2)); // ?! | 2701 //printf("\tmov\tpc, %s @ indirect jump\n",register_name(e2)); // ?! |
2702 printf("\tbi\t%s\n",register_name(e2)); // ?! | |
2632 control=0; | 2703 control=0; |
2633 } | 2704 } |
2634 | 2705 |
2635 void | 2706 void |
2636 code_rindirect(int e1, int reg,int offset, int sign,int sz) | 2707 code_rindirect(int e1, int reg,int offset, int sign,int sz) |
2651 int xreg; | 2722 int xreg; |
2652 g_expr(e1); | 2723 g_expr(e1); |
2653 if (!is_int_reg(creg)) error(-1); | 2724 if (!is_int_reg(creg)) error(-1); |
2654 xreg = creg; | 2725 xreg = creg; |
2655 use_float(d,reg); | 2726 use_float(d,reg); |
2656 code_ldf(d?"ldfd":"ldfs",register_name(reg),offset,xreg,""); | 2727 code_ldf(d?"lqd":"lqd",register_name(reg),offset,xreg,""); |
2657 return d?DOUBLE:FLOAT; | 2728 return d?DOUBLE:FLOAT; |
2658 } | 2729 } |
2659 #endif | 2730 #endif |
2660 | 2731 |
2661 #if LONGLONG_CODE||FLOAT_CODE | 2732 #if LONGLONG_CODE||FLOAT_CODE |
2664 lload(int creg,int reg,int offset) | 2735 lload(int creg,int reg,int offset) |
2665 { | 2736 { |
2666 char *crn=register_name(creg); | 2737 char *crn=register_name(creg); |
2667 #if ENDIAN_L==0 | 2738 #if ENDIAN_L==0 |
2668 if (creg!=reg) { | 2739 if (creg!=reg) { |
2669 printf("\tldr\t%s, [%s, #%d]\n",lregister_name_low(reg),crn,offset); | 2740 printf("\tlqd\t%s, %d(%s)\n",lregister_name_low(reg),offset,crn); |
2670 printf("\tldr\t%s, [%s, #%d]\n",lregister_name_high(reg),crn,offset+SIZE_OF_INT); | 2741 //printf("\tldr\t%s, [%s, #%d]\n",lregister_name_high(reg),crn,offset+SIZE_OF_INT); |
2671 } else { | 2742 } else { |
2672 printf("\tldr\t%s, [%s, #%d]\n",lregister_name_high(reg),crn,offset+SIZE_OF_INT); | 2743 printf("\tlqd\t%s, %d(%s)\n",lregister_name_high(reg),offset+SIZE_OF_INT,crn); |
2673 printf("\tldr\t%s, [%s, #%d]\n",lregister_name_low(reg),crn,offset); | 2744 //printf("\tldr\t%s, [%s, #%d]\n",lregister_name_low(reg),crn,offset); |
2674 } | 2745 } |
2675 #else | 2746 #else |
2676 if (creg!=reg) { | 2747 if (creg!=reg) { |
2677 printf("\tldr\t%s, [%s, #%d]\n",lregister_name_low(reg),crn,offset+SIZE_OF_INT); | 2748 printf("\tlqd\t%s, %d(%s)\n",lregister_name_low(reg),offset+SIZE_OF_INT,crn); |
2678 printf("\tldr\t%s, [%s, #%d]\n",lregister_name_high(reg),crn,offset); | 2749 //printf("\tldr\t%s, [%s, #%d]\n",lregister_name_high(reg),crn,offset); |
2679 } else { | 2750 } else { |
2680 printf("\tldr\t%s, [%s, #%d]\n",lregister_name_high(reg),crn,offset); | 2751 printf("\tlqd\t%s, %d(%s)\n",lregister_name_high(reg),offset,crn); |
2681 printf("\tldr\t%s, [%s, #%d]\n",lregister_name_low(reg),crn,offset+SIZE_OF_INT); | 2752 //printf("\tldr\t%s, [%s, #%d]\n",lregister_name_low(reg),crn,offset+SIZE_OF_INT); |
2682 } | 2753 } |
2683 #endif | 2754 #endif |
2684 } | 2755 } |
2685 | 2756 |
2686 | 2757 |
2712 char *crn_h; | 2783 char *crn_h; |
2713 char *crn_l; | 2784 char *crn_l; |
2714 crn_h = lregister_name_high(creg); | 2785 crn_h = lregister_name_high(creg); |
2715 crn_l = lregister_name_low(creg); | 2786 crn_l = lregister_name_low(creg); |
2716 #if ENDIAN_L==0 | 2787 #if ENDIAN_L==0 |
2717 printf("\tstr\t%s, [%s, #0]\n",crn_l,drn); | 2788 printf("\tstqd\t%s, 0(%s)\n",crn_l,drn); |
2718 printf("\tstr\t%s, [%s, #%d]\n",crn_h,drn,SIZE_OF_INT); | 2789 printf("\tstqd\t%s, %d(%s)\n",crn_h,SIZE_OF_INT,drn); |
2719 #else | 2790 #else |
2720 printf("\tstr\t%s, [%s, #0]\n",crn_h,drn); | 2791 printf("\tstqd\t%s, 0(%s)\n",crn_h,drn); |
2721 printf("\tstr\t%s, [%s, #%d]\n",crn_l,drn,SIZE_OF_INT); | 2792 printf("\tstqd\t%s, %d(%s)\n",crn_l,SIZE_OF_INT,drn); |
2722 #endif | 2793 #endif |
2723 } | 2794 } |
2724 | 2795 |
2725 int | 2796 int |
2726 code_lrindirect(int e1, int reg, int offset, int us) | 2797 code_lrindirect(int e1, int reg, int offset, int us) |
2738 | 2809 |
2739 static char * | 2810 static char * |
2740 cstore(int sz) | 2811 cstore(int sz) |
2741 { | 2812 { |
2742 switch(sz) { | 2813 switch(sz) { |
2743 case 1: return "stqx"; | 2814 case 1: return "stqd"; |
2744 case SIZE_OF_SHORT: return "stqa"; | 2815 case SIZE_OF_SHORT: return "stqd"; |
2745 default: return "stqd"; | 2816 default: return "stqd"; |
2746 } | 2817 } |
2747 } | 2818 } |
2748 | 2819 |
2749 void | 2820 void |
2923 switch(op) { | 2994 switch(op) { |
2924 case MUL: case UMUL: | 2995 case MUL: case UMUL: |
2925 v=ilog(v); | 2996 v=ilog(v); |
2926 case LSHIFT: | 2997 case LSHIFT: |
2927 case ULSHIFT: | 2998 case ULSHIFT: |
2928 printf("\tmov\t%s, %s, asl #%d\n",crn,crn,v); | 2999 printf("\troti\t%s, %s,-%d\n",crn,crn,v); |
2929 break; | 3000 break; |
2930 case DIV: | 3001 case DIV: |
2931 v=ilog(v); | 3002 v=ilog(v); |
2932 case RSHIFT: | 3003 case RSHIFT: |
2933 printf("\trotmai\t%s, %s, %d\n",crn,crn,v); | 3004 printf("\troti\t%s, %s, -%d\n",crn,crn,v); |
2934 break; | 3005 break; |
2935 case UDIV: | 3006 case UDIV: |
2936 v=ilog(v); | 3007 v=ilog(v); |
2937 case URSHIFT: | 3008 case URSHIFT: |
2938 printf("\tshli\t%s, %s,%d\n",crn,crn,v); | 3009 printf("\tshli\t%s, %s,%d\n",crn,crn,v); |
2942 break; | 3013 break; |
2943 case SUB: | 3014 case SUB: |
2944 code_add(creg,-v,creg); | 3015 code_add(creg,-v,creg); |
2945 break; | 3016 break; |
2946 case CMP: printf("\tceq\t%s,%d\n",crn,v); break; | 3017 case CMP: printf("\tceq\t%s,%d\n",crn,v); break; |
2947 case BOR: printf("\tor\t%s, %s, #%d\n",crn,crn,v); break; | 3018 case BOR: printf("\tori\t%s, %s, %d\n",crn,crn,v); break; |
2948 case EOR: printf("\txor\t%s, %s, #%d\n",crn,crn,v); break; | 3019 case EOR: printf("\txori\t%s, %s, %d\n",crn,crn,v); break; |
2949 case BAND: printf("\tand\t%s, %s, #%d\n",crn,crn,v); break; | 3020 case BAND: printf("\tandi\t%s, %s, %d\n",crn,crn,v); break; |
2950 default: | 3021 default: |
2951 error(-1); | 3022 error(-1); |
2952 } | 3023 } |
2953 } | 3024 } |
2954 | 3025 |
3001 printf("\tceqi\t%s, %s, %d\n",crn,crn,-e); | 3072 printf("\tceqi\t%s, %s, %d\n",crn,crn,-e); |
3002 } | 3073 } |
3003 switch(cond) { | 3074 switch(cond) { |
3004 case -1: break; | 3075 case -1: break; |
3005 case 1: | 3076 case 1: |
3006 printf("\tbne\t.LC%d\n",label); break; | 3077 printf("\tbr\t.LC%d\n",label); break; |
3007 case 0: | 3078 case 0: |
3008 printf("\tbeq\t.LC%d\n",label); break; | 3079 printf("\tbr\t.LC%d\n",label); break; |
3009 case LT: | 3080 case LT: |
3010 printf("\tblt\t.LC%d\n",label); break; | 3081 printf("\tbra\t.LC%d\n",label); break; |
3011 case GT: | 3082 case GT: |
3012 printf("\tbgt\t.LC%d\n",label); break; | 3083 printf("\tbgt\t.LC%d\n",label); break; |
3013 default: error(-1); | 3084 default: error(-1); |
3014 } | 3085 } |
3015 if (reg!=-1) free_register(reg); | 3086 if (reg!=-1) free_register(reg); |
3016 } | 3087 } |
3054 rn2 = register_name(r2); | 3125 rn2 = register_name(r2); |
3055 printf("\tceq\t%s, %s, %s\n",rn1,rn1,rn2); | 3126 printf("\tceq\t%s, %s, %s\n",rn1,rn1,rn2); |
3056 } | 3127 } |
3057 | 3128 |
3058 switch(op+(!cond)*BNOT) { | 3129 switch(op+(!cond)*BNOT) { |
3059 case GT: case LE+BNOT: cc="cgt"; ncc="le"; break; | 3130 case GT: case LE+BNOT: cc="r"; ncc="r"; break; |
3060 case LE: case GT+BNOT: cc="le"; ncc="cgt"; break; | 3131 case LE: case GT+BNOT: cc="r"; ncc="r"; break; |
3061 case GE: case LT+BNOT: cc="ge"; ncc="lt"; break; | 3132 case GE: case LT+BNOT: cc="r"; ncc="r"; break; |
3062 case LT: case GE+BNOT: cc="lt"; ncc="ge"; break; | 3133 case LT: case GE+BNOT: cc="r"; ncc="r"; break; |
3063 case UGT: case ULE+BNOT: cc="hi"; ncc="ls"; break; | 3134 case UGT: case ULE+BNOT: cc="r"; ncc="r"; break; |
3064 case ULE: case UGT+BNOT: cc="ls"; ncc="hi"; break; | 3135 case ULE: case UGT+BNOT: cc="r"; ncc="r"; break; |
3065 case UGE: case ULT+BNOT: cc="hs"; ncc="lo"; break; | 3136 case UGE: case ULT+BNOT: cc="r"; ncc="r"; break; |
3066 case ULT: case UGE+BNOT: cc="lo"; ncc="hs"; break; | 3137 case ULT: case UGE+BNOT: cc="r"; ncc="r"; break; |
3067 case EQ: case NEQ+BNOT: cc="eq"; ncc="ne"; break; | 3138 case EQ: case NEQ+BNOT: cc="r"; ncc="r"; break; |
3068 case NEQ: case EQ+BNOT: cc="ne"; ncc="eq"; break; | 3139 //case NEQ: case EQ+BNOT: cc="rnz"; ncc="r"; break; |
3140 case NEQ: case EQ+BNOT: cc="r"; ncc="r"; break; | |
3069 default: error(-1); | 3141 default: error(-1); |
3070 } | 3142 } |
3071 | 3143 |
3072 if (mode==COND_BRANCH||mode==COND_BRANCH_CONST) { | 3144 if (mode==COND_BRANCH||mode==COND_BRANCH_CONST) { |
3073 printf("\tb%s\t.LC%d\n",cc,l1); | 3145 printf("\tb%s\t.LC%d\n",cc,l1); |
3146 //printf("\tb%s\t%s, .LC%d\n",cc,rn1,l1); | |
3074 } else if (mode==COND_VALUE||mode==COND_VALUE_CONST) { | 3147 } else if (mode==COND_VALUE||mode==COND_VALUE_CONST) { |
3075 rn0 = register_name(r0); | 3148 rn0 = register_name(r0); |
3076 printf("\tmov%s\t%s, #0\n",ncc,rn0); | 3149 // ここはnccで分岐させなきゃダメだな |
3077 printf("\tmov%s\t%s, #1\n",cc,rn0); | 3150 printf("#####pcond##########\n"); |
3151 //printf("\tmovhoge%s\t%s, #0\n",ncc,rn0); | |
3152 //printf("\tmovfuho%s\t%s, #1\n",cc,rn0); | |
3078 } else error(-1); | 3153 } else error(-1); |
3079 } | 3154 } |
3080 | 3155 |
3081 int | 3156 int |
3082 rexpr_bool(int e1, int reg) | 3157 rexpr_bool(int e1, int reg) |
3129 #define CMP_C1T (-1) | 3204 #define CMP_C1T (-1) |
3130 | 3205 |
3131 static void | 3206 static void |
3132 jcond(int l, int cond) | 3207 jcond(int l, int cond) |
3133 { | 3208 { |
3134 printf("\tb%s\t.LC%d\n",cond?"ne":"eq",l); | 3209 printf("\tb%s\t.LC%d\n",cond?"r":"r",l); |
3135 } | 3210 } |
3136 | 3211 |
3137 void | 3212 void |
3138 jmp(int l) | 3213 jmp(int l) |
3139 { | 3214 { |
3170 { | 3245 { |
3171 int i; | 3246 int i; |
3172 if (freg_save>0) { | 3247 if (freg_save>0) { |
3173 i=reg_save*SIZE_OF_INT+ | 3248 i=reg_save*SIZE_OF_INT+ |
3174 freg_save*SIZE_OF_DOUBLE + 20; | 3249 freg_save*SIZE_OF_DOUBLE + 20; |
3175 printf("\tlfm\tf4, %d, [fp, #%d]\n",freg_save,-i); | 3250 //printf("\tlfm\tf4, %d, [fp, #%d]\n",freg_save,-i); |
3176 } | 3251 printf("\tlqd\t$sp,%d($sp)\n",i); |
3252 } | |
3177 //printf("\tldmea\tfp, {"); | 3253 //printf("\tldmea\tfp, {"); |
3178 for (i=reg_var_num(0);i<reg_var_num(reg_save);i++) { | 3254 for (i=reg_var_num(0);i<reg_var_num(reg_save);i++) { |
3179 printf("%s, ",register_name(i)); | 3255 //printf("%s, ",register_name(i)); |
3180 } | 3256 printf("\tlqd\t%s,-%d($sp)\n",register_name(i),-disp); |
3257 disp -= SIZE_OF_FLOAT*4; | |
3258 } | |
3181 //printf("fp, sp, pc}\n"); | 3259 //printf("fp, sp, pc}\n"); |
3182 return disp; | 3260 return disp; |
3183 } | 3261 } |
3184 | 3262 |
3185 static int entry_label; | 3263 static int entry_label; |
3196 printf("\t.type\t%s,function\n",name); | 3274 printf("\t.type\t%s,function\n",name); |
3197 r1_offset_label = fwdlabel(); | 3275 r1_offset_label = fwdlabel(); |
3198 max_func_args = 0; | 3276 max_func_args = 0; |
3199 printf("%s:\n",name); | 3277 printf("%s:\n",name); |
3200 code_label_value(r1_offset_label,REG_ip); | 3278 code_label_value(r1_offset_label,REG_ip); |
3201 printf("\ta\tsp, ip, fp\n"); | 3279 printf("\ta\t$sp, $sp, $fp\n"); |
3202 clear_ptr_cache(); | 3280 clear_ptr_cache(); |
3203 } | 3281 } |
3204 | 3282 |
3205 | 3283 |
3206 void | 3284 void |
3233 // r1_offset_label = fwdlabel(); | 3311 // r1_offset_label = fwdlabel(); |
3234 printf("\t.type\t%s,function\n",name); | 3312 printf("\t.type\t%s,function\n",name); |
3235 if (stmode!=STATIC) | 3313 if (stmode!=STATIC) |
3236 printf("\t.globl\t%s\n",name); | 3314 printf("\t.globl\t%s\n",name); |
3237 printf("%s:\n",name); | 3315 printf("%s:\n",name); |
3238 //printf("\tmov\tip, sp\n"); | 3316 //printf("\tmov\t$sp, $lr,0\n"); |
3239 printf("\tstqd\t$lr,16($sp)\n"); | 3317 printf("\tstqd\t$lr,16($sp)\n"); |
3240 printf("\tstqd\t$sp,-32($sp)\n"); | 3318 printf("\tstqd\t$sp,-32($sp)\n"); |
3241 printf("\tai\t$sp,$sp,-32\n"); | 3319 printf("\tai\t$sp,$sp,-32\n"); |
3242 //gen_jmp(entry_label = fwdlabel()); | 3320 //gen_jmp(entry_label = fwdlabel()); |
3243 //register_save_return_label = backdef(); | 3321 //register_save_return_label = backdef(); |
3254 } | 3332 } |
3255 | 3333 |
3256 void | 3334 void |
3257 code_label_call(int l) | 3335 code_label_call(int l) |
3258 { | 3336 { |
3259 printf("\tbl\tL_%d\n",l); | 3337 printf("\tbr\tL_%d\n",l); |
3260 } | 3338 } |
3261 | 3339 |
3262 void | 3340 void |
3263 code_ret() | 3341 code_ret() |
3264 { | 3342 { |
3265 printf("\tmov\tpc, lr\n"); | 3343 //printf("\tmov\tpc, lr\n"); |
3266 control=0; | 3344 control=0; |
3267 } | 3345 } |
3268 | 3346 |
3269 void | 3347 void |
3270 leave(int control0, char *name) | 3348 leave(int control0, char *name) |
3293 } else if (cadr(fnptr->ty)>0&&( | 3371 } else if (cadr(fnptr->ty)>0&&( |
3294 car(cadr(fnptr->ty))==STRUCT || | 3372 car(cadr(fnptr->ty))==STRUCT || |
3295 car(cadr(fnptr->ty))==UNION)) { | 3373 car(cadr(fnptr->ty))==UNION)) { |
3296 sz = size(cadr(fnptr->ty)); | 3374 sz = size(cadr(fnptr->ty)); |
3297 code_const(sz,REGISTER_OPERAND); | 3375 code_const(sz,REGISTER_OPERAND); |
3298 printf("\tsf\tr1, r2, fp\n"); | 3376 printf("\tsf\t$1, $2, $sp\n"); |
3299 printf("\tlqd\tr0, [fp, #%d]\n",(my_func_args-1)*SIZE_OF_INT); | 3377 printf("\tlqd\t$1, %d($sp)\n",(my_func_args-1)*SIZE_OF_INT); |
3300 emit_copy(6,3,sz,0,1,1); | 3378 emit_copy(6,3,sz,0,1,1); |
3301 } else if (cadr(fnptr->ty)!=VOID) { | 3379 } else if (cadr(fnptr->ty)!=VOID) { |
3302 creg = ireg = cadr(get_input_register_var(0,0,1)); | 3380 creg = ireg = cadr(get_input_register_var(0,0,1)); |
3303 if (creg!=RET_REGISTER) | 3381 if (creg!=RET_REGISTER) |
3304 set_ireg(RET_REGISTER,1); | 3382 set_ireg(RET_REGISTER,1); |
3314 | 3392 |
3315 // entry part (save register) | 3393 // entry part (save register) |
3316 | 3394 |
3317 fwddef(entry_label); | 3395 fwddef(entry_label); |
3318 if (arg_on_register>0) | 3396 if (arg_on_register>0) |
3319 printf("\tsfi\tsp, sp, %d\n",arg_on_register); | 3397 printf("\tsfi\t$sp, $sp, %d\n",arg_on_register); |
3320 //code_register_save(max_reg_var,max_reg_var,0); | 3398 //code_register_save(max_reg_var,max_reg_var,0); |
3321 | 3399 |
3322 //printf("\tsf\tfp, ip, #%d\n",4+arg_on_register); | 3400 //printf("\tsf\tfp, ip, #%d\n",4+arg_on_register); |
3323 code_add(REG_sp,disp-max_func_args*SIZE_OF_INT,REG_sp); | 3401 code_add(REG_sp,disp-max_func_args*SIZE_OF_INT,REG_sp); |
3324 gen_jmp(register_save_return_label); | 3402 gen_jmp(register_save_return_label); |
3555 | 3633 |
3556 void | 3634 void |
3557 emit_label(int labelno) | 3635 emit_label(int labelno) |
3558 { | 3636 { |
3559 data_mode(0); | 3637 data_mode(0); |
3560 printf("\t.word .L%d\n",labelno); | 3638 printf("\t.word .LC%d\n",labelno); |
3561 } | 3639 } |
3562 | 3640 |
3563 void | 3641 void |
3564 emit_data_closing(NMTBL *n) | 3642 emit_data_closing(NMTBL *n) |
3565 { | 3643 { |
3569 if (mode==GDECL) { | 3647 if (mode==GDECL) { |
3570 data_mode(0); | 3648 data_mode(0); |
3571 #ifdef DOT_SIZE | 3649 #ifdef DOT_SIZE |
3572 lb=fwdlabel(); | 3650 lb=fwdlabel(); |
3573 printf(".LC%d:\n",lb); | 3651 printf(".LC%d:\n",lb); |
3574 printf("\t.size\t%s,.L%d-%s\n",n->nm,lb,n->nm); | 3652 printf("\t.size\t%s,.LC%d-%s\n",n->nm,lb,n->nm); |
3575 #endif | 3653 #endif |
3576 } | 3654 } |
3577 } | 3655 } |
3578 | 3656 |
3579 | 3657 |
3580 static void | 3658 static void |
3581 comm(NMTBL *n) | 3659 comm(NMTBL *n) |
3582 { | 3660 { |
3583 printf(".comm %s,%d @ %d\n",n->nm,size(n->ty), | 3661 //printf(".comm %s,%d @ %d\n",n->nm,size(n->ty), |
3584 (n->ty==DOUBLE||n->ty==LONGLONG||n->ty==ULONGLONG)?8:4 | 3662 //(n->ty==DOUBLE||n->ty==LONGLONG||n->ty==ULONGLONG)?8:4 |
3585 ); | 3663 //); |
3586 } | 3664 } |
3587 | 3665 |
3588 void | 3666 void |
3589 global_table(void) | 3667 global_table(void) |
3590 { | 3668 { |
3673 extern_conv(char *conv) | 3751 extern_conv(char *conv) |
3674 { | 3752 { |
3675 code_save_stacks(); | 3753 code_save_stacks(); |
3676 clear_ptr_cache(); | 3754 clear_ptr_cache(); |
3677 extern_define(conv,0,FUNCTION,1); | 3755 extern_define(conv,0,FUNCTION,1); |
3678 printf("\tbl\t%s\n",conv); | 3756 printf("\tbr\t%s\n",conv); |
3679 lib_args(16); | 3757 lib_args(16); |
3680 } | 3758 } |
3681 #endif | 3759 #endif |
3682 | 3760 |
3683 static void | 3761 static void |
3688 clear_ptr_cache(); | 3766 clear_ptr_cache(); |
3689 g = list3(REGISTER_OPERAND,0,reg); | 3767 g = list3(REGISTER_OPERAND,0,reg); |
3690 g = list3(REGISTER_OPERAND_1,g,oreg); | 3768 g = list3(REGISTER_OPERAND_1,g,oreg); |
3691 parallel_rassign(g); | 3769 parallel_rassign(g); |
3692 extern_define(lib,0,FUNCTION,1); | 3770 extern_define(lib,0,FUNCTION,1); |
3693 printf("\tbl\t%s\n",lib); | 3771 printf("\tbr\t%s\n",lib); |
3694 lib_args(16); | 3772 lib_args(16); |
3695 set_ireg(RET_REGISTER,0); | 3773 set_ireg(RET_REGISTER,0); |
3696 if (reg!=RET_REGISTER) { | 3774 if (reg!=RET_REGISTER) { |
3697 code_register(RET_REGISTER,reg); | 3775 code_register(RET_REGISTER,reg); |
3698 } | 3776 } |
3718 } | 3796 } |
3719 | 3797 |
3720 static char * | 3798 static char * |
3721 movef(int d) | 3799 movef(int d) |
3722 { | 3800 { |
3723 return d?"mvfd":"mvfs"; | 3801 return d?"ori":"ori"; |
3724 } | 3802 } |
3725 | 3803 |
3726 static char * | 3804 static char * |
3727 fload(int d) { return d?"ldfd":"ldfs"; } | 3805 fload(int d) { return d?"lqd":"lqd"; } |
3728 | 3806 |
3729 static char * | 3807 static char * |
3730 fstore(int d) { return d?"stfd":"stfs"; } | 3808 fstore(int d) { return d?"stqd":"stqd"; } |
3731 | 3809 |
3732 | 3810 |
3733 void | 3811 void |
3734 code_dregister(int e2,int freg,int d) | 3812 code_dregister(int e2,int freg,int d) |
3735 { | 3813 { |
3736 use_float(d,freg); | 3814 use_float(d,freg); |
3737 if (freg!=e2) { | 3815 if (freg!=e2) { |
3738 if (is_int_reg(e2)) error(-1); | 3816 if (is_int_reg(e2)) error(-1); |
3739 printf("\t%s\t%s, %s\n",movef(d), | 3817 printf("\t%s\t%s, %s, 0\n",movef(d), |
3740 register_name(freg),register_name(e2)); | 3818 register_name(freg),register_name(e2)); |
3741 } | 3819 } |
3742 } | 3820 } |
3743 | 3821 |
3744 void | 3822 void |
3745 code_dassign_gvar(int e2,int freg,int d) | 3823 code_dassign_gvar(int e2,int freg,int d) |
3746 { | 3824 { |
3747 use_float(d,freg); | 3825 use_float(d,freg); |
3748 code_ldf(fstore(d),register_name(freg),cadr(e2), | 3826 code_ldf(fstore(d),register_name(freg),cadr(e2), |
3749 get_ptr_cache((NMTBL*)caddr(e2))," @ float"); | 3827 get_ptr_cache((NMTBL*)caddr(e2)),""); |
3750 } | 3828 } |
3751 | 3829 |
3752 void | 3830 void |
3753 code_dassign_lvar(int e2,int freg,int d) | 3831 code_dassign_lvar(int e2,int freg,int d) |
3754 { | 3832 { |
3755 use_float(d,freg); | 3833 use_float(d,freg); |
3756 lvar_intro(e2); | 3834 lvar_intro(e2); |
3757 printf("\t%s\t%s, ",fstore(d),register_name(freg)); | 3835 printf("\t%s\t%s, ",fstore(d),register_name(freg)); |
3758 lvar(e2,"@ float"); | 3836 lvar(e2,""); |
3759 } | 3837 } |
3760 | 3838 |
3761 void | 3839 void |
3762 code_dassign(int e2,int freg,int d) | 3840 code_dassign(int e2,int freg,int d) |
3763 { | 3841 { |
3764 use_float(d,freg); | 3842 use_float(d,freg); |
3765 printf("\t%s\t%s, [%s, #0] @ float\n",fstore(d), | 3843 //printf("\t%s\t%s, [%s, #0] @ float\n",fstore(d), |
3844 printf("\t%s\t%s, 0(%s)\n",fstore(d), | |
3766 register_name(freg),register_name(e2)); | 3845 register_name(freg),register_name(e2)); |
3767 } | 3846 } |
3768 | 3847 |
3769 void | 3848 void |
3770 code_dassign_dregister(int e2,int d,int freg) { | 3849 code_dassign_dregister(int e2,int d,int freg) { |
3771 use_float(d,freg); | 3850 use_float(d,freg); |
3772 if (e2!=freg) { | 3851 if (e2!=freg) { |
3773 printf("\t%s\t%s, %s\n",movef(d), | 3852 printf("\t%s\t%s, %s, 0\n",movef(d), |
3774 register_name(e2),register_name(freg)); | 3853 register_name(e2),register_name(freg)); |
3775 } | 3854 } |
3776 } | 3855 } |
3777 | 3856 |
3778 static double d0 = 1.0; | 3857 static double d0 = 1.0; |
3800 } | 3879 } |
3801 | 3880 |
3802 static void | 3881 static void |
3803 dconst(int l,int h,double value) | 3882 dconst(int l,int h,double value) |
3804 { | 3883 { |
3805 #if ENDIAN_D==0 | 3884 code_dconst(code_d2(value),h,1); |
3806 code_const(code_d1(value),l); | |
3807 code_const(code_d2(value),h); | |
3808 #else | |
3809 code_const(code_d1(value),h); | |
3810 code_const(code_d2(value),l); | |
3811 #endif | |
3812 } | 3885 } |
3813 | 3886 |
3814 | 3887 |
3815 void | 3888 void |
3816 code_dconst(int e2,int freg,int d) | 3889 code_dconst(int e2,int freg,int d) |
3821 int label,disp; | 3894 int label,disp; |
3822 | 3895 |
3823 use_float(d,freg); | 3896 use_float(d,freg); |
3824 frn = register_name(freg); | 3897 frn = register_name(freg); |
3825 if (value==0 || value==1 || value==10) { | 3898 if (value==0 || value==1 || value==10) { |
3826 printf("\t%s\t%s, #%d\n",movef(d),frn,(int)value); | 3899 printf("\t%s\t%s, %s, %d\n",movef(d),frn,frn,(int)value); |
3827 } else if (value==-1 || value==-10) { | 3900 } else if (value==-1 || value==-10) { |
3828 printf("\t%s\t%s, #%d\n",d?"mnfd":"mnfs",frn,(int)-value); | 3901 printf("\t%s\t%s, %d\n",d?"mnfd":"mnfs",frn,(int)-value); |
3829 } else if (d) { | 3902 } else if (d) { |
3830 #if ENDIAN_D==0 | 3903 #if ENDIAN_D==0 |
3831 disp = search_double_const(DCONST, | 3904 disp = search_double_const(DCONST, |
3832 code_d1(value),code_d2(value),&label); | 3905 code_d1(value),code_d2(value),&label); |
3833 #else | 3906 #else |
3834 disp = search_double_const(DCONST, | 3907 disp = search_double_const(DCONST, |
3835 code_d2(value),code_d1(value),&label); | 3908 code_d2(value),code_d1(value),&label); |
3836 #endif | 3909 #endif |
3837 printf("\tldfd\t%s, .LC%d+%d\n",frn,label,disp); | 3910 printf("\tlqd\t%s, .LC%d+%d($sp)\n",frn,label,disp); |
3838 } else { | 3911 } else { |
3839 //disp = search_const(CONST,*((int*)&f),&label); | 3912 //disp = search_const(CONST,*((int*)&f),&label); |
3840 printf("\tldfs\t%s, .LC%d+%d\n",frn,label,disp); | 3913 printf("\tlqd\t%s, .LC%d+%d($sp)\n",frn,label,disp); |
3841 } | 3914 } |
3842 } | 3915 } |
3843 | 3916 |
3844 | 3917 |
3845 void | 3918 void |
3872 code_d2i0(int reg,int d) | 3945 code_d2i0(int reg,int d) |
3873 { | 3946 { |
3874 int lreg; | 3947 int lreg; |
3875 use_float(d,reg); | 3948 use_float(d,reg); |
3876 lreg = get_register(); | 3949 lreg = get_register(); |
3877 printf("\tfixz\t%s, %s\n",register_name(lreg),register_name(reg)); | 3950 //printf("\tfixz\t%s, %s\n",register_name(lreg),register_name(reg)); |
3878 set_ireg(lreg,0); | 3951 set_ireg(lreg,0); |
3879 return; | 3952 return; |
3880 } | 3953 } |
3881 | 3954 |
3882 void | 3955 void |
3897 int lreg,reg0; | 3970 int lreg,reg0; |
3898 char *lrn,*frn,*crn; | 3971 char *lrn,*frn,*crn; |
3899 // u = (d>2.1e9)?((int)(d-2.1e9)^2147483648):(int)d | 3972 // u = (d>2.1e9)?((int)(d-2.1e9)^2147483648):(int)d |
3900 use_float(1,reg); | 3973 use_float(1,reg); |
3901 frn = register_name(reg); | 3974 frn = register_name(reg); |
3902 if (!d) printf("\tmvfd\t%s, %s\n",frn,frn); | 3975 if (!d) printf("\tori\t%s, %s, 0\n",frn,frn); |
3903 emit_dpush(1); | 3976 emit_dpush(1); |
3904 code_dconst(dlist2(DCONST,2.147483648e9),USE_CREG,1); | 3977 code_dconst(dlist2(DCONST,2.147483648e9),USE_CREG,1); |
3905 lrn = register_name(lreg = emit_dpop(d)); | 3978 lrn = register_name(lreg = emit_dpop(d)); |
3906 frn = register_name(freg); | 3979 frn = register_name(freg); |
3907 set_ireg(reg0=get_register(),0); | 3980 set_ireg(reg0=get_register(),0); |
3908 crn = register_name(reg0); | 3981 crn = register_name(reg0); |
3909 printf("\tcmfe\t%s, %s\n",lrn,frn); | 3982 printf("\tcmfe\t%s, %s\n",lrn,frn); |
3910 printf("\tbge\t1f\n"); | 3983 printf("\tbr\t1f\n"); |
3911 printf("\tfixz\t%s, %s\n",crn,lrn); | 3984 //printf("\tfixz\t%s, %s\n",crn,lrn); |
3912 printf("\tb\t2f\n"); | 3985 printf("\tb\t2f\n"); |
3913 printf("1:\n"); | 3986 printf("1:\n"); |
3914 printf("\tsufd\t%s, %s, %s\n",lrn,lrn,frn); | 3987 printf("\tsufd\t%s, %s, %s\n",lrn,lrn,frn); |
3915 printf("\tfixz\t%s, %s\n",crn,lrn); | 3988 //printf("\tfixz\t%s, %s\n",crn,lrn); |
3916 printf("\teor\t%s, %s, #-2147483648\n",crn,crn); | 3989 printf("\teor\t%s, %s, #-2147483648\n",crn,crn); |
3917 printf("2:\n"); | 3990 printf("2:\n"); |
3918 emit_dpop_free(lreg,d); | 3991 emit_dpop_free(lreg,d); |
3919 return; | 3992 return; |
3920 } | 3993 } |
3927 use_int(reg); | 4000 use_int(reg); |
3928 crn = register_name(reg); | 4001 crn = register_name(reg); |
3929 set_dreg(reg=get_dregister(1),0); | 4002 set_dreg(reg=get_dregister(1),0); |
3930 frn = register_name(reg); | 4003 frn = register_name(reg); |
3931 printf("\tfltd\t%s, %s\n",frn,crn); | 4004 printf("\tfltd\t%s, %s\n",frn,crn); |
3932 printf("\tcmp\t%s, #0\n",crn); | 4005 printf("\tceqi\t%s, %s, 0\n",crn,crn); |
3933 printf("\tbge\t1f\n"); | 4006 printf("\tbr\t1f\n"); |
3934 freg1 = get_dregister(1); | 4007 freg1 = get_dregister(1); |
3935 code_dconst(dlist2(DCONST,4.29496729600000000000e9),freg1,1); | 4008 code_dconst(dlist2(DCONST,4.29496729600000000000e9),freg1,1); |
3936 frn = register_name(creg); | 4009 frn = register_name(creg); |
3937 lrn = register_name(freg1); | 4010 lrn = register_name(freg1); |
3938 printf("\tadfd\t%s, %s, %s\n",frn,frn,lrn); | 4011 printf("\tadfd\t%s, %s, %s\n",frn,frn,lrn); |
3953 | 4026 |
3954 void | 4027 void |
3955 code_f2d(int reg) { | 4028 code_f2d(int reg) { |
3956 char *frn; | 4029 char *frn; |
3957 frn = register_name(freg); | 4030 frn = register_name(freg); |
3958 printf("\tmvfd\t%s, %s\n",frn,frn); | 4031 printf("\tori\t%s, %s, 0\n",frn,frn); |
3959 return; | 4032 return; |
3960 } | 4033 } |
3961 | 4034 |
3962 void | 4035 void |
3963 code_d2i(int reg) { | 4036 code_d2i(int reg) { |
4218 case DOP+NEQ: | 4291 case DOP+NEQ: |
4219 op=DOP+EQ; break; | 4292 op=DOP+EQ; break; |
4220 } | 4293 } |
4221 } | 4294 } |
4222 switch(op) { | 4295 switch(op) { |
4223 case FOP+GT: op1=FOP+CMP; opn = "bgt"; break; | 4296 case FOP+GT: op1=FOP+CMP; opn = "br"; break; |
4224 case FOP+GE: op1=FOP+CMPGE; opn = "bge"; break; | 4297 case FOP+GE: op1=FOP+CMPGE; opn = "br"; break; |
4225 case FOP+EQ: op1=FOP+CMP; opn = "beq"; break; | 4298 case FOP+EQ: op1=FOP+CMP; opn = "br"; break; |
4226 case FOP+NEQ: op1=FOP+CMP; opn = "bne"; break; | 4299 case FOP+NEQ: op1=FOP+CMP; opn = "br"; break; |
4227 case DOP+GT: op1=DOP+CMP; opn = "bgt"; break; | 4300 case DOP+GT: op1=DOP+CMP; opn = "br"; break; |
4228 case DOP+GE: op1=DOP+CMPGE; opn = "bge"; break; | 4301 case DOP+GE: op1=DOP+CMPGE; opn = "br"; break; |
4229 case DOP+EQ: op1=DOP+CMP; opn = "beq"; break; | 4302 case DOP+EQ: op1=DOP+CMP; opn = "br"; break; |
4230 case DOP+NEQ: op1=DOP+CMP; opn = "bne"; break; | 4303 case DOP+NEQ: op1=DOP+CMP; opn = "br"; break; |
4231 default: error(-1); | 4304 default: error(-1); |
4232 } | 4305 } |
4233 g_expr(list3(op1,e2,e1)); | 4306 g_expr(list3(op1,e2,e1)); |
4234 printf("\t%s\t.L%d\n",opn,l1); | 4307 printf("\t%s\t.L%d\n",opn,l1); |
4235 return l1; | 4308 return l1; |
4319 | 4392 |
4320 void | 4393 void |
4321 code_cmp_lregister(int reg,int label,int cond) | 4394 code_cmp_lregister(int reg,int label,int cond) |
4322 { | 4395 { |
4323 use_longlong(reg); | 4396 use_longlong(reg); |
4324 printf("\torr\t%s, %s, %s\n", | 4397 printf("\torc\t%s, %s, %s\n", |
4325 lregister_name_low(reg), | 4398 lregister_name_low(reg), |
4326 lregister_name_low(reg), | 4399 lregister_name_low(reg), |
4327 lregister_name_high(reg)); | 4400 lregister_name_high(reg)); |
4328 code_cmp_register((reg),label,cond); | 4401 code_cmp_register((reg),label,cond); |
4329 } | 4402 } |
4402 use_longlong(creg); | 4475 use_longlong(creg); |
4403 crn_h = lregister_name_high(creg); | 4476 crn_h = lregister_name_high(creg); |
4404 crn_l = lregister_name_low(creg); | 4477 crn_l = lregister_name_low(creg); |
4405 lvar_intro(e2); | 4478 lvar_intro(e2); |
4406 #if ENDIAN_L==0 | 4479 #if ENDIAN_L==0 |
4407 printf("\tstr\t%s, ",crn_l);lvar(e2,""); | 4480 printf("\tstqd\t%s, ",crn_l);lvar(e2,""); |
4408 printf("\tstr\t%s, ",crn_h);lvar(e2+SIZE_OF_INT,""); | 4481 printf("\tstqd\t%s, ",crn_h);lvar(e2+SIZE_OF_INT,""); |
4409 #else | 4482 #else |
4410 printf("\tstr\t%s, ",crn_h);lvar(e2,""); | 4483 printf("\tstqd\t%s, ",crn_h);lvar(e2,""); |
4411 printf("\tstr\t%s, ",crn_l);lvar(e2+SIZE_OF_INT,""); | 4484 printf("\tstqd\t%s, ",crn_l);lvar(e2+SIZE_OF_INT,""); |
4412 #endif | 4485 #endif |
4413 } | 4486 } |
4414 | 4487 |
4415 void | 4488 void |
4416 code_lassign_lregister(int e2,int reg) | 4489 code_lassign_lregister(int e2,int reg) |
4448 use_longlong(creg); | 4521 use_longlong(creg); |
4449 crn_h = lregister_name_high(creg); | 4522 crn_h = lregister_name_high(creg); |
4450 crn_l = lregister_name_low(creg); | 4523 crn_l = lregister_name_low(creg); |
4451 r = get_ptr_cache((NMTBL*)caddr(e1)); | 4524 r = get_ptr_cache((NMTBL*)caddr(e1)); |
4452 #if ENDIAN_L==0 | 4525 #if ENDIAN_L==0 |
4453 code_ldf("ldr",crn_l,cadr(e1),r,""); | 4526 code_ldf("lqd",crn_l,cadr(e1),r,""); |
4454 code_ldf("ldr",crn_h,cadr(e1)+SIZE_OF_INT,r,""); | 4527 //code_ldf("ldr",crn_h,cadr(e1)+SIZE_OF_INT,r,""); |
4455 #else | 4528 #else |
4456 code_ldf("ldr",crn_h,cadr(e1),r,""); | 4529 code_ldf("lqd",crn_h,cadr(e1),r,""); |
4457 code_ldf("ldr",crn_l,cadr(e1)+SIZE_OF_INT,r,""); | 4530 //code_ldf("ldr",crn_l,cadr(e1)+SIZE_OF_INT,r,""); |
4458 #endif | 4531 #endif |
4459 } | 4532 } |
4460 | 4533 |
4461 void | 4534 void |
4462 code_lrlvar(int e1,int creg) | 4535 code_lrlvar(int e1,int creg) |
4492 | 4565 |
4493 void | 4566 void |
4494 code_lconst(int e1,int creg) | 4567 code_lconst(int e1,int creg) |
4495 { | 4568 { |
4496 use_longlong(creg); | 4569 use_longlong(creg); |
4497 #if ENDIAN_L==0 | |
4498 code_const(code_l1(lcadr(e1)),(creg)); | |
4499 code_const(code_l2(lcadr(e1)),(creg)); | 4570 code_const(code_l2(lcadr(e1)),(creg)); |
4500 #else | |
4501 code_const(code_l1(lcadr(e1)),(creg)); | |
4502 code_const(code_l2(lcadr(e1)),(creg)); | |
4503 #endif | |
4504 } | 4571 } |
4505 | 4572 |
4506 void | 4573 void |
4507 code_lneg(int creg) | 4574 code_lneg(int creg) |
4508 { | 4575 { |
4588 case LEOR: | 4655 case LEOR: |
4589 printf("\teor\t%s, %s, %s\n",crn_l,crn_l,orn_l); | 4656 printf("\teor\t%s, %s, %s\n",crn_l,crn_l,orn_l); |
4590 printf("\teor\t%s, %s, %s\n",crn_h,crn_h,orn_h); | 4657 printf("\teor\t%s, %s, %s\n",crn_h,crn_h,orn_h); |
4591 break; | 4658 break; |
4592 case LBOR: | 4659 case LBOR: |
4593 printf("\torr\t%s, %s, %s\n",crn_l,crn_l,orn_l); | 4660 printf("\tor\t%s, %s, %s\n",crn_l,crn_l,orn_l); |
4594 printf("\torr\t%s, %s, %s\n",crn_h,crn_h,orn_h); | 4661 printf("\tor\t%s, %s, %s\n",crn_h,crn_h,orn_h); |
4595 break; | 4662 break; |
4596 case LMUL: | 4663 case LMUL: |
4597 case LUMUL: | 4664 case LUMUL: |
4598 code_longlong_lib("__muldi3",reg,oreg); | 4665 code_longlong_lib("__muldi3",reg,oreg); |
4599 check_lreg(reg); | 4666 check_lreg(reg); |
4676 if (v==32) { | 4743 if (v==32) { |
4677 code_register((creg),(creg)); | 4744 code_register((creg),(creg)); |
4678 code_const(0,(creg)); | 4745 code_const(0,(creg)); |
4679 return; | 4746 return; |
4680 } else if (v>31) { | 4747 } else if (v>31) { |
4681 printf("\tmov\t%s, %s, lsl #%d\n",crn_h,crn_l,v-32); | 4748 //printf("\tmov\t%s, %s, lsl #%d\n",crn_h,crn_l,v-32); |
4682 code_const(0,(creg)); | 4749 // 右シフト |
4750 printf("\troti\t%s,%s,%d\n",crn_h,crn_h,96-v); | |
4751 code_const(0,(creg)); | |
4683 return; | 4752 return; |
4684 } | 4753 } |
4685 greg = get_register(); | 4754 greg = get_register(); |
4686 grn = register_name(greg); | 4755 grn = register_name(greg); |
4687 printf("\tmov\t%s, %s, lsl #%d\n",crn_h,crn_h,v); | 4756 printf("\tshli\t%s, %s, %d\n",crn_h,crn_h,v); |
4688 printf("\tmov\t%s, %s, lsr #%d\n",grn,crn_l,32-v); | 4757 printf("\troti\t%s, %s, -%d\n",grn,crn_l,32-v); |
4689 printf("\torr\t%s, %s,%s\n",crn_h,crn_h,grn); | 4758 printf("\torc\t%s, %s,%s\n",crn_h,crn_h,grn); |
4690 printf("\tmov\t%s, %s, lsl #%d\n",crn_l,crn_l,v); | 4759 printf("\tshli\t%s, %s,%d\n",crn_l,crn_l,v); |
4691 free_register(greg); | 4760 free_register(greg); |
4692 return; | 4761 return; |
4693 case LDIV: | 4762 case LDIV: |
4694 v=ilog(v); | 4763 v=ilog(v); |
4695 case LRSHIFT: | 4764 case LRSHIFT: |
4696 if (v==0) return; | 4765 if (v==0) return; |
4697 if (v==32) { | 4766 if (v==32) { |
4698 code_register((creg),(creg)); | 4767 code_register((creg),(creg)); |
4699 printf("\tmov\t%s, %s, asr #31\n",crn_h,crn_l); | 4768 printf("\tshli\t%s, %s, 31\n",crn_h,crn_l); |
4700 return; | 4769 return; |
4701 } else if (v>31) { | 4770 } else if (v>31) { |
4702 printf("\tmov\t%s, %s, asr #%d\n",crn_l,crn_h,v-32); | 4771 printf("\t\t%s, %s, asr #%d\n",crn_l,crn_h,v-32); |
4703 printf("\tmov\t%s, %s, asr #31\n",crn_h,crn_l); | 4772 printf("\tshl\t%s, %s, 31\n",crn_h,crn_l); |
4704 return; | 4773 return; |
4705 } | 4774 } |
4706 greg = get_register(); | 4775 greg = get_register(); |
4707 grn = register_name(greg); | 4776 grn = register_name(greg); |
4708 printf("\tmov\t%s, %s, lsr #%d\n",crn_l,crn_l,v); | 4777 printf("\troti \t%s, %s, %d\n",crn_l,crn_l,v); |
4709 printf("\tmov\t%s, %s, lsl #%d\n",grn,crn_h,32-v); | 4778 printf("\troti\t%s, %s, %d\n",grn,crn_h,160-v); |
4710 printf("\torr\t%s, %s,%s\n",crn_l,crn_l,grn); | 4779 printf("\tor\t%s, %s,%s\n",crn_l,crn_l,grn); |
4711 printf("\tmov\t%s, %s, asr #%d\n",crn_h,crn_h,v); | 4780 printf("\tshli\t%s, %s, %d\n",crn_h,crn_h,v); |
4712 free_register(greg); | 4781 free_register(greg); |
4713 return; | 4782 return; |
4714 case LUDIV: | 4783 case LUDIV: |
4715 v=ilog(v); | 4784 v=ilog(v); |
4716 case LURSHIFT: | 4785 case LURSHIFT: |
4724 code_const(0,(creg)); | 4793 code_const(0,(creg)); |
4725 return; | 4794 return; |
4726 } | 4795 } |
4727 greg = get_register(); | 4796 greg = get_register(); |
4728 grn = register_name(greg); | 4797 grn = register_name(greg); |
4729 printf("\tmov\t%s, %s, lsl #%d\n",grn,crn_h,32-v); | 4798 printf("\troti\t%s, %s, %d\n",grn,crn_h,96-v); |
4730 printf("\tmov\t%s, %s, lsr #%d\n",crn_l,crn_l,v); | 4799 printf("\troti\t%s, %s, %d\n",crn_l,crn_l,v); |
4731 printf("\torr\t%s, %s,%s\n",crn_l,grn,crn_l); | 4800 printf("\tor\t%s, %s,%s\n",crn_l,grn,crn_l); |
4732 printf("\tmov\t%s, %s, lsr #%d\n",crn_h,crn_h,v); | 4801 printf("\troti\t%s, %s, %d\n",crn_h,crn_h,v); |
4733 free_register(greg); | 4802 free_register(greg); |
4734 return; | 4803 return; |
4735 case LADD: | 4804 case LADD: |
4736 printf("\tadds\t%s, %s, #%d\n",crn_l,crn_l,v); | 4805 printf("\tadds\t%s, %s, #%d\n",crn_l,crn_l,v); |
4737 printf("\tadc\t%s, %s, #%d\n",crn_h,crn_h,vh); | 4806 printf("\tadc\t%s, %s, #%d\n",crn_h,crn_h,vh); |
4739 case LSUB: | 4808 case LSUB: |
4740 printf("\tsubs\t%s, %s, #%d\n",crn_l,crn_l,v); | 4809 printf("\tsubs\t%s, %s, #%d\n",crn_l,crn_l,v); |
4741 printf("\tsbc\t%s, %s, #%d\n",crn_h,crn_h,vh); | 4810 printf("\tsbc\t%s, %s, #%d\n",crn_h,crn_h,vh); |
4742 break; | 4811 break; |
4743 case LBAND: | 4812 case LBAND: |
4744 printf("\tand\t%s, %s, #%d\n",crn_l,crn_l,v); | 4813 printf("\tandi\t%s, %s, %d\n",crn_l,crn_l,v); |
4745 printf("\tand\t%s, %s, #%d\n",crn_h,crn_h,vh); | 4814 printf("\tandi\t%s, %s, %d\n",crn_h,crn_h,vh); |
4746 break; | 4815 break; |
4747 case LEOR: | 4816 case LEOR: |
4748 printf("\teor\t%s, %s, #%d\n",crn_l,crn_l,v); | 4817 printf("\teor\t%s, %s, #%d\n",crn_l,crn_l,v); |
4749 printf("\teor\t%s, %s, #%d\n",crn_h,crn_h,vh); | 4818 printf("\teor\t%s, %s, #%d\n",crn_h,crn_h,vh); |
4750 break; | 4819 break; |
4751 case LBOR: | 4820 case LBOR: |
4752 printf("\torr\t%s, %s, #%d\n",crn_l,crn_l,v); | 4821 printf("\tori\t%s, %s, %d\n",crn_l,crn_l,v); |
4753 printf("\torr\t%s, %s, #%d\n",crn_h,crn_h,vh); | 4822 printf("\tori\t%s, %s, %d\n",crn_h,crn_h,vh); |
4754 break; | 4823 break; |
4755 default: | 4824 default: |
4756 error(-1); | 4825 error(-1); |
4757 } | 4826 } |
4758 if (dx!=-1) free_register(dx); | 4827 if (dx!=-1) free_register(dx); |
4768 use_longlong(reg); | 4837 use_longlong(reg); |
4769 crn_h = lregister_name_high(lreg); | 4838 crn_h = lregister_name_high(lreg); |
4770 crn_l = lregister_name_low(lreg); | 4839 crn_l = lregister_name_low(lreg); |
4771 if (reg0!=(lreg)) | 4840 if (reg0!=(lreg)) |
4772 printf("\tori\t%s, %s, 0\n",crn_l,crn); | 4841 printf("\tori\t%s, %s, 0\n",crn_l,crn); |
4773 printf("\tmov\t%s, %s, asr #31\n",crn_h,crn_l); | 4842 printf("\tshli\t%s, %s, 31\n",crn_h,crn_l); |
4774 } | 4843 } |
4775 | 4844 |
4776 void | 4845 void |
4777 code_i2ull(int reg) | 4846 code_i2ull(int reg) |
4778 { | 4847 { |
5102 code_cmpdimm(max-min,t,dlabel,-1); | 5171 code_cmpdimm(max-min,t,dlabel,-1); |
5103 printf("\tldrls\tpc, [pc, %s, asl #2]\n",trn); | 5172 printf("\tldrls\tpc, [pc, %s, asl #2]\n",trn); |
5104 break; | 5173 break; |
5105 case 2: | 5174 case 2: |
5106 printf("\ttst\t%s, #1\n",trn); | 5175 printf("\ttst\t%s, #1\n",trn); |
5107 printf("\tbne\t.L%d\n",dlabel); | 5176 printf("\tbr\t.L%d\n",dlabel); |
5108 code_cmpdimm(max-min,t,dlabel,-1); | 5177 code_cmpdimm(max-min,t,dlabel,-1); |
5109 printf("\tldrls\tpc, [pc, %s, asl #1]\n",trn); break; | 5178 printf("\tldrls\tpc, [pc, %s, asl #1]\n",trn); break; |
5110 break; | 5179 break; |
5111 case 4: | 5180 case 4: |
5112 printf("\ttst\t%s, #3\n",trn); | 5181 printf("\ttst\t%s, #3\n",trn); |
5113 printf("\tbne\t.L%d\n",dlabel); | 5182 printf("\tbr\t.L%d\n",dlabel); |
5114 code_cmpdimm(max-min,t,dlabel,-1); | 5183 code_cmpdimm(max-min,t,dlabel,-1); |
5115 printf("\tldrls\tpc, [pc, %s]\n",trn); break; | 5184 printf("\tldrls\tpc, [pc, %s]\n",trn); break; |
5116 break; | 5185 break; |
5117 default: | 5186 default: |
5118 error(-1); | 5187 error(-1); |
5515 static void | 5584 static void |
5516 make_mask_and_or(int mask,int tmp,char *trn,char *crn,char *lrn) | 5585 make_mask_and_or(int mask,int tmp,char *trn,char *crn,char *lrn) |
5517 { | 5586 { |
5518 // printf("## mask 0x%08x ~0x%08x\n",mask,~mask); | 5587 // printf("## mask 0x%08x ~0x%08x\n",mask,~mask); |
5519 code_const(~mask,tmp); | 5588 code_const(~mask,tmp); |
5520 printf("\torr\t%s, %s, %s\n",trn,crn,trn); | 5589 printf("\tor\t%s, %s, %s\n",trn,crn,trn); |
5521 /* do conjunction */ | 5590 /* do conjunction */ |
5522 printf("\tand\t%s, %s, %s\n",lrn,trn,lrn); | 5591 printf("\tand\t%s, %s, %s\n",lrn,trn,lrn); |
5523 /* make or-mask */ | 5592 /* make or-mask */ |
5524 code_const(mask,tmp); | 5593 code_const(mask,tmp); |
5525 printf("\tand\t%s, %s, %s\n",trn,crn,trn); | 5594 printf("\tand\t%s, %s, %s\n",trn,crn,trn); |
5526 /* do disjunction */ | 5595 /* do disjunction */ |
5527 printf("\torr\t%s, %s, %s\n",crn,trn,lrn); | 5596 printf("\tor\t%s, %s, %s\n",crn,trn,lrn); |
5528 } | 5597 } |
5529 | 5598 |
5530 extern void | 5599 extern void |
5531 code_bit_replace(int adr,int value,int type) | 5600 code_bit_replace(int adr,int value,int type) |
5532 { | 5601 { |
5647 int tmp = -1; | 5716 int tmp = -1; |
5648 int m; | 5717 int m; |
5649 // printf("## mask 0x%08x ~0x%08x\n",mask,~mask); | 5718 // printf("## mask 0x%08x ~0x%08x\n",mask,~mask); |
5650 if ((m=(~mask|c))!=-1) { | 5719 if ((m=(~mask|c))!=-1) { |
5651 if (is_stage1_const(m,0)>0) { | 5720 if (is_stage1_const(m,0)>0) { |
5652 printf("\tand\t%s, %s, #%d\n",crn,crn,m); | 5721 printf("\tandi\t%s, %s, %d\n",crn,crn,m); |
5653 } else { | 5722 } else { |
5654 trn = register_name(tmp=get_register()); | 5723 trn = register_name(tmp=get_register()); |
5655 code_const((~mask|c),tmp); | 5724 code_const((~mask|c),tmp); |
5656 /* do conjunction */ | 5725 /* do conjunction */ |
5657 printf("\tand\t%s, %s, %s\n",crn,trn,crn); | 5726 printf("\tand\t%s, %s, %s\n",crn,trn,crn); |
5661 /* make or-mask */ | 5730 /* make or-mask */ |
5662 c = mask&c; | 5731 c = mask&c; |
5663 if (c!=0) { | 5732 if (c!=0) { |
5664 /* do disjunction */ | 5733 /* do disjunction */ |
5665 if (is_stage1_const(c,0)>0) { | 5734 if (is_stage1_const(c,0)>0) { |
5666 printf("\torr\t%s, %s, #%d\n",crn,crn,c); | 5735 printf("\tori\t%s, %s, %d\n",crn,crn,c); |
5667 } else { | 5736 } else { |
5668 trn = register_name(tmp=get_register()); | 5737 trn = register_name(tmp=get_register()); |
5669 code_const(c,tmp); | 5738 code_const(c,tmp); |
5670 printf("\torr\t%s, %s, %s\n",crn,trn,crn); | 5739 printf("\tor\t%s, %s, %s\n",crn,trn,crn); |
5671 } | 5740 } |
5672 } | 5741 } |
5673 if (tmp!=-1) free_register(tmp); | 5742 if (tmp!=-1) free_register(tmp); |
5674 } | 5743 } |
5675 | 5744 |