| 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 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 86 | 86 |
| 87 // There are no runtime calls to closures, so we do not need to set the tag | 87 // There are no runtime calls to closures, so we do not need to set the tag |
| 88 // bits kClosureFunctionBit and kInstanceFunctionBit in argc_tag_. | 88 // bits kClosureFunctionBit and kInstanceFunctionBit in argc_tag_. |
| 89 ASSERT(argc_tag_offset == 1 * kWordSize); | 89 ASSERT(argc_tag_offset == 1 * kWordSize); |
| 90 __ mov(R1, R4); // Set argc in NativeArguments. | 90 __ mov(R1, R4); // Set argc in NativeArguments. |
| 91 | 91 |
| 92 ASSERT(argv_offset == 2 * kWordSize); | 92 ASSERT(argv_offset == 2 * kWordSize); |
| 93 __ add(R2, ZR, Operand(R4, LSL, 3)); | 93 __ add(R2, ZR, Operand(R4, LSL, 3)); |
| 94 __ add(R2, FP, Operand(R2)); // Compute argv. | 94 __ add(R2, FP, Operand(R2)); // Compute argv. |
| 95 // Set argv in NativeArguments. | 95 // Set argv in NativeArguments. |
| 96 __ AddImmediate(R2, R2, exitframe_last_param_slot_from_fp * kWordSize, | 96 __ AddImmediate(R2, R2, exitframe_last_param_slot_from_fp * kWordSize, kNoPP); |
| 97 kNoPP); | |
| 98 | 97 |
| 99 ASSERT(retval_offset == 3 * kWordSize); | 98 ASSERT(retval_offset == 3 * kWordSize); |
| 100 __ AddImmediate(R3, R2, kWordSize, kNoPP); | 99 __ AddImmediate(R3, R2, kWordSize, kNoPP); |
| 101 | 100 |
| 102 __ StoreToOffset(R0, SP, isolate_offset, kNoPP); | 101 __ StoreToOffset(R0, SP, isolate_offset, kNoPP); |
| 103 __ StoreToOffset(R1, SP, argc_tag_offset, kNoPP); | 102 __ StoreToOffset(R1, SP, argc_tag_offset, kNoPP); |
| 104 __ StoreToOffset(R2, SP, argv_offset, kNoPP); | 103 __ StoreToOffset(R2, SP, argv_offset, kNoPP); |
| 105 __ StoreToOffset(R3, SP, retval_offset, kNoPP); | 104 __ StoreToOffset(R3, SP, retval_offset, kNoPP); |
| 106 __ mov(R0, SP); // Pass the pointer to the NativeArguments. | 105 __ mov(R0, SP); // Pass the pointer to the NativeArguments. |
| 107 | 106 |
| (...skipping 668 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 776 // R0 : entrypoint of the Dart function to call. | 775 // R0 : entrypoint of the Dart function to call. |
| 777 // R1 : arguments descriptor array. | 776 // R1 : arguments descriptor array. |
| 778 // R2 : arguments array. | 777 // R2 : arguments array. |
| 779 // R3 : new context containing the current isolate pointer. | 778 // R3 : new context containing the current isolate pointer. |
| 780 void StubCode::GenerateInvokeDartCodeStub(Assembler* assembler) { | 779 void StubCode::GenerateInvokeDartCodeStub(Assembler* assembler) { |
| 781 __ Comment("InvokeDartCodeStub"); | 780 __ Comment("InvokeDartCodeStub"); |
| 782 // The new context, saved vm tag, the top exit frame, and the old context. | 781 // The new context, saved vm tag, the top exit frame, and the old context. |
| 783 const intptr_t kNewContextOffsetFromFp = | 782 const intptr_t kNewContextOffsetFromFp = |
| 784 -(1 + kAbiPreservedCpuRegCount + kAbiPreservedFpuRegCount) * kWordSize; | 783 -(1 + kAbiPreservedCpuRegCount + kAbiPreservedFpuRegCount) * kWordSize; |
| 785 | 784 |
| 786 // Amount of space to reserve with the system stack pointer before setting it | |
| 787 // to the stack limit. | |
| 788 const intptr_t kRegSaveSpace = Utils::RoundUp(-kNewContextOffsetFromFp, 16); | |
| 789 | |
| 790 // Copy the C stack pointer (R31) into the stack pointer we'll actually use | 785 // Copy the C stack pointer (R31) into the stack pointer we'll actually use |
| 791 // to access the stack. | 786 // to access the stack, and put the C stack pointer at the stack limit. |
| 792 __ SetupDartSP(kRegSaveSpace); | 787 __ SetupDartSP(Isolate::GetSpecifiedStackSize()); |
| 793 __ EnterFrame(0); | 788 __ EnterFrame(0); |
| 794 | 789 |
| 795 // Save the callee-saved registers. | 790 // Save the callee-saved registers. |
| 796 for (int i = kAbiFirstPreservedCpuReg; i <= kAbiLastPreservedCpuReg; i++) { | 791 for (int i = kAbiFirstPreservedCpuReg; i <= kAbiLastPreservedCpuReg; i++) { |
| 797 const Register r = static_cast<Register>(i); | 792 const Register r = static_cast<Register>(i); |
| 798 // We use str instead of the Push macro because we will be pushing the PP | 793 // We use str instead of the Push macro because we will be pushing the PP |
| 799 // register when it is not holding a pool-pointer since we are coming from | 794 // register when it is not holding a pool-pointer since we are coming from |
| 800 // C++ code. | 795 // C++ code. |
| 801 __ str(r, Address(SP, -1 * kWordSize, Address::PreIndex)); | 796 __ str(r, Address(SP, -1 * kWordSize, Address::PreIndex)); |
| 802 } | 797 } |
| 803 | 798 |
| 804 // Save the bottom 64-bits of callee-saved V registers. | 799 // Save the bottom 64-bits of callee-saved V registers. |
| 805 for (int i = kAbiFirstPreservedFpuReg; i <= kAbiLastPreservedFpuReg; i++) { | 800 for (int i = kAbiFirstPreservedFpuReg; i <= kAbiLastPreservedFpuReg; i++) { |
| 806 const VRegister r = static_cast<VRegister>(i); | 801 const VRegister r = static_cast<VRegister>(i); |
| 807 __ PushDouble(r); | 802 __ PushDouble(r); |
| 808 } | 803 } |
| 809 | 804 |
| 810 // Push new context. | 805 // Push new context. |
| 811 __ Push(R3); | 806 __ Push(R3); |
| 807 #if defined(DEBUG) |
| 808 { |
| 809 Label ok; |
| 810 __ AddImmediate(R4, FP, kNewContextOffsetFromFp, kNoPP); |
| 811 __ CompareRegisters(R4, SP); |
| 812 __ b(&ok, EQ); |
| 813 __ Stop("kNewContextOffsetFromFp mismatch"); |
| 814 __ Bind(&ok); |
| 815 } |
| 816 #endif |
| 812 | 817 |
| 813 // We now load the pool pointer(PP) as we are about to invoke dart code and we | 818 // We now load the pool pointer(PP) as we are about to invoke dart code and we |
| 814 // could potentially invoke some intrinsic functions which need the PP to be | 819 // could potentially invoke some intrinsic functions which need the PP to be |
| 815 // set up. | 820 // set up. |
| 816 __ LoadPoolPointer(PP); | 821 __ LoadPoolPointer(PP); |
| 817 | 822 |
| 818 // The new Context structure contains a pointer to the current Isolate | 823 // The new Context structure contains a pointer to the current Isolate |
| 819 // structure. Cache the Context pointer in the CTX register so that it is | 824 // structure. Cache the Context pointer in the CTX register so that it is |
| 820 // available in generated code and calls to Isolate::Current() need not be | 825 // available in generated code and calls to Isolate::Current() need not be |
| 821 // done. The assumption is that this register will never be clobbered by | 826 // done. The assumption is that this register will never be clobbered by |
| 822 // compiled or runtime stub code. | 827 // compiled or runtime stub code. |
| 823 | 828 |
| 824 // Cache the new Context pointer into CTX while executing Dart code. | 829 // Cache the new Context pointer into CTX while executing Dart code. |
| 825 __ LoadFromOffset(CTX, R3, VMHandles::kOffsetOfRawPtrInHandle, PP); | 830 __ LoadFromOffset(CTX, R3, VMHandles::kOffsetOfRawPtrInHandle, PP); |
| 826 | 831 |
| 827 // Load Isolate pointer into temporary register R5. | 832 // Load Isolate pointer into temporary register R5. |
| 828 __ LoadImmediate(R5, Isolate::CurrentAddress(), PP); | 833 __ LoadImmediate(R5, Isolate::CurrentAddress(), PP); |
| 829 | 834 |
| 830 // Load the stack limit address into the C stack pointer register. | |
| 831 __ LoadFromOffset(CSP, R5, Isolate::stack_limit_offset(), PP); | |
| 832 | |
| 833 // Cache the new Context pointer into CTX while executing Dart code. | 835 // Cache the new Context pointer into CTX while executing Dart code. |
| 834 __ LoadFromOffset(CTX, R3, VMHandles::kOffsetOfRawPtrInHandle, PP); | 836 __ LoadFromOffset(CTX, R3, VMHandles::kOffsetOfRawPtrInHandle, PP); |
| 835 | 837 |
| 836 // Save the current VMTag on the stack. | 838 // Save the current VMTag on the stack. |
| 837 ASSERT(kSavedVMTagSlotFromEntryFp == -20); | 839 ASSERT(kSavedVMTagSlotFromEntryFp == -20); |
| 838 __ LoadFromOffset(R4, R5, Isolate::vm_tag_offset(), PP); | 840 __ LoadFromOffset(R4, R5, Isolate::vm_tag_offset(), PP); |
| 839 __ Push(R4); | 841 __ Push(R4); |
| 840 | 842 |
| 841 // Mark that the isolate is executing Dart code. | 843 // Mark that the isolate is executing Dart code. |
| 842 __ LoadImmediate(R6, VMTag::kDartTagId, PP); | 844 __ LoadImmediate(R6, VMTag::kDartTagId, PP); |
| (...skipping 1238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2081 const Register right = R0; | 2083 const Register right = R0; |
| 2082 __ LoadFromOffset(left, SP, 1 * kWordSize, kNoPP); | 2084 __ LoadFromOffset(left, SP, 1 * kWordSize, kNoPP); |
| 2083 __ LoadFromOffset(right, SP, 0 * kWordSize, kNoPP); | 2085 __ LoadFromOffset(right, SP, 0 * kWordSize, kNoPP); |
| 2084 GenerateIdenticalWithNumberCheckStub(assembler, left, right, temp); | 2086 GenerateIdenticalWithNumberCheckStub(assembler, left, right, temp); |
| 2085 __ ret(); | 2087 __ ret(); |
| 2086 } | 2088 } |
| 2087 | 2089 |
| 2088 } // namespace dart | 2090 } // namespace dart |
| 2089 | 2091 |
| 2090 #endif // defined TARGET_ARCH_ARM64 | 2092 #endif // defined TARGET_ARCH_ARM64 |
| OLD | NEW |