| 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..e7afcbf1bbc675f86b59b364581ee88dc8025e0d 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)
|
| + inline JumpTableEntry(Address entry, bool frame, bool is_lazy)
|
| : 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;
|
|
|
|
|