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

Unified Diff: runtime/vm/intermediate_language_x64.cc

Issue 10458050: Move ReturnInstr to new scheme (x64 and ia32) and implement more code in new ia32 compiler. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 7 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/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, &not_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(&not_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());
}

Powered by Google App Engine
This is Rietveld 408576698