Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(408)

Side by Side Diff: src/compiler/instruction.h

Issue 1081053002: [turbofan] cleanup PointerMap (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: renames Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/compiler/code-generator.cc ('k') | src/compiler/instruction.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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_
OLDNEW
« no previous file with comments | « src/compiler/code-generator.cc ('k') | src/compiler/instruction.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698