Index: runtime/vm/intermediate_language_x64.cc |
=================================================================== |
--- runtime/vm/intermediate_language_x64.cc (revision 8130) |
+++ runtime/vm/intermediate_language_x64.cc (working copy) |
@@ -16,6 +16,8 @@ |
namespace dart { |
+DECLARE_FLAG(bool, optimization_counter_threshold); |
+DECLARE_FLAG(bool, trace_functions); |
// True iff. the arguments to a call will be properly pushed and can |
// be popped after the call. |
@@ -52,19 +54,79 @@ |
} |
-static LocationSummary* MakeSimpleLocationSummary( |
- intptr_t input_count, Location out) { |
- LocationSummary* summary = new LocationSummary(input_count, 0); |
- for (intptr_t i = 0; i < input_count; i++) { |
- summary->set_in(i, Location::RequiresRegister()); |
+LocationSummary* ReturnInstr::locs() { |
+ if (locs_ == NULL) { |
+ const intptr_t kNumInputs = 1; |
+ const intptr_t kNumTemps = 1; |
+ locs_ = new LocationSummary(kNumInputs, kNumTemps); |
+ locs_->set_in(0, Location::RegisterLocation(RAX)); |
+ locs_->set_temp(0, Location::RequiresRegister()); |
} |
- summary->set_out(out); |
- return summary; |
+ return locs_; |
} |
+void ReturnInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
+ Register result = locs()->in(0).reg(); |
+ Register temp = locs()->temp(0).reg(); |
+ ASSERT(result == RAX); |
+ if (!compiler->is_optimizing()) { |
+ // Count only in unoptimized code. |
+ // TODO(srdjan): Replace the counting code with a type feedback |
+ // collection and counting stub. |
+ const Function& function = |
+ Function::ZoneHandle(compiler->parsed_function().function().raw()); |
+ __ LoadObject(temp, function); |
+ __ incq(FieldAddress(temp, Function::usage_counter_offset())); |
+ if (CodeGenerator::CanOptimize()) { |
+ // Do not optimize if usage count must be reported. |
+ __ cmpl(FieldAddress(temp, Function::usage_counter_offset()), |
+ Immediate(FLAG_optimization_counter_threshold)); |
+ Label not_yet_hot; |
+ __ j(LESS_EQUAL, ¬_yet_hot, Assembler::kNearJump); |
+ __ pushq(result); // Preserve result. |
+ __ pushq(temp); // Argument for runtime: function to optimize. |
+ __ CallRuntime(kOptimizeInvokedFunctionRuntimeEntry); |
+ __ popq(temp); // Remove argument. |
+ __ popq(result); // Restore result. |
+ __ Bind(¬_yet_hot); |
+ } |
+ } |
+ if (FLAG_trace_functions) { |
+ __ pushq(result); // Preserve result. |
+ const Function& function = |
+ Function::ZoneHandle(compiler->parsed_function().function().raw()); |
+ __ LoadObject(temp, function); |
+ __ pushq(temp); |
+ compiler->GenerateCallRuntime(AstNode::kNoId, |
+ 0, |
+ CatchClauseNode::kInvalidTryIndex, |
+ kTraceFunctionExitRuntimeEntry); |
+ __ popq(temp); // Remove argument. |
+ __ popq(result); // Restore result. |
+ } |
+ __ LeaveFrame(); |
+ __ ret(); |
+ |
+ // Generate 8 bytes of NOPs so that the debugger can patch the |
+ // return pattern with a call to the debug stub. |
+ __ nop(1); |
+ __ nop(1); |
+ __ nop(1); |
+ __ nop(1); |
+ __ nop(1); |
+ __ nop(1); |
+ __ nop(1); |
+ __ nop(1); |
+ compiler->AddCurrentDescriptor(PcDescriptors::kReturn, |
+ cid(), |
+ token_index(), |
+ CatchClauseNode::kInvalidTryIndex); |
+} |
+ |
+ |
LocationSummary* CurrentContextComp::MakeLocationSummary() const { |
- return MakeSimpleLocationSummary(0, Location::RequiresRegister()); |
+ return LocationSummary::Make(0, Location::RequiresRegister()); |
} |
@@ -87,7 +149,7 @@ |
LocationSummary* StrictCompareComp::MakeLocationSummary() const { |
- return MakeSimpleLocationSummary(2, Location::SameAsFirstInput()); |
+ return LocationSummary::Make(2, Location::SameAsFirstInput()); |
} |
@@ -184,7 +246,7 @@ |
LocationSummary* LoadLocalComp::MakeLocationSummary() const { |
- return MakeSimpleLocationSummary(0, Location::RequiresRegister()); |
+ return LocationSummary::Make(0, Location::RequiresRegister()); |
} |
@@ -195,7 +257,7 @@ |
LocationSummary* StoreLocalComp::MakeLocationSummary() const { |
- return MakeSimpleLocationSummary(1, Location::SameAsFirstInput()); |
+ return LocationSummary::Make(1, Location::SameAsFirstInput()); |
} |
@@ -208,7 +270,7 @@ |
LocationSummary* ConstantVal::MakeLocationSummary() const { |
- return MakeSimpleLocationSummary(0, Location::RequiresRegister()); |
+ return LocationSummary::Make(0, Location::RequiresRegister()); |
} |
@@ -258,7 +320,7 @@ |
LocationSummary* AssertBooleanComp::MakeLocationSummary() const { |
- return MakeSimpleLocationSummary(1, Location::SameAsFirstInput()); |
+ return LocationSummary::Make(1, Location::SameAsFirstInput()); |
} |
@@ -344,7 +406,7 @@ |
locs->set_temp(0, Location::RegisterLocation(RAX)); |
locs->set_temp(1, Location::RegisterLocation(RBX)); |
locs->set_temp(2, Location::RegisterLocation(R10)); |
- locs->set_out(Location::RegisterLocation(RAX)); |
+ locs->set_out(Location::RequiresRegister()); |
return locs; |
} |
@@ -353,7 +415,7 @@ |
ASSERT(locs()->temp(0).reg() == RAX); |
ASSERT(locs()->temp(1).reg() == RBX); |
ASSERT(locs()->temp(2).reg() == R10); |
- ASSERT(locs()->out().reg() == RAX); |
+ Register result = locs()->out().reg(); |
// Push the result place holder initialized to NULL. |
__ PushObject(Object::ZoneHandle()); |
@@ -370,13 +432,13 @@ |
try_index(), |
&StubCode::CallNativeCFunctionLabel(), |
PcDescriptors::kOther); |
- __ popq(RAX); |
+ __ popq(result); |
} |
LocationSummary* StoreIndexedComp::MakeLocationSummary() const { |
const intptr_t kNumInputs = 3; |
- return MakeSimpleLocationSummary(kNumInputs, Location::NoLocation()); |
+ return LocationSummary::Make(kNumInputs, Location::NoLocation()); |
} |
@@ -405,7 +467,7 @@ |
LocationSummary* InstanceSetterComp::MakeLocationSummary() const { |
const intptr_t kNumInputs = 2; |
- return MakeSimpleLocationSummary(kNumInputs, Location::RequiresRegister()); |
+ return LocationSummary::Make(kNumInputs, Location::RequiresRegister()); |
return NULL; |
} |
@@ -438,7 +500,7 @@ |
LocationSummary* StaticSetterComp::MakeLocationSummary() const { |
const intptr_t kNumInputs = 1; |
- return MakeSimpleLocationSummary(kNumInputs, Location::RequiresRegister()); |
+ return LocationSummary::Make(kNumInputs, Location::RequiresRegister()); |
} |
@@ -467,7 +529,7 @@ |
// reused for the result (but is not required to) because the input |
// is not used after the result is defined. We should consider adding |
// this information to the input policy. |
- return MakeSimpleLocationSummary(1, Location::RequiresRegister()); |
+ return LocationSummary::Make(1, Location::RequiresRegister()); |
} |
@@ -480,7 +542,7 @@ |
LocationSummary* StoreInstanceFieldComp::MakeLocationSummary() const { |
- return MakeSimpleLocationSummary(2, Location::RequiresRegister()); |
+ return LocationSummary::Make(2, Location::RequiresRegister()); |
} |
@@ -501,7 +563,7 @@ |
LocationSummary* LoadStaticFieldComp::MakeLocationSummary() const { |
- return MakeSimpleLocationSummary(0, Location::RequiresRegister()); |
+ return LocationSummary::Make(0, Location::RequiresRegister()); |
} |
@@ -532,7 +594,7 @@ |
LocationSummary* BooleanNegateComp::MakeLocationSummary() const { |
- return MakeSimpleLocationSummary(1, Location::RequiresRegister()); |
+ return LocationSummary::Make(1, Location::RequiresRegister()); |
} |
@@ -656,7 +718,7 @@ |
LocationSummary* AllocateObjectWithBoundsCheckComp:: |
MakeLocationSummary() const { |
- return MakeSimpleLocationSummary(2, Location::RequiresRegister()); |
+ return LocationSummary::Make(2, Location::RequiresRegister()); |
} |
@@ -685,7 +747,7 @@ |
LocationSummary* LoadVMFieldComp::MakeLocationSummary() const { |
- return MakeSimpleLocationSummary(1, Location::RequiresRegister()); |
+ return LocationSummary::Make(1, Location::RequiresRegister()); |
} |
@@ -698,7 +760,7 @@ |
LocationSummary* StoreVMFieldComp::MakeLocationSummary() const { |
- return MakeSimpleLocationSummary(2, Location::SameAsFirstInput()); |
+ return LocationSummary::Make(2, Location::SameAsFirstInput()); |
} |
@@ -926,7 +988,7 @@ |
LocationSummary* ChainContextComp::MakeLocationSummary() const { |
- return MakeSimpleLocationSummary(1, Location::NoLocation()); |
+ return LocationSummary::Make(1, Location::NoLocation()); |
} |
@@ -943,7 +1005,7 @@ |
LocationSummary* CloneContextComp::MakeLocationSummary() const { |
- return MakeSimpleLocationSummary(1, Location::RequiresRegister()); |
+ return LocationSummary::Make(1, Location::RequiresRegister()); |
} |
@@ -963,7 +1025,7 @@ |
LocationSummary* CatchEntryComp::MakeLocationSummary() const { |
- return MakeSimpleLocationSummary(0, Location::NoLocation()); |
+ return LocationSummary::Make(0, Location::NoLocation()); |
} |