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

Unified Diff: runtime/vm/intermediate_language_ia32.cc

Issue 10823308: Implement basic support for deferred slow path code with calls that save and restore live registers. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: address Kevin's comments Created 8 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
Index: runtime/vm/intermediate_language_ia32.cc
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index 40023e2502224c9ad651f39a768c7659e5fff81e..dbca3a3382435c175d9adebee98150d3888cdba1 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -1429,24 +1429,44 @@ void CatchEntryComp::EmitNativeCode(FlowGraphCompiler* compiler) {
LocationSummary* CheckStackOverflowComp::MakeLocationSummary() const {
const intptr_t kNumInputs = 0;
const intptr_t kNumTemps = 0;
- // TODO(vegorov): spilling is required only on an infrequently executed path.
LocationSummary* summary =
- new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+ new LocationSummary(kNumInputs,
+ kNumTemps,
+ LocationSummary::kCallOnSlowPath);
return summary;
}
+class CheckStackOverflowSlowPath : public SlowPathCode {
+ public:
+ explicit CheckStackOverflowSlowPath(CheckStackOverflowComp* computation)
+ : computation_(computation) { }
+
+ virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
+ __ Bind(entry_label());
+ compiler->SaveLiveRegisters(computation_->locs());
+ compiler->GenerateCallRuntime(computation_->deopt_id(),
+ computation_->token_pos(),
+ computation_->try_index(),
+ kStackOverflowRuntimeEntry,
+ computation_->locs()->stack_bitmap());
+ compiler->RestoreLiveRegisters(computation_->locs());
+ __ jmp(exit_label());
+ }
+
+ private:
+ CheckStackOverflowComp* computation_;
+};
+
+
void CheckStackOverflowComp::EmitNativeCode(FlowGraphCompiler* compiler) {
+ CheckStackOverflowSlowPath* slow_path = new CheckStackOverflowSlowPath(this);
+ compiler->AddSlowPathCode(slow_path);
+
__ cmpl(ESP,
Address::Absolute(Isolate::Current()->stack_limit_address()));
- Label no_stack_overflow;
- __ j(ABOVE, &no_stack_overflow);
- compiler->GenerateCallRuntime(deopt_id(),
- token_pos(),
- try_index(),
- kStackOverflowRuntimeEntry,
- locs()->stack_bitmap());
- __ Bind(&no_stack_overflow);
+ __ j(BELOW_EQUAL, slow_path->entry_label());
+ __ Bind(slow_path->exit_label());
}

Powered by Google App Engine
This is Rietveld 408576698