Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(153)

Side by Side Diff: src/compiler/register-allocator.h

Issue 1287383003: Re-reland: Remove register index/code indirection (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix MIPS tests again Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/compiler/pipeline.cc ('k') | src/compiler/register-allocator.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_REGISTER_ALLOCATOR_H_ 5 #ifndef V8_REGISTER_ALLOCATOR_H_
6 #define V8_REGISTER_ALLOCATOR_H_ 6 #define V8_REGISTER_ALLOCATOR_H_
7 7
8 #include "src/compiler/instruction.h" 8 #include "src/compiler/instruction.h"
9 #include "src/ostreams.h" 9 #include "src/ostreams.h"
10 #include "src/register-configuration.h"
10 #include "src/zone-containers.h" 11 #include "src/zone-containers.h"
11 12
12 namespace v8 { 13 namespace v8 {
13 namespace internal { 14 namespace internal {
14 namespace compiler { 15 namespace compiler {
15 16
16 enum RegisterKind { 17 enum RegisterKind {
17 GENERAL_REGISTERS, 18 GENERAL_REGISTERS,
18 DOUBLE_REGISTERS 19 DOUBLE_REGISTERS
19 }; 20 };
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
234 } 235 }
235 UsePositionType type() const { return TypeField::decode(flags_); } 236 UsePositionType type() const { return TypeField::decode(flags_); }
236 void set_type(UsePositionType type, bool register_beneficial); 237 void set_type(UsePositionType type, bool register_beneficial);
237 238
238 LifetimePosition pos() const { return pos_; } 239 LifetimePosition pos() const { return pos_; }
239 240
240 UsePosition* next() const { return next_; } 241 UsePosition* next() const { return next_; }
241 void set_next(UsePosition* next) { next_ = next; } 242 void set_next(UsePosition* next) { next_ = next; }
242 243
243 // For hinting only. 244 // For hinting only.
244 void set_assigned_register(int register_index) { 245 void set_assigned_register(int register_code) {
245 flags_ = AssignedRegisterField::update(flags_, register_index); 246 flags_ = AssignedRegisterField::update(flags_, register_code);
246 } 247 }
247 248
248 UsePositionHintType hint_type() const { 249 UsePositionHintType hint_type() const {
249 return HintTypeField::decode(flags_); 250 return HintTypeField::decode(flags_);
250 } 251 }
251 bool HasHint() const; 252 bool HasHint() const;
252 bool HintRegister(int* register_index) const; 253 bool HintRegister(int* register_code) const;
253 void ResolveHint(UsePosition* use_pos); 254 void ResolveHint(UsePosition* use_pos);
254 bool IsResolved() const { 255 bool IsResolved() const {
255 return hint_type() != UsePositionHintType::kUnresolved; 256 return hint_type() != UsePositionHintType::kUnresolved;
256 } 257 }
257 static UsePositionHintType HintTypeForOperand(const InstructionOperand& op); 258 static UsePositionHintType HintTypeForOperand(const InstructionOperand& op);
258 259
259 private: 260 private:
260 typedef BitField<UsePositionType, 0, 2> TypeField; 261 typedef BitField<UsePositionType, 0, 2> TypeField;
261 typedef BitField<UsePositionHintType, 2, 3> HintTypeField; 262 typedef BitField<UsePositionHintType, 2, 3> HintTypeField;
262 typedef BitField<bool, 5, 1> RegisterBeneficialField; 263 typedef BitField<bool, 5, 1> RegisterBeneficialField;
(...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after
659 public: 660 public:
660 class PhiMapValue : public ZoneObject { 661 class PhiMapValue : public ZoneObject {
661 public: 662 public:
662 PhiMapValue(PhiInstruction* phi, const InstructionBlock* block, Zone* zone); 663 PhiMapValue(PhiInstruction* phi, const InstructionBlock* block, Zone* zone);
663 664
664 const PhiInstruction* phi() const { return phi_; } 665 const PhiInstruction* phi() const { return phi_; }
665 const InstructionBlock* block() const { return block_; } 666 const InstructionBlock* block() const { return block_; }
666 667
667 // For hinting. 668 // For hinting.
668 int assigned_register() const { return assigned_register_; } 669 int assigned_register() const { return assigned_register_; }
669 void set_assigned_register(int register_index) { 670 void set_assigned_register(int register_code) {
670 DCHECK_EQ(assigned_register_, kUnassignedRegister); 671 DCHECK_EQ(assigned_register_, kUnassignedRegister);
671 assigned_register_ = register_index; 672 assigned_register_ = register_code;
672 } 673 }
673 void UnsetAssignedRegister() { assigned_register_ = kUnassignedRegister; } 674 void UnsetAssignedRegister() { assigned_register_ = kUnassignedRegister; }
674 675
675 void AddOperand(InstructionOperand* operand); 676 void AddOperand(InstructionOperand* operand);
676 void CommitAssignment(const InstructionOperand& operand); 677 void CommitAssignment(const InstructionOperand& operand);
677 678
678 private: 679 private:
679 PhiInstruction* const phi_; 680 PhiInstruction* const phi_;
680 const InstructionBlock* const block_; 681 const InstructionBlock* const block_;
681 ZoneVector<InstructionOperand*> incoming_operands_; 682 ZoneVector<InstructionOperand*> incoming_operands_;
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
762 763
763 private: 764 private:
764 int GetNextLiveRangeId(); 765 int GetNextLiveRangeId();
765 766
766 Zone* const allocation_zone_; 767 Zone* const allocation_zone_;
767 Frame* const frame_; 768 Frame* const frame_;
768 InstructionSequence* const code_; 769 InstructionSequence* const code_;
769 const char* const debug_name_; 770 const char* const debug_name_;
770 const RegisterConfiguration* const config_; 771 const RegisterConfiguration* const config_;
771 PhiMap phi_map_; 772 PhiMap phi_map_;
773 ZoneVector<int> allocatable_codes_;
774 ZoneVector<int> allocatable_double_codes_;
772 ZoneVector<BitVector*> live_in_sets_; 775 ZoneVector<BitVector*> live_in_sets_;
773 ZoneVector<BitVector*> live_out_sets_; 776 ZoneVector<BitVector*> live_out_sets_;
774 ZoneVector<TopLevelLiveRange*> live_ranges_; 777 ZoneVector<TopLevelLiveRange*> live_ranges_;
775 ZoneVector<TopLevelLiveRange*> fixed_live_ranges_; 778 ZoneVector<TopLevelLiveRange*> fixed_live_ranges_;
776 ZoneVector<TopLevelLiveRange*> fixed_double_live_ranges_; 779 ZoneVector<TopLevelLiveRange*> fixed_double_live_ranges_;
777 ZoneVector<SpillRange*> spill_ranges_; 780 ZoneVector<SpillRange*> spill_ranges_;
778 DelayedReferences delayed_references_; 781 DelayedReferences delayed_references_;
779 BitVector* assigned_registers_; 782 BitVector* assigned_registers_;
780 BitVector* assigned_double_registers_; 783 BitVector* assigned_double_registers_;
781 int virtual_register_count_; 784 int virtual_register_count_;
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
879 882
880 class RegisterAllocator : public ZoneObject { 883 class RegisterAllocator : public ZoneObject {
881 public: 884 public:
882 explicit RegisterAllocator(RegisterAllocationData* data, RegisterKind kind); 885 explicit RegisterAllocator(RegisterAllocationData* data, RegisterKind kind);
883 886
884 protected: 887 protected:
885 RegisterAllocationData* data() const { return data_; } 888 RegisterAllocationData* data() const { return data_; }
886 InstructionSequence* code() const { return data()->code(); } 889 InstructionSequence* code() const { return data()->code(); }
887 RegisterKind mode() const { return mode_; } 890 RegisterKind mode() const { return mode_; }
888 int num_registers() const { return num_registers_; } 891 int num_registers() const { return num_registers_; }
892 int num_allocatable_registers() const { return num_allocatable_registers_; }
893 int allocatable_register_code(int allocatable_index) const {
894 return allocatable_register_codes_[allocatable_index];
895 }
889 896
890 Zone* allocation_zone() const { return data()->allocation_zone(); } 897 Zone* allocation_zone() const { return data()->allocation_zone(); }
891 898
892 // Split the given range at the given position. 899 // Split the given range at the given position.
893 // If range starts at or after the given position then the 900 // If range starts at or after the given position then the
894 // original range is returned. 901 // original range is returned.
895 // Otherwise returns the live range that starts at pos and contains 902 // Otherwise returns the live range that starts at pos and contains
896 // all uses from the original range that follow pos. Uses at pos will 903 // all uses from the original range that follow pos. Uses at pos will
897 // still be owned by the original range after splitting. 904 // still be owned by the original range after splitting.
898 LiveRange* SplitRangeAt(LiveRange* range, LifetimePosition pos); 905 LiveRange* SplitRangeAt(LiveRange* range, LifetimePosition pos);
(...skipping 15 matching lines...) Expand all
914 LifetimePosition FindOptimalSpillingPos(LiveRange* range, 921 LifetimePosition FindOptimalSpillingPos(LiveRange* range,
915 LifetimePosition pos); 922 LifetimePosition pos);
916 923
917 const ZoneVector<TopLevelLiveRange*>& GetFixedRegisters() const; 924 const ZoneVector<TopLevelLiveRange*>& GetFixedRegisters() const;
918 const char* RegisterName(int allocation_index) const; 925 const char* RegisterName(int allocation_index) const;
919 926
920 private: 927 private:
921 RegisterAllocationData* const data_; 928 RegisterAllocationData* const data_;
922 const RegisterKind mode_; 929 const RegisterKind mode_;
923 const int num_registers_; 930 const int num_registers_;
931 int num_allocatable_registers_;
932 const int* allocatable_register_codes_;
924 933
925 DISALLOW_COPY_AND_ASSIGN(RegisterAllocator); 934 DISALLOW_COPY_AND_ASSIGN(RegisterAllocator);
926 }; 935 };
927 936
928 937
929 class LinearScanAllocator final : public RegisterAllocator { 938 class LinearScanAllocator final : public RegisterAllocator {
930 public: 939 public:
931 LinearScanAllocator(RegisterAllocationData* data, RegisterKind kind, 940 LinearScanAllocator(RegisterAllocationData* data, RegisterKind kind,
932 Zone* local_zone); 941 Zone* local_zone);
933 942
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
1075 RegisterAllocationData* const data_; 1084 RegisterAllocationData* const data_;
1076 1085
1077 DISALLOW_COPY_AND_ASSIGN(LiveRangeConnector); 1086 DISALLOW_COPY_AND_ASSIGN(LiveRangeConnector);
1078 }; 1087 };
1079 1088
1080 } // namespace compiler 1089 } // namespace compiler
1081 } // namespace internal 1090 } // namespace internal
1082 } // namespace v8 1091 } // namespace v8
1083 1092
1084 #endif // V8_REGISTER_ALLOCATOR_H_ 1093 #endif // V8_REGISTER_ALLOCATOR_H_
OLDNEW
« no previous file with comments | « src/compiler/pipeline.cc ('k') | src/compiler/register-allocator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698