| 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_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 313 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 324 } | 324 } |
| 325 | 325 |
| 326 | 326 |
| 327 // Input parameters: | 327 // Input parameters: |
| 328 // R10: smi-tagged argument count, may be zero. | 328 // R10: smi-tagged argument count, may be zero. |
| 329 // RBP[kParamEndSlotFromFp + 1]: last argument. | 329 // RBP[kParamEndSlotFromFp + 1]: last argument. |
| 330 static void PushArgumentsArray(Assembler* assembler) { | 330 static void PushArgumentsArray(Assembler* assembler) { |
| 331 __ LoadObject(R12, Object::null_object()); | 331 __ LoadObject(R12, Object::null_object()); |
| 332 // Allocate array to store arguments of caller. | 332 // Allocate array to store arguments of caller. |
| 333 __ movq(RBX, R12); // Null element type for raw Array. | 333 __ movq(RBX, R12); // Null element type for raw Array. |
| 334 const ExternalLabel array_label(StubCode::AllocateArrayEntryPoint()); | 334 __ Call(*StubCode::AllocateArray_entry()); |
| 335 __ call(&array_label); | |
| 336 __ SmiUntag(R10); | 335 __ SmiUntag(R10); |
| 337 // RAX: newly allocated array. | 336 // RAX: newly allocated array. |
| 338 // R10: length of the array (was preserved by the stub). | 337 // R10: length of the array (was preserved by the stub). |
| 339 __ pushq(RAX); // Array is in RAX and on top of stack. | 338 __ pushq(RAX); // Array is in RAX and on top of stack. |
| 340 __ leaq(R12, Address(RBP, R10, TIMES_8, kParamEndSlotFromFp * kWordSize)); | 339 __ leaq(R12, Address(RBP, R10, TIMES_8, kParamEndSlotFromFp * kWordSize)); |
| 341 __ leaq(RBX, FieldAddress(RAX, Array::data_offset())); | 340 __ leaq(RBX, FieldAddress(RAX, Array::data_offset())); |
| 342 // R12: address of first argument on stack. | 341 // R12: address of first argument on stack. |
| 343 // RBX: address of first argument in array. | 342 // RBX: address of first argument in array. |
| 344 Label loop, loop_condition; | 343 Label loop, loop_condition; |
| 345 #if defined(DEBUG) | 344 #if defined(DEBUG) |
| (...skipping 817 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1163 } | 1162 } |
| 1164 __ CallRuntime(kAllocateObjectRuntimeEntry, 2); // Allocate object. | 1163 __ CallRuntime(kAllocateObjectRuntimeEntry, 2); // Allocate object. |
| 1165 __ popq(RAX); // Pop argument (type arguments of object). | 1164 __ popq(RAX); // Pop argument (type arguments of object). |
| 1166 __ popq(RAX); // Pop argument (class of object). | 1165 __ popq(RAX); // Pop argument (class of object). |
| 1167 __ popq(RAX); // Pop result (newly allocated object). | 1166 __ popq(RAX); // Pop result (newly allocated object). |
| 1168 // RAX: new object | 1167 // RAX: new object |
| 1169 // Restore the frame pointer. | 1168 // Restore the frame pointer. |
| 1170 __ LeaveStubFrame(); | 1169 __ LeaveStubFrame(); |
| 1171 __ ret(); | 1170 __ ret(); |
| 1172 *patch_code_pc_offset = assembler->CodeSize(); | 1171 *patch_code_pc_offset = assembler->CodeSize(); |
| 1173 __ JmpPatchable(&StubCode::FixAllocationStubTargetLabel(), new_pp); | 1172 __ JmpPatchable(*StubCode::FixAllocationStubTarget_entry(), new_pp); |
| 1174 } | 1173 } |
| 1175 | 1174 |
| 1176 | 1175 |
| 1177 // Called for invoking "dynamic noSuchMethod(Invocation invocation)" function | 1176 // Called for invoking "dynamic noSuchMethod(Invocation invocation)" function |
| 1178 // from the entry code of a dart function after an error in passed argument | 1177 // from the entry code of a dart function after an error in passed argument |
| 1179 // name or number is detected. | 1178 // name or number is detected. |
| 1180 // Input parameters: | 1179 // Input parameters: |
| 1181 // RSP : points to return address. | 1180 // RSP : points to return address. |
| 1182 // RSP + 8 : address of last argument. | 1181 // RSP + 8 : address of last argument. |
| 1183 // R10 : arguments descriptor array. | 1182 // R10 : arguments descriptor array. |
| (...skipping 965 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2149 // Result: | 2148 // Result: |
| 2150 // RCX: entry point. | 2149 // RCX: entry point. |
| 2151 void StubCode::GenerateMegamorphicLookupStub(Assembler* assembler) { | 2150 void StubCode::GenerateMegamorphicLookupStub(Assembler* assembler) { |
| 2152 EmitMegamorphicLookup(assembler, RDI, RBX, RCX); | 2151 EmitMegamorphicLookup(assembler, RDI, RBX, RCX); |
| 2153 __ ret(); | 2152 __ ret(); |
| 2154 } | 2153 } |
| 2155 | 2154 |
| 2156 } // namespace dart | 2155 } // namespace dart |
| 2157 | 2156 |
| 2158 #endif // defined TARGET_ARCH_X64 | 2157 #endif // defined TARGET_ARCH_X64 |
| OLD | NEW |