| Index: src/x64/lithium-x64.h
|
| diff --git a/src/x64/lithium-x64.h b/src/x64/lithium-x64.h
|
| index f66ec1689c98e8a44476b066be849c1f28ea33d6..fcab235662627239af24725203a81811de83ee95 100644
|
| --- a/src/x64/lithium-x64.h
|
| +++ b/src/x64/lithium-x64.h
|
| @@ -1,4 +1,4 @@
|
| -// Copyright 2010 the V8 project authors. All rights reserved.
|
| +// Copyright 2011 the V8 project authors. All rights reserved.
|
| // Redistribution and use in source and binary forms, with or without
|
| // modification, are permitted provided that the following conditions are
|
| // met:
|
| @@ -30,6 +30,7 @@
|
|
|
| #include "hydrogen.h"
|
| #include "lithium-allocator.h"
|
| +#include "lithium.h"
|
| #include "safepoint-table.h"
|
|
|
| namespace v8 {
|
| @@ -45,6 +46,9 @@ class LInstruction: public ZoneObject {
|
| LInstruction() { }
|
| virtual ~LInstruction() { }
|
|
|
| + virtual void PrintTo(StringStream* stream) const { UNIMPLEMENTED(); }
|
| + virtual void PrintDataTo(StringStream* stream) const { }
|
| +
|
| // Predicates should be generated by macro as in lithium-ia32.h.
|
| virtual bool IsLabel() const {
|
| UNIMPLEMENTED();
|
| @@ -55,23 +59,43 @@ class LInstruction: public ZoneObject {
|
| return false;
|
| }
|
|
|
| - LPointerMap* pointer_map() const {
|
| - UNIMPLEMENTED();
|
| - return NULL;
|
| - }
|
| + void set_environment(LEnvironment* env) { environment_.set(env); }
|
| + LEnvironment* environment() const { return environment_.get(); }
|
| + bool HasEnvironment() const { return environment_.is_set(); }
|
|
|
| - bool HasPointerMap() const {
|
| - UNIMPLEMENTED();
|
| - return false;
|
| + void set_pointer_map(LPointerMap* p) { pointer_map_.set(p); }
|
| + LPointerMap* pointer_map() const { return pointer_map_.get(); }
|
| + bool HasPointerMap() const { return pointer_map_.is_set(); }
|
| +
|
| + void set_result(LOperand* operand) { result_.set(operand); }
|
| + LOperand* result() const { return result_.get(); }
|
| + bool HasResult() const { return result_.is_set(); }
|
| +
|
| + void set_hydrogen_value(HValue* value) { hydrogen_value_ = value; }
|
| + HValue* hydrogen_value() const { return hydrogen_value_; }
|
| +
|
| + void set_deoptimization_environment(LEnvironment* env) {
|
| + deoptimization_environment_.set(env);
|
| + }
|
| + LEnvironment* deoptimization_environment() const {
|
| + return deoptimization_environment_.get();
|
| + }
|
| + bool HasDeoptimizationEnvironment() const {
|
| + return deoptimization_environment_.is_set();
|
| }
|
|
|
| - 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 +105,9 @@ class LParallelMove : public ZoneObject {
|
| UNIMPLEMENTED();
|
| return NULL;
|
| }
|
| +
|
| + private:
|
| + ZoneList<LMoveOperands> move_operands_;
|
| };
|
|
|
|
|
| @@ -111,12 +138,20 @@ class LGap: public LInstruction {
|
| 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 +179,21 @@ class LOsrEntry: public LInstruction {
|
| 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,21 +201,80 @@ class LPointerMap: public ZoneObject {
|
| }
|
|
|
| void RecordPointer(LOperand* op) { UNIMPLEMENTED(); }
|
| +
|
| + private:
|
| + ZoneList<LOperand*> pointer_operands_;
|
| + int position_;
|
| + int lithium_position_;
|
| };
|
|
|
|
|
| -class LChunk: public ZoneObject {
|
| +class LEnvironment: public ZoneObject {
|
| public:
|
| - explicit LChunk(HGraph* graph) { }
|
| -
|
| - HGraph* graph() const {
|
| - UNIMPLEMENTED();
|
| - return NULL;
|
| + 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) {
|
| }
|
|
|
| - const ZoneList<LPointerMap*>* pointer_maps() const {
|
| - UNIMPLEMENTED();
|
| - return NULL;
|
| + 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)
|
| + : spill_slot_count_(0),
|
| + graph_(graph),
|
| + instructions_(32),
|
| + pointer_maps_(8),
|
| + inlined_closures_(1) { }
|
| +
|
| + 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_;
|
| }
|
|
|
| LOperand* GetNextSpillSlot(bool double_slot) {
|
| @@ -189,11 +292,6 @@ class LChunk: public ZoneObject {
|
| return NULL;
|
| }
|
|
|
| - const ZoneList<LInstruction*>* instructions() const {
|
| - UNIMPLEMENTED();
|
| - return NULL;
|
| - }
|
| -
|
| int GetParameterStackSlot(int index) const {
|
| UNIMPLEMENTED();
|
| return 0;
|
| @@ -219,20 +317,35 @@ class LChunk: public ZoneObject {
|
| 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 +355,38 @@ class LChunkBuilder BASE_EMBEDDED {
|
| 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);
|
| };
|
|
|
|
|