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

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

Issue 1389373002: [turbofan] Create ExplicitOperands to specify operands without virtual registers (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Review feedback Created 5 years, 1 month 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/instruction.h ('k') | src/compiler/instruction-selector-impl.h » ('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 9
10 namespace v8 { 10 namespace v8 {
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 << "]"; 98 << "]";
99 case InstructionOperand::IMMEDIATE: { 99 case InstructionOperand::IMMEDIATE: {
100 auto imm = ImmediateOperand::cast(op); 100 auto imm = ImmediateOperand::cast(op);
101 switch (imm.type()) { 101 switch (imm.type()) {
102 case ImmediateOperand::INLINE: 102 case ImmediateOperand::INLINE:
103 return os << "#" << imm.inline_value(); 103 return os << "#" << imm.inline_value();
104 case ImmediateOperand::INDEXED: 104 case ImmediateOperand::INDEXED:
105 return os << "[immediate:" << imm.indexed_value() << "]"; 105 return os << "[immediate:" << imm.indexed_value() << "]";
106 } 106 }
107 } 107 }
108 case InstructionOperand::EXPLICIT:
108 case InstructionOperand::ALLOCATED: { 109 case InstructionOperand::ALLOCATED: {
109 auto allocated = AllocatedOperand::cast(op); 110 auto allocated = LocationOperand::cast(op);
110 switch (allocated.allocated_kind()) { 111 if (op.IsStackSlot()) {
111 case AllocatedOperand::STACK_SLOT: 112 os << "[stack:" << LocationOperand::cast(op).index();
112 os << "[stack:" << StackSlotOperand::cast(op).index(); 113 } else if (op.IsDoubleStackSlot()) {
113 break; 114 os << "[double_stack:" << LocationOperand::cast(op).index();
114 case AllocatedOperand::DOUBLE_STACK_SLOT: 115 } else if (op.IsRegister()) {
115 os << "[double_stack:" << DoubleStackSlotOperand::cast(op).index(); 116 os << "[" << LocationOperand::cast(op).GetRegister().ToString() << "|R";
116 break; 117 } else {
117 case AllocatedOperand::REGISTER: 118 DCHECK(op.IsDoubleRegister());
118 os << "[" << RegisterOperand::cast(op).GetRegister().ToString() 119 os << "[" << LocationOperand::cast(op).GetDoubleRegister().ToString()
119 << "|R"; 120 << "|R";
120 break; 121 }
121 case AllocatedOperand::DOUBLE_REGISTER: 122 if (allocated.IsExplicit()) {
122 os << "[" 123 os << "|E";
123 << DoubleRegisterOperand::cast(op).GetDoubleRegister().ToString()
124 << "|R";
125 break;
126 } 124 }
127 switch (allocated.machine_type()) { 125 switch (allocated.machine_type()) {
128 case kRepWord32: 126 case kRepWord32:
129 os << "|w32"; 127 os << "|w32";
130 break; 128 break;
131 case kRepWord64: 129 case kRepWord64:
132 os << "|w64"; 130 os << "|w64";
133 break; 131 break;
134 case kRepFloat32: 132 case kRepFloat32:
135 os << "|f32"; 133 os << "|f32";
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
174 } 172 }
175 return true; 173 return true;
176 } 174 }
177 175
178 176
179 MoveOperands* ParallelMove::PrepareInsertAfter(MoveOperands* move) const { 177 MoveOperands* ParallelMove::PrepareInsertAfter(MoveOperands* move) const {
180 MoveOperands* replacement = nullptr; 178 MoveOperands* replacement = nullptr;
181 MoveOperands* to_eliminate = nullptr; 179 MoveOperands* to_eliminate = nullptr;
182 for (auto curr : *this) { 180 for (auto curr : *this) {
183 if (curr->IsEliminated()) continue; 181 if (curr->IsEliminated()) continue;
184 if (curr->destination().EqualsModuloType(move->source())) { 182 if (curr->destination().EqualsCanonicalized(move->source())) {
185 DCHECK(!replacement); 183 DCHECK(!replacement);
186 replacement = curr; 184 replacement = curr;
187 if (to_eliminate != nullptr) break; 185 if (to_eliminate != nullptr) break;
188 } else if (curr->destination().EqualsModuloType(move->destination())) { 186 } else if (curr->destination().EqualsCanonicalized(move->destination())) {
189 DCHECK(!to_eliminate); 187 DCHECK(!to_eliminate);
190 to_eliminate = curr; 188 to_eliminate = curr;
191 if (replacement != nullptr) break; 189 if (replacement != nullptr) break;
192 } 190 }
193 } 191 }
194 DCHECK_IMPLIES(replacement == to_eliminate, replacement == nullptr); 192 DCHECK_IMPLIES(replacement == to_eliminate, replacement == nullptr);
195 if (replacement != nullptr) move->set_source(replacement->source()); 193 if (replacement != nullptr) move->set_source(replacement->source());
196 return to_eliminate; 194 return to_eliminate;
197 } 195 }
198 196
199 197
198 ExplicitOperand::ExplicitOperand(LocationKind kind, MachineType machine_type,
199 int index)
200 : LocationOperand(EXPLICIT, kind, machine_type, index) {
201 DCHECK_IMPLIES(kind == REGISTER && !IsFloatingPoint(machine_type),
202 Register::from_code(index).IsAllocatable());
203 DCHECK_IMPLIES(kind == REGISTER && IsFloatingPoint(machine_type),
204 DoubleRegister::from_code(index).IsAllocatable());
205 }
206
207
200 Instruction::Instruction(InstructionCode opcode) 208 Instruction::Instruction(InstructionCode opcode)
201 : opcode_(opcode), 209 : opcode_(opcode),
202 bit_field_(OutputCountField::encode(0) | InputCountField::encode(0) | 210 bit_field_(OutputCountField::encode(0) | InputCountField::encode(0) |
203 TempCountField::encode(0) | IsCallField::encode(false)), 211 TempCountField::encode(0) | IsCallField::encode(false)),
204 reference_map_(NULL) { 212 reference_map_(NULL) {
205 parallel_moves_[0] = nullptr; 213 parallel_moves_[0] = nullptr;
206 parallel_moves_[1] = nullptr; 214 parallel_moves_[1] = nullptr;
207 } 215 }
208 216
209 217
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
256 first = false; 264 first = false;
257 PrintableMoveOperands pmo = {printable.register_configuration_, move}; 265 PrintableMoveOperands pmo = {printable.register_configuration_, move};
258 os << pmo; 266 os << pmo;
259 } 267 }
260 return os; 268 return os;
261 } 269 }
262 270
263 271
264 void ReferenceMap::RecordReference(const AllocatedOperand& op) { 272 void ReferenceMap::RecordReference(const AllocatedOperand& op) {
265 // Do not record arguments as pointers. 273 // Do not record arguments as pointers.
266 if (op.IsStackSlot() && StackSlotOperand::cast(op).index() < 0) return; 274 if (op.IsStackSlot() && LocationOperand::cast(op).index() < 0) return;
267 DCHECK(!op.IsDoubleRegister() && !op.IsDoubleStackSlot()); 275 DCHECK(!op.IsDoubleRegister() && !op.IsDoubleStackSlot());
268 reference_operands_.push_back(op); 276 reference_operands_.push_back(op);
269 } 277 }
270 278
271 279
272 std::ostream& operator<<(std::ostream& os, const ReferenceMap& pm) { 280 std::ostream& operator<<(std::ostream& os, const ReferenceMap& pm) {
273 os << "{"; 281 os << "{";
274 bool first = true; 282 bool first = true;
275 PrintableInstructionOperand poi = { 283 PrintableInstructionOperand poi = {
276 RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN), 284 RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN),
(...skipping 600 matching lines...) Expand 10 before | Expand all | Expand 10 after
877 os << " B" << succ.ToInt(); 885 os << " B" << succ.ToInt();
878 } 886 }
879 os << "\n"; 887 os << "\n";
880 } 888 }
881 return os; 889 return os;
882 } 890 }
883 891
884 } // namespace compiler 892 } // namespace compiler
885 } // namespace internal 893 } // namespace internal
886 } // namespace v8 894 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/instruction.h ('k') | src/compiler/instruction-selector-impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698