OLD | NEW |
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_COMPILER_INSTRUCTION_H_ | 5 #ifndef V8_COMPILER_INSTRUCTION_H_ |
6 #define V8_COMPILER_INSTRUCTION_H_ | 6 #define V8_COMPILER_INSTRUCTION_H_ |
7 | 7 |
8 #include <deque> | 8 #include <deque> |
9 #include <iosfwd> | 9 #include <iosfwd> |
10 #include <map> | 10 #include <map> |
(...skipping 791 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
802 BasicBlock::RpoNumber ao_number() const { return ao_number_; } | 802 BasicBlock::RpoNumber ao_number() const { return ao_number_; } |
803 BasicBlock::RpoNumber rpo_number() const { return rpo_number_; } | 803 BasicBlock::RpoNumber rpo_number() const { return rpo_number_; } |
804 BasicBlock::RpoNumber loop_header() const { return loop_header_; } | 804 BasicBlock::RpoNumber loop_header() const { return loop_header_; } |
805 BasicBlock::RpoNumber loop_end() const { | 805 BasicBlock::RpoNumber loop_end() const { |
806 DCHECK(IsLoopHeader()); | 806 DCHECK(IsLoopHeader()); |
807 return loop_end_; | 807 return loop_end_; |
808 } | 808 } |
809 inline bool IsLoopHeader() const { return loop_end_.IsValid(); } | 809 inline bool IsLoopHeader() const { return loop_end_.IsValid(); } |
810 | 810 |
811 typedef ZoneVector<BasicBlock::RpoNumber> Predecessors; | 811 typedef ZoneVector<BasicBlock::RpoNumber> Predecessors; |
| 812 Predecessors& predecessors() { return predecessors_; } |
812 const Predecessors& predecessors() const { return predecessors_; } | 813 const Predecessors& predecessors() const { return predecessors_; } |
813 size_t PredecessorCount() const { return predecessors_.size(); } | 814 size_t PredecessorCount() const { return predecessors_.size(); } |
814 size_t PredecessorIndexOf(BasicBlock::RpoNumber rpo_number) const; | 815 size_t PredecessorIndexOf(BasicBlock::RpoNumber rpo_number) const; |
815 | 816 |
816 typedef ZoneVector<BasicBlock::RpoNumber> Successors; | 817 typedef ZoneVector<BasicBlock::RpoNumber> Successors; |
| 818 Successors& successors() { return successors_; } |
817 const Successors& successors() const { return successors_; } | 819 const Successors& successors() const { return successors_; } |
818 size_t SuccessorCount() const { return successors_.size(); } | 820 size_t SuccessorCount() const { return successors_.size(); } |
819 | 821 |
820 typedef ZoneVector<PhiInstruction*> PhiInstructions; | 822 typedef ZoneVector<PhiInstruction*> PhiInstructions; |
821 const PhiInstructions& phis() const { return phis_; } | 823 const PhiInstructions& phis() const { return phis_; } |
822 void AddPhi(PhiInstruction* phi) { phis_.push_back(phi); } | 824 void AddPhi(PhiInstruction* phi) { phis_.push_back(phi); } |
823 | 825 |
824 private: | 826 private: |
825 Successors successors_; | 827 Successors successors_; |
826 Predecessors predecessors_; | 828 Predecessors predecessors_; |
827 PhiInstructions phis_; | 829 PhiInstructions phis_; |
828 BasicBlock::Id id_; | 830 const BasicBlock::Id id_; |
829 BasicBlock::RpoNumber ao_number_; // Assembly order number. | 831 const BasicBlock::RpoNumber ao_number_; // Assembly order number. |
830 // TODO(dcarney): probably dont't need this. | 832 // TODO(dcarney): probably dont't need this. |
831 BasicBlock::RpoNumber rpo_number_; | 833 const BasicBlock::RpoNumber rpo_number_; |
832 BasicBlock::RpoNumber loop_header_; | 834 const BasicBlock::RpoNumber loop_header_; |
833 BasicBlock::RpoNumber loop_end_; | 835 const BasicBlock::RpoNumber loop_end_; |
834 int32_t code_start_; // start index of arch-specific code. | 836 int32_t code_start_; // start index of arch-specific code. |
835 int32_t code_end_; // end index of arch-specific code. | 837 int32_t code_end_; // end index of arch-specific code. |
836 const bool deferred_; // Block contains deferred code. | 838 const bool deferred_; // Block contains deferred code. |
837 }; | 839 }; |
838 | 840 |
839 typedef ZoneDeque<Constant> ConstantDeque; | 841 typedef ZoneDeque<Constant> ConstantDeque; |
840 typedef std::map<int, Constant, std::less<int>, | 842 typedef std::map<int, Constant, std::less<int>, |
841 zone_allocator<std::pair<int, Constant> > > ConstantMap; | 843 zone_allocator<std::pair<int, Constant> > > ConstantMap; |
842 | 844 |
843 typedef ZoneDeque<Instruction*> InstructionDeque; | 845 typedef ZoneDeque<Instruction*> InstructionDeque; |
844 typedef ZoneDeque<PointerMap*> PointerMapDeque; | 846 typedef ZoneDeque<PointerMap*> PointerMapDeque; |
845 typedef ZoneVector<FrameStateDescriptor*> DeoptimizationVector; | 847 typedef ZoneVector<FrameStateDescriptor*> DeoptimizationVector; |
846 typedef ZoneVector<InstructionBlock*> InstructionBlocks; | 848 typedef ZoneVector<InstructionBlock*> InstructionBlocks; |
847 | 849 |
848 // Represents architecture-specific generated code before, during, and after | 850 // Represents architecture-specific generated code before, during, and after |
849 // register allocation. | 851 // register allocation. |
850 // TODO(titzer): s/IsDouble/IsFloat64/ | 852 // TODO(titzer): s/IsDouble/IsFloat64/ |
851 class InstructionSequence FINAL { | 853 class InstructionSequence FINAL { |
852 public: | 854 public: |
853 InstructionSequence(Zone* zone, const Schedule* schedule); | 855 static InstructionBlocks* InstructionBlocksFor(Zone* zone, |
| 856 const Schedule* schedule); |
| 857 |
| 858 InstructionSequence(Zone* zone, InstructionBlocks* instruction_blocks); |
854 | 859 |
855 int NextVirtualRegister() { return next_virtual_register_++; } | 860 int NextVirtualRegister() { return next_virtual_register_++; } |
856 int VirtualRegisterCount() const { return next_virtual_register_; } | 861 int VirtualRegisterCount() const { return next_virtual_register_; } |
857 | 862 |
858 const InstructionBlocks& instruction_blocks() const { | 863 const InstructionBlocks& instruction_blocks() const { |
859 return instruction_blocks_; | 864 return *instruction_blocks_; |
860 } | 865 } |
861 | 866 |
862 int InstructionBlockCount() const { | 867 int InstructionBlockCount() const { |
863 return static_cast<int>(instruction_blocks_.size()); | 868 return static_cast<int>(instruction_blocks_->size()); |
864 } | 869 } |
865 | 870 |
866 InstructionBlock* InstructionBlockAt(BasicBlock::RpoNumber rpo_number) { | 871 InstructionBlock* InstructionBlockAt(BasicBlock::RpoNumber rpo_number) { |
867 return instruction_blocks_[rpo_number.ToSize()]; | 872 return instruction_blocks_->at(rpo_number.ToSize()); |
868 } | 873 } |
869 | 874 |
870 int LastLoopInstructionIndex(const InstructionBlock* block) { | 875 int LastLoopInstructionIndex(const InstructionBlock* block) { |
871 return instruction_blocks_[block->loop_end().ToSize() - 1] | 876 return instruction_blocks_->at(block->loop_end().ToSize() - 1) |
872 ->last_instruction_index(); | 877 ->last_instruction_index(); |
873 } | 878 } |
874 | 879 |
875 const InstructionBlock* InstructionBlockAt( | 880 const InstructionBlock* InstructionBlockAt( |
876 BasicBlock::RpoNumber rpo_number) const { | 881 BasicBlock::RpoNumber rpo_number) const { |
877 return instruction_blocks_[rpo_number.ToSize()]; | 882 return instruction_blocks_->at(rpo_number.ToSize()); |
878 } | 883 } |
879 | 884 |
880 const InstructionBlock* GetInstructionBlock(int instruction_index) const; | 885 const InstructionBlock* GetInstructionBlock(int instruction_index) const; |
881 | 886 |
882 bool IsReference(int virtual_register) const; | 887 bool IsReference(int virtual_register) const; |
883 bool IsDouble(int virtual_register) const; | 888 bool IsDouble(int virtual_register) const; |
884 | 889 |
885 void MarkAsReference(int virtual_register); | 890 void MarkAsReference(int virtual_register); |
886 void MarkAsDouble(int virtual_register); | 891 void MarkAsDouble(int virtual_register); |
887 | 892 |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
954 FrameStateDescriptor* GetFrameStateDescriptor(StateId deoptimization_id); | 959 FrameStateDescriptor* GetFrameStateDescriptor(StateId deoptimization_id); |
955 int GetFrameStateDescriptorCount(); | 960 int GetFrameStateDescriptorCount(); |
956 | 961 |
957 private: | 962 private: |
958 friend std::ostream& operator<<(std::ostream& os, | 963 friend std::ostream& operator<<(std::ostream& os, |
959 const InstructionSequence& code); | 964 const InstructionSequence& code); |
960 | 965 |
961 typedef std::set<int, std::less<int>, ZoneIntAllocator> VirtualRegisterSet; | 966 typedef std::set<int, std::less<int>, ZoneIntAllocator> VirtualRegisterSet; |
962 | 967 |
963 Zone* const zone_; | 968 Zone* const zone_; |
964 InstructionBlocks instruction_blocks_; | 969 InstructionBlocks* const instruction_blocks_; |
965 ConstantMap constants_; | 970 ConstantMap constants_; |
966 ConstantDeque immediates_; | 971 ConstantDeque immediates_; |
967 InstructionDeque instructions_; | 972 InstructionDeque instructions_; |
968 int next_virtual_register_; | 973 int next_virtual_register_; |
969 PointerMapDeque pointer_maps_; | 974 PointerMapDeque pointer_maps_; |
970 VirtualRegisterSet doubles_; | 975 VirtualRegisterSet doubles_; |
971 VirtualRegisterSet references_; | 976 VirtualRegisterSet references_; |
972 DeoptimizationVector deoptimization_entries_; | 977 DeoptimizationVector deoptimization_entries_; |
973 }; | 978 }; |
974 | 979 |
975 std::ostream& operator<<(std::ostream& os, const InstructionSequence& code); | 980 std::ostream& operator<<(std::ostream& os, const InstructionSequence& code); |
976 | 981 |
977 } // namespace compiler | 982 } // namespace compiler |
978 } // namespace internal | 983 } // namespace internal |
979 } // namespace v8 | 984 } // namespace v8 |
980 | 985 |
981 #endif // V8_COMPILER_INSTRUCTION_H_ | 986 #endif // V8_COMPILER_INSTRUCTION_H_ |
OLD | NEW |