Chromium Code Reviews| Index: src/arm/lithium-codegen-arm.h |
| diff --git a/src/arm/lithium-codegen-arm.h b/src/arm/lithium-codegen-arm.h |
| index 921285b0d228c8d023038e2422e9772d735135b3..a7ee7c6e8137899889b78e85d5e80fafe1ae062c 100644 |
| --- a/src/arm/lithium-codegen-arm.h |
| +++ b/src/arm/lithium-codegen-arm.h |
| @@ -61,6 +61,7 @@ class LCodeGen BASE_EMBEDDED { |
| deferred_(8, info->zone()), |
| osr_pc_offset_(-1), |
| last_lazy_deopt_pc_(0), |
| + frame_is_built_(false), |
| safepoints_(info->zone()), |
| resolver_(this), |
| expected_safepoint_kind_(Safepoint::kSimple) { |
| @@ -76,6 +77,15 @@ class LCodeGen BASE_EMBEDDED { |
| Heap* heap() const { return isolate()->heap(); } |
| Zone* zone() const { return zone_; } |
| + bool NeedsEagerFrame() const { |
| + return GetStackSlotCount() > 0 || |
| + info()->is_non_deferred_calling() || |
| + !info()->IsStub(); |
| + } |
| + bool NeedsDeferredFrame() const { |
| + return !NeedsEagerFrame() && info()->is_deferred_calling(); |
| + } |
| + |
| // Support for converting LOperands to assembler types. |
| // LOperand must be a register. |
| Register ToRegister(LOperand* op) const; |
| @@ -84,12 +94,12 @@ class LCodeGen BASE_EMBEDDED { |
| Register EmitLoadRegister(LOperand* op, Register scratch); |
| // LOperand must be a double register. |
| - DoubleRegister ToDoubleRegister(LOperand* op) const; |
| + DwVfpRegister ToDoubleRegister(LOperand* op) const; |
| // LOperand is loaded into dbl_scratch, unless already a double register. |
| - DoubleRegister EmitLoadDoubleRegister(LOperand* op, |
| - SwVfpRegister flt_scratch, |
| - DoubleRegister dbl_scratch); |
| + DwVfpRegister EmitLoadDoubleRegister(LOperand* op, |
| + SwVfpRegister flt_scratch, |
| + DwVfpRegister dbl_scratch); |
| int ToInteger32(LConstantOperand* op) const; |
| double ToDouble(LConstantOperand* op) const; |
| Operand ToOperand(LOperand* op); |
| @@ -193,7 +203,7 @@ class LCodeGen BASE_EMBEDDED { |
| Register temporary2); |
| int GetStackSlotCount() const { return chunk()->spill_slot_count(); } |
| - int GetParameterCount() const { return scope()->num_parameters(); } |
| + int GetParameterCount() const { return info()->num_parameters(); } |
| void Abort(const char* reason); |
| void Comment(const char* format, ...); |
| @@ -275,7 +285,7 @@ class LCodeGen BASE_EMBEDDED { |
| void PopulateDeoptimizationLiteralsWithInlinedFunctions(); |
| Register ToRegister(int index) const; |
| - DoubleRegister ToDoubleRegister(int index) const; |
| + DwVfpRegister ToDoubleRegister(int index) const; |
| // Specific math operations - used from DoUnaryMathOperation. |
| void EmitIntegerMathAbs(LUnaryMathOperation* instr); |
| @@ -308,7 +318,7 @@ class LCodeGen BASE_EMBEDDED { |
| void EmitGoto(int block); |
| void EmitBranch(int left_block, int right_block, Condition cc); |
| void EmitNumberUntagD(Register input, |
| - DoubleRegister result, |
| + DwVfpRegister result, |
| bool deoptimize_on_undefined, |
| bool deoptimize_on_minus_zero, |
| LEnvironment* env); |
| @@ -369,11 +379,15 @@ class LCodeGen BASE_EMBEDDED { |
| LEnvironment* environment); |
| struct JumpTableEntry { |
| - explicit inline JumpTableEntry(Address entry) |
| + explicit inline JumpTableEntry(Address entry, bool frame, bool is_lazy) |
|
Jakob Kummerow
2012/11/28 16:28:22
nit: no need for "explicit"
danno
2012/11/30 16:23:24
Done.
|
| : label(), |
| - address(entry) { } |
| + address(entry), |
| + needs_frame(frame), |
| + is_lazy_deopt(is_lazy) { } |
| Label label; |
| Address address; |
| + bool needs_frame; |
| + bool is_lazy_deopt; |
| }; |
| void EnsureSpaceForLazyDeopt(); |
| @@ -402,6 +416,7 @@ class LCodeGen BASE_EMBEDDED { |
| ZoneList<LDeferredCode*> deferred_; |
| int osr_pc_offset_; |
| int last_lazy_deopt_pc_; |
| + bool frame_is_built_; |
| // Builder that keeps track of safepoints in the code. The table |
| // itself is emitted at the end of the generated code. |
| @@ -417,6 +432,7 @@ class LCodeGen BASE_EMBEDDED { |
| PushSafepointRegistersScope(LCodeGen* codegen, |
| Safepoint::Kind kind) |
| : codegen_(codegen) { |
| + ASSERT(codegen_->info()->is_calling()); |
| ASSERT(codegen_->expected_safepoint_kind_ == Safepoint::kSimple); |
| codegen_->expected_safepoint_kind_ = kind; |