| Index: runtime/vm/stub_code_x64.cc
|
| diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
|
| index 7b4561d93637a7470db3f8aeae8c8468faf28efb..44d5f9632a6a46d14a3debd762b73f428509a41d 100644
|
| --- a/runtime/vm/stub_code_x64.cc
|
| +++ b/runtime/vm/stub_code_x64.cc
|
| @@ -46,10 +46,6 @@ void StubCode::GenerateCallToRuntimeStub(Assembler* assembler) {
|
|
|
| __ EnterStubFrame();
|
|
|
| - 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(THR, Thread::top_exit_frame_info_offset()), RBP);
|
| @@ -58,15 +54,15 @@ void StubCode::GenerateCallToRuntimeStub(Assembler* assembler) {
|
| { Label ok;
|
| // Check that we are always entering from Dart code.
|
| __ movq(RAX, Immediate(VMTag::kDartTagId));
|
| - __ cmpq(RAX, Address(R12, Isolate::vm_tag_offset()));
|
| + __ cmpq(RAX, Assembler::VMTagAddress());
|
| __ j(EQUAL, &ok, Assembler::kNearJump);
|
| __ Stop("Not coming from Dart code.");
|
| __ Bind(&ok);
|
| }
|
| #endif
|
|
|
| - // Mark that the isolate is executing VM code.
|
| - __ movq(Address(R12, Isolate::vm_tag_offset()), RBX);
|
| + // Mark that the thread is executing VM code.
|
| + __ movq(Assembler::VMTagAddress(), RBX);
|
|
|
| // Reserve space for arguments and align frame before entering C++ world.
|
| __ subq(RSP, Immediate(sizeof(NativeArguments)));
|
| @@ -90,9 +86,8 @@ void StubCode::GenerateCallToRuntimeStub(Assembler* assembler) {
|
| #endif
|
| __ CallCFunction(RBX);
|
|
|
| - // Mark that the isolate is executing Dart code.
|
| - __ movq(Address(R12, Isolate::vm_tag_offset()),
|
| - Immediate(VMTag::kDartTagId));
|
| + // Mark that the thread is executing Dart code.
|
| + __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
|
|
|
| // Reset exit frame information in Isolate structure.
|
| __ movq(Address(THR, Thread::top_exit_frame_info_offset()), Immediate(0));
|
| @@ -144,10 +139,6 @@ void StubCode::GenerateCallNativeCFunctionStub(Assembler* assembler) {
|
|
|
| __ EnterStubFrame();
|
|
|
| - 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(THR, Thread::top_exit_frame_info_offset()), RBP);
|
| @@ -156,15 +147,15 @@ void StubCode::GenerateCallNativeCFunctionStub(Assembler* assembler) {
|
| { Label ok;
|
| // Check that we are always entering from Dart code.
|
| __ movq(R8, Immediate(VMTag::kDartTagId));
|
| - __ cmpq(R8, Address(R12, Isolate::vm_tag_offset()));
|
| + __ cmpq(R8, Assembler::VMTagAddress());
|
| __ j(EQUAL, &ok, Assembler::kNearJump);
|
| __ Stop("Not coming from Dart code.");
|
| __ Bind(&ok);
|
| }
|
| #endif
|
|
|
| - // Mark that the isolate is executing Native code.
|
| - __ movq(Address(R12, Isolate::vm_tag_offset()), RBX);
|
| + // Mark that the thread is executing native code.
|
| + __ movq(Assembler::VMTagAddress(), RBX);
|
|
|
| // Reserve space for the native arguments structure passed on the stack (the
|
| // outgoing pointer parameter to the native arguments structure is passed in
|
| @@ -189,9 +180,8 @@ void StubCode::GenerateCallNativeCFunctionStub(Assembler* assembler) {
|
| __ movq(RAX, Address(THR, Thread::native_call_wrapper_entry_point_offset()));
|
| __ CallCFunction(RAX);
|
|
|
| - // Mark that the isolate is executing Dart code.
|
| - __ movq(Address(R12, Isolate::vm_tag_offset()),
|
| - Immediate(VMTag::kDartTagId));
|
| + // Mark that the thread is executing Dart code.
|
| + __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
|
|
|
| // Reset exit frame information in Isolate structure.
|
| __ movq(Address(THR, Thread::top_exit_frame_info_offset()), Immediate(0));
|
| @@ -220,10 +210,6 @@ void StubCode::GenerateCallBootstrapCFunctionStub(Assembler* assembler) {
|
|
|
| __ EnterStubFrame();
|
|
|
| - 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(THR, Thread::top_exit_frame_info_offset()), RBP);
|
| @@ -232,15 +218,15 @@ void StubCode::GenerateCallBootstrapCFunctionStub(Assembler* assembler) {
|
| { Label ok;
|
| // Check that we are always entering from Dart code.
|
| __ movq(R8, Immediate(VMTag::kDartTagId));
|
| - __ cmpq(R8, Address(R12, Isolate::vm_tag_offset()));
|
| + __ cmpq(R8, Assembler::VMTagAddress());
|
| __ j(EQUAL, &ok, Assembler::kNearJump);
|
| __ Stop("Not coming from Dart code.");
|
| __ Bind(&ok);
|
| }
|
| #endif
|
|
|
| - // Mark that the isolate is executing Native code.
|
| - __ movq(Address(R12, Isolate::vm_tag_offset()), RBX);
|
| + // Mark that the thread is executing native code.
|
| + __ movq(Assembler::VMTagAddress(), RBX);
|
|
|
| // Reserve space for the native arguments structure passed on the stack (the
|
| // outgoing pointer parameter to the native arguments structure is passed in
|
| @@ -261,9 +247,8 @@ void StubCode::GenerateCallBootstrapCFunctionStub(Assembler* assembler) {
|
| __ movq(CallingConventions::kArg1Reg, RSP);
|
| __ CallCFunction(RBX);
|
|
|
| - // Mark that the isolate is executing Dart code.
|
| - __ movq(Address(R12, Isolate::vm_tag_offset()),
|
| - Immediate(VMTag::kDartTagId));
|
| + // Mark that the thread is executing Dart code.
|
| + __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
|
|
|
| // Reset exit frame information in Isolate structure.
|
| __ movq(Address(THR, Thread::top_exit_frame_info_offset()), Immediate(0));
|
| @@ -753,17 +738,13 @@ void StubCode::GenerateInvokeDartCodeStub(Assembler* assembler) {
|
| if (THR != kThreadReg) {
|
| __ movq(THR, kThreadReg);
|
| }
|
| - // 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()));
|
| + __ movq(RAX, Assembler::VMTagAddress());
|
| __ pushq(RAX);
|
|
|
| - // Mark that the isolate is executing Dart code.
|
| - __ movq(Address(kIsolateReg, Isolate::vm_tag_offset()),
|
| - Immediate(VMTag::kDartTagId));
|
| + // Mark that the thread is executing Dart code.
|
| + __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
|
|
|
| // Save top resource and top exit frame info. Use RAX as a temporary register.
|
| // StackFrameIterator reads the top exit frame info saved in this frame.
|
| @@ -833,12 +814,11 @@ void StubCode::GenerateInvokeDartCodeStub(Assembler* assembler) {
|
|
|
| // Restore the saved top exit frame info and top resource back into the
|
| // Isolate structure.
|
| - __ LoadIsolate(kIsolateReg);
|
| __ popq(Address(THR, Thread::top_exit_frame_info_offset()));
|
| __ popq(Address(THR, Thread::top_resource_offset()));
|
|
|
| // Restore the current VMTag from the stack.
|
| - __ popq(Address(kIsolateReg, Isolate::vm_tag_offset()));
|
| + __ popq(Assembler::VMTagAddress());
|
|
|
| // Restore C++ ABI callee-saved registers.
|
| __ PopRegisters(CallingConventions::kCalleeSaveCpuRegisters,
|
| @@ -1961,20 +1941,16 @@ void StubCode::GenerateJumpToExceptionHandlerStub(Assembler* assembler) {
|
| Register stacktrace_reg = RBX;
|
| __ movq(stacktrace_reg, Address(RSP, 5 * kWordSize));
|
| __ movq(THR, Address(RSP, 6 * kWordSize));
|
| - Register isolate_reg = RDI;
|
| #else
|
| Register stacktrace_reg = CallingConventions::kArg5Reg;
|
| __ movq(THR, CallingConventions::kArg6Reg);
|
| - Register isolate_reg = CallingConventions::kArg6Reg;
|
| #endif
|
| - __ LoadIsolate(isolate_reg);
|
| __ movq(RBP, CallingConventions::kArg3Reg);
|
| __ movq(RSP, CallingConventions::kArg2Reg);
|
| __ movq(kStackTraceObjectReg, stacktrace_reg);
|
| __ movq(kExceptionObjectReg, CallingConventions::kArg4Reg);
|
| // Set the tag.
|
| - __ movq(Address(isolate_reg, Isolate::vm_tag_offset()),
|
| - Immediate(VMTag::kDartTagId));
|
| + __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
|
| // Clear top exit frame.
|
| __ movq(Address(THR, Thread::top_exit_frame_info_offset()),
|
| Immediate(0));
|
|
|