| 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 1666 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1677 __ ret(); | 1677 __ ret(); |
| 1678 } | 1678 } |
| 1679 | 1679 |
| 1680 | 1680 |
| 1681 ASSEMBLER_TEST_RUN(LoadImmediateMedNeg4, test) { | 1681 ASSEMBLER_TEST_RUN(LoadImmediateMedNeg4, test) { |
| 1682 typedef int64_t (*Int64Return)() DART_UNUSED; | 1682 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1683 EXPECT_EQ(-0x12341234, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1683 EXPECT_EQ(-0x12341234, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1684 } | 1684 } |
| 1685 | 1685 |
| 1686 | 1686 |
| 1687 ASSEMBLER_TEST_GENERATE(LoadHalfWordUnaligned, assembler) { |
| 1688 __ LoadUnaligned(R1, R0, TMP, kHalfword); |
| 1689 __ mov(R0, R1); |
| 1690 __ ret(); |
| 1691 } |
| 1692 |
| 1693 |
| 1694 ASSEMBLER_TEST_RUN(LoadHalfWordUnaligned, test) { |
| 1695 EXPECT(test != NULL); |
| 1696 typedef intptr_t (*LoadHalfWordUnaligned)(intptr_t) DART_UNUSED; |
| 1697 uint8_t buffer[4] = { |
| 1698 0x89, 0xAB, 0xCD, 0xEF, |
| 1699 }; |
| 1700 |
| 1701 EXPECT_EQ(static_cast<int16_t>(static_cast<uint16_t>(0xAB89)), |
| 1702 EXECUTE_TEST_CODE_INTPTR_INTPTR( |
| 1703 LoadHalfWordUnaligned, |
| 1704 test->entry(), |
| 1705 reinterpret_cast<intptr_t>(&buffer[0]))); |
| 1706 EXPECT_EQ(static_cast<int16_t>(static_cast<uint16_t>(0xCDAB)), |
| 1707 EXECUTE_TEST_CODE_INTPTR_INTPTR( |
| 1708 LoadHalfWordUnaligned, |
| 1709 test->entry(), |
| 1710 reinterpret_cast<intptr_t>(&buffer[1]))); |
| 1711 } |
| 1712 |
| 1713 |
| 1714 ASSEMBLER_TEST_GENERATE(LoadHalfWordUnsignedUnaligned, assembler) { |
| 1715 __ LoadUnaligned(R1, R0, TMP, kUnsignedHalfword); |
| 1716 __ mov(R0, R1); |
| 1717 __ ret(); |
| 1718 } |
| 1719 |
| 1720 |
| 1721 ASSEMBLER_TEST_RUN(LoadHalfWordUnsignedUnaligned, test) { |
| 1722 EXPECT(test != NULL); |
| 1723 typedef intptr_t (*LoadHalfWordUnsignedUnaligned)(intptr_t) DART_UNUSED; |
| 1724 uint8_t buffer[4] = { |
| 1725 0x89, 0xAB, 0xCD, 0xEF, |
| 1726 }; |
| 1727 |
| 1728 EXPECT_EQ(0xAB89, |
| 1729 EXECUTE_TEST_CODE_INTPTR_INTPTR( |
| 1730 LoadHalfWordUnsignedUnaligned, |
| 1731 test->entry(), |
| 1732 reinterpret_cast<intptr_t>(&buffer[0]))); |
| 1733 EXPECT_EQ(0xCDAB, |
| 1734 EXECUTE_TEST_CODE_INTPTR_INTPTR( |
| 1735 LoadHalfWordUnsignedUnaligned, |
| 1736 test->entry(), |
| 1737 reinterpret_cast<intptr_t>(&buffer[1]))); |
| 1738 } |
| 1739 |
| 1740 |
| 1741 ASSEMBLER_TEST_GENERATE(StoreHalfWordUnaligned, assembler) { |
| 1742 __ LoadImmediate(R1, 0xABCD); |
| 1743 __ StoreUnaligned(R1, R0, TMP, kHalfword); |
| 1744 __ mov(R0, R1); |
| 1745 __ ret(); |
| 1746 } |
| 1747 |
| 1748 |
| 1749 ASSEMBLER_TEST_RUN(StoreHalfWordUnaligned, test) { |
| 1750 EXPECT(test != NULL); |
| 1751 typedef intptr_t (*StoreHalfWordUnaligned)(intptr_t) DART_UNUSED; |
| 1752 uint8_t buffer[4] = { |
| 1753 0, 0, 0, 0, |
| 1754 }; |
| 1755 |
| 1756 EXPECT_EQ(0xABCD, |
| 1757 EXECUTE_TEST_CODE_INTPTR_INTPTR( |
| 1758 StoreHalfWordUnaligned, |
| 1759 test->entry(), |
| 1760 reinterpret_cast<intptr_t>(&buffer[0]))); |
| 1761 EXPECT_EQ(0xCD, buffer[0]); |
| 1762 EXPECT_EQ(0xAB, buffer[1]); |
| 1763 EXPECT_EQ(0, buffer[2]); |
| 1764 |
| 1765 EXPECT_EQ(0xABCD, |
| 1766 EXECUTE_TEST_CODE_INTPTR_INTPTR( |
| 1767 StoreHalfWordUnaligned, |
| 1768 test->entry(), |
| 1769 reinterpret_cast<intptr_t>(&buffer[1]))); |
| 1770 EXPECT_EQ(0xCD, buffer[1]); |
| 1771 EXPECT_EQ(0xAB, buffer[2]); |
| 1772 EXPECT_EQ(0, buffer[3]); |
| 1773 } |
| 1774 |
| 1775 |
| 1776 ASSEMBLER_TEST_GENERATE(LoadWordUnaligned, assembler) { |
| 1777 __ LoadUnaligned(R1, R0, TMP, kUnsignedWord); |
| 1778 __ mov(R0, R1); |
| 1779 __ ret(); |
| 1780 } |
| 1781 |
| 1782 |
| 1783 ASSEMBLER_TEST_RUN(LoadWordUnaligned, test) { |
| 1784 EXPECT(test != NULL); |
| 1785 typedef int32_t (*LoadWordUnaligned)(intptr_t) DART_UNUSED; |
| 1786 uint8_t buffer[8] = { |
| 1787 0x12, 0x34, 0x56, 0x78, |
| 1788 0x9A, 0xBC, 0xDE, 0xF0 |
| 1789 }; |
| 1790 |
| 1791 EXPECT_EQ(static_cast<int32_t>(0x78563412), |
| 1792 EXECUTE_TEST_CODE_INT32_INTPTR( |
| 1793 LoadWordUnaligned, |
| 1794 test->entry(), |
| 1795 reinterpret_cast<intptr_t>(&buffer[0]))); |
| 1796 EXPECT_EQ(static_cast<int32_t>(0x9A785634), |
| 1797 EXECUTE_TEST_CODE_INT32_INTPTR( |
| 1798 LoadWordUnaligned, |
| 1799 test->entry(), |
| 1800 reinterpret_cast<intptr_t>(&buffer[1]))); |
| 1801 EXPECT_EQ(static_cast<int32_t>(0xBC9A7856), |
| 1802 EXECUTE_TEST_CODE_INT32_INTPTR( |
| 1803 LoadWordUnaligned, |
| 1804 test->entry(), |
| 1805 reinterpret_cast<intptr_t>(&buffer[2]))); |
| 1806 EXPECT_EQ(static_cast<int32_t>(0xDEBC9A78), |
| 1807 EXECUTE_TEST_CODE_INT32_INTPTR( |
| 1808 LoadWordUnaligned, |
| 1809 test->entry(), |
| 1810 reinterpret_cast<intptr_t>(&buffer[3]))); |
| 1811 } |
| 1812 |
| 1813 |
| 1814 ASSEMBLER_TEST_GENERATE(StoreWordUnaligned, assembler) { |
| 1815 __ LoadImmediate(R1, 0x12345678); |
| 1816 __ StoreUnaligned(R1, R0, TMP, kUnsignedWord); |
| 1817 __ mov(R0, R1); |
| 1818 __ ret(); |
| 1819 } |
| 1820 |
| 1821 |
| 1822 ASSEMBLER_TEST_RUN(StoreWordUnaligned, test) { |
| 1823 EXPECT(test != NULL); |
| 1824 typedef intptr_t (*StoreWordUnaligned)(intptr_t) DART_UNUSED; |
| 1825 uint8_t buffer[8] = { |
| 1826 0, 0, 0, 0, |
| 1827 0, 0, 0, 0 |
| 1828 }; |
| 1829 |
| 1830 EXPECT_EQ(0x12345678, |
| 1831 EXECUTE_TEST_CODE_INTPTR_INTPTR( |
| 1832 StoreWordUnaligned, |
| 1833 test->entry(), |
| 1834 reinterpret_cast<intptr_t>(&buffer[0]))); |
| 1835 EXPECT_EQ(0x78, buffer[0]); |
| 1836 EXPECT_EQ(0x56, buffer[1]); |
| 1837 EXPECT_EQ(0x34, buffer[2]); |
| 1838 EXPECT_EQ(0x12, buffer[3]); |
| 1839 |
| 1840 EXPECT_EQ(0x12345678, |
| 1841 EXECUTE_TEST_CODE_INTPTR_INTPTR( |
| 1842 StoreWordUnaligned, |
| 1843 test->entry(), |
| 1844 reinterpret_cast<intptr_t>(&buffer[1]))); |
| 1845 EXPECT_EQ(0x78, buffer[1]); |
| 1846 EXPECT_EQ(0x56, buffer[2]); |
| 1847 EXPECT_EQ(0x34, buffer[3]); |
| 1848 EXPECT_EQ(0x12, buffer[4]); |
| 1849 |
| 1850 EXPECT_EQ(0x12345678, |
| 1851 EXECUTE_TEST_CODE_INTPTR_INTPTR( |
| 1852 StoreWordUnaligned, |
| 1853 test->entry(), |
| 1854 reinterpret_cast<intptr_t>(&buffer[2]))); |
| 1855 EXPECT_EQ(0x78, buffer[2]); |
| 1856 EXPECT_EQ(0x56, buffer[3]); |
| 1857 EXPECT_EQ(0x34, buffer[4]); |
| 1858 EXPECT_EQ(0x12, buffer[5]); |
| 1859 |
| 1860 EXPECT_EQ(0x12345678, |
| 1861 EXECUTE_TEST_CODE_INTPTR_INTPTR( |
| 1862 StoreWordUnaligned, |
| 1863 test->entry(), |
| 1864 reinterpret_cast<intptr_t>(&buffer[3]))); |
| 1865 EXPECT_EQ(0x78, buffer[3]); |
| 1866 EXPECT_EQ(0x56, buffer[4]); |
| 1867 EXPECT_EQ(0x34, buffer[5]); |
| 1868 EXPECT_EQ(0x12, buffer[6]); |
| 1869 } |
| 1870 |
| 1871 |
| 1687 static void EnterTestFrame(Assembler* assembler) { | 1872 static void EnterTestFrame(Assembler* assembler) { |
| 1688 __ EnterFrame(0); | 1873 __ EnterFrame(0); |
| 1689 __ Push(CODE_REG); | 1874 __ Push(CODE_REG); |
| 1690 __ Push(THR); | 1875 __ Push(THR); |
| 1691 __ TagAndPushPP(); | 1876 __ TagAndPushPP(); |
| 1692 __ ldr(CODE_REG, Address(R0, VMHandles::kOffsetOfRawPtrInHandle)); | 1877 __ ldr(CODE_REG, Address(R0, VMHandles::kOffsetOfRawPtrInHandle)); |
| 1693 __ mov(THR, R1); | 1878 __ mov(THR, R1); |
| 1694 __ LoadPoolPointer(PP); | 1879 __ LoadPoolPointer(PP); |
| 1695 } | 1880 } |
| 1696 | 1881 |
| (...skipping 1931 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3628 __ Pop(LR); | 3813 __ Pop(LR); |
| 3629 __ Pop(THR); | 3814 __ Pop(THR); |
| 3630 __ Pop(CODE_REG); | 3815 __ Pop(CODE_REG); |
| 3631 __ RestoreCSP(); | 3816 __ RestoreCSP(); |
| 3632 __ ret(); | 3817 __ ret(); |
| 3633 } | 3818 } |
| 3634 | 3819 |
| 3635 } // namespace dart | 3820 } // namespace dart |
| 3636 | 3821 |
| 3637 #endif // defined(TARGET_ARCH_ARM64) | 3822 #endif // defined(TARGET_ARCH_ARM64) |
| OLD | NEW |