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

Unified Diff: runtime/vm/stub_code_x64.cc

Issue 22825023: Uses an object pool on x64 (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 4 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
« runtime/vm/assembler_x64.cc ('K') | « runtime/vm/stack_frame_x64.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/stub_code_x64.cc
===================================================================
--- runtime/vm/stub_code_x64.cc (revision 26436)
+++ runtime/vm/stub_code_x64.cc (working copy)
@@ -330,7 +330,7 @@
// called, the stub accesses the receiver from this location directly
// when trying to resolve the call.
void StubCode::GenerateInstanceFunctionLookupStub(Assembler* assembler) {
- __ EnterStubFrame();
+ __ EnterStubFrame(true);
const Immediate& raw_null =
Immediate(reinterpret_cast<intptr_t>(Object::null()));
@@ -338,10 +338,10 @@
// Push the receiver as an argument. Load the smi-tagged argument
// count into R13 to index the receiver in the stack. There are
- // three words (null, stub's pc marker, saved fp) above the return
+ // four words (null, stub's pc marker, saved pp, saved fp) above the return
// address.
__ movq(R13, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
- __ pushq(Address(RSP, R13, TIMES_4, (3 * kWordSize)));
+ __ pushq(Address(RSP, R13, TIMES_4, (4 * kWordSize)));
__ pushq(RBX); // Pass IC data object.
__ pushq(R10); // Pass arguments descriptor array.
@@ -355,7 +355,7 @@
// Remove arguments.
__ Drop(4);
__ popq(RAX); // Get result into RAX.
- __ LeaveFrame();
+ __ LeaveFrame(true);
__ ret();
}
@@ -380,6 +380,8 @@
// GC can occur only after frame is fully rewritten.
// Stack after EnterDartFrame(0) below:
// +------------------+
+// | Saved PP | <- PP
+// +------------------+
// | PC marker | <- TOS
// +------------------+
// | Saved FP | <- FP of stub
@@ -391,8 +393,12 @@
// Parts of the code cannot GC, part of the code can GC.
static void GenerateDeoptimizationSequence(Assembler* assembler,
bool preserve_result) {
- // Leaf runtime function DeoptimizeCopyFrame expects a Dart frame.
- __ EnterDartFrame(0);
+ // DeoptimizeCopyFrame expects a Dart frame, i.e. EnterDartFrame(0), but there
+ // is no need to set the correct PC marker or load PP, since they get patched.
+ __ EnterFrame(0);
+ __ pushq(Immediate(0));
+ __ pushq(PP);
+
// The code in this frame may not cause GC. kDeoptimizeCopyFrameRuntimeEntry
// and kDeoptimizeFillFrameRuntimeEntry are leaf runtime calls.
const intptr_t saved_result_slot_from_fp =
@@ -422,14 +428,18 @@
__ movq(RBX, Address(RBP, saved_result_slot_from_fp * kWordSize));
}
- __ LeaveFrame();
+ __ LeaveFrame(true);
__ popq(RCX); // Preserve return address.
__ movq(RSP, RBP); // Discard optimized frame.
__ subq(RSP, RAX); // Reserve space for deoptimized frame.
__ pushq(RCX); // Restore return address.
- // Leaf runtime function DeoptimizeFillFrame expects a Dart frame.
- __ EnterDartFrame(0);
+ // DeoptimizeFillFrame expects a Dart frame, i.e. EnterDartFrame(0), but there
+ // is no need to set the correct PC marker or load PP, since they get patched.
+ __ EnterFrame(0);
+ __ pushq(Immediate(0));
+ __ pushq(PP);
+
if (preserve_result) {
__ pushq(RBX); // Preserve result as first local.
}
@@ -441,7 +451,7 @@
__ movq(RBX, Address(RBP, kFirstLocalSlotFromFp * kWordSize));
}
// Code above cannot cause GC.
- __ LeaveFrame();
+ __ LeaveFrame(true);
// Frame is fully rewritten at this point and it is safe to perform a GC.
// Materialize any objects that were deferred by FillFrame because they
@@ -486,13 +496,14 @@
void StubCode::GenerateMegamorphicMissStub(Assembler* assembler) {
- __ EnterStubFrame();
+ __ EnterStubFrame(true);
// Load the receiver into RAX. The argument count in the arguments
// descriptor in R10 is a smi.
__ movq(RAX, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
- // Two words (saved fp, stub's pc marker) in the stack above the return
- // address.
- __ movq(RAX, Address(RSP, RAX, TIMES_4, 2 * kWordSize));
+ // Three words (saved pp, saved fp, stub's pc marker)
+ // in the stack above the return address.
+ __ movq(RAX, Address(RSP, RAX, TIMES_4,
+ kSavedAboveReturnAddress * kWordSize));
// Preserve IC data and arguments descriptor.
__ pushq(RBX);
__ pushq(R10);
@@ -511,7 +522,7 @@
__ popq(RAX); // Return value from the runtime call (instructions).
__ popq(R10); // Restore arguments descriptor.
__ popq(RBX); // Restore IC data.
- __ LeaveFrame();
+ __ LeaveFrame(true);
Label lookup;
__ cmpq(RAX, raw_null);
@@ -761,12 +772,12 @@
// RCX : new context containing the current isolate pointer.
void StubCode::GenerateInvokeDartCodeStub(Assembler* assembler) {
// Save frame pointer coming in.
- __ EnterFrame(0);
+ __ EnterStubFrame();
// Save arguments descriptor array and new context.
- const intptr_t kArgumentsDescOffset = -1 * kWordSize;
+ const intptr_t kArgumentsDescOffset = -2 * kWordSize;
__ pushq(RSI);
- const intptr_t kNewContextOffset = -2 * kWordSize;
+ const intptr_t kNewContextOffset = -3 * kWordSize;
__ pushq(RCX);
// Save C++ ABI callee-saved registers.
@@ -792,7 +803,7 @@
// StackFrameIterator reads the top exit frame info saved in this frame.
// The constant kExitLinkSlotFromEntryFp must be kept in sync with the
// code below.
- ASSERT(kExitLinkSlotFromEntryFp == -8);
+ ASSERT(kExitLinkSlotFromEntryFp == -9);
__ movq(RAX, Address(R8, Isolate::top_exit_frame_info_offset()));
__ pushq(RAX);
__ movq(Address(R8, Isolate::top_exit_frame_info_offset()), Immediate(0));
@@ -804,7 +815,7 @@
// EntryFrame::SavedContext reads the context saved in this frame.
// The constant kSavedContextSlotFromEntryFp must be kept in sync with
// the code below.
- ASSERT(kSavedContextSlotFromEntryFp == -9);
+ ASSERT(kSavedContextSlotFromEntryFp == -10);
__ movq(RAX, Address(R8, Isolate::top_context_offset()));
__ pushq(RAX);
@@ -1217,7 +1228,7 @@
__ movq(RDX, Address(RSP, kInstantiatorTypeArgumentsOffset));
}
// Create a stub frame.
- __ EnterStubFrame();
+ __ EnterStubFrame(true);
__ pushq(raw_null); // Setup space on stack for return value.
__ PushObject(cls); // Push class of object to be allocated.
if (is_cls_parameterized) {
@@ -1234,7 +1245,7 @@
__ popq(RAX); // Pop result (newly allocated object).
// RAX: new object
// Restore the frame pointer.
- __ LeaveFrame();
+ __ LeaveFrame(true);
__ ret();
}
@@ -1254,8 +1265,10 @@
func.IsImplicitInstanceClosureFunction();
const Class& cls = Class::ZoneHandle(func.signature_class());
const bool has_type_arguments = cls.HasTypeArguments();
- const intptr_t kTypeArgumentsOffset = 1 * kWordSize;
- const intptr_t kReceiverOffset = 2 * kWordSize;
+
+ __ EnterStubFrame(true); // Uses pool pointer to refer to function.
+ const intptr_t kTypeArgumentsOffset = 4 * kWordSize;
+ const intptr_t kReceiverOffset = 5 * kWordSize;
const intptr_t closure_size = Closure::InstanceSize();
const intptr_t context_size = Context::InstanceSize(1); // Captured receiver.
if (FLAG_inline_alloc &&
@@ -1340,6 +1353,7 @@
// Done allocating and initializing the instance.
// RAX: new object.
__ addq(RAX, Immediate(kHeapObjectTag));
+ __ LeaveFrame(true);
__ ret();
__ Bind(&slow_case);
@@ -1350,8 +1364,7 @@
if (is_implicit_instance_closure) {
__ movq(RAX, Address(RSP, kReceiverOffset));
}
- // Create the stub frame.
- __ EnterStubFrame();
+
__ pushq(raw_null); // Setup space on stack for the return value.
__ PushObject(func);
if (is_implicit_instance_closure) {
@@ -1375,7 +1388,7 @@
__ popq(RAX); // Pop the result.
// RAX: New closure object.
// Restore the calling frame.
- __ LeaveFrame();
+ __ LeaveFrame(true);
__ ret();
}
@@ -1827,7 +1840,7 @@
__ LeaveFrame();
__ popq(R11); // discard return address of call to this stub.
- __ LeaveFrame();
+ __ LeaveFrame(true);
__ ret();
}
@@ -2081,7 +2094,7 @@
__ Bind(&update_ic_data);
- // RCX: ICData
+ // RBX: ICData
__ movq(RAX, Address(RSP, 1 * kWordSize));
__ movq(R13, Address(RSP, 2 * kWordSize));
__ EnterStubFrame();
« runtime/vm/assembler_x64.cc ('K') | « runtime/vm/stack_frame_x64.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698