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

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

Issue 2092413002: [RegisterConfiguration] Streamline access to arch defaults, simplify Registers. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix compile. Created 4 years, 5 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/graph-visualizer.cc ('k') | src/compiler/move-optimizer.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 #include "src/compiler/common-operator.h" 5 #include "src/compiler/common-operator.h"
6 #include "src/compiler/graph.h" 6 #include "src/compiler/graph.h"
7 #include "src/compiler/instruction.h" 7 #include "src/compiler/instruction.h"
8 #include "src/compiler/schedule.h" 8 #include "src/compiler/schedule.h"
9 #include "src/compiler/state-values-utils.h" 9 #include "src/compiler/state-values-utils.h"
10 10
11 namespace v8 { 11 namespace v8 {
12 namespace internal { 12 namespace internal {
13 namespace compiler { 13 namespace compiler {
14 14
15 const auto GetRegConfig = RegisterConfiguration::Turbofan;
15 16
16 FlagsCondition CommuteFlagsCondition(FlagsCondition condition) { 17 FlagsCondition CommuteFlagsCondition(FlagsCondition condition) {
17 switch (condition) { 18 switch (condition) {
18 case kSignedLessThan: 19 case kSignedLessThan:
19 return kSignedGreaterThan; 20 return kSignedGreaterThan;
20 case kSignedGreaterThanOrEqual: 21 case kSignedGreaterThanOrEqual:
21 return kSignedLessThanOrEqual; 22 return kSignedLessThanOrEqual;
22 case kSignedLessThanOrEqual: 23 case kSignedLessThanOrEqual:
23 return kSignedGreaterThanOrEqual; 24 return kSignedGreaterThanOrEqual;
24 case kSignedGreaterThan: 25 case kSignedGreaterThan:
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
57 } 58 }
58 UNREACHABLE(); 59 UNREACHABLE();
59 return condition; 60 return condition;
60 } 61 }
61 62
62 bool InstructionOperand::InterferesWith(const InstructionOperand& that) const { 63 bool InstructionOperand::InterferesWith(const InstructionOperand& that) const {
63 if (!IsFPRegister() || !that.IsFPRegister()) return EqualsCanonicalized(that); 64 if (!IsFPRegister() || !that.IsFPRegister()) return EqualsCanonicalized(that);
64 65
65 const LocationOperand& loc1 = *LocationOperand::cast(this); 66 const LocationOperand& loc1 = *LocationOperand::cast(this);
66 const LocationOperand& loc2 = LocationOperand::cast(that); 67 const LocationOperand& loc2 = LocationOperand::cast(that);
67 const RegisterConfiguration* config = 68 const RegisterConfiguration* config = GetRegConfig();
68 RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN);
69 if (config->fp_aliasing_kind() != RegisterConfiguration::COMBINE) 69 if (config->fp_aliasing_kind() != RegisterConfiguration::COMBINE)
70 return loc1.register_code() == loc2.register_code(); 70 return loc1.register_code() == loc2.register_code();
71 71
72 return config->AreAliases(loc1.representation(), loc1.register_code(), 72 return config->AreAliases(loc1.representation(), loc1.register_code(),
73 loc2.representation(), loc2.register_code()); 73 loc2.representation(), loc2.register_code());
74 } 74 }
75 75
76 void InstructionOperand::Print(const RegisterConfiguration* config) const { 76 void InstructionOperand::Print(const RegisterConfiguration* config) const {
77 OFStream os(stdout); 77 OFStream os(stdout);
78 PrintableInstructionOperand wrapper; 78 PrintableInstructionOperand wrapper;
79 wrapper.register_configuration_ = config; 79 wrapper.register_configuration_ = config;
80 wrapper.op_ = *this; 80 wrapper.op_ = *this;
81 os << wrapper << std::endl; 81 os << wrapper << std::endl;
82 } 82 }
83 83
84 84 void InstructionOperand::Print() const { Print(GetRegConfig()); }
85 void InstructionOperand::Print() const {
86 const RegisterConfiguration* config =
87 RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN);
88 Print(config);
89 }
90 85
91 std::ostream& operator<<(std::ostream& os, 86 std::ostream& operator<<(std::ostream& os,
92 const PrintableInstructionOperand& printable) { 87 const PrintableInstructionOperand& printable) {
93 const InstructionOperand& op = printable.op_; 88 const InstructionOperand& op = printable.op_;
94 const RegisterConfiguration* conf = printable.register_configuration_; 89 const RegisterConfiguration* conf = printable.register_configuration_;
95 switch (op.kind()) { 90 switch (op.kind()) {
96 case InstructionOperand::UNALLOCATED: { 91 case InstructionOperand::UNALLOCATED: {
97 const UnallocatedOperand* unalloc = UnallocatedOperand::cast(&op); 92 const UnallocatedOperand* unalloc = UnallocatedOperand::cast(&op);
98 os << "v" << unalloc->virtual_register(); 93 os << "v" << unalloc->virtual_register();
99 if (unalloc->basic_policy() == UnallocatedOperand::FIXED_SLOT) { 94 if (unalloc->basic_policy() == UnallocatedOperand::FIXED_SLOT) {
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
135 } 130 }
136 } 131 }
137 case InstructionOperand::EXPLICIT: 132 case InstructionOperand::EXPLICIT:
138 case InstructionOperand::ALLOCATED: { 133 case InstructionOperand::ALLOCATED: {
139 LocationOperand allocated = LocationOperand::cast(op); 134 LocationOperand allocated = LocationOperand::cast(op);
140 if (op.IsStackSlot()) { 135 if (op.IsStackSlot()) {
141 os << "[stack:" << allocated.index(); 136 os << "[stack:" << allocated.index();
142 } else if (op.IsFPStackSlot()) { 137 } else if (op.IsFPStackSlot()) {
143 os << "[fp_stack:" << allocated.index(); 138 os << "[fp_stack:" << allocated.index();
144 } else if (op.IsRegister()) { 139 } else if (op.IsRegister()) {
145 os << "[" << allocated.GetRegister().ToString() << "|R"; 140 os << "["
141 << GetRegConfig()->GetGeneralRegisterName(allocated.register_code())
142 << "|R";
146 } else if (op.IsDoubleRegister()) { 143 } else if (op.IsDoubleRegister()) {
147 os << "[" << allocated.GetDoubleRegister().ToString() << "|R"; 144 os << "["
145 << GetRegConfig()->GetDoubleRegisterName(allocated.register_code())
146 << "|R";
148 } else { 147 } else {
149 DCHECK(op.IsFloatRegister()); 148 DCHECK(op.IsFloatRegister());
150 os << "[" << allocated.GetFloatRegister().ToString() << "|R"; 149 os << "["
150 << GetRegConfig()->GetFloatRegisterName(allocated.register_code())
151 << "|R";
151 } 152 }
152 if (allocated.IsExplicit()) { 153 if (allocated.IsExplicit()) {
153 os << "|E"; 154 os << "|E";
154 } 155 }
155 switch (allocated.representation()) { 156 switch (allocated.representation()) {
156 case MachineRepresentation::kNone: 157 case MachineRepresentation::kNone:
157 os << "|-"; 158 os << "|-";
158 break; 159 break;
159 case MachineRepresentation::kBit: 160 case MachineRepresentation::kBit:
160 os << "|b"; 161 os << "|b";
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
196 void MoveOperands::Print(const RegisterConfiguration* config) const { 197 void MoveOperands::Print(const RegisterConfiguration* config) const {
197 OFStream os(stdout); 198 OFStream os(stdout);
198 PrintableInstructionOperand wrapper; 199 PrintableInstructionOperand wrapper;
199 wrapper.register_configuration_ = config; 200 wrapper.register_configuration_ = config;
200 wrapper.op_ = destination(); 201 wrapper.op_ = destination();
201 os << wrapper << " = "; 202 os << wrapper << " = ";
202 wrapper.op_ = source(); 203 wrapper.op_ = source();
203 os << wrapper << std::endl; 204 os << wrapper << std::endl;
204 } 205 }
205 206
206 207 void MoveOperands::Print() const { Print(GetRegConfig()); }
207 void MoveOperands::Print() const {
208 const RegisterConfiguration* config =
209 RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN);
210 Print(config);
211 }
212
213 208
214 std::ostream& operator<<(std::ostream& os, 209 std::ostream& operator<<(std::ostream& os,
215 const PrintableMoveOperands& printable) { 210 const PrintableMoveOperands& printable) {
216 const MoveOperands& mo = *printable.move_operands_; 211 const MoveOperands& mo = *printable.move_operands_;
217 PrintableInstructionOperand printable_op = {printable.register_configuration_, 212 PrintableInstructionOperand printable_op = {printable.register_configuration_,
218 mo.destination()}; 213 mo.destination()};
219 os << printable_op; 214 os << printable_op;
220 if (!mo.source().Equals(mo.destination())) { 215 if (!mo.source().Equals(mo.destination())) {
221 printable_op.op_ = mo.source(); 216 printable_op.op_ = mo.source();
222 os << " = " << printable_op; 217 os << " = " << printable_op;
(...skipping 28 matching lines...) Expand all
251 DCHECK_IMPLIES(replacement == to_eliminate, replacement == nullptr); 246 DCHECK_IMPLIES(replacement == to_eliminate, replacement == nullptr);
252 if (replacement != nullptr) move->set_source(replacement->source()); 247 if (replacement != nullptr) move->set_source(replacement->source());
253 return to_eliminate; 248 return to_eliminate;
254 } 249 }
255 250
256 251
257 ExplicitOperand::ExplicitOperand(LocationKind kind, MachineRepresentation rep, 252 ExplicitOperand::ExplicitOperand(LocationKind kind, MachineRepresentation rep,
258 int index) 253 int index)
259 : LocationOperand(EXPLICIT, kind, rep, index) { 254 : LocationOperand(EXPLICIT, kind, rep, index) {
260 DCHECK_IMPLIES(kind == REGISTER && !IsFloatingPoint(rep), 255 DCHECK_IMPLIES(kind == REGISTER && !IsFloatingPoint(rep),
261 Register::from_code(index).IsAllocatable( 256 GetRegConfig()->IsAllocatableGeneralCode(index));
262 RegisterConfiguration::TURBOFAN));
263 DCHECK_IMPLIES(kind == REGISTER && rep == MachineRepresentation::kFloat32, 257 DCHECK_IMPLIES(kind == REGISTER && rep == MachineRepresentation::kFloat32,
264 FloatRegister::from_code(index).IsAllocatable( 258 GetRegConfig()->IsAllocatableFloatCode(index));
265 RegisterConfiguration::TURBOFAN));
266 DCHECK_IMPLIES(kind == REGISTER && (rep == MachineRepresentation::kFloat64), 259 DCHECK_IMPLIES(kind == REGISTER && (rep == MachineRepresentation::kFloat64),
267 DoubleRegister::from_code(index).IsAllocatable( 260 GetRegConfig()->IsAllocatableDoubleCode(index));
268 RegisterConfiguration::TURBOFAN));
269 } 261 }
270 262
271 Instruction::Instruction(InstructionCode opcode) 263 Instruction::Instruction(InstructionCode opcode)
272 : opcode_(opcode), 264 : opcode_(opcode),
273 bit_field_(OutputCountField::encode(0) | InputCountField::encode(0) | 265 bit_field_(OutputCountField::encode(0) | InputCountField::encode(0) |
274 TempCountField::encode(0) | IsCallField::encode(false)), 266 TempCountField::encode(0) | IsCallField::encode(false)),
275 reference_map_(nullptr), 267 reference_map_(nullptr),
276 block_(nullptr) { 268 block_(nullptr) {
277 parallel_moves_[0] = nullptr; 269 parallel_moves_[0] = nullptr;
278 parallel_moves_[1] = nullptr; 270 parallel_moves_[1] = nullptr;
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
319 311
320 312
321 void Instruction::Print(const RegisterConfiguration* config) const { 313 void Instruction::Print(const RegisterConfiguration* config) const {
322 OFStream os(stdout); 314 OFStream os(stdout);
323 PrintableInstruction wrapper; 315 PrintableInstruction wrapper;
324 wrapper.instr_ = this; 316 wrapper.instr_ = this;
325 wrapper.register_configuration_ = config; 317 wrapper.register_configuration_ = config;
326 os << wrapper << std::endl; 318 os << wrapper << std::endl;
327 } 319 }
328 320
329 321 void Instruction::Print() const { Print(GetRegConfig()); }
330 void Instruction::Print() const {
331 const RegisterConfiguration* config =
332 RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN);
333 Print(config);
334 }
335
336 322
337 std::ostream& operator<<(std::ostream& os, 323 std::ostream& operator<<(std::ostream& os,
338 const PrintableParallelMove& printable) { 324 const PrintableParallelMove& printable) {
339 const ParallelMove& pm = *printable.parallel_move_; 325 const ParallelMove& pm = *printable.parallel_move_;
340 bool first = true; 326 bool first = true;
341 for (MoveOperands* move : pm) { 327 for (MoveOperands* move : pm) {
342 if (move->IsEliminated()) continue; 328 if (move->IsEliminated()) continue;
343 if (!first) os << " "; 329 if (!first) os << " ";
344 first = false; 330 first = false;
345 PrintableMoveOperands pmo = {printable.register_configuration_, move}; 331 PrintableMoveOperands pmo = {printable.register_configuration_, move};
346 os << pmo; 332 os << pmo;
347 } 333 }
348 return os; 334 return os;
349 } 335 }
350 336
351 337
352 void ReferenceMap::RecordReference(const AllocatedOperand& op) { 338 void ReferenceMap::RecordReference(const AllocatedOperand& op) {
353 // Do not record arguments as pointers. 339 // Do not record arguments as pointers.
354 if (op.IsStackSlot() && LocationOperand::cast(op).index() < 0) return; 340 if (op.IsStackSlot() && LocationOperand::cast(op).index() < 0) return;
355 DCHECK(!op.IsFPRegister() && !op.IsFPStackSlot()); 341 DCHECK(!op.IsFPRegister() && !op.IsFPStackSlot());
356 reference_operands_.push_back(op); 342 reference_operands_.push_back(op);
357 } 343 }
358 344
359 345
360 std::ostream& operator<<(std::ostream& os, const ReferenceMap& pm) { 346 std::ostream& operator<<(std::ostream& os, const ReferenceMap& pm) {
361 os << "{"; 347 os << "{";
362 bool first = true; 348 bool first = true;
363 PrintableInstructionOperand poi = { 349 PrintableInstructionOperand poi = {GetRegConfig(), InstructionOperand()};
364 RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN),
365 InstructionOperand()};
366 for (const InstructionOperand& op : pm.reference_operands_) { 350 for (const InstructionOperand& op : pm.reference_operands_) {
367 if (!first) { 351 if (!first) {
368 os << ";"; 352 os << ";";
369 } else { 353 } else {
370 first = false; 354 first = false;
371 } 355 }
372 poi.op_ = op; 356 poi.op_ = op;
373 os << poi; 357 os << poi;
374 } 358 }
375 return os << "}"; 359 return os << "}";
(...skipping 514 matching lines...) Expand 10 before | Expand all | Expand 10 after
890 874
891 875
892 void InstructionSequence::Print(const RegisterConfiguration* config) const { 876 void InstructionSequence::Print(const RegisterConfiguration* config) const {
893 OFStream os(stdout); 877 OFStream os(stdout);
894 PrintableInstructionSequence wrapper; 878 PrintableInstructionSequence wrapper;
895 wrapper.register_configuration_ = config; 879 wrapper.register_configuration_ = config;
896 wrapper.sequence_ = this; 880 wrapper.sequence_ = this;
897 os << wrapper << std::endl; 881 os << wrapper << std::endl;
898 } 882 }
899 883
900 884 void InstructionSequence::Print() const { Print(GetRegConfig()); }
901 void InstructionSequence::Print() const {
902 const RegisterConfiguration* config =
903 RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN);
904 Print(config);
905 }
906 885
907 void InstructionSequence::PrintBlock(const RegisterConfiguration* config, 886 void InstructionSequence::PrintBlock(const RegisterConfiguration* config,
908 int block_id) const { 887 int block_id) const {
909 OFStream os(stdout); 888 OFStream os(stdout);
910 RpoNumber rpo = RpoNumber::FromInt(block_id); 889 RpoNumber rpo = RpoNumber::FromInt(block_id);
911 const InstructionBlock* block = InstructionBlockAt(rpo); 890 const InstructionBlock* block = InstructionBlockAt(rpo);
912 CHECK(block->rpo_number() == rpo); 891 CHECK(block->rpo_number() == rpo);
913 892
914 os << "B" << block->rpo_number(); 893 os << "B" << block->rpo_number();
915 os << ": AO#" << block->ao_number(); 894 os << ": AO#" << block->ao_number();
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
949 os << " " << buf.start() << ": " << printable_instr << "\n"; 928 os << " " << buf.start() << ": " << printable_instr << "\n";
950 } 929 }
951 930
952 for (RpoNumber succ : block->successors()) { 931 for (RpoNumber succ : block->successors()) {
953 os << " B" << succ.ToInt(); 932 os << " B" << succ.ToInt();
954 } 933 }
955 os << "\n"; 934 os << "\n";
956 } 935 }
957 936
958 void InstructionSequence::PrintBlock(int block_id) const { 937 void InstructionSequence::PrintBlock(int block_id) const {
959 const RegisterConfiguration* config = 938 PrintBlock(GetRegConfig(), block_id);
960 RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN);
961 PrintBlock(config, block_id);
962 } 939 }
963 940
964 FrameStateDescriptor::FrameStateDescriptor( 941 FrameStateDescriptor::FrameStateDescriptor(
965 Zone* zone, FrameStateType type, BailoutId bailout_id, 942 Zone* zone, FrameStateType type, BailoutId bailout_id,
966 OutputFrameStateCombine state_combine, size_t parameters_count, 943 OutputFrameStateCombine state_combine, size_t parameters_count,
967 size_t locals_count, size_t stack_count, 944 size_t locals_count, size_t stack_count,
968 MaybeHandle<SharedFunctionInfo> shared_info, 945 MaybeHandle<SharedFunctionInfo> shared_info,
969 FrameStateDescriptor* outer_state) 946 FrameStateDescriptor* outer_state)
970 : type_(type), 947 : type_(type),
971 bailout_id_(bailout_id), 948 bailout_id_(bailout_id),
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
1043 } 1020 }
1044 for (int i = 0; i < code.InstructionBlockCount(); i++) { 1021 for (int i = 0; i < code.InstructionBlockCount(); i++) {
1045 printable.sequence_->PrintBlock(printable.register_configuration_, i); 1022 printable.sequence_->PrintBlock(printable.register_configuration_, i);
1046 } 1023 }
1047 return os; 1024 return os;
1048 } 1025 }
1049 1026
1050 } // namespace compiler 1027 } // namespace compiler
1051 } // namespace internal 1028 } // namespace internal
1052 } // namespace v8 1029 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/graph-visualizer.cc ('k') | src/compiler/move-optimizer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698