| Index: src/lithium-allocator.h
|
| diff --git a/src/lithium-allocator.h b/src/lithium-allocator.h
|
| index 52fee6455f9df96fcc141f417ec0b98313daa92e..3ec984e262f9e397801f98bbfcb11430d2b3f4b1 100644
|
| --- a/src/lithium-allocator.h
|
| +++ b/src/lithium-allocator.h
|
| @@ -55,6 +55,7 @@ class LPointerMap;
|
| class LStackSlot;
|
| class LRegister;
|
|
|
| +
|
| // This class represents a single point of a LOperand's lifetime.
|
| // For each lithium instruction there are exactly two lifetime positions:
|
| // the beginning and the end of the instruction. Lifetime positions for
|
| @@ -121,7 +122,13 @@ class LifetimePosition {
|
| // instruction.
|
| bool IsValid() const { return value_ != -1; }
|
|
|
| - static LifetimePosition Invalid() { return LifetimePosition(); }
|
| + static inline LifetimePosition Invalid() { return LifetimePosition(); }
|
| +
|
| + static inline LifetimePosition MaxPosition() {
|
| + // We have to use this kind of getter instead of static member due to
|
| + // crash bug in GDB.
|
| + return LifetimePosition(kMaxInt);
|
| + }
|
|
|
| private:
|
| static const int kStep = 2;
|
| @@ -135,6 +142,13 @@ class LifetimePosition {
|
| };
|
|
|
|
|
| +enum RegisterKind {
|
| + NONE,
|
| + GENERAL_REGISTERS,
|
| + DOUBLE_REGISTERS
|
| +};
|
| +
|
| +
|
| class LOperand: public ZoneObject {
|
| public:
|
| enum Kind {
|
| @@ -594,8 +608,8 @@ class LiveRange: public ZoneObject {
|
| explicit LiveRange(int id)
|
| : id_(id),
|
| spilled_(false),
|
| - assigned_double_(false),
|
| assigned_register_(kInvalidAssignment),
|
| + assigned_register_kind_(NONE),
|
| last_interval_(NULL),
|
| first_interval_(NULL),
|
| first_pos_(NULL),
|
| @@ -620,10 +634,10 @@ class LiveRange: public ZoneObject {
|
| LOperand* CreateAssignedOperand();
|
| int assigned_register() const { return assigned_register_; }
|
| int spill_start_index() const { return spill_start_index_; }
|
| - void set_assigned_register(int reg, bool double_reg) {
|
| + void set_assigned_register(int reg, RegisterKind register_kind) {
|
| ASSERT(!HasRegisterAssigned() && !IsSpilled());
|
| assigned_register_ = reg;
|
| - assigned_double_ = double_reg;
|
| + assigned_register_kind_ = register_kind;
|
| ConvertOperands();
|
| }
|
| void MakeSpilled() {
|
| @@ -652,9 +666,13 @@ class LiveRange: public ZoneObject {
|
| // Can this live range be spilled at this position.
|
| bool CanBeSpilled(LifetimePosition pos);
|
|
|
| + // Split this live range at the given position which must follow the start of
|
| + // the range.
|
| + // All uses following the given position will be moved from this
|
| + // live range to the result live range.
|
| void SplitAt(LifetimePosition position, LiveRange* result);
|
|
|
| - bool IsDouble() const { return assigned_double_; }
|
| + bool IsDouble() const { return assigned_register_kind_ == DOUBLE_REGISTERS; }
|
| bool HasRegisterAssigned() const {
|
| return assigned_register_ != kInvalidAssignment;
|
| }
|
| @@ -721,8 +739,8 @@ class LiveRange: public ZoneObject {
|
|
|
| int id_;
|
| bool spilled_;
|
| - bool assigned_double_;
|
| int assigned_register_;
|
| + RegisterKind assigned_register_kind_;
|
| UseInterval* last_interval_;
|
| UseInterval* first_interval_;
|
| UsePosition* first_pos_;
|
| @@ -774,8 +792,8 @@ class LAllocator BASE_EMBEDDED {
|
| // Checks whether the value of a given virtual register is tagged.
|
| bool HasTaggedValue(int virtual_register) const;
|
|
|
| - // Checks whether the value of a given virtual register is a double.
|
| - bool HasDoubleValue(int virtual_register) const;
|
| + // Returns the register kind required by the given virtual register.
|
| + RegisterKind RequiredRegisterKind(int virtual_register) const;
|
|
|
| // Begin a new instruction.
|
| void BeginInstruction();
|
| @@ -814,12 +832,6 @@ class LAllocator BASE_EMBEDDED {
|
| #endif
|
|
|
| private:
|
| - enum OperationMode {
|
| - NONE,
|
| - CPU_REGISTERS,
|
| - XMM_REGISTERS
|
| - };
|
| -
|
| void MeetRegisterConstraints();
|
| void ResolvePhis();
|
| void BuildLiveRanges();
|
| @@ -871,17 +883,38 @@ class LAllocator BASE_EMBEDDED {
|
| // Helper methods for allocating registers.
|
| bool TryAllocateFreeReg(LiveRange* range);
|
| void AllocateBlockedReg(LiveRange* range);
|
| - void SplitAndSpillIntersecting(LiveRange* range);
|
| +
|
| + // Live range splitting helpers.
|
| +
|
| + // Split the given range at the given position.
|
| + // If range starts at or after the given position then the
|
| + // original range is returned.
|
| + // Otherwise returns the live range that starts at pos and contains
|
| + // all uses from the original range that follow pos. Uses at pos will
|
| + // still be owned by the original range after splitting.
|
| + LiveRange* SplitAt(LiveRange* range, LifetimePosition pos);
|
| +
|
| + // Split the given range in a position from the interval [start, end].
|
| + LiveRange* SplitBetween(LiveRange* range,
|
| + LifetimePosition start,
|
| + LifetimePosition end);
|
| +
|
| + // Find a lifetime position in the interval [start, end] which
|
| + // is optimal for splitting: it is either header of the outermost
|
| + // loop covered by this interval or the latest possible position.
|
| LifetimePosition FindOptimalSplitPos(LifetimePosition start,
|
| LifetimePosition end);
|
| - LiveRange* Split(LiveRange* range,
|
| - LifetimePosition start,
|
| - LifetimePosition end);
|
| - LiveRange* Split(LiveRange* range, LifetimePosition split_pos);
|
| - void SplitAndSpill(LiveRange* range,
|
| - LifetimePosition start,
|
| - LifetimePosition end);
|
| - void SplitAndSpill(LiveRange* range, LifetimePosition at);
|
| +
|
| + // Spill the given life range after position pos.
|
| + void SpillAfter(LiveRange* range, LifetimePosition pos);
|
| +
|
| + // Spill the given life range after position start and up to position end.
|
| + void SpillBetween(LiveRange* range,
|
| + LifetimePosition start,
|
| + LifetimePosition end);
|
| +
|
| + void SplitAndSpillIntersecting(LiveRange* range);
|
| +
|
| void Spill(LiveRange* range);
|
| bool IsBlockBoundary(LifetimePosition pos);
|
| void AddGapMove(int pos, LiveRange* prev, LiveRange* next);
|
| @@ -914,6 +947,8 @@ class LAllocator BASE_EMBEDDED {
|
| HPhi* LookupPhi(LOperand* operand) const;
|
| LGap* GetLastGap(HBasicBlock* block) const;
|
|
|
| + const char* RegisterName(int allocation_index);
|
| +
|
| LChunk* chunk_;
|
| ZoneList<InstructionSummary*> summaries_;
|
| InstructionSummary* next_summary_;
|
| @@ -938,7 +973,7 @@ class LAllocator BASE_EMBEDDED {
|
| // Next virtual register number to be assigned to temporaries.
|
| int next_virtual_register_;
|
|
|
| - OperationMode mode_;
|
| + RegisterKind mode_;
|
| int num_registers_;
|
|
|
| HGraph* graph_;
|
|
|