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

Unified Diff: runtime/vm/flow_graph_compiler_x64.cc

Issue 1192103004: VM: New calling convention for generated code. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: fixed comments Created 5 years, 3 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
« no previous file with comments | « runtime/vm/flow_graph_compiler_mips.cc ('k') | runtime/vm/gc_marker.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/flow_graph_compiler_x64.cc
diff --git a/runtime/vm/flow_graph_compiler_x64.cc b/runtime/vm/flow_graph_compiler_x64.cc
index 59934cd1360ca8bbe5f9309aadcad9df9bc7c464..2c531a1af8cc5259a29d3cea3c227a2b1d39505b 100644
--- a/runtime/vm/flow_graph_compiler_x64.cc
+++ b/runtime/vm/flow_graph_compiler_x64.cc
@@ -100,7 +100,6 @@ RawTypedData* CompilerDeoptInfo::CreateDeoptInfo(FlowGraphCompiler* compiler,
Zone* zone = compiler->zone();
- // Current PP, FP, and PC.
builder->AddPp(current->function(), slot_ix++);
builder->AddPcMarker(Function::Handle(zone), slot_ix++);
builder->AddCallerFp(slot_ix++);
@@ -121,7 +120,6 @@ RawTypedData* CompilerDeoptInfo::CreateDeoptInfo(FlowGraphCompiler* compiler,
Environment* previous = current;
current = current->outer();
while (current != NULL) {
- // PP, FP, and PC.
builder->AddPp(current->function(), slot_ix++);
builder->AddPcMarker(previous->function(), slot_ix++);
builder->AddCallerFp(slot_ix++);
@@ -157,9 +155,8 @@ RawTypedData* CompilerDeoptInfo::CreateDeoptInfo(FlowGraphCompiler* compiler,
// The previous pointer is now the outermost environment.
ASSERT(previous != NULL);
- // For the outermost environment, set caller PC, caller PP, and caller FP.
+ // Set slots for the outermost environment.
builder->AddCallerPp(slot_ix++);
- // PC marker.
builder->AddPcMarker(previous->function(), slot_ix++);
builder->AddCallerFp(slot_ix++);
builder->AddCallerPc(slot_ix++);
@@ -187,6 +184,7 @@ void CompilerDeoptInfoWithStub::GenerateCode(FlowGraphCompiler* compiler,
ASSERT(deopt_env() != NULL);
+ __ pushq(CODE_REG);
__ Call(*StubCode::Deoptimize_entry());
set_pc_offset(assem->CodeSize());
__ int3();
@@ -925,11 +923,8 @@ void FlowGraphCompiler::CopyParameters() {
__ Bind(&wrong_num_arguments);
if (function.IsClosureFunction()) {
- ASSERT(assembler()->constant_pool_allowed());
- __ LeaveDartFrame(); // The arguments are still on the stack.
- ASSERT(!assembler()->constant_pool_allowed());
- __ jmp(*StubCode::CallClosureNoSuchMethod_entry());
- __ set_constant_pool_allowed(true);
+ __ LeaveDartFrame(kKeepCalleePP); // The arguments are still on the stack.
+ __ Jmp(*StubCode::CallClosureNoSuchMethod_entry());
// The noSuchMethod call may return to the caller, but not here.
} else if (check_correct_named_args) {
__ Stop("Wrong arguments");
@@ -986,30 +981,19 @@ void FlowGraphCompiler::GenerateInlinedSetter(intptr_t offset) {
// NOTE: If the entry code shape changes, ReturnAddressLocator in profiler.cc
// needs to be updated to match.
void FlowGraphCompiler::EmitFrameEntry() {
- ASSERT(Assembler::EntryPointToPcMarkerOffset() == 0);
-
const Function& function = parsed_function().function();
- const Register new_pp = R13;
- const Register new_pc = R12;
-
- // Load PC marker.
- const intptr_t kRIPRelativeLeaqSize = 7;
- const intptr_t entry_to_rip_offset = __ CodeSize() + kRIPRelativeLeaqSize;
- __ leaq(new_pc, Address::AddressRIPRelative(-entry_to_rip_offset));
- ASSERT(__ CodeSize() == entry_to_rip_offset);
-
// Load pool pointer.
- const intptr_t object_pool_pc_dist =
- Instructions::HeaderSize() - Instructions::object_pool_offset();
- __ movq(new_pp, Address(new_pc, -object_pool_pc_dist));
if (flow_graph().IsCompiledForOsr()) {
intptr_t extra_slots = StackSize()
- flow_graph().num_stack_locals()
- flow_graph().num_copied_params();
ASSERT(extra_slots >= 0);
- __ EnterOsrFrame(extra_slots * kWordSize, new_pp, new_pc);
+ __ EnterOsrFrame(extra_slots * kWordSize);
} else {
+ const Register new_pp = R13;
+ __ LoadPoolPointer(new_pp);
+
if (CanOptimizeFunction() &&
function.IsOptimizable() &&
(!is_optimizing() || may_reoptimize())) {
@@ -1017,9 +1001,6 @@ void FlowGraphCompiler::EmitFrameEntry() {
// Load function object using the callee's pool pointer.
__ LoadFunctionFromCalleePool(function_reg, function, new_pp);
- // Patch point is after the eventually inlined function object.
- entry_patch_pc_offset_ = assembler()->CodeSize();
-
// Reoptimization of an optimized function is triggered by counting in
// IC stubs, but not at the entry of the function.
if (!is_optimizing()) {
@@ -1032,12 +1013,10 @@ void FlowGraphCompiler::EmitFrameEntry() {
__ J(GREATER_EQUAL,
*StubCode::OptimizeFunction_entry(),
new_pp);
- } else {
- entry_patch_pc_offset_ = assembler()->CodeSize();
}
ASSERT(StackSize() >= 0);
__ Comment("Enter frame");
- __ EnterDartFrame(StackSize() * kWordSize, new_pp, new_pc);
+ __ EnterDartFrame(StackSize() * kWordSize, new_pp);
}
}
@@ -1082,11 +1061,8 @@ void FlowGraphCompiler::CompileGraph() {
__ Bind(&wrong_num_arguments);
if (function.IsClosureFunction()) {
- ASSERT(assembler()->constant_pool_allowed());
- __ LeaveDartFrame(); // The arguments are still on the stack.
- ASSERT(!assembler()->constant_pool_allowed());
- __ jmp(*StubCode::CallClosureNoSuchMethod_entry());
- __ set_constant_pool_allowed(true);
+ __ LeaveDartFrame(kKeepCalleePP); // Leave arguments on the stack.
+ __ Jmp(*StubCode::CallClosureNoSuchMethod_entry());
// The noSuchMethod call may return to the caller, but not here.
} else {
__ Stop("Wrong number of arguments");
@@ -1150,10 +1126,6 @@ void FlowGraphCompiler::CompileGraph() {
GenerateDeferredCode();
// Emit function patching code. This will be swapped with the first 13 bytes
// at entry point.
- patch_code_pc_offset_ = assembler()->CodeSize();
- // This is patched up to a point in FrameEntry where the PP for the
- // current function is in R13 instead of PP.
- __ JmpPatchable(*StubCode::FixCallersTarget_entry(), R13);
if (is_optimizing()) {
lazy_deopt_pc_offset_ = assembler()->CodeSize();
« no previous file with comments | « runtime/vm/flow_graph_compiler_mips.cc ('k') | runtime/vm/gc_marker.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698