| 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 | 
|---|