Index: runtime/vm/stub_code_x64.cc |
=================================================================== |
--- runtime/vm/stub_code_x64.cc (revision 41393) |
+++ runtime/vm/stub_code_x64.cc (working copy) |
@@ -36,7 +36,6 @@ |
// R10 : number of arguments to the call. |
// Must preserve callee saved registers R12 and R13. |
void StubCode::GenerateCallToRuntimeStub(Assembler* assembler) { |
- ASSERT((R12 != CTX) && (R13 != CTX)); |
const intptr_t isolate_offset = NativeArguments::isolate_offset(); |
const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset(); |
const intptr_t argv_offset = NativeArguments::argv_offset(); |
@@ -44,23 +43,19 @@ |
__ EnterFrame(0); |
- __ LoadIsolate(RAX); |
+ COMPILE_ASSERT( |
+ (CallingConventions::kCalleeSaveCpuRegisters & (1 << R12)) != 0); |
+ __ LoadIsolate(R12); |
// Save exit frame information to enable stack walking as we are about |
// to transition to Dart VM C++ code. |
- __ movq(Address(RAX, Isolate::top_exit_frame_info_offset()), RSP); |
+ __ movq(Address(R12, Isolate::top_exit_frame_info_offset()), RSP); |
- // Save current Context pointer into Isolate structure. |
- __ movq(Address(RAX, Isolate::top_context_offset()), CTX); |
- |
- // Cache Isolate pointer into CTX while executing runtime code. |
- __ movq(CTX, RAX); |
- |
#if defined(DEBUG) |
{ Label ok; |
// Check that we are always entering from Dart code. |
__ movq(RAX, Immediate(VMTag::kDartTagId)); |
- __ cmpq(RAX, Address(CTX, Isolate::vm_tag_offset())); |
+ __ cmpq(RAX, Address(R12, Isolate::vm_tag_offset())); |
__ j(EQUAL, &ok, Assembler::kNearJump); |
__ Stop("Not coming from Dart code."); |
__ Bind(&ok); |
@@ -68,7 +63,7 @@ |
#endif |
// Mark that the isolate is executing VM code. |
- __ movq(Address(CTX, Isolate::vm_tag_offset()), RBX); |
+ __ movq(Address(R12, Isolate::vm_tag_offset()), RBX); |
// Reserve space for arguments and align frame before entering C++ world. |
__ subq(RSP, Immediate(sizeof(NativeArguments))); |
@@ -77,7 +72,7 @@ |
} |
// Pass NativeArguments structure by value and call runtime. |
- __ movq(Address(RSP, isolate_offset), CTX); // Set isolate in NativeArgs. |
+ __ movq(Address(RSP, isolate_offset), R12); // Set isolate in NativeArgs. |
// There are no runtime calls to closures, so we do not need to set the tag |
// bits kClosureFunctionBit and kInstanceFunctionBit in argc_tag_. |
__ movq(Address(RSP, argc_tag_offset), R10); // Set argc in NativeArguments. |
@@ -92,22 +87,12 @@ |
__ CallCFunction(RBX); |
// Mark that the isolate is executing Dart code. |
- __ movq(Address(CTX, Isolate::vm_tag_offset()), |
+ __ movq(Address(R12, Isolate::vm_tag_offset()), |
Immediate(VMTag::kDartTagId)); |
// Reset exit frame information in Isolate structure. |
- __ movq(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0)); |
+ __ movq(Address(R12, Isolate::top_exit_frame_info_offset()), Immediate(0)); |
- // Load Context pointer from Isolate structure into RBX. |
- __ movq(RBX, Address(CTX, Isolate::top_context_offset())); |
- |
- // Reset Context pointer in Isolate structure. |
- __ LoadObject(R12, Object::null_object(), PP); |
- __ movq(Address(CTX, Isolate::top_context_offset()), R12); |
- |
- // Cache Context pointer into CTX while executing Dart code. |
- __ movq(CTX, RBX); |
- |
__ LeaveFrame(); |
__ ret(); |
} |
@@ -155,23 +140,19 @@ |
__ EnterFrame(0); |
- __ LoadIsolate(R8); |
+ COMPILE_ASSERT( |
+ (CallingConventions::kCalleeSaveCpuRegisters & (1 << R12)) != 0); |
+ __ LoadIsolate(R12); |
// Save exit frame information to enable stack walking as we are about |
// to transition to native code. |
- __ movq(Address(R8, Isolate::top_exit_frame_info_offset()), RSP); |
+ __ movq(Address(R12, Isolate::top_exit_frame_info_offset()), RSP); |
-// Save current Context pointer into Isolate structure. |
- __ movq(Address(R8, Isolate::top_context_offset()), CTX); |
- |
- // Cache Isolate pointer into CTX while executing native code. |
- __ movq(CTX, R8); |
- |
#if defined(DEBUG) |
{ Label ok; |
// Check that we are always entering from Dart code. |
__ movq(R8, Immediate(VMTag::kDartTagId)); |
- __ cmpq(R8, Address(CTX, Isolate::vm_tag_offset())); |
+ __ cmpq(R8, Address(R12, Isolate::vm_tag_offset())); |
__ j(EQUAL, &ok, Assembler::kNearJump); |
__ Stop("Not coming from Dart code."); |
__ Bind(&ok); |
@@ -179,7 +160,7 @@ |
#endif |
// Mark that the isolate is executing Native code. |
- __ movq(Address(CTX, Isolate::vm_tag_offset()), RBX); |
+ __ movq(Address(R12, Isolate::vm_tag_offset()), RBX); |
// Reserve space for the native arguments structure passed on the stack (the |
// outgoing pointer parameter to the native arguments structure is passed in |
@@ -190,7 +171,7 @@ |
} |
// Pass NativeArguments structure by value and call native function. |
- __ movq(Address(RSP, isolate_offset), CTX); // Set isolate in NativeArgs. |
+ __ movq(Address(RSP, isolate_offset), R12); // Set isolate in NativeArgs. |
__ movq(Address(RSP, argc_tag_offset), R10); // Set argc in NativeArguments. |
__ movq(Address(RSP, argv_offset), RAX); // Set argv in NativeArguments. |
__ leaq(RAX, Address(RBP, 2 * kWordSize)); // Compute return value addr. |
@@ -203,22 +184,12 @@ |
__ CallCFunction(&NativeEntry::NativeCallWrapperLabel()); |
// Mark that the isolate is executing Dart code. |
- __ movq(Address(CTX, Isolate::vm_tag_offset()), |
+ __ movq(Address(R12, Isolate::vm_tag_offset()), |
Immediate(VMTag::kDartTagId)); |
// Reset exit frame information in Isolate structure. |
- __ movq(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0)); |
+ __ movq(Address(R12, Isolate::top_exit_frame_info_offset()), Immediate(0)); |
- // Load Context pointer from Isolate structure into R8. |
- __ movq(R8, Address(CTX, Isolate::top_context_offset())); |
- |
- // Reset Context pointer in Isolate structure. |
- __ LoadObject(R12, Object::null_object(), PP); |
- __ movq(Address(CTX, Isolate::top_context_offset()), R12); |
- |
- // Cache Context pointer into CTX while executing Dart code. |
- __ movq(CTX, R8); |
- |
__ LeaveFrame(); |
__ ret(); |
} |
@@ -243,23 +214,19 @@ |
__ EnterFrame(0); |
- __ LoadIsolate(R8); |
+ COMPILE_ASSERT( |
+ (CallingConventions::kCalleeSaveCpuRegisters & (1 << R12)) != 0); |
+ __ LoadIsolate(R12); |
// Save exit frame information to enable stack walking as we are about |
// to transition to native code. |
- __ movq(Address(R8, Isolate::top_exit_frame_info_offset()), RSP); |
+ __ movq(Address(R12, Isolate::top_exit_frame_info_offset()), RSP); |
- // Save current Context pointer into Isolate structure. |
- __ movq(Address(R8, Isolate::top_context_offset()), CTX); |
- |
- // Cache Isolate pointer into CTX while executing native code. |
- __ movq(CTX, R8); |
- |
#if defined(DEBUG) |
{ Label ok; |
// Check that we are always entering from Dart code. |
__ movq(R8, Immediate(VMTag::kDartTagId)); |
- __ cmpq(R8, Address(CTX, Isolate::vm_tag_offset())); |
+ __ cmpq(R8, Address(R12, Isolate::vm_tag_offset())); |
__ j(EQUAL, &ok, Assembler::kNearJump); |
__ Stop("Not coming from Dart code."); |
__ Bind(&ok); |
@@ -267,7 +234,7 @@ |
#endif |
// Mark that the isolate is executing Native code. |
- __ movq(Address(CTX, Isolate::vm_tag_offset()), RBX); |
+ __ movq(Address(R12, Isolate::vm_tag_offset()), RBX); |
// Reserve space for the native arguments structure passed on the stack (the |
// outgoing pointer parameter to the native arguments structure is passed in |
@@ -278,7 +245,7 @@ |
} |
// Pass NativeArguments structure by value and call native function. |
- __ movq(Address(RSP, isolate_offset), CTX); // Set isolate in NativeArgs. |
+ __ movq(Address(RSP, isolate_offset), R12); // Set isolate in NativeArgs. |
__ movq(Address(RSP, argc_tag_offset), R10); // Set argc in NativeArguments. |
__ movq(Address(RSP, argv_offset), RAX); // Set argv in NativeArguments. |
__ leaq(RAX, Address(RBP, 2 * kWordSize)); // Compute return value addr. |
@@ -289,22 +256,12 @@ |
__ CallCFunction(RBX); |
// Mark that the isolate is executing Dart code. |
- __ movq(Address(CTX, Isolate::vm_tag_offset()), |
+ __ movq(Address(R12, Isolate::vm_tag_offset()), |
Immediate(VMTag::kDartTagId)); |
// Reset exit frame information in Isolate structure. |
- __ movq(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0)); |
+ __ movq(Address(R12, Isolate::top_exit_frame_info_offset()), Immediate(0)); |
- // Load Context pointer from Isolate structure into R8. |
- __ movq(R8, Address(CTX, Isolate::top_context_offset())); |
- |
- // Reset Context pointer in Isolate structure. |
- __ LoadObject(R12, Object::null_object(), PP); |
- __ movq(Address(CTX, Isolate::top_context_offset()), R12); |
- |
- // Cache Context pointer into CTX while executing Dart code. |
- __ movq(CTX, R8); |
- |
__ LeaveFrame(); |
__ ret(); |
} |
@@ -737,17 +694,15 @@ |
const Register kEntryPointReg = CallingConventions::kArg1Reg; |
const Register kArgDescReg = CallingConventions::kArg2Reg; |
const Register kArgsReg = CallingConventions::kArg3Reg; |
- const Register kNewContextReg = CallingConventions::kArg4Reg; |
// At this point, the stack looks like: |
// | saved RBP | <-- RBP |
// | saved PC (return to DartEntry::InvokeFunction) | |
const intptr_t kInitialOffset = 1; |
- // Save arguments descriptor array and new context. |
+ // Save arguments descriptor array. |
const intptr_t kArgumentsDescOffset = -(kInitialOffset) * kWordSize; |
__ pushq(kArgDescReg); |
- __ pushq(kNewContextReg); |
// Save C++ ABI callee-saved registers. |
__ PushRegisters(CallingConventions::kCalleeSaveCpuRegisters, |
@@ -759,36 +714,15 @@ |
__ LoadPoolPointer(PP); |
// If any additional (or fewer) values are pushed, the offsets in |
- // kExitLinkSlotFromEntryFp and kSavedContextSlotFromEntryFp will need to be |
- // changed. |
+ // kExitLinkSlotFromEntryFp will need to be changed. |
- // The new Context structure contains a pointer to the current Isolate |
- // structure. Cache the Context pointer in the CTX register so that it is |
- // available in generated code and calls to Isolate::Current() need not be |
- // done. The assumption is that this register will never be clobbered by |
- // compiled or runtime stub code. |
- |
- // Cache the new Context pointer into CTX while executing Dart code. |
- __ movq(CTX, Address(kNewContextReg, VMHandles::kOffsetOfRawPtrInHandle)); |
- |
- const Register kIsolateReg = RBX; |
- |
// Load Isolate pointer into kIsolateReg. |
+ const Register kIsolateReg = RBX; |
__ LoadIsolate(kIsolateReg); |
// Save the current VMTag on the stack. |
__ movq(RAX, Address(kIsolateReg, Isolate::vm_tag_offset())); |
__ pushq(RAX); |
-#if defined(DEBUG) |
- { |
- Label ok; |
- __ leaq(RAX, Address(RBP, kSavedVMTagSlotFromEntryFp * kWordSize)); |
- __ cmpq(RAX, RSP); |
- __ j(EQUAL, &ok); |
- __ Stop("kSavedVMTagSlotFromEntryFp mismatch"); |
- __ Bind(&ok); |
- } |
-#endif |
// Mark that the isolate is executing Dart code. |
__ movq(Address(kIsolateReg, Isolate::vm_tag_offset()), |
@@ -814,26 +748,6 @@ |
__ movq(Address(kIsolateReg, Isolate::top_exit_frame_info_offset()), |
Immediate(0)); |
- // Save the old Context pointer. Use RAX as a temporary register. |
- // Note that VisitObjectPointers will find this saved Context pointer during |
- // GC marking, since it traverses any information between SP and |
- // FP - kExitLinkSlotFromEntryFp * kWordSize. |
- // EntryFrame::SavedContext reads the context saved in this frame. |
- // The constant kSavedContextSlotFromEntryFp must be kept in sync with |
- // the code below. |
- __ movq(RAX, Address(kIsolateReg, Isolate::top_context_offset())); |
- __ pushq(RAX); |
-#if defined(DEBUG) |
- { |
- Label ok; |
- __ leaq(RAX, Address(RBP, kSavedContextSlotFromEntryFp * kWordSize)); |
- __ cmpq(RAX, RSP); |
- __ j(EQUAL, &ok); |
- __ Stop("kSavedContextSlotFromEntryFp mismatch"); |
- __ Bind(&ok); |
- } |
-#endif |
- |
// Load arguments descriptor array into R10, which is passed to Dart code. |
__ movq(R10, Address(kArgDescReg, VMHandles::kOffsetOfRawPtrInHandle)); |
@@ -872,11 +786,8 @@ |
// Get rid of arguments pushed on the stack. |
__ leaq(RSP, Address(RSP, RDX, TIMES_4, 0)); // RDX is a Smi. |
- __ LoadIsolate(kIsolateReg); |
- // Restore the saved Context pointer into the Isolate structure. |
- __ popq(Address(kIsolateReg, Isolate::top_context_offset())); |
- |
// Restore the saved top exit frame info back into the Isolate structure. |
+ __ LoadIsolate(kIsolateReg); |
__ popq(Address(kIsolateReg, Isolate::top_exit_frame_info_offset())); |
// Restore the current VMTag from the stack. |