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

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

Issue 668193002: Remove isolate pointer from context objects. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 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 | Annotate | Revision Log
« no previous file with comments | « runtime/vm/stub_code.cc ('k') | runtime/vm/stub_code_arm64.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_ARM) 6 #if defined(TARGET_ARCH_ARM)
7 7
8 #include "vm/assembler.h" 8 #include "vm/assembler.h"
9 #include "vm/code_generator.h" 9 #include "vm/code_generator.h"
10 #include "vm/cpu.h" 10 #include "vm/cpu.h"
(...skipping 27 matching lines...) Expand all
38 const intptr_t isolate_offset = NativeArguments::isolate_offset(); 38 const intptr_t isolate_offset = NativeArguments::isolate_offset();
39 const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset(); 39 const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset();
40 const intptr_t argv_offset = NativeArguments::argv_offset(); 40 const intptr_t argv_offset = NativeArguments::argv_offset();
41 const intptr_t retval_offset = NativeArguments::retval_offset(); 41 const intptr_t retval_offset = NativeArguments::retval_offset();
42 const intptr_t exitframe_last_param_slot_from_fp = 2; 42 const intptr_t exitframe_last_param_slot_from_fp = 2;
43 43
44 __ mov(IP, Operand(0)); 44 __ mov(IP, Operand(0));
45 __ Push(IP); // Push 0 for the PC marker. 45 __ Push(IP); // Push 0 for the PC marker.
46 __ EnterFrame((1 << FP) | (1 << LR), 0); 46 __ EnterFrame((1 << FP) | (1 << LR), 0);
47 47
48 // Load current Isolate pointer from Context structure into R0. 48 __ LoadIsolate(R0);
49 __ ldr(R0, FieldAddress(CTX, Context::isolate_offset()));
50 49
51 // Save exit frame information to enable stack walking as we are about 50 // Save exit frame information to enable stack walking as we are about
52 // to transition to Dart VM C++ code. 51 // to transition to Dart VM C++ code.
53 __ StoreToOffset(kWord, SP, R0, Isolate::top_exit_frame_info_offset()); 52 __ StoreToOffset(kWord, SP, R0, Isolate::top_exit_frame_info_offset());
54 53
55 // Save current Context pointer into Isolate structure. 54 // Save current Context pointer into Isolate structure.
56 __ StoreToOffset(kWord, CTX, R0, Isolate::top_context_offset()); 55 __ StoreToOffset(kWord, CTX, R0, Isolate::top_context_offset());
57 56
58 // Cache Isolate pointer into CTX while executing runtime code. 57 // Cache Isolate pointer into CTX while executing runtime code.
59 __ mov(CTX, Operand(R0)); 58 __ mov(CTX, Operand(R0));
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
152 void StubCode::GenerateCallNativeCFunctionStub(Assembler* assembler) { 151 void StubCode::GenerateCallNativeCFunctionStub(Assembler* assembler) {
153 const intptr_t isolate_offset = NativeArguments::isolate_offset(); 152 const intptr_t isolate_offset = NativeArguments::isolate_offset();
154 const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset(); 153 const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset();
155 const intptr_t argv_offset = NativeArguments::argv_offset(); 154 const intptr_t argv_offset = NativeArguments::argv_offset();
156 const intptr_t retval_offset = NativeArguments::retval_offset(); 155 const intptr_t retval_offset = NativeArguments::retval_offset();
157 156
158 __ mov(IP, Operand(0)); 157 __ mov(IP, Operand(0));
159 __ Push(IP); // Push 0 for the PC marker. 158 __ Push(IP); // Push 0 for the PC marker.
160 __ EnterFrame((1 << FP) | (1 << LR), 0); 159 __ EnterFrame((1 << FP) | (1 << LR), 0);
161 160
162 // Load current Isolate pointer from Context structure into R0. 161 __ LoadIsolate(R0);
163 __ ldr(R0, FieldAddress(CTX, Context::isolate_offset()));
164 162
165 // Save exit frame information to enable stack walking as we are about 163 // Save exit frame information to enable stack walking as we are about
166 // to transition to native code. 164 // to transition to native code.
167 __ StoreToOffset(kWord, SP, R0, Isolate::top_exit_frame_info_offset()); 165 __ StoreToOffset(kWord, SP, R0, Isolate::top_exit_frame_info_offset());
168 166
169 // Save current Context pointer into Isolate structure. 167 // Save current Context pointer into Isolate structure.
170 __ StoreToOffset(kWord, CTX, R0, Isolate::top_context_offset()); 168 __ StoreToOffset(kWord, CTX, R0, Isolate::top_context_offset());
171 169
172 // Cache Isolate pointer into CTX while executing native code. 170 // Cache Isolate pointer into CTX while executing native code.
173 __ mov(CTX, Operand(R0)); 171 __ mov(CTX, Operand(R0));
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
260 void StubCode::GenerateCallBootstrapCFunctionStub(Assembler* assembler) { 258 void StubCode::GenerateCallBootstrapCFunctionStub(Assembler* assembler) {
261 const intptr_t isolate_offset = NativeArguments::isolate_offset(); 259 const intptr_t isolate_offset = NativeArguments::isolate_offset();
262 const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset(); 260 const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset();
263 const intptr_t argv_offset = NativeArguments::argv_offset(); 261 const intptr_t argv_offset = NativeArguments::argv_offset();
264 const intptr_t retval_offset = NativeArguments::retval_offset(); 262 const intptr_t retval_offset = NativeArguments::retval_offset();
265 263
266 __ mov(IP, Operand(0)); 264 __ mov(IP, Operand(0));
267 __ Push(IP); // Push 0 for the PC marker. 265 __ Push(IP); // Push 0 for the PC marker.
268 __ EnterFrame((1 << FP) | (1 << LR), 0); 266 __ EnterFrame((1 << FP) | (1 << LR), 0);
269 267
270 // Load current Isolate pointer from Context structure into R0. 268 __ LoadIsolate(R0);
271 __ ldr(R0, FieldAddress(CTX, Context::isolate_offset()));
272 269
273 // Save exit frame information to enable stack walking as we are about 270 // Save exit frame information to enable stack walking as we are about
274 // to transition to native code. 271 // to transition to native code.
275 __ StoreToOffset(kWord, SP, R0, Isolate::top_exit_frame_info_offset()); 272 __ StoreToOffset(kWord, SP, R0, Isolate::top_exit_frame_info_offset());
276 273
277 // Save current Context pointer into Isolate structure. 274 // Save current Context pointer into Isolate structure.
278 __ StoreToOffset(kWord, CTX, R0, Isolate::top_context_offset()); 275 __ StoreToOffset(kWord, CTX, R0, Isolate::top_context_offset());
279 276
280 // Cache Isolate pointer into CTX while executing native code. 277 // Cache Isolate pointer into CTX while executing native code.
281 __ mov(CTX, Operand(R0)); 278 __ mov(CTX, Operand(R0));
(...skipping 526 matching lines...) Expand 10 before | Expand all | Expand 10 after
808 805
809 // The new Context structure contains a pointer to the current Isolate 806 // The new Context structure contains a pointer to the current Isolate
810 // structure. Cache the Context pointer in the CTX register so that it is 807 // structure. Cache the Context pointer in the CTX register so that it is
811 // available in generated code and calls to Isolate::Current() need not be 808 // available in generated code and calls to Isolate::Current() need not be
812 // done. The assumption is that this register will never be clobbered by 809 // done. The assumption is that this register will never be clobbered by
813 // compiled or runtime stub code. 810 // compiled or runtime stub code.
814 811
815 // Cache the new Context pointer into CTX while executing Dart code. 812 // Cache the new Context pointer into CTX while executing Dart code.
816 __ ldr(CTX, Address(R3, VMHandles::kOffsetOfRawPtrInHandle)); 813 __ ldr(CTX, Address(R3, VMHandles::kOffsetOfRawPtrInHandle));
817 814
818 // Load Isolate pointer into temporary register R8.
819 __ LoadIsolate(R8); 815 __ LoadIsolate(R8);
820 816
821 // Save the current VMTag on the stack. 817 // Save the current VMTag on the stack.
822 ASSERT(kSavedVMTagSlotFromEntryFp == -25); 818 ASSERT(kSavedVMTagSlotFromEntryFp == -25);
823 __ LoadFromOffset(kWord, R5, R8, Isolate::vm_tag_offset()); 819 __ LoadFromOffset(kWord, R5, R8, Isolate::vm_tag_offset());
824 __ Push(R5); 820 __ Push(R5);
825 821
826 // Mark that the isolate is executing Dart code. 822 // Mark that the isolate is executing Dart code.
827 __ LoadImmediate(R5, VMTag::kDartTagId); 823 __ LoadImmediate(R5, VMTag::kDartTagId);
828 __ StoreToOffset(kWord, R5, R8, Isolate::vm_tag_offset()); 824 __ StoreToOffset(kWord, R5, R8, Isolate::vm_tag_offset());
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
981 __ orr(R3, R3, Operand(IP)); 977 __ orr(R3, R3, Operand(IP));
982 __ str(R3, FieldAddress(R0, Context::tags_offset())); 978 __ str(R3, FieldAddress(R0, Context::tags_offset()));
983 979
984 // Setup up number of context variables field. 980 // Setup up number of context variables field.
985 // R0: new object. 981 // R0: new object.
986 // R1: number of context variables as integer value (not object). 982 // R1: number of context variables as integer value (not object).
987 // R2: object size. 983 // R2: object size.
988 // R4: allocation stats address. 984 // R4: allocation stats address.
989 __ str(R1, FieldAddress(R0, Context::num_variables_offset())); 985 __ str(R1, FieldAddress(R0, Context::num_variables_offset()));
990 986
991 // Setup isolate field.
992 // Load Isolate pointer into R3.
993 // R0: new object.
994 // R1: number of context variables.
995 // R2: object size.
996 // R4: allocation stats address.
997 __ LoadIsolate(R3);
998 // R3: isolate, not an object.
999 __ str(R3, FieldAddress(R0, Context::isolate_offset()));
1000
1001 // Setup the parent field. 987 // Setup the parent field.
1002 // R0: new object. 988 // R0: new object.
1003 // R1: number of context variables. 989 // R1: number of context variables.
1004 // R2: object size. 990 // R2: object size.
1005 // R4: allocation stats address. 991 // R4: allocation stats address.
1006 __ LoadImmediate(R3, reinterpret_cast<intptr_t>(Object::null())); 992 __ LoadImmediate(R3, reinterpret_cast<intptr_t>(Object::null()));
1007 __ str(R3, FieldAddress(R0, Context::parent_offset())); 993 __ str(R3, FieldAddress(R0, Context::parent_offset()));
1008 994
1009 // Initialize the context variables. 995 // Initialize the context variables.
1010 // R0: new object. 996 // R0: new object.
(...skipping 743 matching lines...) Expand 10 before | Expand all | Expand 10 after
1754 __ LeaveStubFrame(); 1740 __ LeaveStubFrame();
1755 __ bx(R0); 1741 __ bx(R0);
1756 } 1742 }
1757 1743
1758 1744
1759 // Called only from unoptimized code. All relevant registers have been saved. 1745 // Called only from unoptimized code. All relevant registers have been saved.
1760 void StubCode::GenerateDebugStepCheckStub( 1746 void StubCode::GenerateDebugStepCheckStub(
1761 Assembler* assembler) { 1747 Assembler* assembler) {
1762 // Check single stepping. 1748 // Check single stepping.
1763 Label stepping, done_stepping; 1749 Label stepping, done_stepping;
1764 __ ldr(R1, FieldAddress(CTX, Context::isolate_offset())); 1750 __ LoadIsolate(R1);
1765 __ ldrb(R1, Address(R1, Isolate::single_step_offset())); 1751 __ ldrb(R1, Address(R1, Isolate::single_step_offset()));
1766 __ CompareImmediate(R1, 0); 1752 __ CompareImmediate(R1, 0);
1767 __ b(&stepping, NE); 1753 __ b(&stepping, NE);
1768 __ Bind(&done_stepping); 1754 __ Bind(&done_stepping);
1769 __ Ret(); 1755 __ Ret();
1770 1756
1771 __ Bind(&stepping); 1757 __ Bind(&stepping);
1772 __ EnterStubFrame(); 1758 __ EnterStubFrame();
1773 __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0); 1759 __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
1774 __ LeaveStubFrame(); 1760 __ LeaveStubFrame();
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
2014 2000
2015 // Called only from unoptimized code. All relevant registers have been saved. 2001 // Called only from unoptimized code. All relevant registers have been saved.
2016 // LR: return address. 2002 // LR: return address.
2017 // SP + 4: left operand. 2003 // SP + 4: left operand.
2018 // SP + 0: right operand. 2004 // SP + 0: right operand.
2019 // Return Zero condition flag set if equal. 2005 // Return Zero condition flag set if equal.
2020 void StubCode::GenerateUnoptimizedIdenticalWithNumberCheckStub( 2006 void StubCode::GenerateUnoptimizedIdenticalWithNumberCheckStub(
2021 Assembler* assembler) { 2007 Assembler* assembler) {
2022 // Check single stepping. 2008 // Check single stepping.
2023 Label stepping, done_stepping; 2009 Label stepping, done_stepping;
2024 __ ldr(R1, FieldAddress(CTX, Context::isolate_offset())); 2010 __ LoadIsolate(R1);
2025 __ ldrb(R1, Address(R1, Isolate::single_step_offset())); 2011 __ ldrb(R1, Address(R1, Isolate::single_step_offset()));
2026 __ CompareImmediate(R1, 0); 2012 __ CompareImmediate(R1, 0);
2027 __ b(&stepping, NE); 2013 __ b(&stepping, NE);
2028 __ Bind(&done_stepping); 2014 __ Bind(&done_stepping);
2029 2015
2030 const Register temp = R2; 2016 const Register temp = R2;
2031 const Register left = R1; 2017 const Register left = R1;
2032 const Register right = R0; 2018 const Register right = R0;
2033 __ ldr(left, Address(SP, 1 * kWordSize)); 2019 __ ldr(left, Address(SP, 1 * kWordSize));
2034 __ ldr(right, Address(SP, 0 * kWordSize)); 2020 __ ldr(right, Address(SP, 0 * kWordSize));
(...skipping 20 matching lines...) Expand all
2055 const Register right = R0; 2041 const Register right = R0;
2056 __ ldr(left, Address(SP, 1 * kWordSize)); 2042 __ ldr(left, Address(SP, 1 * kWordSize));
2057 __ ldr(right, Address(SP, 0 * kWordSize)); 2043 __ ldr(right, Address(SP, 0 * kWordSize));
2058 GenerateIdenticalWithNumberCheckStub(assembler, left, right, temp); 2044 GenerateIdenticalWithNumberCheckStub(assembler, left, right, temp);
2059 __ Ret(); 2045 __ Ret();
2060 } 2046 }
2061 2047
2062 } // namespace dart 2048 } // namespace dart
2063 2049
2064 #endif // defined TARGET_ARCH_ARM 2050 #endif // defined TARGET_ARCH_ARM
OLDNEW
« no previous file with comments | « runtime/vm/stub_code.cc ('k') | runtime/vm/stub_code_arm64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698