| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/globals.h" | 5 #include "vm/globals.h" |
| 6 #if defined(TARGET_ARCH_ARM64) | 6 #if defined(TARGET_ARCH_ARM64) |
| 7 | 7 |
| 8 #include "vm/assembler.h" | 8 #include "vm/assembler.h" |
| 9 #include "vm/cpu.h" | 9 #include "vm/cpu.h" |
| 10 #include "vm/os.h" | 10 #include "vm/os.h" |
| (...skipping 698 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 709 __ ret(); | 709 __ ret(); |
| 710 } | 710 } |
| 711 | 711 |
| 712 | 712 |
| 713 ASSEMBLER_TEST_RUN(CmpLtBranchNotTaken, test) { | 713 ASSEMBLER_TEST_RUN(CmpLtBranchNotTaken, test) { |
| 714 typedef int (*SimpleCode)(); | 714 typedef int (*SimpleCode)(); |
| 715 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry())); | 715 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry())); |
| 716 } | 716 } |
| 717 | 717 |
| 718 | 718 |
| 719 |
| 720 |
| 721 ASSEMBLER_TEST_GENERATE(FcmpEqBranch, assembler) { |
| 722 Label l; |
| 723 |
| 724 __ LoadDImmediate(V0, 42.0, kNoPP); |
| 725 __ LoadDImmediate(V1, 234.0, kNoPP); |
| 726 __ LoadDImmediate(V2, 234.0, kNoPP); |
| 727 |
| 728 __ fcmpd(V1, V2); |
| 729 __ b(&l, EQ); |
| 730 __ LoadDImmediate(V0, 0.0, kNoPP); |
| 731 __ Bind(&l); |
| 732 __ ret(); |
| 733 } |
| 734 |
| 735 |
| 736 ASSEMBLER_TEST_RUN(FcmpEqBranch, test) { |
| 737 typedef int (*SimpleCode)(); |
| 738 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry())); |
| 739 } |
| 740 |
| 741 |
| 742 ASSEMBLER_TEST_GENERATE(FcmpEqBranchNotTaken, assembler) { |
| 743 Label l; |
| 744 |
| 745 __ LoadDImmediate(V0, 0.0, kNoPP); |
| 746 __ LoadDImmediate(V1, 233.0, kNoPP); |
| 747 __ LoadDImmediate(V2, 234.0, kNoPP); |
| 748 |
| 749 __ fcmpd(V1, V2); |
| 750 __ b(&l, EQ); |
| 751 __ LoadDImmediate(V0, 42.0, kNoPP); |
| 752 __ Bind(&l); |
| 753 __ ret(); |
| 754 } |
| 755 |
| 756 |
| 757 ASSEMBLER_TEST_RUN(FcmpEqBranchNotTaken, test) { |
| 758 typedef int (*SimpleCode)(); |
| 759 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry())); |
| 760 } |
| 761 |
| 762 |
| 763 ASSEMBLER_TEST_GENERATE(FcmpLtBranch, assembler) { |
| 764 Label l; |
| 765 |
| 766 __ LoadDImmediate(V0, 42.0, kNoPP); |
| 767 __ LoadDImmediate(V1, 233.0, kNoPP); |
| 768 __ LoadDImmediate(V2, 234.0, kNoPP); |
| 769 |
| 770 __ fcmpd(V1, V2); |
| 771 __ b(&l, LT); |
| 772 __ LoadDImmediate(V0, 0.0, kNoPP); |
| 773 __ Bind(&l); |
| 774 __ ret(); |
| 775 } |
| 776 |
| 777 |
| 778 ASSEMBLER_TEST_RUN(FcmpLtBranch, test) { |
| 779 typedef int (*SimpleCode)(); |
| 780 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry())); |
| 781 } |
| 782 |
| 783 |
| 784 ASSEMBLER_TEST_GENERATE(FcmpLtBranchNotTaken, assembler) { |
| 785 Label l; |
| 786 |
| 787 __ LoadDImmediate(V0, 0.0, kNoPP); |
| 788 __ LoadDImmediate(V1, 235.0, kNoPP); |
| 789 __ LoadDImmediate(V2, 234.0, kNoPP); |
| 790 |
| 791 __ fcmpd(V1, V2); |
| 792 __ b(&l, LT); |
| 793 __ LoadDImmediate(V0, 42.0, kNoPP); |
| 794 __ Bind(&l); |
| 795 __ ret(); |
| 796 } |
| 797 |
| 798 |
| 799 ASSEMBLER_TEST_RUN(FcmpLtBranchNotTaken, test) { |
| 800 typedef int (*SimpleCode)(); |
| 801 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry())); |
| 802 } |
| 803 |
| 804 |
| 805 ASSEMBLER_TEST_GENERATE(FcmpzGtBranch, assembler) { |
| 806 Label l; |
| 807 |
| 808 __ LoadDImmediate(V0, 235.0, kNoPP); |
| 809 __ LoadDImmediate(V1, 233.0, kNoPP); |
| 810 |
| 811 __ fcmpzd(V1); |
| 812 __ b(&l, GT); |
| 813 __ LoadDImmediate(V0, 0.0, kNoPP); |
| 814 __ ret(); |
| 815 __ Bind(&l); |
| 816 __ LoadDImmediate(V0, 42.0, kNoPP); |
| 817 __ ret(); |
| 818 } |
| 819 |
| 820 |
| 821 ASSEMBLER_TEST_RUN(FcmpzGtBranch, test) { |
| 822 typedef int (*SimpleCode)(); |
| 823 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry())); |
| 824 } |
| 825 |
| 826 |
| 719 ASSEMBLER_TEST_GENERATE(AndsBranch, assembler) { | 827 ASSEMBLER_TEST_GENERATE(AndsBranch, assembler) { |
| 720 Label l; | 828 Label l; |
| 721 | 829 |
| 722 __ movz(R0, 42, 0); | 830 __ movz(R0, 42, 0); |
| 723 __ movz(R1, 2, 0); | 831 __ movz(R1, 2, 0); |
| 724 __ movz(R2, 1, 0); | 832 __ movz(R2, 1, 0); |
| 725 | 833 |
| 726 __ ands(R3, R1, Operand(R2)); | 834 __ ands(R3, R1, Operand(R2)); |
| 727 __ b(&l, EQ); | 835 __ b(&l, EQ); |
| 728 __ movz(R0, 0, 0); | 836 __ movz(R0, 0, 0); |
| (...skipping 609 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1338 __ ret(); | 1446 __ ret(); |
| 1339 } | 1447 } |
| 1340 | 1448 |
| 1341 | 1449 |
| 1342 ASSEMBLER_TEST_RUN(CSelFalse, test) { | 1450 ASSEMBLER_TEST_RUN(CSelFalse, test) { |
| 1343 typedef int (*SimpleCode)(); | 1451 typedef int (*SimpleCode)(); |
| 1344 EXPECT_EQ(1234, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry())); | 1452 EXPECT_EQ(1234, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry())); |
| 1345 } | 1453 } |
| 1346 | 1454 |
| 1347 | 1455 |
| 1456 ASSEMBLER_TEST_GENERATE(CsincTrue, assembler) { |
| 1457 __ LoadImmediate(R1, 42, kNoRegister); |
| 1458 __ LoadImmediate(R2, 1234, kNoRegister); |
| 1459 __ CompareRegisters(R1, R2); |
| 1460 __ csinc(R0, R1, R2, LT); |
| 1461 __ ret(); |
| 1462 } |
| 1463 |
| 1464 |
| 1465 ASSEMBLER_TEST_RUN(CsincTrue, test) { |
| 1466 typedef int (*SimpleCode)(); |
| 1467 EXPECT_EQ(43, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry())); |
| 1468 } |
| 1469 |
| 1470 |
| 1471 ASSEMBLER_TEST_GENERATE(CsincFalse, assembler) { |
| 1472 __ LoadImmediate(R1, 42, kNoRegister); |
| 1473 __ LoadImmediate(R2, 1234, kNoRegister); |
| 1474 __ CompareRegisters(R1, R2); |
| 1475 __ csinc(R0, R1, R2, GE); |
| 1476 __ ret(); |
| 1477 } |
| 1478 |
| 1479 |
| 1480 ASSEMBLER_TEST_RUN(CsincFalse, test) { |
| 1481 typedef int (*SimpleCode)(); |
| 1482 EXPECT_EQ(1234, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry())); |
| 1483 } |
| 1484 |
| 1485 |
| 1348 // Floating point move immediate, to/from integer register. | 1486 // Floating point move immediate, to/from integer register. |
| 1349 ASSEMBLER_TEST_GENERATE(Fmovdi, assembler) { | 1487 ASSEMBLER_TEST_GENERATE(Fmovdi, assembler) { |
| 1350 __ LoadDImmediate(V0, 1.0, kNoPP); | 1488 __ LoadDImmediate(V0, 1.0, kNoPP); |
| 1351 __ ret(); | 1489 __ ret(); |
| 1352 } | 1490 } |
| 1353 | 1491 |
| 1354 | 1492 |
| 1355 ASSEMBLER_TEST_RUN(Fmovdi, test) { | 1493 ASSEMBLER_TEST_RUN(Fmovdi, test) { |
| 1356 typedef int (*SimpleCode)(); | 1494 typedef int (*SimpleCode)(); |
| 1357 EXPECT_EQ(1.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry())); | 1495 EXPECT_EQ(1.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry())); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1406 __ ret(); | 1544 __ ret(); |
| 1407 } | 1545 } |
| 1408 | 1546 |
| 1409 | 1547 |
| 1410 ASSEMBLER_TEST_RUN(FldrdFstrdPrePostIndex, test) { | 1548 ASSEMBLER_TEST_RUN(FldrdFstrdPrePostIndex, test) { |
| 1411 typedef int (*SimpleCode)(); | 1549 typedef int (*SimpleCode)(); |
| 1412 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry())); | 1550 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry())); |
| 1413 } | 1551 } |
| 1414 | 1552 |
| 1415 | 1553 |
| 1554 ASSEMBLER_TEST_GENERATE(Fcvtzds, assembler) { |
| 1555 __ LoadDImmediate(V0, 42.0, kNoPP); |
| 1556 __ fcvtzds(R0, V0); |
| 1557 __ ret(); |
| 1558 } |
| 1559 |
| 1560 |
| 1561 ASSEMBLER_TEST_RUN(Fcvtzds, test) { |
| 1562 typedef int (*SimpleCode)(); |
| 1563 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry())); |
| 1564 } |
| 1565 |
| 1566 |
| 1567 ASSEMBLER_TEST_GENERATE(Scvtfd, assembler) { |
| 1568 __ LoadImmediate(R0, 42, kNoPP); |
| 1569 __ scvtfd(V0, R0); |
| 1570 __ ret(); |
| 1571 } |
| 1572 |
| 1573 |
| 1574 ASSEMBLER_TEST_RUN(Scvtfd, test) { |
| 1575 typedef int (*SimpleCode)(); |
| 1576 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry())); |
| 1577 } |
| 1578 |
| 1579 |
| 1580 ASSEMBLER_TEST_GENERATE(Fmuld, assembler) { |
| 1581 __ LoadDImmediate(V1, 84.0, kNoPP); |
| 1582 __ LoadDImmediate(V2, 0.5, kNoPP); |
| 1583 __ fmuld(V0, V1, V2); |
| 1584 __ ret(); |
| 1585 } |
| 1586 |
| 1587 |
| 1588 ASSEMBLER_TEST_RUN(Fmuld, test) { |
| 1589 typedef int (*SimpleCode)(); |
| 1590 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry())); |
| 1591 } |
| 1592 |
| 1593 |
| 1594 ASSEMBLER_TEST_GENERATE(Fdivd, assembler) { |
| 1595 __ LoadDImmediate(V1, 84.0, kNoPP); |
| 1596 __ LoadDImmediate(V2, 2.0, kNoPP); |
| 1597 __ fdivd(V0, V1, V2); |
| 1598 __ ret(); |
| 1599 } |
| 1600 |
| 1601 |
| 1602 ASSEMBLER_TEST_RUN(Fdivd, test) { |
| 1603 typedef int (*SimpleCode)(); |
| 1604 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry())); |
| 1605 } |
| 1606 |
| 1607 |
| 1608 ASSEMBLER_TEST_GENERATE(Faddd, assembler) { |
| 1609 __ LoadDImmediate(V1, 41.5, kNoPP); |
| 1610 __ LoadDImmediate(V2, 0.5, kNoPP); |
| 1611 __ faddd(V0, V1, V2); |
| 1612 __ ret(); |
| 1613 } |
| 1614 |
| 1615 |
| 1616 ASSEMBLER_TEST_RUN(Faddd, test) { |
| 1617 typedef int (*SimpleCode)(); |
| 1618 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry())); |
| 1619 } |
| 1620 |
| 1621 |
| 1622 ASSEMBLER_TEST_GENERATE(Fsubd, assembler) { |
| 1623 __ LoadDImmediate(V1, 42.5, kNoPP); |
| 1624 __ LoadDImmediate(V2, 0.5, kNoPP); |
| 1625 __ fsubd(V0, V1, V2); |
| 1626 __ ret(); |
| 1627 } |
| 1628 |
| 1629 |
| 1630 ASSEMBLER_TEST_RUN(Fsubd, test) { |
| 1631 typedef int (*SimpleCode)(); |
| 1632 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry())); |
| 1633 } |
| 1634 |
| 1635 |
| 1416 ASSEMBLER_TEST_GENERATE(FldrdFstrdHeapTag, assembler) { | 1636 ASSEMBLER_TEST_GENERATE(FldrdFstrdHeapTag, assembler) { |
| 1417 __ LoadDImmediate(V0, 43.0, kNoPP); | 1637 __ LoadDImmediate(V0, 43.0, kNoPP); |
| 1418 __ LoadDImmediate(V1, 42.0, kNoPP); | 1638 __ LoadDImmediate(V1, 42.0, kNoPP); |
| 1419 __ AddImmediate(SP, SP, -1 * kWordSize, kNoPP); | 1639 __ AddImmediate(SP, SP, -1 * kWordSize, kNoPP); |
| 1420 __ add(R2, SP, Operand(1)); | 1640 __ add(R2, SP, Operand(1)); |
| 1421 __ fstrd(V1, Address(R2, -1)); | 1641 __ fstrd(V1, Address(R2, -1)); |
| 1422 __ fldrd(V0, Address(R2, -1)); | 1642 __ fldrd(V0, Address(R2, -1)); |
| 1423 __ AddImmediate(SP, SP, 1 * kWordSize, kNoPP); | 1643 __ AddImmediate(SP, SP, 1 * kWordSize, kNoPP); |
| 1424 __ ret(); | 1644 __ ret(); |
| 1425 } | 1645 } |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1523 R1); | 1743 R1); |
| 1524 __ Pop(LR); | 1744 __ Pop(LR); |
| 1525 __ Pop(CTX); | 1745 __ Pop(CTX); |
| 1526 __ PopAndUntagPP(); | 1746 __ PopAndUntagPP(); |
| 1527 __ ret(); | 1747 __ ret(); |
| 1528 } | 1748 } |
| 1529 | 1749 |
| 1530 } // namespace dart | 1750 } // namespace dart |
| 1531 | 1751 |
| 1532 #endif // defined(TARGET_ARCH_ARM64) | 1752 #endif // defined(TARGET_ARCH_ARM64) |
| OLD | NEW |