| Index: src/arm/lithium-codegen-arm.cc
|
| diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc
|
| index 04712dc3e4e90a2f1cbf62badfc721a4f6cde7fa..f5800f22468dd0c559e9bf5c248c9fd5e1bc0158 100644
|
| --- a/src/arm/lithium-codegen-arm.cc
|
| +++ b/src/arm/lithium-codegen-arm.cc
|
| @@ -1589,45 +1589,17 @@ void LCodeGen::DoBranch(LBranch* instr) {
|
| }
|
|
|
|
|
| -void LCodeGen::EmitGoto(int block, LDeferredCode* deferred_stack_check) {
|
| +void LCodeGen::EmitGoto(int block) {
|
| block = chunk_->LookupDestination(block);
|
| int next_block = GetNextEmittedBlock(current_block_);
|
| if (block != next_block) {
|
| - // Perform stack overflow check if this goto needs it before jumping.
|
| - if (deferred_stack_check != NULL) {
|
| - __ LoadRoot(ip, Heap::kStackLimitRootIndex);
|
| - __ cmp(sp, Operand(ip));
|
| - __ b(hs, chunk_->GetAssemblyLabel(block));
|
| - __ jmp(deferred_stack_check->entry());
|
| - deferred_stack_check->SetExit(chunk_->GetAssemblyLabel(block));
|
| - } else {
|
| - __ jmp(chunk_->GetAssemblyLabel(block));
|
| - }
|
| + __ jmp(chunk_->GetAssemblyLabel(block));
|
| }
|
| }
|
|
|
|
|
| -void LCodeGen::DoDeferredStackCheck(LGoto* instr) {
|
| - PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters);
|
| - CallRuntimeFromDeferred(Runtime::kStackGuard, 0, instr);
|
| -}
|
| -
|
| -
|
| void LCodeGen::DoGoto(LGoto* instr) {
|
| - class DeferredStackCheck: public LDeferredCode {
|
| - public:
|
| - DeferredStackCheck(LCodeGen* codegen, LGoto* instr)
|
| - : LDeferredCode(codegen), instr_(instr) { }
|
| - virtual void Generate() { codegen()->DoDeferredStackCheck(instr_); }
|
| - private:
|
| - LGoto* instr_;
|
| - };
|
| -
|
| - DeferredStackCheck* deferred = NULL;
|
| - if (instr->include_stack_check()) {
|
| - deferred = new DeferredStackCheck(this, instr);
|
| - }
|
| - EmitGoto(instr->block_id(), deferred);
|
| + EmitGoto(instr->block_id());
|
| }
|
|
|
|
|
| @@ -4597,15 +4569,42 @@ void LCodeGen::DoIn(LIn* instr) {
|
| }
|
|
|
|
|
| +void LCodeGen::DoDeferredStackCheck(LStackCheck* instr) {
|
| + PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters);
|
| + CallRuntimeFromDeferred(Runtime::kStackGuard, 0, instr);
|
| +}
|
| +
|
| +
|
| void LCodeGen::DoStackCheck(LStackCheck* instr) {
|
| - // Perform stack overflow check.
|
| - Label ok;
|
| - __ LoadRoot(ip, Heap::kStackLimitRootIndex);
|
| - __ cmp(sp, Operand(ip));
|
| - __ b(hs, &ok);
|
| - StackCheckStub stub;
|
| - CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
|
| - __ bind(&ok);
|
| + class DeferredStackCheck: public LDeferredCode {
|
| + public:
|
| + DeferredStackCheck(LCodeGen* codegen, LStackCheck* instr)
|
| + : LDeferredCode(codegen), instr_(instr) { }
|
| + virtual void Generate() { codegen()->DoDeferredStackCheck(instr_); }
|
| + private:
|
| + LStackCheck* instr_;
|
| + };
|
| +
|
| + if (instr->hydrogen()->is_function_entry()) {
|
| + // Perform stack overflow check.
|
| + Label done;
|
| + __ LoadRoot(ip, Heap::kStackLimitRootIndex);
|
| + __ cmp(sp, Operand(ip));
|
| + __ b(hs, &done);
|
| + StackCheckStub stub;
|
| + CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
|
| + __ bind(&done);
|
| + } else {
|
| + ASSERT(instr->hydrogen()->is_backwards_branch());
|
| + // Perform stack overflow check if this goto needs it before jumping.
|
| + DeferredStackCheck* deferred_stack_check =
|
| + new DeferredStackCheck(this, instr);
|
| + __ LoadRoot(ip, Heap::kStackLimitRootIndex);
|
| + __ cmp(sp, Operand(ip));
|
| + __ b(lo, deferred_stack_check->entry());
|
| + __ bind(instr->done_label());
|
| + deferred_stack_check->SetExit(instr->done_label());
|
| + }
|
| }
|
|
|
|
|
|
|