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

Unified Diff: runtime/vm/stub_code_mips.cc

Issue 678763004: Make CTX allocatable by the register allocator. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: incorporated latest comments Created 6 years, 2 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 side-by-side diff with in-line comments
Download patch
Index: runtime/vm/stub_code_mips.cc
===================================================================
--- runtime/vm/stub_code_mips.cc (revision 41393)
+++ runtime/vm/stub_code_mips.cc (working copy)
@@ -48,22 +48,17 @@
__ sw(FP, Address(SP, 0 * kWordSize));
__ mov(FP, SP);
- __ LoadIsolate(A0);
+ COMPILE_ASSERT((kAbiPreservedCpuRegs & (1 << S6)) != 0);
+ __ LoadIsolate(S6);
// Save exit frame information to enable stack walking as we are about
// to transition to Dart VM C++ code.
- __ sw(SP, Address(A0, Isolate::top_exit_frame_info_offset()));
+ __ sw(SP, Address(S6, Isolate::top_exit_frame_info_offset()));
- // Save current Context pointer into Isolate structure.
- __ sw(CTX, Address(A0, Isolate::top_context_offset()));
-
- // Cache Isolate pointer into CTX while executing runtime code.
- __ mov(CTX, A0);
-
#if defined(DEBUG)
{ Label ok;
// Check that we are always entering from Dart code.
- __ lw(T0, Address(A0, Isolate::vm_tag_offset()));
+ __ lw(T0, Address(S6, Isolate::vm_tag_offset()));
__ BranchEqual(T0, Immediate(VMTag::kDartTagId), &ok);
__ Stop("Not coming from Dart code.");
__ Bind(&ok);
@@ -71,7 +66,7 @@
#endif
// Mark that the isolate is executing VM code.
- __ sw(S5, Address(A0, Isolate::vm_tag_offset()));
+ __ sw(S5, Address(S6, Isolate::vm_tag_offset()));
// Reserve space for arguments and align frame before entering C++ world.
// NativeArguments are passed in registers.
@@ -82,7 +77,8 @@
// Registers A0, A1, A2, and A3 are used.
ASSERT(isolate_offset == 0 * kWordSize);
- // Set isolate in NativeArgs: A0 already contains CTX.
+ // Set isolate in NativeArgs.
+ __ mov(A0, S6);
// There are no runtime calls to closures, so we do not need to set the tag
// bits kClosureFunctionBit and kInstanceFunctionBit in argc_tag_.
@@ -109,23 +105,11 @@
// Mark that the isolate is executing Dart code.
__ LoadImmediate(A2, VMTag::kDartTagId);
- __ sw(A2, Address(CTX, Isolate::vm_tag_offset()));
+ __ sw(A2, Address(S6, Isolate::vm_tag_offset()));
// Reset exit frame information in Isolate structure.
- __ sw(ZR, Address(CTX, Isolate::top_exit_frame_info_offset()));
+ __ sw(ZR, Address(S6, Isolate::top_exit_frame_info_offset()));
- // Load Context pointer from Isolate structure into A2.
- __ lw(A2, Address(CTX, Isolate::top_context_offset()));
-
- // Load null.
- __ LoadImmediate(TMP, reinterpret_cast<intptr_t>(Object::null()));
-
- // Reset Context pointer in Isolate structure.
- __ sw(TMP, Address(CTX, Isolate::top_context_offset()));
-
- // Cache Context pointer into CTX while executing Dart code.
- __ mov(CTX, A2);
-
__ mov(SP, FP);
__ lw(RA, Address(SP, 1 * kWordSize));
__ lw(FP, Address(SP, 0 * kWordSize));
@@ -173,22 +157,17 @@
__ sw(FP, Address(SP, 0 * kWordSize));
__ mov(FP, SP);
- __ LoadIsolate(A0);
+ COMPILE_ASSERT((kAbiPreservedCpuRegs & (1 << S6)) != 0);
+ __ LoadIsolate(S6);
// Save exit frame information to enable stack walking as we are about
// to transition to native code.
- __ sw(SP, Address(A0, Isolate::top_exit_frame_info_offset()));
+ __ sw(SP, Address(S6, Isolate::top_exit_frame_info_offset()));
- // Save current Context pointer into Isolate structure.
- __ sw(CTX, Address(A0, Isolate::top_context_offset()));
-
- // Cache Isolate pointer into CTX while executing native code.
- __ mov(CTX, A0);
-
#if defined(DEBUG)
{ Label ok;
// Check that we are always entering from Dart code.
- __ lw(T0, Address(A0, Isolate::vm_tag_offset()));
+ __ lw(T0, Address(S6, Isolate::vm_tag_offset()));
__ BranchEqual(T0, Immediate(VMTag::kDartTagId), &ok);
__ Stop("Not coming from Dart code.");
__ Bind(&ok);
@@ -196,13 +175,14 @@
#endif
// Mark that the isolate is executing Native code.
- __ sw(T5, Address(A0, Isolate::vm_tag_offset()));
+ __ sw(T5, Address(S6, Isolate::vm_tag_offset()));
// Initialize NativeArguments structure and call native function.
// Registers A0, A1, A2, and A3 are used.
ASSERT(isolate_offset == 0 * kWordSize);
- // Set isolate in NativeArgs: A0 already contains CTX.
+ // Set isolate in NativeArgs.
+ __ mov(A0, S6);
// There are no native calls to closures, so we do not need to set the tag
// bits kClosureFunctionBit and kInstanceFunctionBit in argc_tag_.
@@ -242,23 +222,11 @@
// Mark that the isolate is executing Dart code.
__ LoadImmediate(A2, VMTag::kDartTagId);
- __ sw(A2, Address(CTX, Isolate::vm_tag_offset()));
+ __ sw(A2, Address(S6, Isolate::vm_tag_offset()));
// Reset exit frame information in Isolate structure.
- __ sw(ZR, Address(CTX, Isolate::top_exit_frame_info_offset()));
+ __ sw(ZR, Address(S6, Isolate::top_exit_frame_info_offset()));
- // Load Context pointer from Isolate structure into A2.
- __ lw(A2, Address(CTX, Isolate::top_context_offset()));
-
- // Load null.
- __ LoadImmediate(TMP, reinterpret_cast<intptr_t>(Object::null()));
-
- // Reset Context pointer in Isolate structure.
- __ sw(TMP, Address(CTX, Isolate::top_context_offset()));
-
- // Cache Context pointer into CTX while executing Dart code.
- __ mov(CTX, A2);
-
__ mov(SP, FP);
__ lw(RA, Address(SP, 1 * kWordSize));
__ lw(FP, Address(SP, 0 * kWordSize));
@@ -287,22 +255,17 @@
__ sw(FP, Address(SP, 0 * kWordSize));
__ mov(FP, SP);
- __ LoadIsolate(A0);
+ COMPILE_ASSERT((kAbiPreservedCpuRegs & (1 << S6)) != 0);
+ __ LoadIsolate(S6);
// Save exit frame information to enable stack walking as we are about
// to transition to native code.
- __ sw(SP, Address(A0, Isolate::top_exit_frame_info_offset()));
+ __ sw(SP, Address(S6, Isolate::top_exit_frame_info_offset()));
- // Save current Context pointer into Isolate structure.
- __ sw(CTX, Address(A0, Isolate::top_context_offset()));
-
- // Cache Isolate pointer into CTX while executing native code.
- __ mov(CTX, A0);
-
#if defined(DEBUG)
{ Label ok;
// Check that we are always entering from Dart code.
- __ lw(T0, Address(A0, Isolate::vm_tag_offset()));
+ __ lw(T0, Address(S6, Isolate::vm_tag_offset()));
__ BranchEqual(T0, Immediate(VMTag::kDartTagId), &ok);
__ Stop("Not coming from Dart code.");
__ Bind(&ok);
@@ -310,13 +273,14 @@
#endif
// Mark that the isolate is executing Native code.
- __ sw(T5, Address(A0, Isolate::vm_tag_offset()));
+ __ sw(T5, Address(S6, Isolate::vm_tag_offset()));
// Initialize NativeArguments structure and call native function.
// Registers A0, A1, A2, and A3 are used.
ASSERT(isolate_offset == 0 * kWordSize);
- // Set isolate in NativeArgs: A0 already contains CTX.
+ // Set isolate in NativeArgs.
+ __ mov(A0, S6);
// There are no native calls to closures, so we do not need to set the tag
// bits kClosureFunctionBit and kInstanceFunctionBit in argc_tag_.
@@ -351,23 +315,11 @@
// Mark that the isolate is executing Dart code.
__ LoadImmediate(A2, VMTag::kDartTagId);
- __ sw(A2, Address(CTX, Isolate::vm_tag_offset()));
+ __ sw(A2, Address(S6, Isolate::vm_tag_offset()));
// Reset exit frame information in Isolate structure.
- __ sw(ZR, Address(CTX, Isolate::top_exit_frame_info_offset()));
+ __ sw(ZR, Address(S6, Isolate::top_exit_frame_info_offset()));
- // Load Context pointer from Isolate structure into A2.
- __ lw(A2, Address(CTX, Isolate::top_context_offset()));
-
- // Load null.
- __ LoadImmediate(TMP, reinterpret_cast<intptr_t>(Object::null()));
-
- // Reset Context pointer in Isolate structure.
- __ sw(TMP, Address(CTX, Isolate::top_context_offset()));
-
- // Cache Context pointer into CTX while executing Dart code.
- __ mov(CTX, A2);
-
__ mov(SP, FP);
__ lw(RA, Address(SP, 1 * kWordSize));
__ lw(FP, Address(SP, 0 * kWordSize));
@@ -860,7 +812,6 @@
// A0 : entrypoint of the Dart function to call.
// A1 : arguments descriptor array.
// A2 : arguments array.
-// A3 : new context containing the current isolate pointer.
void StubCode::GenerateInvokeDartCodeStub(Assembler* assembler) {
// Save frame pointer coming in.
__ TraceSimMsg("InvokeDartCodeStub");
@@ -868,16 +819,16 @@
// Save new context and C++ ABI callee-saved registers.
- // The new context, saved vm tag, the top exit frame, and the old context.
- const intptr_t kPreservedContextSlots = 4;
+ // The saved vm tag and the top exit frame.
+ const intptr_t kPreservedSlots = 2;
const intptr_t kPreservedRegSpace =
kWordSize * (kAbiPreservedCpuRegCount + kAbiPreservedFpuRegCount +
- kPreservedContextSlots);
+ kPreservedSlots);
__ addiu(SP, SP, Immediate(-kPreservedRegSpace));
for (int i = S0; i <= S7; i++) {
Register r = static_cast<Register>(i);
- const intptr_t slot = i - S0 + kPreservedContextSlots;
+ const intptr_t slot = i - S0 + kPreservedSlots;
__ sw(r, Address(SP, slot * kWordSize));
}
@@ -885,33 +836,21 @@
i <= kAbiLastPreservedFpuReg; i++) {
FRegister r = static_cast<FRegister>(i);
const intptr_t slot =
- kAbiPreservedCpuRegCount + kPreservedContextSlots + i -
+ kAbiPreservedCpuRegCount + kPreservedSlots + i -
kAbiFirstPreservedFpuReg;
__ swc1(r, Address(SP, slot * kWordSize));
}
- __ sw(A3, Address(SP, 3 * kWordSize));
-
// We now load the pool pointer(PP) as we are about to invoke dart code and we
// could potentially invoke some intrinsic functions which need the PP to be
// set up.
__ LoadPoolPointer();
- // 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.
- __ lw(CTX, Address(A3, VMHandles::kOffsetOfRawPtrInHandle));
-
__ LoadIsolate(T2);
// Save the current VMTag on the stack.
- ASSERT(kSavedVMTagSlotFromEntryFp == -22);
__ lw(T1, Address(T2, Isolate::vm_tag_offset()));
- __ sw(T1, Address(SP, 2 * kWordSize));
+ __ sw(T1, Address(SP, 1 * kWordSize));
// Mark that the isolate is executing Dart code.
__ LoadImmediate(T0, VMTag::kDartTagId);
@@ -922,22 +861,12 @@
__ lw(T0, Address(T2, Isolate::top_exit_frame_info_offset()));
__ sw(ZR, Address(T2, Isolate::top_exit_frame_info_offset()));
- // Save the old Context pointer. Use T1 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.
- // EntryFrame::SavedContext reads the context saved in this frame.
- __ lw(T1, Address(T2, Isolate::top_context_offset()));
-
- // The constants kSavedContextSlotFromEntryFp and
// kExitLinkSlotFromEntryFp must be kept in sync with the code below.
- ASSERT(kExitLinkSlotFromEntryFp == -23);
- ASSERT(kSavedContextSlotFromEntryFp == -24);
- __ sw(T0, Address(SP, 1 * kWordSize));
- __ sw(T1, Address(SP, 0 * kWordSize));
+ ASSERT(kExitLinkSlotFromEntryFp == -22);
+ __ sw(T0, Address(SP, 0 * kWordSize));
// After the call, The stack pointer is restored to this location.
- // Pushed A3, S0-7, F20-31, T0, T1 = 23.
+ // Pushed S0-7, F20-31, T0, T1 = 22.
// Load arguments descriptor array into S4, which is passed to Dart code.
__ lw(S4, Address(A1, VMHandles::kOffsetOfRawPtrInHandle));
@@ -972,28 +901,23 @@
__ TraceSimMsg("InvokeDartCodeStub return");
// Get rid of arguments pushed on the stack.
- __ AddImmediate(SP, FP, kSavedContextSlotFromEntryFp * kWordSize);
+ __ AddImmediate(SP, FP, kExitLinkSlotFromEntryFp * kWordSize);
- // Load Isolate pointer into CTX.
- __ LoadIsolate(CTX);
+ __ LoadIsolate(S6);
// Restore the current VMTag from the stack.
- __ lw(T1, Address(SP, 2 * kWordSize));
- __ sw(T1, Address(CTX, Isolate::vm_tag_offset()));
+ __ lw(T1, Address(SP, 1 * kWordSize));
+ __ sw(T1, Address(S6, Isolate::vm_tag_offset()));
- // Restore the saved Context pointer into the Isolate structure.
- // Uses T1 as a temporary register for this.
// Restore the saved top exit frame info back into the Isolate structure.
// Uses T0 as a temporary register for this.
- __ lw(T1, Address(SP, 0 * kWordSize));
- __ lw(T0, Address(SP, 1 * kWordSize));
- __ sw(T1, Address(CTX, Isolate::top_context_offset()));
- __ sw(T0, Address(CTX, Isolate::top_exit_frame_info_offset()));
+ __ lw(T0, Address(SP, 0 * kWordSize));
+ __ sw(T0, Address(S6, Isolate::top_exit_frame_info_offset()));
// Restore C++ ABI callee-saved registers.
for (int i = S0; i <= S7; i++) {
Register r = static_cast<Register>(i);
- const intptr_t slot = i - S0 + kPreservedContextSlots;
+ const intptr_t slot = i - S0 + kPreservedSlots;
__ lw(r, Address(SP, slot * kWordSize));
}
@@ -1001,12 +925,11 @@
i <= kAbiLastPreservedFpuReg; i++) {
FRegister r = static_cast<FRegister>(i);
const intptr_t slot =
- kAbiPreservedCpuRegCount + kPreservedContextSlots + i -
+ kAbiPreservedCpuRegCount + kPreservedSlots + i -
kAbiFirstPreservedFpuReg;
__ lwc1(r, Address(SP, slot * kWordSize));
}
- __ lw(A3, Address(SP, 3 * kWordSize));
__ addiu(SP, SP, Immediate(kPreservedRegSpace));
// Restore the frame pointer and return.

Powered by Google App Engine
This is Rietveld 408576698