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

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

Issue 1156593002: Cache current thread in a reserved register and use it in LoadIsolate (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Added more comments. Created 5 years, 7 months 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
OLDNEW
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 752 matching lines...) Expand 10 before | Expand all | Expand 10 after
763 __ BranchPatchable(&stub_code->FixAllocateArrayStubTargetLabel()); 763 __ BranchPatchable(&stub_code->FixAllocateArrayStubTargetLabel());
764 } 764 }
765 765
766 766
767 // Called when invoking Dart code from C++ (VM code). 767 // Called when invoking Dart code from C++ (VM code).
768 // Input parameters: 768 // Input parameters:
769 // LR : points to return address. 769 // LR : points to return address.
770 // R0 : entrypoint of the Dart function to call. 770 // R0 : entrypoint of the Dart function to call.
771 // R1 : arguments descriptor array. 771 // R1 : arguments descriptor array.
772 // R2 : arguments array. 772 // R2 : arguments array.
773 // R3 : new context containing the current isolate pointer. 773 // R3 : current thread.
774 void StubCode::GenerateInvokeDartCodeStub(Assembler* assembler) { 774 void StubCode::GenerateInvokeDartCodeStub(Assembler* assembler) {
775 __ Comment("InvokeDartCodeStub"); 775 __ Comment("InvokeDartCodeStub");
776 776
777 // Copy the C stack pointer (R31) into the stack pointer we'll actually use 777 // Copy the C stack pointer (R31) into the stack pointer we'll actually use
778 // to access the stack, and put the C stack pointer at the stack limit. 778 // to access the stack, and put the C stack pointer at the stack limit.
779 __ SetupDartSP(Isolate::GetSpecifiedStackSize()); 779 __ SetupDartSP(Isolate::GetSpecifiedStackSize());
780 __ EnterFrame(0); 780 __ EnterFrame(0);
781 781
782 // Save the callee-saved registers. 782 // Save the callee-saved registers.
783 for (int i = kAbiFirstPreservedCpuReg; i <= kAbiLastPreservedCpuReg; i++) { 783 for (int i = kAbiFirstPreservedCpuReg; i <= kAbiLastPreservedCpuReg; i++) {
784 const Register r = static_cast<Register>(i); 784 const Register r = static_cast<Register>(i);
785 // We use str instead of the Push macro because we will be pushing the PP 785 // We use str instead of the Push macro because we will be pushing the PP
786 // register when it is not holding a pool-pointer since we are coming from 786 // register when it is not holding a pool-pointer since we are coming from
787 // C++ code. 787 // C++ code.
788 __ str(r, Address(SP, -1 * kWordSize, Address::PreIndex)); 788 __ str(r, Address(SP, -1 * kWordSize, Address::PreIndex));
789 } 789 }
790 790
791 // Save the bottom 64-bits of callee-saved V registers. 791 // Save the bottom 64-bits of callee-saved V registers.
792 for (int i = kAbiFirstPreservedFpuReg; i <= kAbiLastPreservedFpuReg; i++) { 792 for (int i = kAbiFirstPreservedFpuReg; i <= kAbiLastPreservedFpuReg; i++) {
793 const VRegister r = static_cast<VRegister>(i); 793 const VRegister r = static_cast<VRegister>(i);
794 __ PushDouble(r); 794 __ PushDouble(r);
795 } 795 }
796 796
797 // We now load the pool pointer(PP) as we are about to invoke dart code and we 797 // We now load the pool pointer(PP) as we are about to invoke dart code and we
798 // could potentially invoke some intrinsic functions which need the PP to be 798 // could potentially invoke some intrinsic functions which need the PP to be
799 // set up. 799 // set up.
800 __ LoadPoolPointer(PP); 800 __ LoadPoolPointer(PP);
801 801
802 // Set up THR, which caches the current thread in Dart code.
803 if (THR != R3) {
804 __ mov(THR, R3);
805 }
802 // Load Isolate pointer into temporary register R5. 806 // Load Isolate pointer into temporary register R5.
803 __ LoadIsolate(R5, PP); 807 __ LoadIsolate(R5, PP);
804 808
805 // Save the current VMTag on the stack. 809 // Save the current VMTag on the stack.
806 __ LoadFromOffset(R4, R5, Isolate::vm_tag_offset(), PP); 810 __ LoadFromOffset(R4, R5, Isolate::vm_tag_offset(), PP);
807 __ Push(R4); 811 __ Push(R4);
808 812
809 // Mark that the isolate is executing Dart code. 813 // Mark that the isolate is executing Dart code.
810 __ LoadImmediate(R6, VMTag::kDartTagId, PP); 814 __ LoadImmediate(R6, VMTag::kDartTagId, PP);
811 __ StoreToOffset(R6, R5, Isolate::vm_tag_offset(), PP); 815 __ StoreToOffset(R6, R5, Isolate::vm_tag_offset(), PP);
(...skipping 1164 matching lines...) Expand 10 before | Expand all | Expand 10 after
1976 // R5: isolate. 1980 // R5: isolate.
1977 // Does not return. 1981 // Does not return.
1978 void StubCode::GenerateJumpToExceptionHandlerStub(Assembler* assembler) { 1982 void StubCode::GenerateJumpToExceptionHandlerStub(Assembler* assembler) {
1979 ASSERT(kExceptionObjectReg == R0); 1983 ASSERT(kExceptionObjectReg == R0);
1980 ASSERT(kStackTraceObjectReg == R1); 1984 ASSERT(kStackTraceObjectReg == R1);
1981 __ mov(LR, R0); // Program counter. 1985 __ mov(LR, R0); // Program counter.
1982 __ mov(SP, R1); // Stack pointer. 1986 __ mov(SP, R1); // Stack pointer.
1983 __ mov(FP, R2); // Frame_pointer. 1987 __ mov(FP, R2); // Frame_pointer.
1984 __ mov(R0, R3); // Exception object. 1988 __ mov(R0, R3); // Exception object.
1985 __ mov(R1, R4); // StackTrace object. 1989 __ mov(R1, R4); // StackTrace object.
1990 // TODO(koda): Pass thread instead of isolate.
1991 __ LoadFromOffset(THR, R5, Isolate::mutator_thread_offset(), kNoPP);
1986 // Set the tag. 1992 // Set the tag.
1987 __ LoadImmediate(R2, VMTag::kDartTagId, kNoPP); 1993 __ LoadImmediate(R2, VMTag::kDartTagId, kNoPP);
1988 __ StoreToOffset(R2, R5, Isolate::vm_tag_offset(), kNoPP); 1994 __ StoreToOffset(R2, R5, Isolate::vm_tag_offset(), kNoPP);
1989 // Clear top exit frame. 1995 // Clear top exit frame.
1990 __ StoreToOffset(ZR, R5, Isolate::top_exit_frame_info_offset(), kNoPP); 1996 __ StoreToOffset(ZR, R5, Isolate::top_exit_frame_info_offset(), kNoPP);
1991 __ ret(); // Jump to the exception handler code. 1997 __ ret(); // Jump to the exception handler code.
1992 } 1998 }
1993 1999
1994 2000
1995 // Calls to the runtime to optimize the given function. 2001 // Calls to the runtime to optimize the given function.
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after
2180 // Result: 2186 // Result:
2181 // R1: entry point. 2187 // R1: entry point.
2182 void StubCode::GenerateMegamorphicLookupStub(Assembler* assembler) { 2188 void StubCode::GenerateMegamorphicLookupStub(Assembler* assembler) {
2183 EmitMegamorphicLookup(assembler, R0, R1, R1); 2189 EmitMegamorphicLookup(assembler, R0, R1, R1);
2184 __ ret(); 2190 __ ret();
2185 } 2191 }
2186 2192
2187 } // namespace dart 2193 } // namespace dart
2188 2194
2189 #endif // defined TARGET_ARCH_ARM64 2195 #endif // defined TARGET_ARCH_ARM64
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698