| 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 697 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 708 | 708 |
| 709 private: | 709 private: |
| 710 friend std::ostream& operator<<(std::ostream& os, const ReferenceMap& pm); | 710 friend std::ostream& operator<<(std::ostream& os, const ReferenceMap& pm); |
| 711 | 711 |
| 712 ZoneVector<InstructionOperand> reference_operands_; | 712 ZoneVector<InstructionOperand> reference_operands_; |
| 713 int instruction_position_; | 713 int instruction_position_; |
| 714 }; | 714 }; |
| 715 | 715 |
| 716 std::ostream& operator<<(std::ostream& os, const ReferenceMap& pm); | 716 std::ostream& operator<<(std::ostream& os, const ReferenceMap& pm); |
| 717 | 717 |
| 718 class InstructionBlock; |
| 719 |
| 718 class Instruction final { | 720 class Instruction final { |
| 719 public: | 721 public: |
| 720 size_t OutputCount() const { return OutputCountField::decode(bit_field_); } | 722 size_t OutputCount() const { return OutputCountField::decode(bit_field_); } |
| 721 const InstructionOperand* OutputAt(size_t i) const { | 723 const InstructionOperand* OutputAt(size_t i) const { |
| 722 DCHECK(i < OutputCount()); | 724 DCHECK(i < OutputCount()); |
| 723 return &operands_[i]; | 725 return &operands_[i]; |
| 724 } | 726 } |
| 725 InstructionOperand* OutputAt(size_t i) { | 727 InstructionOperand* OutputAt(size_t i) { |
| 726 DCHECK(i < OutputCount()); | 728 DCHECK(i < OutputCount()); |
| 727 return &operands_[i]; | 729 return &operands_[i]; |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 850 | 852 |
| 851 const ParallelMove* GetParallelMove(GapPosition pos) const { | 853 const ParallelMove* GetParallelMove(GapPosition pos) const { |
| 852 return parallel_moves_[pos]; | 854 return parallel_moves_[pos]; |
| 853 } | 855 } |
| 854 | 856 |
| 855 bool AreMovesRedundant() const; | 857 bool AreMovesRedundant() const; |
| 856 | 858 |
| 857 ParallelMove* const* parallel_moves() const { return ¶llel_moves_[0]; } | 859 ParallelMove* const* parallel_moves() const { return ¶llel_moves_[0]; } |
| 858 ParallelMove** parallel_moves() { return ¶llel_moves_[0]; } | 860 ParallelMove** parallel_moves() { return ¶llel_moves_[0]; } |
| 859 | 861 |
| 862 // The block_id may be invalidated in JumpThreading. It is only important for |
| 863 // register allocation, to avoid searching for blocks from instruction |
| 864 // indexes. |
| 865 InstructionBlock* block() const { return block_; } |
| 866 void set_block(InstructionBlock* block) { |
| 867 DCHECK_NOT_NULL(block); |
| 868 block_ = block; |
| 869 } |
| 870 |
| 860 void Print(const RegisterConfiguration* config) const; | 871 void Print(const RegisterConfiguration* config) const; |
| 861 void Print() const; | 872 void Print() const; |
| 862 | 873 |
| 863 private: | 874 private: |
| 864 explicit Instruction(InstructionCode opcode); | 875 explicit Instruction(InstructionCode opcode); |
| 865 | 876 |
| 866 Instruction(InstructionCode opcode, size_t output_count, | 877 Instruction(InstructionCode opcode, size_t output_count, |
| 867 InstructionOperand* outputs, size_t input_count, | 878 InstructionOperand* outputs, size_t input_count, |
| 868 InstructionOperand* inputs, size_t temp_count, | 879 InstructionOperand* inputs, size_t temp_count, |
| 869 InstructionOperand* temps); | 880 InstructionOperand* temps); |
| 870 | 881 |
| 871 typedef BitField<size_t, 0, 8> OutputCountField; | 882 typedef BitField<size_t, 0, 8> OutputCountField; |
| 872 typedef BitField<size_t, 8, 16> InputCountField; | 883 typedef BitField<size_t, 8, 16> InputCountField; |
| 873 typedef BitField<size_t, 24, 6> TempCountField; | 884 typedef BitField<size_t, 24, 6> TempCountField; |
| 874 typedef BitField<bool, 30, 1> IsCallField; | 885 typedef BitField<bool, 30, 1> IsCallField; |
| 875 | 886 |
| 876 InstructionCode opcode_; | 887 InstructionCode opcode_; |
| 877 uint32_t bit_field_; | 888 uint32_t bit_field_; |
| 878 ParallelMove* parallel_moves_[2]; | 889 ParallelMove* parallel_moves_[2]; |
| 879 ReferenceMap* reference_map_; | 890 ReferenceMap* reference_map_; |
| 891 InstructionBlock* block_; |
| 880 InstructionOperand operands_[1]; | 892 InstructionOperand operands_[1]; |
| 881 | 893 |
| 882 DISALLOW_COPY_AND_ASSIGN(Instruction); | 894 DISALLOW_COPY_AND_ASSIGN(Instruction); |
| 883 }; | 895 }; |
| 884 | 896 |
| 885 | 897 |
| 886 struct PrintableInstruction { | 898 struct PrintableInstruction { |
| 887 const RegisterConfiguration* register_configuration_; | 899 const RegisterConfiguration* register_configuration_; |
| 888 const Instruction* instr_; | 900 const Instruction* instr_; |
| 889 }; | 901 }; |
| (...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1387 private: | 1399 private: |
| 1388 friend std::ostream& operator<<(std::ostream& os, | 1400 friend std::ostream& operator<<(std::ostream& os, |
| 1389 const PrintableInstructionSequence& code); | 1401 const PrintableInstructionSequence& code); |
| 1390 | 1402 |
| 1391 typedef ZoneMap<const Instruction*, SourcePosition> SourcePositionMap; | 1403 typedef ZoneMap<const Instruction*, SourcePosition> SourcePositionMap; |
| 1392 | 1404 |
| 1393 Isolate* isolate_; | 1405 Isolate* isolate_; |
| 1394 Zone* const zone_; | 1406 Zone* const zone_; |
| 1395 InstructionBlocks* const instruction_blocks_; | 1407 InstructionBlocks* const instruction_blocks_; |
| 1396 SourcePositionMap source_positions_; | 1408 SourcePositionMap source_positions_; |
| 1397 IntVector block_starts_; | |
| 1398 ConstantMap constants_; | 1409 ConstantMap constants_; |
| 1399 Immediates immediates_; | 1410 Immediates immediates_; |
| 1400 InstructionDeque instructions_; | 1411 InstructionDeque instructions_; |
| 1401 int next_virtual_register_; | 1412 int next_virtual_register_; |
| 1402 ReferenceMapDeque reference_maps_; | 1413 ReferenceMapDeque reference_maps_; |
| 1403 ZoneVector<MachineRepresentation> representations_; | 1414 ZoneVector<MachineRepresentation> representations_; |
| 1404 DeoptimizationVector deoptimization_entries_; | 1415 DeoptimizationVector deoptimization_entries_; |
| 1405 | 1416 |
| 1417 // Used at construction time |
| 1418 InstructionBlock* current_block_; |
| 1419 |
| 1406 DISALLOW_COPY_AND_ASSIGN(InstructionSequence); | 1420 DISALLOW_COPY_AND_ASSIGN(InstructionSequence); |
| 1407 }; | 1421 }; |
| 1408 | 1422 |
| 1409 | 1423 |
| 1410 struct PrintableInstructionSequence { | 1424 struct PrintableInstructionSequence { |
| 1411 const RegisterConfiguration* register_configuration_; | 1425 const RegisterConfiguration* register_configuration_; |
| 1412 const InstructionSequence* sequence_; | 1426 const InstructionSequence* sequence_; |
| 1413 }; | 1427 }; |
| 1414 | 1428 |
| 1415 | 1429 |
| 1416 std::ostream& operator<<(std::ostream& os, | 1430 std::ostream& operator<<(std::ostream& os, |
| 1417 const PrintableInstructionSequence& code); | 1431 const PrintableInstructionSequence& code); |
| 1418 | 1432 |
| 1419 } // namespace compiler | 1433 } // namespace compiler |
| 1420 } // namespace internal | 1434 } // namespace internal |
| 1421 } // namespace v8 | 1435 } // namespace v8 |
| 1422 | 1436 |
| 1423 #endif // V8_COMPILER_INSTRUCTION_H_ | 1437 #endif // V8_COMPILER_INSTRUCTION_H_ |
| OLD | NEW |