Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(850)

Side by Side Diff: runtime/vm/assembler_arm64_test.cc

Issue 2452453002: Support unaligned integer loads on ARM and MIPS. (Closed)
Patch Set: review Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « runtime/vm/assembler_arm64.cc ('k') | runtime/vm/assembler_arm_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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)
OLDNEW
« no previous file with comments | « runtime/vm/assembler_arm64.cc ('k') | runtime/vm/assembler_arm_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698