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

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

Issue 2799373002: Pass a second type argument vector to all type instantiation calls in the VM. (Closed)
Patch Set: addressed comments Created 3 years, 8 months 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/stub_code_mips.cc ('k') | no next file » | 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_X64) 6 #if defined(TARGET_ARCH_X64)
7 7
8 #include "vm/assembler.h" 8 #include "vm/assembler.h"
9 #include "vm/compiler.h" 9 #include "vm/compiler.h"
10 #include "vm/dart_entry.h" 10 #include "vm/dart_entry.h"
(...skipping 1711 matching lines...) Expand 10 before | Expand all | Expand 10 after
1722 __ Bind(&stepping); 1722 __ Bind(&stepping);
1723 __ EnterStubFrame(); 1723 __ EnterStubFrame();
1724 __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0); 1724 __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
1725 __ LeaveStubFrame(); 1725 __ LeaveStubFrame();
1726 __ jmp(&done_stepping, Assembler::kNearJump); 1726 __ jmp(&done_stepping, Assembler::kNearJump);
1727 } 1727 }
1728 1728
1729 1729
1730 // Used to check class and type arguments. Arguments passed on stack: 1730 // Used to check class and type arguments. Arguments passed on stack:
1731 // TOS + 0: return address. 1731 // TOS + 0: return address.
1732 // TOS + 1: instantiator type arguments (can be NULL). 1732 // TOS + 1: function type arguments (only if n == 4, can be raw_null).
1733 // TOS + 2: instance. 1733 // TOS + 2: instantiator type arguments (only if n == 4, can be raw_null).
1734 // TOS + 3: SubtypeTestCache. 1734 // TOS + 3: instance.
1735 // TOS + 4: SubtypeTestCache.
1735 // Result in RCX: null -> not found, otherwise result (true or false). 1736 // Result in RCX: null -> not found, otherwise result (true or false).
1736 static void GenerateSubtypeNTestCacheStub(Assembler* assembler, int n) { 1737 static void GenerateSubtypeNTestCacheStub(Assembler* assembler, int n) {
1737 ASSERT((1 <= n) && (n <= 3)); 1738 ASSERT((n == 1) || (n == 2) || (n == 4));
1738 const intptr_t kInstantiatorTypeArgumentsInBytes = 1 * kWordSize; 1739 const intptr_t kFunctionTypeArgumentsInBytes = 1 * kWordSize;
1739 const intptr_t kInstanceOffsetInBytes = 2 * kWordSize; 1740 const intptr_t kInstantiatorTypeArgumentsInBytes = 2 * kWordSize;
1740 const intptr_t kCacheOffsetInBytes = 3 * kWordSize; 1741 const intptr_t kInstanceOffsetInBytes = 3 * kWordSize;
1742 const intptr_t kCacheOffsetInBytes = 4 * kWordSize;
1741 __ movq(RAX, Address(RSP, kInstanceOffsetInBytes)); 1743 __ movq(RAX, Address(RSP, kInstanceOffsetInBytes));
1742 __ LoadObject(R9, Object::null_object()); 1744 __ LoadObject(R9, Object::null_object());
1743 if (n > 1) { 1745 if (n > 1) {
1744 __ LoadClass(R10, RAX); 1746 __ LoadClass(R10, RAX);
1745 // Compute instance type arguments into R13. 1747 // Compute instance type arguments into R13.
1746 Label has_no_type_arguments; 1748 Label has_no_type_arguments;
1747 __ movq(R13, R9); 1749 __ movq(R13, R9);
1748 __ movl(RDI, 1750 __ movl(RDI,
1749 FieldAddress(R10, 1751 FieldAddress(R10,
1750 Class::type_arguments_field_offset_in_words_offset())); 1752 Class::type_arguments_field_offset_in_words_offset()));
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1784 Address(RDX, kWordSize * SubtypeTestCache::kInstanceTypeArguments)); 1786 Address(RDX, kWordSize * SubtypeTestCache::kInstanceTypeArguments));
1785 __ cmpq(RDI, R13); 1787 __ cmpq(RDI, R13);
1786 if (n == 2) { 1788 if (n == 2) {
1787 __ j(EQUAL, &found, Assembler::kNearJump); 1789 __ j(EQUAL, &found, Assembler::kNearJump);
1788 } else { 1790 } else {
1789 __ j(NOT_EQUAL, &next_iteration, Assembler::kNearJump); 1791 __ j(NOT_EQUAL, &next_iteration, Assembler::kNearJump);
1790 __ movq(RDI, 1792 __ movq(RDI,
1791 Address(RDX, kWordSize * 1793 Address(RDX, kWordSize *
1792 SubtypeTestCache::kInstantiatorTypeArguments)); 1794 SubtypeTestCache::kInstantiatorTypeArguments));
1793 __ cmpq(RDI, Address(RSP, kInstantiatorTypeArgumentsInBytes)); 1795 __ cmpq(RDI, Address(RSP, kInstantiatorTypeArgumentsInBytes));
1796 __ j(NOT_EQUAL, &next_iteration, Assembler::kNearJump);
1797 __ movq(RDI, Address(RDX, kWordSize *
1798 SubtypeTestCache::kFunctionTypeArguments));
1799 __ cmpq(RDI, Address(RSP, kFunctionTypeArgumentsInBytes));
1794 __ j(EQUAL, &found, Assembler::kNearJump); 1800 __ j(EQUAL, &found, Assembler::kNearJump);
1795 } 1801 }
1796 } 1802 }
1797 1803
1798 __ Bind(&next_iteration); 1804 __ Bind(&next_iteration);
1799 __ addq(RDX, Immediate(kWordSize * SubtypeTestCache::kTestEntryLength)); 1805 __ addq(RDX, Immediate(kWordSize * SubtypeTestCache::kTestEntryLength));
1800 __ jmp(&loop, Assembler::kNearJump); 1806 __ jmp(&loop, Assembler::kNearJump);
1801 // Fall through to not found. 1807 // Fall through to not found.
1802 __ Bind(&not_found); 1808 __ Bind(&not_found);
1803 __ movq(RCX, R9); 1809 __ movq(RCX, R9);
1804 __ ret(); 1810 __ ret();
1805 1811
1806 __ Bind(&found); 1812 __ Bind(&found);
1807 __ movq(RCX, Address(RDX, kWordSize * SubtypeTestCache::kTestResult)); 1813 __ movq(RCX, Address(RDX, kWordSize * SubtypeTestCache::kTestResult));
1808 __ ret(); 1814 __ ret();
1809 } 1815 }
1810 1816
1811 1817
1812 // Used to check class and type arguments. Arguments passed on stack: 1818 // Used to check class and type arguments. Arguments passed on stack:
1813 // TOS + 0: return address. 1819 // TOS + 0: return address.
1814 // TOS + 1: instantiator type arguments or NULL. 1820 // TOS + 1: raw_null.
1815 // TOS + 2: instance. 1821 // TOS + 2: raw_null.
1816 // TOS + 3: cache array. 1822 // TOS + 3: instance.
1823 // TOS + 4: SubtypeTestCache.
1817 // Result in RCX: null -> not found, otherwise result (true or false). 1824 // Result in RCX: null -> not found, otherwise result (true or false).
1818 void StubCode::GenerateSubtype1TestCacheStub(Assembler* assembler) { 1825 void StubCode::GenerateSubtype1TestCacheStub(Assembler* assembler) {
1819 GenerateSubtypeNTestCacheStub(assembler, 1); 1826 GenerateSubtypeNTestCacheStub(assembler, 1);
1820 } 1827 }
1821 1828
1822 1829
1823 // Used to check class and type arguments. Arguments passed on stack: 1830 // Used to check class and type arguments. Arguments passed on stack:
1824 // TOS + 0: return address. 1831 // TOS + 0: return address.
1825 // TOS + 1: instantiator type arguments or NULL. 1832 // TOS + 1: raw_null.
1826 // TOS + 2: instance. 1833 // TOS + 2: raw_null.
1827 // TOS + 3: cache array. 1834 // TOS + 3: instance.
1835 // TOS + 4: SubtypeTestCache.
1828 // Result in RCX: null -> not found, otherwise result (true or false). 1836 // Result in RCX: null -> not found, otherwise result (true or false).
1829 void StubCode::GenerateSubtype2TestCacheStub(Assembler* assembler) { 1837 void StubCode::GenerateSubtype2TestCacheStub(Assembler* assembler) {
1830 GenerateSubtypeNTestCacheStub(assembler, 2); 1838 GenerateSubtypeNTestCacheStub(assembler, 2);
1831 } 1839 }
1832 1840
1833 1841
1834 // Used to check class and type arguments. Arguments passed on stack: 1842 // Used to check class and type arguments. Arguments passed on stack:
1835 // TOS + 0: return address. 1843 // TOS + 0: return address.
1836 // TOS + 1: instantiator type arguments. 1844 // TOS + 1: function type arguments (can be raw_null).
1837 // TOS + 2: instance. 1845 // TOS + 2: instantiator type arguments (can be raw_null).
1838 // TOS + 3: cache array. 1846 // TOS + 3: instance.
1847 // TOS + 4: SubtypeTestCache.
1839 // Result in RCX: null -> not found, otherwise result (true or false). 1848 // Result in RCX: null -> not found, otherwise result (true or false).
1840 void StubCode::GenerateSubtype3TestCacheStub(Assembler* assembler) { 1849 void StubCode::GenerateSubtype4TestCacheStub(Assembler* assembler) {
1841 GenerateSubtypeNTestCacheStub(assembler, 3); 1850 GenerateSubtypeNTestCacheStub(assembler, 4);
1842 } 1851 }
1843 1852
1844 1853
1845 // Return the current stack pointer address, used to stack alignment 1854 // Return the current stack pointer address, used to stack alignment
1846 // checks. 1855 // checks.
1847 // TOS + 0: return address 1856 // TOS + 0: return address
1848 // Result in RAX. 1857 // Result in RAX.
1849 void StubCode::GenerateGetStackPointerStub(Assembler* assembler) { 1858 void StubCode::GenerateGetStackPointerStub(Assembler* assembler) {
1850 __ leaq(RAX, Address(RSP, kWordSize)); 1859 __ leaq(RAX, Address(RSP, kWordSize));
1851 __ ret(); 1860 __ ret();
(...skipping 433 matching lines...) Expand 10 before | Expand all | Expand 10 after
2285 } 2294 }
2286 2295
2287 2296
2288 void StubCode::GenerateAsynchronousGapMarkerStub(Assembler* assembler) { 2297 void StubCode::GenerateAsynchronousGapMarkerStub(Assembler* assembler) {
2289 __ int3(); 2298 __ int3();
2290 } 2299 }
2291 2300
2292 } // namespace dart 2301 } // namespace dart
2293 2302
2294 #endif // defined TARGET_ARCH_X64 2303 #endif // defined TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « runtime/vm/stub_code_mips.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698