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 500 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
511 | 511 |
512 struct PrintableParallelMove { | 512 struct PrintableParallelMove { |
513 const RegisterConfiguration* register_configuration_; | 513 const RegisterConfiguration* register_configuration_; |
514 const ParallelMove* parallel_move_; | 514 const ParallelMove* parallel_move_; |
515 }; | 515 }; |
516 | 516 |
517 | 517 |
518 std::ostream& operator<<(std::ostream& os, const PrintableParallelMove& pm); | 518 std::ostream& operator<<(std::ostream& os, const PrintableParallelMove& pm); |
519 | 519 |
520 | 520 |
521 class PointerMap FINAL : public ZoneObject { | 521 class ReferenceMap FINAL : public ZoneObject { |
522 public: | 522 public: |
523 explicit PointerMap(Zone* zone) | 523 explicit ReferenceMap(Zone* zone) |
524 : pointer_operands_(8, zone), | 524 : reference_operands_(8, zone), instruction_position_(-1) {} |
525 untagged_operands_(0, zone), | |
526 instruction_position_(-1) {} | |
527 | 525 |
528 const ZoneList<InstructionOperand*>* GetNormalizedOperands() { | 526 const ZoneVector<InstructionOperand>& reference_operands() const { |
529 for (int i = 0; i < untagged_operands_.length(); ++i) { | 527 return reference_operands_; |
530 RemovePointer(untagged_operands_[i]); | |
531 } | |
532 untagged_operands_.Clear(); | |
533 return &pointer_operands_; | |
534 } | 528 } |
535 int instruction_position() const { return instruction_position_; } | 529 int instruction_position() const { return instruction_position_; } |
536 | 530 |
537 void set_instruction_position(int pos) { | 531 void set_instruction_position(int pos) { |
538 DCHECK(instruction_position_ == -1); | 532 DCHECK(instruction_position_ == -1); |
539 instruction_position_ = pos; | 533 instruction_position_ = pos; |
540 } | 534 } |
541 | 535 |
542 void RecordPointer(InstructionOperand* op, Zone* zone); | 536 void RecordReference(const InstructionOperand& op); |
543 void RemovePointer(InstructionOperand* op); | |
544 void RecordUntagged(InstructionOperand* op, Zone* zone); | |
545 | 537 |
546 private: | 538 private: |
547 friend std::ostream& operator<<(std::ostream& os, const PointerMap& pm); | 539 friend std::ostream& operator<<(std::ostream& os, const ReferenceMap& pm); |
548 | 540 |
549 ZoneList<InstructionOperand*> pointer_operands_; | 541 ZoneVector<InstructionOperand> reference_operands_; |
550 ZoneList<InstructionOperand*> untagged_operands_; | |
551 int instruction_position_; | 542 int instruction_position_; |
552 }; | 543 }; |
553 | 544 |
554 std::ostream& operator<<(std::ostream& os, const PointerMap& pm); | 545 std::ostream& operator<<(std::ostream& os, const ReferenceMap& pm); |
555 | 546 |
556 // TODO(titzer): s/PointerMap/ReferenceMap/ | |
557 class Instruction { | 547 class Instruction { |
558 public: | 548 public: |
559 size_t OutputCount() const { return OutputCountField::decode(bit_field_); } | 549 size_t OutputCount() const { return OutputCountField::decode(bit_field_); } |
560 const InstructionOperand* OutputAt(size_t i) const { | 550 const InstructionOperand* OutputAt(size_t i) const { |
561 DCHECK(i < OutputCount()); | 551 DCHECK(i < OutputCount()); |
562 return &operands_[i]; | 552 return &operands_[i]; |
563 } | 553 } |
564 InstructionOperand* OutputAt(size_t i) { | 554 InstructionOperand* OutputAt(size_t i) { |
565 DCHECK(i < OutputCount()); | 555 DCHECK(i < OutputCount()); |
566 return &operands_[i]; | 556 return &operands_[i]; |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
620 total_extra_ops * sizeof(InstructionOperand)); | 610 total_extra_ops * sizeof(InstructionOperand)); |
621 return new (zone->New(size)) Instruction( | 611 return new (zone->New(size)) Instruction( |
622 opcode, output_count, outputs, input_count, inputs, temp_count, temps); | 612 opcode, output_count, outputs, input_count, inputs, temp_count, temps); |
623 } | 613 } |
624 | 614 |
625 Instruction* MarkAsCall() { | 615 Instruction* MarkAsCall() { |
626 bit_field_ = IsCallField::update(bit_field_, true); | 616 bit_field_ = IsCallField::update(bit_field_, true); |
627 return this; | 617 return this; |
628 } | 618 } |
629 bool IsCall() const { return IsCallField::decode(bit_field_); } | 619 bool IsCall() const { return IsCallField::decode(bit_field_); } |
630 bool NeedsPointerMap() const { return IsCall(); } | 620 bool NeedsReferenceMap() const { return IsCall(); } |
631 bool HasPointerMap() const { return pointer_map_ != NULL; } | 621 bool HasReferenceMap() const { return reference_map_ != NULL; } |
632 | 622 |
633 bool IsSourcePosition() const { | 623 bool IsSourcePosition() const { |
634 return opcode() == kSourcePositionInstruction; | 624 return opcode() == kSourcePositionInstruction; |
635 } | 625 } |
636 | 626 |
637 bool ClobbersRegisters() const { return IsCall(); } | 627 bool ClobbersRegisters() const { return IsCall(); } |
638 bool ClobbersTemps() const { return IsCall(); } | 628 bool ClobbersTemps() const { return IsCall(); } |
639 bool ClobbersDoubleRegisters() const { return IsCall(); } | 629 bool ClobbersDoubleRegisters() const { return IsCall(); } |
640 PointerMap* pointer_map() const { return pointer_map_; } | 630 ReferenceMap* reference_map() const { return reference_map_; } |
641 | 631 |
642 void set_pointer_map(PointerMap* map) { | 632 void set_reference_map(ReferenceMap* map) { |
643 DCHECK(NeedsPointerMap()); | 633 DCHECK(NeedsReferenceMap()); |
644 DCHECK(!pointer_map_); | 634 DCHECK(!reference_map_); |
645 pointer_map_ = map; | 635 reference_map_ = map; |
646 } | 636 } |
647 | 637 |
648 void OverwriteWithNop() { | 638 void OverwriteWithNop() { |
649 opcode_ = ArchOpcodeField::encode(kArchNop); | 639 opcode_ = ArchOpcodeField::encode(kArchNop); |
650 bit_field_ = 0; | 640 bit_field_ = 0; |
651 pointer_map_ = NULL; | 641 reference_map_ = NULL; |
652 } | 642 } |
653 | 643 |
654 bool IsNop() const { | 644 bool IsNop() const { |
655 return arch_opcode() == kArchNop && InputCount() == 0 && | 645 return arch_opcode() == kArchNop && InputCount() == 0 && |
656 OutputCount() == 0 && TempCount() == 0; | 646 OutputCount() == 0 && TempCount() == 0; |
657 } | 647 } |
658 | 648 |
659 enum GapPosition { | 649 enum GapPosition { |
660 START, | 650 START, |
661 END, | 651 END, |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
693 InstructionOperand* temps); | 683 InstructionOperand* temps); |
694 | 684 |
695 typedef BitField<size_t, 0, 8> OutputCountField; | 685 typedef BitField<size_t, 0, 8> OutputCountField; |
696 typedef BitField<size_t, 8, 16> InputCountField; | 686 typedef BitField<size_t, 8, 16> InputCountField; |
697 typedef BitField<size_t, 24, 6> TempCountField; | 687 typedef BitField<size_t, 24, 6> TempCountField; |
698 typedef BitField<bool, 30, 1> IsCallField; | 688 typedef BitField<bool, 30, 1> IsCallField; |
699 | 689 |
700 InstructionCode opcode_; | 690 InstructionCode opcode_; |
701 uint32_t bit_field_; | 691 uint32_t bit_field_; |
702 ParallelMove* parallel_moves_[2]; | 692 ParallelMove* parallel_moves_[2]; |
703 PointerMap* pointer_map_; | 693 ReferenceMap* reference_map_; |
704 InstructionOperand operands_[1]; | 694 InstructionOperand operands_[1]; |
705 | 695 |
706 private: | 696 private: |
707 DISALLOW_COPY_AND_ASSIGN(Instruction); | 697 DISALLOW_COPY_AND_ASSIGN(Instruction); |
708 }; | 698 }; |
709 | 699 |
710 | 700 |
711 struct PrintableInstruction { | 701 struct PrintableInstruction { |
712 const RegisterConfiguration* register_configuration_; | 702 const RegisterConfiguration* register_configuration_; |
713 const Instruction* instr_; | 703 const Instruction* instr_; |
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
980 int32_t code_start_; // start index of arch-specific code. | 970 int32_t code_start_; // start index of arch-specific code. |
981 int32_t code_end_; // end index of arch-specific code. | 971 int32_t code_end_; // end index of arch-specific code. |
982 const bool deferred_; // Block contains deferred code. | 972 const bool deferred_; // Block contains deferred code. |
983 }; | 973 }; |
984 | 974 |
985 typedef ZoneDeque<Constant> ConstantDeque; | 975 typedef ZoneDeque<Constant> ConstantDeque; |
986 typedef std::map<int, Constant, std::less<int>, | 976 typedef std::map<int, Constant, std::less<int>, |
987 zone_allocator<std::pair<int, Constant> > > ConstantMap; | 977 zone_allocator<std::pair<int, Constant> > > ConstantMap; |
988 | 978 |
989 typedef ZoneDeque<Instruction*> InstructionDeque; | 979 typedef ZoneDeque<Instruction*> InstructionDeque; |
990 typedef ZoneDeque<PointerMap*> PointerMapDeque; | 980 typedef ZoneDeque<ReferenceMap*> ReferenceMapDeque; |
991 typedef ZoneVector<FrameStateDescriptor*> DeoptimizationVector; | 981 typedef ZoneVector<FrameStateDescriptor*> DeoptimizationVector; |
992 typedef ZoneVector<InstructionBlock*> InstructionBlocks; | 982 typedef ZoneVector<InstructionBlock*> InstructionBlocks; |
993 | 983 |
994 struct PrintableInstructionSequence; | 984 struct PrintableInstructionSequence; |
995 | 985 |
996 | 986 |
997 // Represents architecture-specific generated code before, during, and after | 987 // Represents architecture-specific generated code before, during, and after |
998 // register allocation. | 988 // register allocation. |
999 // TODO(titzer): s/IsDouble/IsFloat64/ | 989 // TODO(titzer): s/IsDouble/IsFloat64/ |
1000 class InstructionSequence FINAL : public ZoneObject { | 990 class InstructionSequence FINAL : public ZoneObject { |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1046 const_iterator end() const { return instructions_.end(); } | 1036 const_iterator end() const { return instructions_.end(); } |
1047 const InstructionDeque& instructions() const { return instructions_; } | 1037 const InstructionDeque& instructions() const { return instructions_; } |
1048 | 1038 |
1049 Instruction* InstructionAt(int index) const { | 1039 Instruction* InstructionAt(int index) const { |
1050 DCHECK(index >= 0); | 1040 DCHECK(index >= 0); |
1051 DCHECK(index < static_cast<int>(instructions_.size())); | 1041 DCHECK(index < static_cast<int>(instructions_.size())); |
1052 return instructions_[index]; | 1042 return instructions_[index]; |
1053 } | 1043 } |
1054 | 1044 |
1055 Isolate* isolate() const { return isolate_; } | 1045 Isolate* isolate() const { return isolate_; } |
1056 const PointerMapDeque* pointer_maps() const { return &pointer_maps_; } | 1046 const ReferenceMapDeque* reference_maps() const { return &reference_maps_; } |
1057 Zone* zone() const { return zone_; } | 1047 Zone* zone() const { return zone_; } |
1058 | 1048 |
1059 // Used by the instruction selector while adding instructions. | 1049 // Used by the instruction selector while adding instructions. |
1060 int AddInstruction(Instruction* instr); | 1050 int AddInstruction(Instruction* instr); |
1061 void StartBlock(RpoNumber rpo); | 1051 void StartBlock(RpoNumber rpo); |
1062 void EndBlock(RpoNumber rpo); | 1052 void EndBlock(RpoNumber rpo); |
1063 | 1053 |
1064 int AddConstant(int virtual_register, Constant constant) { | 1054 int AddConstant(int virtual_register, Constant constant) { |
1065 // TODO(titzer): allow RPO numbers as constants? | 1055 // TODO(titzer): allow RPO numbers as constants? |
1066 DCHECK(constant.type() != Constant::kRpoNumber); | 1056 DCHECK(constant.type() != Constant::kRpoNumber); |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1126 typedef std::set<int, std::less<int>, ZoneIntAllocator> VirtualRegisterSet; | 1116 typedef std::set<int, std::less<int>, ZoneIntAllocator> VirtualRegisterSet; |
1127 | 1117 |
1128 Isolate* isolate_; | 1118 Isolate* isolate_; |
1129 Zone* const zone_; | 1119 Zone* const zone_; |
1130 InstructionBlocks* const instruction_blocks_; | 1120 InstructionBlocks* const instruction_blocks_; |
1131 IntVector block_starts_; | 1121 IntVector block_starts_; |
1132 ConstantMap constants_; | 1122 ConstantMap constants_; |
1133 Immediates immediates_; | 1123 Immediates immediates_; |
1134 InstructionDeque instructions_; | 1124 InstructionDeque instructions_; |
1135 int next_virtual_register_; | 1125 int next_virtual_register_; |
1136 PointerMapDeque pointer_maps_; | 1126 ReferenceMapDeque reference_maps_; |
1137 VirtualRegisterSet doubles_; | 1127 VirtualRegisterSet doubles_; |
1138 VirtualRegisterSet references_; | 1128 VirtualRegisterSet references_; |
1139 DeoptimizationVector deoptimization_entries_; | 1129 DeoptimizationVector deoptimization_entries_; |
1140 | 1130 |
1141 DISALLOW_COPY_AND_ASSIGN(InstructionSequence); | 1131 DISALLOW_COPY_AND_ASSIGN(InstructionSequence); |
1142 }; | 1132 }; |
1143 | 1133 |
1144 | 1134 |
1145 struct PrintableInstructionSequence { | 1135 struct PrintableInstructionSequence { |
1146 const RegisterConfiguration* register_configuration_; | 1136 const RegisterConfiguration* register_configuration_; |
1147 const InstructionSequence* sequence_; | 1137 const InstructionSequence* sequence_; |
1148 }; | 1138 }; |
1149 | 1139 |
1150 | 1140 |
1151 std::ostream& operator<<(std::ostream& os, | 1141 std::ostream& operator<<(std::ostream& os, |
1152 const PrintableInstructionSequence& code); | 1142 const PrintableInstructionSequence& code); |
1153 | 1143 |
1154 } // namespace compiler | 1144 } // namespace compiler |
1155 } // namespace internal | 1145 } // namespace internal |
1156 } // namespace v8 | 1146 } // namespace v8 |
1157 | 1147 |
1158 #endif // V8_COMPILER_INSTRUCTION_H_ | 1148 #endif // V8_COMPILER_INSTRUCTION_H_ |
OLD | NEW |