| 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 383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 394 bool InstructionOperand::Is##SubKind() const { \ | 394 bool InstructionOperand::Is##SubKind() const { \ |
| 395 return IsAllocated() && \ | 395 return IsAllocated() && \ |
| 396 AllocatedOperand::cast(this)->allocated_kind() == \ | 396 AllocatedOperand::cast(this)->allocated_kind() == \ |
| 397 AllocatedOperand::kOperandKind; \ | 397 AllocatedOperand::kOperandKind; \ |
| 398 } | 398 } |
| 399 ALLOCATED_OPERAND_LIST(ALLOCATED_OPERAND_IS) | 399 ALLOCATED_OPERAND_LIST(ALLOCATED_OPERAND_IS) |
| 400 #undef ALLOCATED_OPERAND_IS | 400 #undef ALLOCATED_OPERAND_IS |
| 401 | 401 |
| 402 | 402 |
| 403 #define ALLOCATED_OPERAND_CLASS(SubKind, kOperandKind) \ | 403 #define ALLOCATED_OPERAND_CLASS(SubKind, kOperandKind) \ |
| 404 class SubKind##Operand FINAL : public AllocatedOperand { \ | 404 class SubKind##Operand final : public AllocatedOperand { \ |
| 405 public: \ | 405 public: \ |
| 406 explicit SubKind##Operand(int index) \ | 406 explicit SubKind##Operand(int index) \ |
| 407 : AllocatedOperand(kOperandKind, index) {} \ | 407 : AllocatedOperand(kOperandKind, index) {} \ |
| 408 \ | 408 \ |
| 409 static SubKind##Operand* New(Zone* zone, int index) { \ | 409 static SubKind##Operand* New(Zone* zone, int index) { \ |
| 410 return InstructionOperand::New(zone, SubKind##Operand(index)); \ | 410 return InstructionOperand::New(zone, SubKind##Operand(index)); \ |
| 411 } \ | 411 } \ |
| 412 \ | 412 \ |
| 413 static SubKind##Operand* cast(InstructionOperand* op) { \ | 413 static SubKind##Operand* cast(InstructionOperand* op) { \ |
| 414 DCHECK_EQ(kOperandKind, AllocatedOperand::cast(op)->allocated_kind()); \ | 414 DCHECK_EQ(kOperandKind, AllocatedOperand::cast(op)->allocated_kind()); \ |
| 415 return reinterpret_cast<SubKind##Operand*>(op); \ | 415 return reinterpret_cast<SubKind##Operand*>(op); \ |
| 416 } \ | 416 } \ |
| 417 \ | 417 \ |
| 418 static const SubKind##Operand* cast(const InstructionOperand* op) { \ | 418 static const SubKind##Operand* cast(const InstructionOperand* op) { \ |
| 419 DCHECK_EQ(kOperandKind, AllocatedOperand::cast(op)->allocated_kind()); \ | 419 DCHECK_EQ(kOperandKind, AllocatedOperand::cast(op)->allocated_kind()); \ |
| 420 return reinterpret_cast<const SubKind##Operand*>(op); \ | 420 return reinterpret_cast<const SubKind##Operand*>(op); \ |
| 421 } \ | 421 } \ |
| 422 \ | 422 \ |
| 423 static SubKind##Operand cast(const InstructionOperand& op) { \ | 423 static SubKind##Operand cast(const InstructionOperand& op) { \ |
| 424 DCHECK_EQ(kOperandKind, AllocatedOperand::cast(op).allocated_kind()); \ | 424 DCHECK_EQ(kOperandKind, AllocatedOperand::cast(op).allocated_kind()); \ |
| 425 return *static_cast<const SubKind##Operand*>(&op); \ | 425 return *static_cast<const SubKind##Operand*>(&op); \ |
| 426 } \ | 426 } \ |
| 427 }; | 427 }; |
| 428 ALLOCATED_OPERAND_LIST(ALLOCATED_OPERAND_CLASS) | 428 ALLOCATED_OPERAND_LIST(ALLOCATED_OPERAND_CLASS) |
| 429 #undef ALLOCATED_OPERAND_CLASS | 429 #undef ALLOCATED_OPERAND_CLASS |
| 430 | 430 |
| 431 | 431 |
| 432 class MoveOperands FINAL : public ZoneObject { | 432 class MoveOperands final : public ZoneObject { |
| 433 public: | 433 public: |
| 434 MoveOperands(const InstructionOperand& source, | 434 MoveOperands(const InstructionOperand& source, |
| 435 const InstructionOperand& destination) | 435 const InstructionOperand& destination) |
| 436 : source_(source), destination_(destination) { | 436 : source_(source), destination_(destination) { |
| 437 DCHECK(!source.IsInvalid() && !destination.IsInvalid()); | 437 DCHECK(!source.IsInvalid() && !destination.IsInvalid()); |
| 438 } | 438 } |
| 439 | 439 |
| 440 const InstructionOperand& source() const { return source_; } | 440 const InstructionOperand& source() const { return source_; } |
| 441 InstructionOperand& source() { return source_; } | 441 InstructionOperand& source() { return source_; } |
| 442 void set_source(const InstructionOperand& operand) { source_ = operand; } | 442 void set_source(const InstructionOperand& operand) { source_ = operand; } |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 483 | 483 |
| 484 struct PrintableMoveOperands { | 484 struct PrintableMoveOperands { |
| 485 const RegisterConfiguration* register_configuration_; | 485 const RegisterConfiguration* register_configuration_; |
| 486 const MoveOperands* move_operands_; | 486 const MoveOperands* move_operands_; |
| 487 }; | 487 }; |
| 488 | 488 |
| 489 | 489 |
| 490 std::ostream& operator<<(std::ostream& os, const PrintableMoveOperands& mo); | 490 std::ostream& operator<<(std::ostream& os, const PrintableMoveOperands& mo); |
| 491 | 491 |
| 492 | 492 |
| 493 class ParallelMove FINAL : public ZoneVector<MoveOperands*>, public ZoneObject { | 493 class ParallelMove final : public ZoneVector<MoveOperands*>, public ZoneObject { |
| 494 public: | 494 public: |
| 495 explicit ParallelMove(Zone* zone) : ZoneVector<MoveOperands*>(zone) { | 495 explicit ParallelMove(Zone* zone) : ZoneVector<MoveOperands*>(zone) { |
| 496 reserve(4); | 496 reserve(4); |
| 497 } | 497 } |
| 498 | 498 |
| 499 MoveOperands* AddMove(const InstructionOperand& from, | 499 MoveOperands* AddMove(const InstructionOperand& from, |
| 500 const InstructionOperand& to) { | 500 const InstructionOperand& to) { |
| 501 auto zone = get_allocator().zone(); | 501 auto zone = get_allocator().zone(); |
| 502 auto move = new (zone) MoveOperands(from, to); | 502 auto move = new (zone) MoveOperands(from, to); |
| 503 push_back(move); | 503 push_back(move); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 518 | 518 |
| 519 struct PrintableParallelMove { | 519 struct PrintableParallelMove { |
| 520 const RegisterConfiguration* register_configuration_; | 520 const RegisterConfiguration* register_configuration_; |
| 521 const ParallelMove* parallel_move_; | 521 const ParallelMove* parallel_move_; |
| 522 }; | 522 }; |
| 523 | 523 |
| 524 | 524 |
| 525 std::ostream& operator<<(std::ostream& os, const PrintableParallelMove& pm); | 525 std::ostream& operator<<(std::ostream& os, const PrintableParallelMove& pm); |
| 526 | 526 |
| 527 | 527 |
| 528 class ReferenceMap FINAL : public ZoneObject { | 528 class ReferenceMap final : public ZoneObject { |
| 529 public: | 529 public: |
| 530 explicit ReferenceMap(Zone* zone) | 530 explicit ReferenceMap(Zone* zone) |
| 531 : reference_operands_(8, zone), instruction_position_(-1) {} | 531 : reference_operands_(8, zone), instruction_position_(-1) {} |
| 532 | 532 |
| 533 const ZoneVector<InstructionOperand>& reference_operands() const { | 533 const ZoneVector<InstructionOperand>& reference_operands() const { |
| 534 return reference_operands_; | 534 return reference_operands_; |
| 535 } | 535 } |
| 536 int instruction_position() const { return instruction_position_; } | 536 int instruction_position() const { return instruction_position_; } |
| 537 | 537 |
| 538 void set_instruction_position(int pos) { | 538 void set_instruction_position(int pos) { |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 701 }; | 701 }; |
| 702 | 702 |
| 703 | 703 |
| 704 struct PrintableInstruction { | 704 struct PrintableInstruction { |
| 705 const RegisterConfiguration* register_configuration_; | 705 const RegisterConfiguration* register_configuration_; |
| 706 const Instruction* instr_; | 706 const Instruction* instr_; |
| 707 }; | 707 }; |
| 708 std::ostream& operator<<(std::ostream& os, const PrintableInstruction& instr); | 708 std::ostream& operator<<(std::ostream& os, const PrintableInstruction& instr); |
| 709 | 709 |
| 710 | 710 |
| 711 class RpoNumber FINAL { | 711 class RpoNumber final { |
| 712 public: | 712 public: |
| 713 static const int kInvalidRpoNumber = -1; | 713 static const int kInvalidRpoNumber = -1; |
| 714 int ToInt() const { | 714 int ToInt() const { |
| 715 DCHECK(IsValid()); | 715 DCHECK(IsValid()); |
| 716 return index_; | 716 return index_; |
| 717 } | 717 } |
| 718 size_t ToSize() const { | 718 size_t ToSize() const { |
| 719 DCHECK(IsValid()); | 719 DCHECK(IsValid()); |
| 720 return static_cast<size_t>(index_); | 720 return static_cast<size_t>(index_); |
| 721 } | 721 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 734 | 734 |
| 735 private: | 735 private: |
| 736 explicit RpoNumber(int32_t index) : index_(index) {} | 736 explicit RpoNumber(int32_t index) : index_(index) {} |
| 737 int32_t index_; | 737 int32_t index_; |
| 738 }; | 738 }; |
| 739 | 739 |
| 740 | 740 |
| 741 std::ostream& operator<<(std::ostream&, const RpoNumber&); | 741 std::ostream& operator<<(std::ostream&, const RpoNumber&); |
| 742 | 742 |
| 743 | 743 |
| 744 class Constant FINAL { | 744 class Constant final { |
| 745 public: | 745 public: |
| 746 enum Type { | 746 enum Type { |
| 747 kInt32, | 747 kInt32, |
| 748 kInt64, | 748 kInt64, |
| 749 kFloat32, | 749 kFloat32, |
| 750 kFloat64, | 750 kFloat64, |
| 751 kExternalReference, | 751 kExternalReference, |
| 752 kHeapObject, | 752 kHeapObject, |
| 753 kRpoNumber | 753 kRpoNumber |
| 754 }; | 754 }; |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 844 size_t locals_count_; | 844 size_t locals_count_; |
| 845 size_t stack_count_; | 845 size_t stack_count_; |
| 846 ZoneVector<MachineType> types_; | 846 ZoneVector<MachineType> types_; |
| 847 FrameStateDescriptor* outer_state_; | 847 FrameStateDescriptor* outer_state_; |
| 848 MaybeHandle<JSFunction> jsfunction_; | 848 MaybeHandle<JSFunction> jsfunction_; |
| 849 }; | 849 }; |
| 850 | 850 |
| 851 std::ostream& operator<<(std::ostream& os, const Constant& constant); | 851 std::ostream& operator<<(std::ostream& os, const Constant& constant); |
| 852 | 852 |
| 853 | 853 |
| 854 class PhiInstruction FINAL : public ZoneObject { | 854 class PhiInstruction final : public ZoneObject { |
| 855 public: | 855 public: |
| 856 typedef ZoneVector<InstructionOperand> Inputs; | 856 typedef ZoneVector<InstructionOperand> Inputs; |
| 857 | 857 |
| 858 PhiInstruction(Zone* zone, int virtual_register, size_t input_count); | 858 PhiInstruction(Zone* zone, int virtual_register, size_t input_count); |
| 859 | 859 |
| 860 void SetInput(size_t offset, int virtual_register); | 860 void SetInput(size_t offset, int virtual_register); |
| 861 | 861 |
| 862 int virtual_register() const { return virtual_register_; } | 862 int virtual_register() const { return virtual_register_; } |
| 863 const IntVector& operands() const { return operands_; } | 863 const IntVector& operands() const { return operands_; } |
| 864 | 864 |
| 865 // TODO(dcarney): this has no real business being here, since it's internal to | 865 // TODO(dcarney): this has no real business being here, since it's internal to |
| 866 // the register allocator, but putting it here was convenient. | 866 // the register allocator, but putting it here was convenient. |
| 867 const InstructionOperand& output() const { return output_; } | 867 const InstructionOperand& output() const { return output_; } |
| 868 InstructionOperand& output() { return output_; } | 868 InstructionOperand& output() { return output_; } |
| 869 | 869 |
| 870 private: | 870 private: |
| 871 const int virtual_register_; | 871 const int virtual_register_; |
| 872 InstructionOperand output_; | 872 InstructionOperand output_; |
| 873 IntVector operands_; | 873 IntVector operands_; |
| 874 }; | 874 }; |
| 875 | 875 |
| 876 | 876 |
| 877 // Analogue of BasicBlock for Instructions instead of Nodes. | 877 // Analogue of BasicBlock for Instructions instead of Nodes. |
| 878 class InstructionBlock FINAL : public ZoneObject { | 878 class InstructionBlock final : public ZoneObject { |
| 879 public: | 879 public: |
| 880 InstructionBlock(Zone* zone, RpoNumber rpo_number, RpoNumber loop_header, | 880 InstructionBlock(Zone* zone, RpoNumber rpo_number, RpoNumber loop_header, |
| 881 RpoNumber loop_end, bool deferred); | 881 RpoNumber loop_end, bool deferred); |
| 882 | 882 |
| 883 // Instruction indexes (used by the register allocator). | 883 // Instruction indexes (used by the register allocator). |
| 884 int first_instruction_index() const { | 884 int first_instruction_index() const { |
| 885 DCHECK(code_start_ >= 0); | 885 DCHECK(code_start_ >= 0); |
| 886 DCHECK(code_end_ > 0); | 886 DCHECK(code_end_ > 0); |
| 887 DCHECK(code_end_ >= code_start_); | 887 DCHECK(code_end_ >= code_start_); |
| 888 return code_start_; | 888 return code_start_; |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 949 typedef ZoneDeque<ReferenceMap*> ReferenceMapDeque; | 949 typedef ZoneDeque<ReferenceMap*> ReferenceMapDeque; |
| 950 typedef ZoneVector<FrameStateDescriptor*> DeoptimizationVector; | 950 typedef ZoneVector<FrameStateDescriptor*> DeoptimizationVector; |
| 951 typedef ZoneVector<InstructionBlock*> InstructionBlocks; | 951 typedef ZoneVector<InstructionBlock*> InstructionBlocks; |
| 952 | 952 |
| 953 struct PrintableInstructionSequence; | 953 struct PrintableInstructionSequence; |
| 954 | 954 |
| 955 | 955 |
| 956 // Represents architecture-specific generated code before, during, and after | 956 // Represents architecture-specific generated code before, during, and after |
| 957 // register allocation. | 957 // register allocation. |
| 958 // TODO(titzer): s/IsDouble/IsFloat64/ | 958 // TODO(titzer): s/IsDouble/IsFloat64/ |
| 959 class InstructionSequence FINAL : public ZoneObject { | 959 class InstructionSequence final : public ZoneObject { |
| 960 public: | 960 public: |
| 961 static InstructionBlocks* InstructionBlocksFor(Zone* zone, | 961 static InstructionBlocks* InstructionBlocksFor(Zone* zone, |
| 962 const Schedule* schedule); | 962 const Schedule* schedule); |
| 963 // Puts the deferred blocks last. | 963 // Puts the deferred blocks last. |
| 964 static void ComputeAssemblyOrder(InstructionBlocks* blocks); | 964 static void ComputeAssemblyOrder(InstructionBlocks* blocks); |
| 965 | 965 |
| 966 InstructionSequence(Isolate* isolate, Zone* zone, | 966 InstructionSequence(Isolate* isolate, Zone* zone, |
| 967 InstructionBlocks* instruction_blocks); | 967 InstructionBlocks* instruction_blocks); |
| 968 | 968 |
| 969 int NextVirtualRegister(); | 969 int NextVirtualRegister(); |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1114 | 1114 |
| 1115 | 1115 |
| 1116 std::ostream& operator<<(std::ostream& os, | 1116 std::ostream& operator<<(std::ostream& os, |
| 1117 const PrintableInstructionSequence& code); | 1117 const PrintableInstructionSequence& code); |
| 1118 | 1118 |
| 1119 } // namespace compiler | 1119 } // namespace compiler |
| 1120 } // namespace internal | 1120 } // namespace internal |
| 1121 } // namespace v8 | 1121 } // namespace v8 |
| 1122 | 1122 |
| 1123 #endif // V8_COMPILER_INSTRUCTION_H_ | 1123 #endif // V8_COMPILER_INSTRUCTION_H_ |
| OLD | NEW |