Index: src/x64/lithium-x64.h |
=================================================================== |
--- src/x64/lithium-x64.h (revision 6167) |
+++ src/x64/lithium-x64.h (working copy) |
@@ -66,12 +66,19 @@ |
} |
virtual void PrintTo(StringStream* stream) const { UNIMPLEMENTED(); } |
+ |
+ private: |
+ SetOncePointer<LEnvironment> environment_; |
+ SetOncePointer<LPointerMap> pointer_map_; |
+ SetOncePointer<LOperand> result_; |
+ HValue* hydrogen_value_; |
+ SetOncePointer<LEnvironment> deoptimization_environment_; |
}; |
class LParallelMove : public ZoneObject { |
public: |
- LParallelMove() { } |
+ LParallelMove() : move_operands_(4) { } |
void AddMove(LOperand* from, LOperand* to) { |
UNIMPLEMENTED(); |
@@ -81,6 +88,9 @@ |
UNIMPLEMENTED(); |
return NULL; |
} |
+ |
+ private: |
+ ZoneList<LMoveOperands> move_operands_; |
}; |
@@ -111,12 +121,20 @@ |
UNIMPLEMENTED(); |
return NULL; |
} |
+ |
+ private: |
+ LParallelMove* parallel_moves_[LAST_INNER_POSITION + 1]; |
+ HBasicBlock* block_; |
}; |
class LLabel: public LGap { |
public: |
explicit LLabel(HBasicBlock* block) : LGap(block) { } |
+ |
+ private: |
+ Label label_; |
+ LLabel* replacement_; |
}; |
@@ -144,12 +162,21 @@ |
LOperand* spill_operand) { |
UNIMPLEMENTED(); |
} |
+ |
+ private: |
+ // Arrays of spill slot operands for registers with an assigned spill |
+ // slot, i.e., that must also be restored to the spill slot on OSR entry. |
+ // NULL if the register has no assigned spill slot. Indexed by allocation |
+ // index. |
+ LOperand* register_spills_[Register::kNumAllocatableRegisters]; |
+ LOperand* double_register_spills_[DoubleRegister::kNumAllocatableRegisters]; |
}; |
class LPointerMap: public ZoneObject { |
public: |
- explicit LPointerMap(int position) { } |
+ explicit LPointerMap(int position) |
+ : pointer_operands_(8), position_(position), lithium_position_(-1) { } |
int lithium_position() const { |
UNIMPLEMENTED(); |
@@ -157,23 +184,82 @@ |
} |
void RecordPointer(LOperand* op) { UNIMPLEMENTED(); } |
+ |
+ private: |
+ ZoneList<LOperand*> pointer_operands_; |
+ int position_; |
+ int lithium_position_; |
}; |
+class LEnvironment: public ZoneObject { |
+ public: |
+ LEnvironment(Handle<JSFunction> closure, |
+ int ast_id, |
+ int parameter_count, |
+ int argument_count, |
+ int value_count, |
+ LEnvironment* outer) |
+ : closure_(closure), |
+ arguments_stack_height_(argument_count), |
+ deoptimization_index_(Safepoint::kNoDeoptimizationIndex), |
+ translation_index_(-1), |
+ ast_id_(ast_id), |
+ parameter_count_(parameter_count), |
+ values_(value_count), |
+ representations_(value_count), |
+ spilled_registers_(NULL), |
+ spilled_double_registers_(NULL), |
+ outer_(outer) { |
+ } |
+ |
+ Handle<JSFunction> closure() const { return closure_; } |
+ int arguments_stack_height() const { return arguments_stack_height_; } |
+ int deoptimization_index() const { return deoptimization_index_; } |
+ int translation_index() const { return translation_index_; } |
+ int ast_id() const { return ast_id_; } |
+ int parameter_count() const { return parameter_count_; } |
+ const ZoneList<LOperand*>* values() const { return &values_; } |
+ LEnvironment* outer() const { return outer_; } |
+ |
+ private: |
+ Handle<JSFunction> closure_; |
+ int arguments_stack_height_; |
+ int deoptimization_index_; |
+ int translation_index_; |
+ int ast_id_; |
+ int parameter_count_; |
+ ZoneList<LOperand*> values_; |
+ ZoneList<Representation> representations_; |
+ |
+ // Allocation index indexed arrays of spill slot operands for registers |
+ // that are also in spill slots at an OSR entry. NULL for environments |
+ // that do not correspond to an OSR entry. |
+ LOperand** spilled_registers_; |
+ LOperand** spilled_double_registers_; |
+ |
+ LEnvironment* outer_; |
+}; |
+ |
+ |
+class LChunkBuilder; |
class LChunk: public ZoneObject { |
public: |
- explicit LChunk(HGraph* graph) { } |
+ explicit LChunk(HGraph* graph) |
+ : spill_slot_count_(0), |
+ graph_(graph), |
+ instructions_(32), |
+ pointer_maps_(8), |
+ inlined_closures_(1) { } |
- HGraph* graph() const { |
- UNIMPLEMENTED(); |
- return NULL; |
+ int spill_slot_count() const { return spill_slot_count_; } |
+ HGraph* graph() const { return graph_; } |
+ const ZoneList<LInstruction*>* instructions() const { return &instructions_; } |
+ const ZoneList<LPointerMap*>* pointer_maps() const { return &pointer_maps_; } |
+ const ZoneList<Handle<JSFunction> >* inlined_closures() const { |
+ return &inlined_closures_; |
} |
- const ZoneList<LPointerMap*>* pointer_maps() const { |
- UNIMPLEMENTED(); |
- return NULL; |
- } |
- |
LOperand* GetNextSpillSlot(bool double_slot) { |
UNIMPLEMENTED(); |
return NULL; |
@@ -189,11 +275,6 @@ |
return NULL; |
} |
- const ZoneList<LInstruction*>* instructions() const { |
- UNIMPLEMENTED(); |
- return NULL; |
- } |
- |
int GetParameterStackSlot(int index) const { |
UNIMPLEMENTED(); |
return 0; |
@@ -219,20 +300,35 @@ |
void MarkEmptyBlocks() { UNIMPLEMENTED(); } |
#ifdef DEBUG |
- void Verify() { UNIMPLEMENTED(); } |
+ void Verify() { } |
#endif |
+ |
+ private: |
+ int spill_slot_count_; |
+ HGraph* const graph_; |
+ ZoneList<LInstruction*> instructions_; |
+ ZoneList<LPointerMap*> pointer_maps_; |
+ ZoneList<Handle<JSFunction> > inlined_closures_; |
}; |
class LChunkBuilder BASE_EMBEDDED { |
public: |
- LChunkBuilder(HGraph* graph, LAllocator* allocator) { } |
+ LChunkBuilder(HGraph* graph, LAllocator* allocator) |
+ : chunk_(NULL), |
+ graph_(graph), |
+ status_(UNUSED), |
+ current_instruction_(NULL), |
+ current_block_(NULL), |
+ next_block_(NULL), |
+ argument_count_(0), |
+ allocator_(allocator), |
+ position_(RelocInfo::kNoPosition), |
+ instructions_pending_deoptimization_environment_(NULL), |
+ pending_deoptimization_ast_id_(AstNode::kNoNumber) { } |
// Build the sequence for the graph. |
- LChunk* Build() { |
- UNIMPLEMENTED(); |
- return NULL; |
- }; |
+ LChunk* Build(); |
// Declare methods that deal with the individual node types. |
#define DECLARE_DO(type) LInstruction* Do##type(H##type* node) { \ |
@@ -242,6 +338,38 @@ |
HYDROGEN_CONCRETE_INSTRUCTION_LIST(DECLARE_DO) |
#undef DECLARE_DO |
+ private: |
+ enum Status { |
+ UNUSED, |
+ BUILDING, |
+ DONE, |
+ ABORTED |
+ }; |
+ |
+ LChunk* chunk() const { return chunk_; } |
+ HGraph* graph() const { return graph_; } |
+ |
+ bool is_unused() const { return status_ == UNUSED; } |
+ bool is_building() const { return status_ == BUILDING; } |
+ bool is_done() const { return status_ == DONE; } |
+ bool is_aborted() const { return status_ == ABORTED; } |
+ |
+ void Abort(const char* format, ...); |
+ |
+ void DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block); |
+ |
+ LChunk* chunk_; |
+ HGraph* const graph_; |
+ Status status_; |
+ HInstruction* current_instruction_; |
+ HBasicBlock* current_block_; |
+ HBasicBlock* next_block_; |
+ int argument_count_; |
+ LAllocator* allocator_; |
+ int position_; |
+ LInstruction* instructions_pending_deoptimization_environment_; |
+ int pending_deoptimization_ast_id_; |
+ |
DISALLOW_COPY_AND_ASSIGN(LChunkBuilder); |
}; |