OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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/code_generator.h" | 9 #include "vm/code_generator.h" |
10 #include "vm/compiler.h" | 10 #include "vm/compiler.h" |
(...skipping 26 matching lines...) Expand all Loading... |
37 const intptr_t isolate_offset = NativeArguments::isolate_offset(); | 37 const intptr_t isolate_offset = NativeArguments::isolate_offset(); |
38 const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset(); | 38 const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset(); |
39 const intptr_t argv_offset = NativeArguments::argv_offset(); | 39 const intptr_t argv_offset = NativeArguments::argv_offset(); |
40 const intptr_t retval_offset = NativeArguments::retval_offset(); | 40 const intptr_t retval_offset = NativeArguments::retval_offset(); |
41 const intptr_t exitframe_last_param_slot_from_fp = 1; | 41 const intptr_t exitframe_last_param_slot_from_fp = 1; |
42 | 42 |
43 __ SetPrologueOffset(); | 43 __ SetPrologueOffset(); |
44 __ Comment("CallToRuntimeStub"); | 44 __ Comment("CallToRuntimeStub"); |
45 __ EnterFrame(0); | 45 __ EnterFrame(0); |
46 | 46 |
47 // Load current Isolate pointer from Context structure into R0. | 47 __ LoadIsolate(R0, kNoPP); |
48 __ LoadFieldFromOffset(R0, CTX, Context::isolate_offset(), kNoPP); | |
49 | 48 |
50 // Save exit frame information to enable stack walking as we are about | 49 // Save exit frame information to enable stack walking as we are about |
51 // to transition to Dart VM C++ code. | 50 // to transition to Dart VM C++ code. |
52 __ StoreToOffset(SP, R0, Isolate::top_exit_frame_info_offset(), kNoPP); | 51 __ StoreToOffset(SP, R0, Isolate::top_exit_frame_info_offset(), kNoPP); |
53 | 52 |
54 // Save current Context pointer into Isolate structure. | 53 // Save current Context pointer into Isolate structure. |
55 __ StoreToOffset(CTX, R0, Isolate::top_context_offset(), kNoPP); | 54 __ StoreToOffset(CTX, R0, Isolate::top_context_offset(), kNoPP); |
56 | 55 |
57 // Cache Isolate pointer into CTX while executing runtime code. | 56 // Cache Isolate pointer into CTX while executing runtime code. |
58 __ mov(CTX, R0); | 57 __ mov(CTX, R0); |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
154 // R2 : address of first argument in argument array. | 153 // R2 : address of first argument in argument array. |
155 // R1 : argc_tag including number of arguments and function kind. | 154 // R1 : argc_tag including number of arguments and function kind. |
156 void StubCode::GenerateCallNativeCFunctionStub(Assembler* assembler) { | 155 void StubCode::GenerateCallNativeCFunctionStub(Assembler* assembler) { |
157 const intptr_t isolate_offset = NativeArguments::isolate_offset(); | 156 const intptr_t isolate_offset = NativeArguments::isolate_offset(); |
158 const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset(); | 157 const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset(); |
159 const intptr_t argv_offset = NativeArguments::argv_offset(); | 158 const intptr_t argv_offset = NativeArguments::argv_offset(); |
160 const intptr_t retval_offset = NativeArguments::retval_offset(); | 159 const intptr_t retval_offset = NativeArguments::retval_offset(); |
161 | 160 |
162 __ EnterFrame(0); | 161 __ EnterFrame(0); |
163 | 162 |
164 // Load current Isolate pointer from Context structure into R0. | 163 __ LoadIsolate(R0, kNoPP); |
165 __ LoadFieldFromOffset(R0, CTX, Context::isolate_offset(), kNoPP); | |
166 | 164 |
167 // Save exit frame information to enable stack walking as we are about | 165 // Save exit frame information to enable stack walking as we are about |
168 // to transition to native code. | 166 // to transition to native code. |
169 __ StoreToOffset(SP, R0, Isolate::top_exit_frame_info_offset(), kNoPP); | 167 __ StoreToOffset(SP, R0, Isolate::top_exit_frame_info_offset(), kNoPP); |
170 | 168 |
171 // Save current Context pointer into Isolate structure. | 169 // Save current Context pointer into Isolate structure. |
172 __ StoreToOffset(CTX, R0, Isolate::top_context_offset(), kNoPP); | 170 __ StoreToOffset(CTX, R0, Isolate::top_context_offset(), kNoPP); |
173 | 171 |
174 // Cache Isolate pointer into CTX while executing native code. | 172 // Cache Isolate pointer into CTX while executing native code. |
175 __ mov(CTX, R0); | 173 __ mov(CTX, R0); |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
271 // R2 : address of first argument in argument array. | 269 // R2 : address of first argument in argument array. |
272 // R1 : argc_tag including number of arguments and function kind. | 270 // R1 : argc_tag including number of arguments and function kind. |
273 void StubCode::GenerateCallBootstrapCFunctionStub(Assembler* assembler) { | 271 void StubCode::GenerateCallBootstrapCFunctionStub(Assembler* assembler) { |
274 const intptr_t isolate_offset = NativeArguments::isolate_offset(); | 272 const intptr_t isolate_offset = NativeArguments::isolate_offset(); |
275 const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset(); | 273 const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset(); |
276 const intptr_t argv_offset = NativeArguments::argv_offset(); | 274 const intptr_t argv_offset = NativeArguments::argv_offset(); |
277 const intptr_t retval_offset = NativeArguments::retval_offset(); | 275 const intptr_t retval_offset = NativeArguments::retval_offset(); |
278 | 276 |
279 __ EnterFrame(0); | 277 __ EnterFrame(0); |
280 | 278 |
281 // Load current Isolate pointer from Context structure into R0. | 279 __ LoadIsolate(R0, kNoPP); |
282 __ LoadFieldFromOffset(R0, CTX, Context::isolate_offset(), kNoPP); | |
283 | 280 |
284 // Save exit frame information to enable stack walking as we are about | 281 // Save exit frame information to enable stack walking as we are about |
285 // to transition to native code. | 282 // to transition to native code. |
286 __ StoreToOffset(SP, R0, Isolate::top_exit_frame_info_offset(), kNoPP); | 283 __ StoreToOffset(SP, R0, Isolate::top_exit_frame_info_offset(), kNoPP); |
287 | 284 |
288 // Save current Context pointer into Isolate structure. | 285 // Save current Context pointer into Isolate structure. |
289 __ StoreToOffset(CTX, R0, Isolate::top_context_offset(), kNoPP); | 286 __ StoreToOffset(CTX, R0, Isolate::top_context_offset(), kNoPP); |
290 | 287 |
291 // Cache Isolate pointer into CTX while executing native code. | 288 // Cache Isolate pointer into CTX while executing native code. |
292 __ mov(CTX, R0); | 289 __ mov(CTX, R0); |
(...skipping 754 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1047 __ LoadImmediate( | 1044 __ LoadImmediate( |
1048 TMP, RawObject::ClassIdTag::encode(cid), kNoPP); | 1045 TMP, RawObject::ClassIdTag::encode(cid), kNoPP); |
1049 __ orr(R2, R2, Operand(TMP)); | 1046 __ orr(R2, R2, Operand(TMP)); |
1050 __ StoreFieldToOffset(R2, R0, Context::tags_offset(), kNoPP); | 1047 __ StoreFieldToOffset(R2, R0, Context::tags_offset(), kNoPP); |
1051 | 1048 |
1052 // Setup up number of context variables field. | 1049 // Setup up number of context variables field. |
1053 // R0: new object. | 1050 // R0: new object. |
1054 // R1: number of context variables as integer value (not object). | 1051 // R1: number of context variables as integer value (not object). |
1055 __ StoreFieldToOffset(R1, R0, Context::num_variables_offset(), kNoPP); | 1052 __ StoreFieldToOffset(R1, R0, Context::num_variables_offset(), kNoPP); |
1056 | 1053 |
1057 // Setup isolate field. | |
1058 // Load Isolate pointer into R2. | |
1059 // R0: new object. | |
1060 // R1: number of context variables. | |
1061 __ LoadIsolate(R2, kNoPP); | |
1062 // R2: isolate, not an object. | |
1063 __ StoreFieldToOffset(R2, R0, Context::isolate_offset(), kNoPP); | |
1064 | |
1065 // Setup the parent field. | 1054 // Setup the parent field. |
1066 // R0: new object. | 1055 // R0: new object. |
1067 // R1: number of context variables. | 1056 // R1: number of context variables. |
1068 __ LoadObject(R2, Object::null_object(), PP); | 1057 __ LoadObject(R2, Object::null_object(), PP); |
1069 __ StoreFieldToOffset(R2, R0, Context::parent_offset(), kNoPP); | 1058 __ StoreFieldToOffset(R2, R0, Context::parent_offset(), kNoPP); |
1070 | 1059 |
1071 // Initialize the context variables. | 1060 // Initialize the context variables. |
1072 // R0: new object. | 1061 // R0: new object. |
1073 // R1: number of context variables. | 1062 // R1: number of context variables. |
1074 // R2: raw null. | 1063 // R2: raw null. |
(...skipping 754 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1829 __ Pop(R0); | 1818 __ Pop(R0); |
1830 __ LeaveStubFrame(); | 1819 __ LeaveStubFrame(); |
1831 __ br(R0); | 1820 __ br(R0); |
1832 } | 1821 } |
1833 | 1822 |
1834 // Called only from unoptimized code. All relevant registers have been saved. | 1823 // Called only from unoptimized code. All relevant registers have been saved. |
1835 void StubCode::GenerateDebugStepCheckStub( | 1824 void StubCode::GenerateDebugStepCheckStub( |
1836 Assembler* assembler) { | 1825 Assembler* assembler) { |
1837 // Check single stepping. | 1826 // Check single stepping. |
1838 Label stepping, done_stepping; | 1827 Label stepping, done_stepping; |
1839 __ LoadFieldFromOffset(R1, CTX, Context::isolate_offset(), kNoPP); | 1828 __ LoadIsolate(R1, kNoPP); |
1840 __ LoadFromOffset( | 1829 __ LoadFromOffset( |
1841 R1, R1, Isolate::single_step_offset(), kNoPP, kUnsignedByte); | 1830 R1, R1, Isolate::single_step_offset(), kNoPP, kUnsignedByte); |
1842 __ CompareImmediate(R1, 0, kNoPP); | 1831 __ CompareImmediate(R1, 0, kNoPP); |
1843 __ b(&stepping, NE); | 1832 __ b(&stepping, NE); |
1844 __ Bind(&done_stepping); | 1833 __ Bind(&done_stepping); |
1845 | 1834 |
1846 __ ret(); | 1835 __ ret(); |
1847 | 1836 |
1848 __ Bind(&stepping); | 1837 __ Bind(&stepping); |
1849 __ EnterStubFrame(); | 1838 __ EnterStubFrame(); |
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2081 | 2070 |
2082 // Called only from unoptimized code. All relevant registers have been saved. | 2071 // Called only from unoptimized code. All relevant registers have been saved. |
2083 // LR: return address. | 2072 // LR: return address. |
2084 // SP + 4: left operand. | 2073 // SP + 4: left operand. |
2085 // SP + 0: right operand. | 2074 // SP + 0: right operand. |
2086 // Return Zero condition flag set if equal. | 2075 // Return Zero condition flag set if equal. |
2087 void StubCode::GenerateUnoptimizedIdenticalWithNumberCheckStub( | 2076 void StubCode::GenerateUnoptimizedIdenticalWithNumberCheckStub( |
2088 Assembler* assembler) { | 2077 Assembler* assembler) { |
2089 // Check single stepping. | 2078 // Check single stepping. |
2090 Label stepping, done_stepping; | 2079 Label stepping, done_stepping; |
2091 __ LoadFieldFromOffset(R1, CTX, Context::isolate_offset(), kNoPP); | 2080 __ LoadIsolate(R1, kNoPP); |
2092 __ LoadFromOffset( | 2081 __ LoadFromOffset( |
2093 R1, R1, Isolate::single_step_offset(), kNoPP, kUnsignedByte); | 2082 R1, R1, Isolate::single_step_offset(), kNoPP, kUnsignedByte); |
2094 __ CompareImmediate(R1, 0, kNoPP); | 2083 __ CompareImmediate(R1, 0, kNoPP); |
2095 __ b(&stepping, NE); | 2084 __ b(&stepping, NE); |
2096 __ Bind(&done_stepping); | 2085 __ Bind(&done_stepping); |
2097 | 2086 |
2098 const Register left = R1; | 2087 const Register left = R1; |
2099 const Register right = R0; | 2088 const Register right = R0; |
2100 __ LoadFromOffset(left, SP, 1 * kWordSize, kNoPP); | 2089 __ LoadFromOffset(left, SP, 1 * kWordSize, kNoPP); |
2101 __ LoadFromOffset(right, SP, 0 * kWordSize, kNoPP); | 2090 __ LoadFromOffset(right, SP, 0 * kWordSize, kNoPP); |
(...skipping 20 matching lines...) Expand all Loading... |
2122 const Register right = R0; | 2111 const Register right = R0; |
2123 __ LoadFromOffset(left, SP, 1 * kWordSize, kNoPP); | 2112 __ LoadFromOffset(left, SP, 1 * kWordSize, kNoPP); |
2124 __ LoadFromOffset(right, SP, 0 * kWordSize, kNoPP); | 2113 __ LoadFromOffset(right, SP, 0 * kWordSize, kNoPP); |
2125 GenerateIdenticalWithNumberCheckStub(assembler, left, right, temp); | 2114 GenerateIdenticalWithNumberCheckStub(assembler, left, right, temp); |
2126 __ ret(); | 2115 __ ret(); |
2127 } | 2116 } |
2128 | 2117 |
2129 } // namespace dart | 2118 } // namespace dart |
2130 | 2119 |
2131 #endif // defined TARGET_ARCH_ARM64 | 2120 #endif // defined TARGET_ARCH_ARM64 |
OLD | NEW |