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()); |
+ } |
} |