Chromium Code Reviews| Index: src/ia32/lithium-codegen-ia32.h |
| diff --git a/src/ia32/lithium-codegen-ia32.h b/src/ia32/lithium-codegen-ia32.h |
| index 44ddaffcd41ab038c00db70110761f8d9bb5331e..84245450fbf71cbe6aab9b6bded74e896295d8d3 100644 |
| --- a/src/ia32/lithium-codegen-ia32.h |
| +++ b/src/ia32/lithium-codegen-ia32.h |
| @@ -55,6 +55,7 @@ class LCodeGen BASE_EMBEDDED { |
| current_instruction_(-1), |
| instructions_(chunk->instructions()), |
| deoptimizations_(4, info->zone()), |
| + jump_table_(4, info->zone()), |
| deoptimization_literals_(8, info->zone()), |
| inlined_function_count_(0), |
| scope_(info->scope()), |
| @@ -64,6 +65,7 @@ class LCodeGen BASE_EMBEDDED { |
| dynamic_frame_alignment_(false), |
| osr_pc_offset_(-1), |
| last_lazy_deopt_pc_(0), |
| + frame_is_built_(false), |
| safepoints_(info->zone()), |
| resolver_(this), |
| expected_safepoint_kind_(Safepoint::kSimple) { |
| @@ -78,10 +80,20 @@ 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. |
| Operand ToOperand(LOperand* op) const; |
| Register ToRegister(LOperand* op) const; |
| XMMRegister ToDoubleRegister(LOperand* op) const; |
| + bool IsX87TopOfStack(LOperand* op) const; |
| bool IsInteger32(LConstantOperand* op) const; |
| Immediate ToInteger32Immediate(LOperand* op) const { |
| @@ -90,6 +102,9 @@ class LCodeGen BASE_EMBEDDED { |
| Handle<Object> ToHandle(LConstantOperand* op) const; |
| + // A utility for instructions that return floating point values on X87. |
| + void HandleX87FPReturnValue(LInstruction* instr); |
| + |
| // The operand denoting the second word (the one with a higher address) of |
| // a double stack slot. |
| Operand HighOperand(LOperand* op); |
| @@ -122,7 +137,7 @@ class LCodeGen BASE_EMBEDDED { |
| Label* map_check); |
| void DoCheckMapCommon(Register reg, Handle<Map> map, |
| - CompareMapMode mode, LEnvironment* env); |
| + CompareMapMode mode, LInstruction* instr); |
| // Parallel move support. |
| void DoParallelMove(LParallelMove* move); |
| @@ -172,7 +187,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, ...); |
| @@ -184,9 +199,7 @@ class LCodeGen BASE_EMBEDDED { |
| bool GeneratePrologue(); |
| bool GenerateBody(); |
| bool GenerateDeferredCode(); |
| - // Pad the reloc info to ensure that we have enough space to patch during |
| - // deoptimization. |
| - bool GenerateRelocPadding(); |
| + bool GenerateJumpTable(); |
| bool GenerateSafepointTable(); |
| enum SafepointMode { |
| @@ -356,10 +369,23 @@ class LCodeGen BASE_EMBEDDED { |
| MacroAssembler* const masm_; |
| CompilationInfo* const info_; |
| + struct JumpTableEntry { |
| + 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), |
| + needs_frame(frame), |
| + is_lazy_deopt(is_lazy) { } |
| + Label label; |
| + Address address; |
| + bool needs_frame; |
| + bool is_lazy_deopt; |
| + }; |
| + |
| int current_block_; |
| int current_instruction_; |
| const ZoneList<LInstruction*>* instructions_; |
| ZoneList<LEnvironment*> deoptimizations_; |
| + ZoneList<JumpTableEntry> jump_table_; |
| ZoneList<Handle<Object> > deoptimization_literals_; |
| int inlined_function_count_; |
| Scope* const scope_; |
| @@ -369,6 +395,7 @@ class LCodeGen BASE_EMBEDDED { |
| bool dynamic_frame_alignment_; |
| 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. |
| @@ -386,6 +413,7 @@ class LCodeGen BASE_EMBEDDED { |
| ASSERT(codegen_->expected_safepoint_kind_ == Safepoint::kSimple); |
| codegen_->masm_->PushSafepointRegisters(); |
| codegen_->expected_safepoint_kind_ = Safepoint::kWithRegisters; |
| + ASSERT(codegen_->info()->is_calling()); |
| } |
| ~PushSafepointRegistersScope() { |