| Index: src/compiler/register-allocator.h
|
| diff --git a/src/compiler/register-allocator.h b/src/compiler/register-allocator.h
|
| index 933d1d2472974dc4804582618d050baab6805849..640acebd4e838812bf973e0b0afd5ca1fe3fe2d1 100644
|
| --- a/src/compiler/register-allocator.h
|
| +++ b/src/compiler/register-allocator.h
|
| @@ -678,8 +678,7 @@ class SpillRange final : public ZoneObject {
|
| SpillRange(TopLevelLiveRange* range, Zone* zone);
|
|
|
| UseInterval* interval() const { return use_interval_; }
|
| - // Currently, only 4 or 8 byte slots are supported.
|
| - int ByteWidth() const;
|
| +
|
| bool IsEmpty() const { return live_ranges_.empty(); }
|
| bool TryMerge(SpillRange* other);
|
| bool HasSlot() const { return assigned_slot_ != kUnassignedSlot; }
|
| @@ -768,6 +767,12 @@ class RegisterAllocationData final : public ZoneObject {
|
| ZoneVector<TopLevelLiveRange*>& fixed_live_ranges() {
|
| return fixed_live_ranges_;
|
| }
|
| + ZoneVector<TopLevelLiveRange*>& fixed_float_live_ranges() {
|
| + return fixed_float_live_ranges_;
|
| + }
|
| + const ZoneVector<TopLevelLiveRange*>& fixed_float_live_ranges() const {
|
| + return fixed_float_live_ranges_;
|
| + }
|
| ZoneVector<TopLevelLiveRange*>& fixed_double_live_ranges() {
|
| return fixed_double_live_ranges_;
|
| }
|
| @@ -779,7 +784,7 @@ class RegisterAllocationData final : public ZoneObject {
|
| ZoneVector<SpillRange*>& spill_ranges() { return spill_ranges_; }
|
| DelayedReferences& delayed_references() { return delayed_references_; }
|
| InstructionSequence* code() const { return code_; }
|
| - // This zone is for datastructures only needed during register allocation
|
| + // This zone is for data structures only needed during register allocation
|
| // phases.
|
| Zone* allocation_zone() const { return allocation_zone_; }
|
| // This zone is for InstructionOperands and moves that live beyond register
|
| @@ -810,7 +815,7 @@ class RegisterAllocationData final : public ZoneObject {
|
| bool ExistsUseWithoutDefinition();
|
| bool RangesDefinedInDeferredStayInDeferred();
|
|
|
| - void MarkAllocated(RegisterKind kind, int index);
|
| + void MarkAllocated(MachineRepresentation rep, int index);
|
|
|
| PhiMapValue* InitializePhiMap(const InstructionBlock* block,
|
| PhiInstruction* phi);
|
| @@ -835,6 +840,7 @@ class RegisterAllocationData final : public ZoneObject {
|
| ZoneVector<BitVector*> live_out_sets_;
|
| ZoneVector<TopLevelLiveRange*> live_ranges_;
|
| ZoneVector<TopLevelLiveRange*> fixed_live_ranges_;
|
| + ZoneVector<TopLevelLiveRange*> fixed_float_live_ranges_;
|
| ZoneVector<TopLevelLiveRange*> fixed_double_live_ranges_;
|
| ZoneVector<SpillRange*> spill_ranges_;
|
| DelayedReferences delayed_references_;
|
| @@ -911,9 +917,9 @@ class LiveRangeBuilder final : public ZoneObject {
|
| void ProcessLoopHeader(const InstructionBlock* block, BitVector* live);
|
|
|
| static int FixedLiveRangeID(int index) { return -index - 1; }
|
| - int FixedDoubleLiveRangeID(int index);
|
| + int FixedFPLiveRangeID(int index, MachineRepresentation rep);
|
| TopLevelLiveRange* FixedLiveRangeFor(int index);
|
| - TopLevelLiveRange* FixedDoubleLiveRangeFor(int index);
|
| + TopLevelLiveRange* FixedFPLiveRangeFor(int index, MachineRepresentation rep);
|
|
|
| void MapPhiHint(InstructionOperand* operand, UsePosition* use_pos);
|
| void ResolvePhiHint(InstructionOperand* operand, UsePosition* use_pos);
|
| @@ -947,7 +953,7 @@ class LiveRangeBuilder final : public ZoneObject {
|
|
|
| class RegisterAllocator : public ZoneObject {
|
| public:
|
| - explicit RegisterAllocator(RegisterAllocationData* data, RegisterKind kind);
|
| + RegisterAllocator(RegisterAllocationData* data, RegisterKind kind);
|
|
|
| protected:
|
| RegisterAllocationData* data() const { return data_; }
|
| @@ -955,9 +961,14 @@ class RegisterAllocator : public ZoneObject {
|
| RegisterKind mode() const { return mode_; }
|
| int num_registers() const { return num_registers_; }
|
| int num_allocatable_registers() const { return num_allocatable_registers_; }
|
| - int allocatable_register_code(int allocatable_index) const {
|
| - return allocatable_register_codes_[allocatable_index];
|
| + const int* allocatable_register_codes() const {
|
| + return allocatable_register_codes_;
|
| }
|
| + // Returns true if registers do not combine to form larger registers, i.e.
|
| + // no complex aliasing detection is required. This is always true for the
|
| + // general register pass, and true for the FP register pass except for arm
|
| + // and mips archs.
|
| + bool no_combining() const { return no_combining_; }
|
|
|
| // TODO(mtrofin): explain why splitting in gap START is always OK.
|
| LifetimePosition GetSplitPositionForInstruction(const LiveRange* range,
|
| @@ -1009,6 +1020,9 @@ class RegisterAllocator : public ZoneObject {
|
| int num_allocatable_registers_;
|
| const int* allocatable_register_codes_;
|
|
|
| + private:
|
| + bool no_combining_;
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(RegisterAllocator);
|
| };
|
|
|
|
|