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 382 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
393 move_operands_.Add(MoveOperands(from, to), zone); | 393 move_operands_.Add(MoveOperands(from, to), zone); |
394 } | 394 } |
395 | 395 |
396 bool IsRedundant() const; | 396 bool IsRedundant() const; |
397 | 397 |
398 ZoneList<MoveOperands>* move_operands() { return &move_operands_; } | 398 ZoneList<MoveOperands>* move_operands() { return &move_operands_; } |
399 const ZoneList<MoveOperands>* move_operands() const { | 399 const ZoneList<MoveOperands>* move_operands() const { |
400 return &move_operands_; | 400 return &move_operands_; |
401 } | 401 } |
402 | 402 |
| 403 // Prepare this ParallelMove to insert move as if it happened in a subsequent |
| 404 // ParallelMove. move->source() may be changed. The MoveOperand returned |
| 405 // must be Eliminated and, as it points directly into move_operands_, it must |
| 406 // be Eliminated before any further mutation. |
| 407 MoveOperands* PrepareInsertAfter(MoveOperands* move) const; |
| 408 |
403 private: | 409 private: |
404 ZoneList<MoveOperands> move_operands_; | 410 ZoneList<MoveOperands> move_operands_; |
405 }; | 411 }; |
406 | 412 |
407 | 413 |
408 struct PrintableParallelMove { | 414 struct PrintableParallelMove { |
409 const RegisterConfiguration* register_configuration_; | 415 const RegisterConfiguration* register_configuration_; |
410 const ParallelMove* parallel_move_; | 416 const ParallelMove* parallel_move_; |
411 }; | 417 }; |
412 | 418 |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
589 }; | 595 }; |
590 std::ostream& operator<<(std::ostream& os, const PrintableInstruction& instr); | 596 std::ostream& operator<<(std::ostream& os, const PrintableInstruction& instr); |
591 | 597 |
592 | 598 |
593 // Represents moves inserted before an instruction due to register allocation. | 599 // Represents moves inserted before an instruction due to register allocation. |
594 // TODO(titzer): squash GapInstruction back into Instruction, since essentially | 600 // TODO(titzer): squash GapInstruction back into Instruction, since essentially |
595 // every instruction can possibly have moves inserted before it. | 601 // every instruction can possibly have moves inserted before it. |
596 class GapInstruction : public Instruction { | 602 class GapInstruction : public Instruction { |
597 public: | 603 public: |
598 enum InnerPosition { | 604 enum InnerPosition { |
599 BEFORE, | |
600 START, | 605 START, |
601 END, | 606 END, |
602 AFTER, | 607 FIRST_INNER_POSITION = START, |
603 FIRST_INNER_POSITION = BEFORE, | 608 LAST_INNER_POSITION = END |
604 LAST_INNER_POSITION = AFTER | |
605 }; | 609 }; |
606 | 610 |
607 ParallelMove* GetOrCreateParallelMove(InnerPosition pos, Zone* zone) { | 611 ParallelMove* GetOrCreateParallelMove(InnerPosition pos, Zone* zone) { |
608 if (parallel_moves_[pos] == NULL) { | 612 if (parallel_moves_[pos] == NULL) { |
609 parallel_moves_[pos] = new (zone) ParallelMove(zone); | 613 parallel_moves_[pos] = new (zone) ParallelMove(zone); |
610 } | 614 } |
611 return parallel_moves_[pos]; | 615 return parallel_moves_[pos]; |
612 } | 616 } |
613 | 617 |
614 ParallelMove* GetParallelMove(InnerPosition pos) { | 618 ParallelMove* GetParallelMove(InnerPosition pos) { |
(...skipping 18 matching lines...) Expand all Loading... |
633 return static_cast<GapInstruction*>(instr); | 637 return static_cast<GapInstruction*>(instr); |
634 } | 638 } |
635 | 639 |
636 static const GapInstruction* cast(const Instruction* instr) { | 640 static const GapInstruction* cast(const Instruction* instr) { |
637 DCHECK(instr->IsGapMoves()); | 641 DCHECK(instr->IsGapMoves()); |
638 return static_cast<const GapInstruction*>(instr); | 642 return static_cast<const GapInstruction*>(instr); |
639 } | 643 } |
640 | 644 |
641 protected: | 645 protected: |
642 explicit GapInstruction(InstructionCode opcode) : Instruction(opcode) { | 646 explicit GapInstruction(InstructionCode opcode) : Instruction(opcode) { |
643 parallel_moves_[BEFORE] = NULL; | |
644 parallel_moves_[START] = NULL; | 647 parallel_moves_[START] = NULL; |
645 parallel_moves_[END] = NULL; | 648 parallel_moves_[END] = NULL; |
646 parallel_moves_[AFTER] = NULL; | |
647 } | 649 } |
648 | 650 |
649 private: | 651 private: |
650 friend std::ostream& operator<<(std::ostream& os, | 652 friend std::ostream& operator<<(std::ostream& os, |
651 const PrintableInstruction& instr); | 653 const PrintableInstruction& instr); |
652 ParallelMove* parallel_moves_[LAST_INNER_POSITION + 1]; | 654 ParallelMove* parallel_moves_[LAST_INNER_POSITION + 1]; |
653 }; | 655 }; |
654 | 656 |
655 | 657 |
656 class SourcePositionInstruction FINAL : public Instruction { | 658 class SourcePositionInstruction FINAL : public Instruction { |
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1060 | 1062 |
1061 | 1063 |
1062 std::ostream& operator<<(std::ostream& os, | 1064 std::ostream& operator<<(std::ostream& os, |
1063 const PrintableInstructionSequence& code); | 1065 const PrintableInstructionSequence& code); |
1064 | 1066 |
1065 } // namespace compiler | 1067 } // namespace compiler |
1066 } // namespace internal | 1068 } // namespace internal |
1067 } // namespace v8 | 1069 } // namespace v8 |
1068 | 1070 |
1069 #endif // V8_COMPILER_INSTRUCTION_H_ | 1071 #endif // V8_COMPILER_INSTRUCTION_H_ |
OLD | NEW |