Reviewers: Kasper Lund, Description: Experimental: defer the per-function and per-loop calls to the runtime on a failed stack check.
Please review this at http://codereview.chromium.org/18661 SVN Base: http://v8.googlecode.com/svn/branches/experimental/toiger/ Affected files: M src/codegen-ia32.cc Index: src/codegen-ia32.cc =================================================================== --- src/codegen-ia32.cc (revision 1127) +++ src/codegen-ia32.cc (working copy) @@ -1327,19 +1327,36 @@ } +class DeferredStackCheck: public DeferredCode { + public: + DeferredStackCheck(CodeGenerator* generator) + : DeferredCode(generator) { + set_comment("[ DeferredStackCheck"); + } + + virtual void Generate(); +}; + + +void DeferredStackCheck::Generate() { + StackCheckStub stub; + enter()->Bind(); + // The stack check can trigger the debugger. Before calling it, all + // values including constants must be spilled to the frame. + generator()->frame()->SpillAll(); + Result ignored = generator()->frame()->CallStub(&stub, 0); + exit()->Jump(); +} + + void CodeGenerator::CheckStack() { if (FLAG_check_stack) { - JumpTarget stack_is_ok(this); - StackCheckStub stub; + DeferredStackCheck* deferred = new DeferredStackCheck(this); ExternalReference stack_guard_limit = ExternalReference::address_of_stack_guard_limit(); __ cmp(esp, Operand::StaticVariable(stack_guard_limit)); - stack_is_ok.Branch(above_equal, taken); - // The stack check can trigger the debugger. Before calling it, all - // values including constants must be spilled to the frame. - frame_->SpillAll(); - frame_->CallStub(&stub, 0); - stack_is_ok.Bind(); + deferred->enter()->Branch(below, not_taken); + deferred->exit()->Bind(); } } @@ -2765,7 +2782,7 @@ public: DeferredRegExpLiteral(CodeGenerator* generator, RegExpLiteral* node) : DeferredCode(generator), node_(node) { - set_comment("[ RegExpDeferred"); + set_comment("[ DeferredRegExpLiteral"); } virtual void Generate(); private: @@ -2834,7 +2851,7 @@ DeferredObjectLiteral(CodeGenerator* generator, ObjectLiteral* node) : DeferredCode(generator), node_(node) { - set_comment("[ ObjectLiteralDeferred"); + set_comment("[ DeferredObjectLiteral"); } virtual void Generate(); private: @@ -3771,7 +3788,7 @@ is_postfix_(is_postfix), is_increment_(is_increment), result_offset_(result_offset) { - set_comment("[ CountOperationDeferred"); + set_comment("[ DeferredCountOperation"); } virtual void Generate(); --~--~---------~--~----~------------~-------~--~----~ v8-dev mailing list [email protected] http://groups.google.com/group/v8-dev -~----------~----~----~----~------~----~------~--~---
