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

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
« no previous file with comments | « runtime/vm/intermediate_language_ia32.cc ('k') | runtime/vm/locations.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/intermediate_language_x64.cc
===================================================================
--- runtime/vm/intermediate_language_x64.cc (revision 8165)
+++ runtime/vm/intermediate_language_x64.cc (working copy)
@@ -16,18 +16,10 @@
namespace dart {
+DECLARE_FLAG(bool, optimization_counter_threshold);
+DECLARE_FLAG(bool, trace_functions);
-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());
- }
- summary->set_out(out);
- return summary;
-}
-
// True iff. the arguments to a call will be properly pushed and can
// be popped after the call.
template <typename T> static bool VerifyCallComputation(T* comp) {
@@ -126,8 +118,77 @@
}
+LocationSummary* ReturnInstr::MakeLocationSummary() const {
+ const intptr_t kNumInputs = 1;
+ const intptr_t kNumTemps = 1;
+ LocationSummary* locs = new LocationSummary(kNumInputs, kNumTemps);
+ locs->set_in(0, Location::RegisterLocation(RAX));
+ locs->set_temp(0, Location::RequiresRegister());
+ 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());
}
@@ -150,7 +211,7 @@
LocationSummary* StrictCompareComp::MakeLocationSummary() const {
- return MakeSimpleLocationSummary(2, Location::SameAsFirstInput());
+ return LocationSummary::Make(2, Location::SameAsFirstInput());
}
@@ -247,7 +308,7 @@
LocationSummary* LoadLocalComp::MakeLocationSummary() const {
- return MakeSimpleLocationSummary(0, Location::RequiresRegister());
+ return LocationSummary::Make(0, Location::RequiresRegister());
}
@@ -258,7 +319,7 @@
LocationSummary* StoreLocalComp::MakeLocationSummary() const {
- return MakeSimpleLocationSummary(1, Location::SameAsFirstInput());
+ return LocationSummary::Make(1, Location::SameAsFirstInput());
}
@@ -271,7 +332,7 @@
LocationSummary* ConstantVal::MakeLocationSummary() const {
- return MakeSimpleLocationSummary(0, Location::RequiresRegister());
+ return LocationSummary::Make(0, Location::RequiresRegister());
}
@@ -321,7 +382,7 @@
LocationSummary* AssertBooleanComp::MakeLocationSummary() const {
- return MakeSimpleLocationSummary(1, Location::SameAsFirstInput());
+ return LocationSummary::Make(1, Location::SameAsFirstInput());
}
@@ -407,7 +468,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;
}
@@ -416,7 +477,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());
@@ -433,13 +494,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());
}
@@ -468,7 +529,7 @@
LocationSummary* InstanceSetterComp::MakeLocationSummary() const {
const intptr_t kNumInputs = 2;
- return MakeSimpleLocationSummary(kNumInputs, Location::RequiresRegister());
+ return LocationSummary::Make(kNumInputs, Location::RequiresRegister());
return NULL;
}
@@ -501,7 +562,7 @@
LocationSummary* StaticSetterComp::MakeLocationSummary() const {
const intptr_t kNumInputs = 1;
- return MakeSimpleLocationSummary(kNumInputs, Location::RequiresRegister());
+ return LocationSummary::Make(kNumInputs, Location::RequiresRegister());
}
@@ -530,7 +591,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());
}
@@ -543,7 +604,7 @@
LocationSummary* StoreInstanceFieldComp::MakeLocationSummary() const {
- return MakeSimpleLocationSummary(2, Location::RequiresRegister());
+ return LocationSummary::Make(2, Location::RequiresRegister());
}
@@ -564,7 +625,7 @@
LocationSummary* LoadStaticFieldComp::MakeLocationSummary() const {
- return MakeSimpleLocationSummary(0, Location::RequiresRegister());
+ return LocationSummary::Make(0, Location::RequiresRegister());
}
@@ -595,7 +656,7 @@
LocationSummary* BooleanNegateComp::MakeLocationSummary() const {
- return MakeSimpleLocationSummary(1, Location::RequiresRegister());
+ return LocationSummary::Make(1, Location::RequiresRegister());
}
@@ -710,7 +771,7 @@
LocationSummary* AllocateObjectWithBoundsCheckComp::
MakeLocationSummary() const {
- return MakeSimpleLocationSummary(2, Location::RequiresRegister());
+ return LocationSummary::Make(2, Location::RequiresRegister());
}
@@ -739,7 +800,7 @@
LocationSummary* LoadVMFieldComp::MakeLocationSummary() const {
- return MakeSimpleLocationSummary(1, Location::RequiresRegister());
+ return LocationSummary::Make(1, Location::RequiresRegister());
}
@@ -752,7 +813,7 @@
LocationSummary* StoreVMFieldComp::MakeLocationSummary() const {
- return MakeSimpleLocationSummary(2, Location::SameAsFirstInput());
+ return LocationSummary::Make(2, Location::SameAsFirstInput());
}
@@ -970,7 +1031,7 @@
LocationSummary* ChainContextComp::MakeLocationSummary() const {
- return MakeSimpleLocationSummary(1, Location::NoLocation());
+ return LocationSummary::Make(1, Location::NoLocation());
}
@@ -987,7 +1048,7 @@
LocationSummary* CloneContextComp::MakeLocationSummary() const {
- return MakeSimpleLocationSummary(1, Location::RequiresRegister());
+ return LocationSummary::Make(1, Location::RequiresRegister());
}
@@ -1007,7 +1068,7 @@
LocationSummary* CatchEntryComp::MakeLocationSummary() const {
- return MakeSimpleLocationSummary(0, Location::NoLocation());
+ return LocationSummary::Make(0, Location::NoLocation());
}
« no previous file with comments | « runtime/vm/intermediate_language_ia32.cc ('k') | runtime/vm/locations.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698