| 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> |
| 11 #include <set> | 11 #include <set> |
| 12 | 12 |
| 13 #include "src/compiler/common-operator.h" | 13 #include "src/compiler/common-operator.h" |
| 14 #include "src/compiler/frame.h" | 14 #include "src/compiler/frame.h" |
| 15 #include "src/compiler/instruction-codes.h" | 15 #include "src/compiler/instruction-codes.h" |
| 16 #include "src/compiler/opcodes.h" | 16 #include "src/compiler/opcodes.h" |
| 17 #include "src/compiler/register-configuration.h" | 17 #include "src/compiler/register-configuration.h" |
| 18 #include "src/compiler/schedule.h" | 18 #include "src/compiler/schedule.h" |
| 19 #include "src/compiler/source-position.h" | 19 #include "src/compiler/source-position.h" |
| 20 #include "src/zone-allocator.h" | 20 #include "src/zone-allocator.h" |
| 21 | 21 |
| 22 namespace v8 { | 22 namespace v8 { |
| 23 namespace internal { | 23 namespace internal { |
| 24 namespace compiler { | 24 namespace compiler { |
| 25 | 25 |
| 26 // A couple of reserved opcodes are used for internal use. | 26 // A couple of reserved opcodes are used for internal use. |
| 27 const InstructionCode kGapInstruction = -1; | 27 const InstructionCode kGapInstruction = -1; |
| 28 const InstructionCode kBlockStartInstruction = -2; | 28 const InstructionCode kSourcePositionInstruction = -2; |
| 29 const InstructionCode kSourcePositionInstruction = -3; | |
| 30 | 29 |
| 31 #define INSTRUCTION_OPERAND_LIST(V) \ | 30 #define INSTRUCTION_OPERAND_LIST(V) \ |
| 32 V(Constant, CONSTANT, 0) \ | 31 V(Constant, CONSTANT, 0) \ |
| 33 V(Immediate, IMMEDIATE, 0) \ | 32 V(Immediate, IMMEDIATE, 0) \ |
| 34 V(StackSlot, STACK_SLOT, 128) \ | 33 V(StackSlot, STACK_SLOT, 128) \ |
| 35 V(DoubleStackSlot, DOUBLE_STACK_SLOT, 128) \ | 34 V(DoubleStackSlot, DOUBLE_STACK_SLOT, 128) \ |
| 36 V(Register, REGISTER, RegisterConfiguration::kMaxGeneralRegisters) \ | 35 V(Register, REGISTER, RegisterConfiguration::kMaxGeneralRegisters) \ |
| 37 V(DoubleRegister, DOUBLE_REGISTER, RegisterConfiguration::kMaxDoubleRegisters) | 36 V(DoubleRegister, DOUBLE_REGISTER, RegisterConfiguration::kMaxDoubleRegisters) |
| 38 | 37 |
| 39 class InstructionOperand : public ZoneObject { | 38 class InstructionOperand : public ZoneObject { |
| (...skipping 447 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 487 } | 486 } |
| 488 Instruction* MarkAsCall() { | 487 Instruction* MarkAsCall() { |
| 489 bit_field_ = IsCallField::update(bit_field_, true); | 488 bit_field_ = IsCallField::update(bit_field_, true); |
| 490 return this; | 489 return this; |
| 491 } | 490 } |
| 492 bool IsControl() const { return IsControlField::decode(bit_field_); } | 491 bool IsControl() const { return IsControlField::decode(bit_field_); } |
| 493 bool IsCall() const { return IsCallField::decode(bit_field_); } | 492 bool IsCall() const { return IsCallField::decode(bit_field_); } |
| 494 bool NeedsPointerMap() const { return IsCall(); } | 493 bool NeedsPointerMap() const { return IsCall(); } |
| 495 bool HasPointerMap() const { return pointer_map_ != NULL; } | 494 bool HasPointerMap() const { return pointer_map_ != NULL; } |
| 496 | 495 |
| 497 bool IsGapMoves() const { | 496 bool IsGapMoves() const { return opcode() == kGapInstruction; } |
| 498 return opcode() == kGapInstruction || opcode() == kBlockStartInstruction; | |
| 499 } | |
| 500 bool IsBlockStart() const { return opcode() == kBlockStartInstruction; } | |
| 501 bool IsSourcePosition() const { | 497 bool IsSourcePosition() const { |
| 502 return opcode() == kSourcePositionInstruction; | 498 return opcode() == kSourcePositionInstruction; |
| 503 } | 499 } |
| 504 | 500 |
| 505 bool ClobbersRegisters() const { return IsCall(); } | 501 bool ClobbersRegisters() const { return IsCall(); } |
| 506 bool ClobbersTemps() const { return IsCall(); } | 502 bool ClobbersTemps() const { return IsCall(); } |
| 507 bool ClobbersDoubleRegisters() const { return IsCall(); } | 503 bool ClobbersDoubleRegisters() const { return IsCall(); } |
| 508 PointerMap* pointer_map() const { return pointer_map_; } | 504 PointerMap* pointer_map() const { return pointer_map_; } |
| 509 | 505 |
| 510 void set_pointer_map(PointerMap* map) { | 506 void set_pointer_map(PointerMap* map) { |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 636 parallel_moves_[AFTER] = NULL; | 632 parallel_moves_[AFTER] = NULL; |
| 637 } | 633 } |
| 638 | 634 |
| 639 private: | 635 private: |
| 640 friend std::ostream& operator<<(std::ostream& os, | 636 friend std::ostream& operator<<(std::ostream& os, |
| 641 const PrintableInstruction& instr); | 637 const PrintableInstruction& instr); |
| 642 ParallelMove* parallel_moves_[LAST_INNER_POSITION + 1]; | 638 ParallelMove* parallel_moves_[LAST_INNER_POSITION + 1]; |
| 643 }; | 639 }; |
| 644 | 640 |
| 645 | 641 |
| 646 // This special kind of gap move instruction represents the beginning of a | |
| 647 // block of code. | |
| 648 class BlockStartInstruction FINAL : public GapInstruction { | |
| 649 public: | |
| 650 static BlockStartInstruction* New(Zone* zone) { | |
| 651 void* buffer = zone->New(sizeof(BlockStartInstruction)); | |
| 652 return new (buffer) BlockStartInstruction(); | |
| 653 } | |
| 654 | |
| 655 static BlockStartInstruction* cast(Instruction* instr) { | |
| 656 DCHECK(instr->IsBlockStart()); | |
| 657 return static_cast<BlockStartInstruction*>(instr); | |
| 658 } | |
| 659 | |
| 660 static const BlockStartInstruction* cast(const Instruction* instr) { | |
| 661 DCHECK(instr->IsBlockStart()); | |
| 662 return static_cast<const BlockStartInstruction*>(instr); | |
| 663 } | |
| 664 | |
| 665 private: | |
| 666 BlockStartInstruction() : GapInstruction(kBlockStartInstruction) {} | |
| 667 }; | |
| 668 | |
| 669 | |
| 670 class SourcePositionInstruction FINAL : public Instruction { | 642 class SourcePositionInstruction FINAL : public Instruction { |
| 671 public: | 643 public: |
| 672 static SourcePositionInstruction* New(Zone* zone, SourcePosition position) { | 644 static SourcePositionInstruction* New(Zone* zone, SourcePosition position) { |
| 673 void* buffer = zone->New(sizeof(SourcePositionInstruction)); | 645 void* buffer = zone->New(sizeof(SourcePositionInstruction)); |
| 674 return new (buffer) SourcePositionInstruction(position); | 646 return new (buffer) SourcePositionInstruction(position); |
| 675 } | 647 } |
| 676 | 648 |
| 677 SourcePosition source_position() const { return source_position_; } | 649 SourcePosition source_position() const { return source_position_; } |
| 678 | 650 |
| 679 static SourcePositionInstruction* cast(Instruction* instr) { | 651 static SourcePositionInstruction* cast(Instruction* instr) { |
| (...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 976 const InstructionBlock* GetInstructionBlock(int instruction_index) const; | 948 const InstructionBlock* GetInstructionBlock(int instruction_index) const; |
| 977 | 949 |
| 978 bool IsReference(int virtual_register) const; | 950 bool IsReference(int virtual_register) const; |
| 979 bool IsDouble(int virtual_register) const; | 951 bool IsDouble(int virtual_register) const; |
| 980 | 952 |
| 981 void MarkAsReference(int virtual_register); | 953 void MarkAsReference(int virtual_register); |
| 982 void MarkAsDouble(int virtual_register); | 954 void MarkAsDouble(int virtual_register); |
| 983 | 955 |
| 984 void AddGapMove(int index, InstructionOperand* from, InstructionOperand* to); | 956 void AddGapMove(int index, InstructionOperand* from, InstructionOperand* to); |
| 985 | 957 |
| 986 BlockStartInstruction* GetBlockStart(BasicBlock::RpoNumber rpo) const; | 958 GapInstruction* GetBlockStart(BasicBlock::RpoNumber rpo) const; |
| 987 | 959 |
| 988 typedef InstructionDeque::const_iterator const_iterator; | 960 typedef InstructionDeque::const_iterator const_iterator; |
| 989 const_iterator begin() const { return instructions_.begin(); } | 961 const_iterator begin() const { return instructions_.begin(); } |
| 990 const_iterator end() const { return instructions_.end(); } | 962 const_iterator end() const { return instructions_.end(); } |
| 991 const InstructionDeque& instructions() const { return instructions_; } | 963 const InstructionDeque& instructions() const { return instructions_; } |
| 992 | 964 |
| 993 GapInstruction* GapAt(int index) const { | 965 GapInstruction* GapAt(int index) const { |
| 994 return GapInstruction::cast(InstructionAt(index)); | 966 return GapInstruction::cast(InstructionAt(index)); |
| 995 } | 967 } |
| 996 bool IsGapAt(int index) const { return InstructionAt(index)->IsGapMoves(); } | 968 bool IsGapAt(int index) const { return InstructionAt(index)->IsGapMoves(); } |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1088 | 1060 |
| 1089 | 1061 |
| 1090 std::ostream& operator<<(std::ostream& os, | 1062 std::ostream& operator<<(std::ostream& os, |
| 1091 const PrintableInstructionSequence& code); | 1063 const PrintableInstructionSequence& code); |
| 1092 | 1064 |
| 1093 } // namespace compiler | 1065 } // namespace compiler |
| 1094 } // namespace internal | 1066 } // namespace internal |
| 1095 } // namespace v8 | 1067 } // namespace v8 |
| 1096 | 1068 |
| 1097 #endif // V8_COMPILER_INSTRUCTION_H_ | 1069 #endif // V8_COMPILER_INSTRUCTION_H_ |
| OLD | NEW |