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 #include "src/compiler/common-operator.h" | 5 #include "src/compiler/common-operator.h" |
6 | 6 |
7 #include "src/assembler.h" | 7 #include "src/assembler.h" |
8 #include "src/base/lazy-instance.h" | 8 #include "src/base/lazy-instance.h" |
9 #include "src/compiler/linkage.h" | 9 #include "src/compiler/linkage.h" |
10 #include "src/compiler/opcodes.h" | 10 #include "src/compiler/opcodes.h" |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
187 V(6) \ | 187 V(6) \ |
188 V(7) \ | 188 V(7) \ |
189 V(8) \ | 189 V(8) \ |
190 V(10) \ | 190 V(10) \ |
191 V(11) \ | 191 V(11) \ |
192 V(12) \ | 192 V(12) \ |
193 V(13) \ | 193 V(13) \ |
194 V(14) | 194 V(14) |
195 | 195 |
196 | 196 |
197 struct CommonOperatorGlobalCache FINAL { | 197 struct CommonOperatorGlobalCache final { |
198 #define CACHED(Name, properties, value_input_count, effect_input_count, \ | 198 #define CACHED(Name, properties, value_input_count, effect_input_count, \ |
199 control_input_count, value_output_count, effect_output_count, \ | 199 control_input_count, value_output_count, effect_output_count, \ |
200 control_output_count) \ | 200 control_output_count) \ |
201 struct Name##Operator FINAL : public Operator { \ | 201 struct Name##Operator final : public Operator { \ |
202 Name##Operator() \ | 202 Name##Operator() \ |
203 : Operator(IrOpcode::k##Name, properties, #Name, value_input_count, \ | 203 : Operator(IrOpcode::k##Name, properties, #Name, value_input_count, \ |
204 effect_input_count, control_input_count, \ | 204 effect_input_count, control_input_count, \ |
205 value_output_count, effect_output_count, \ | 205 value_output_count, effect_output_count, \ |
206 control_output_count) {} \ | 206 control_output_count) {} \ |
207 }; \ | 207 }; \ |
208 Name##Operator k##Name##Operator; | 208 Name##Operator k##Name##Operator; |
209 CACHED_OP_LIST(CACHED) | 209 CACHED_OP_LIST(CACHED) |
210 #undef CACHED | 210 #undef CACHED |
211 | 211 |
212 template <BranchHint kBranchHint> | 212 template <BranchHint kBranchHint> |
213 struct BranchOperator FINAL : public Operator1<BranchHint> { | 213 struct BranchOperator final : public Operator1<BranchHint> { |
214 BranchOperator() | 214 BranchOperator() |
215 : Operator1<BranchHint>( // -- | 215 : Operator1<BranchHint>( // -- |
216 IrOpcode::kBranch, Operator::kKontrol, // opcode | 216 IrOpcode::kBranch, Operator::kKontrol, // opcode |
217 "Branch", // name | 217 "Branch", // name |
218 1, 0, 1, 0, 0, 2, // counts | 218 1, 0, 1, 0, 0, 2, // counts |
219 kBranchHint) {} // parameter | 219 kBranchHint) {} // parameter |
220 }; | 220 }; |
221 BranchOperator<BranchHint::kNone> kBranchNoneOperator; | 221 BranchOperator<BranchHint::kNone> kBranchNoneOperator; |
222 BranchOperator<BranchHint::kTrue> kBranchTrueOperator; | 222 BranchOperator<BranchHint::kTrue> kBranchTrueOperator; |
223 BranchOperator<BranchHint::kFalse> kBranchFalseOperator; | 223 BranchOperator<BranchHint::kFalse> kBranchFalseOperator; |
224 | 224 |
225 template <int kEffectInputCount> | 225 template <int kEffectInputCount> |
226 struct EffectPhiOperator FINAL : public Operator { | 226 struct EffectPhiOperator final : public Operator { |
227 EffectPhiOperator() | 227 EffectPhiOperator() |
228 : Operator( // -- | 228 : Operator( // -- |
229 IrOpcode::kEffectPhi, Operator::kPure, // opcode | 229 IrOpcode::kEffectPhi, Operator::kPure, // opcode |
230 "EffectPhi", // name | 230 "EffectPhi", // name |
231 0, kEffectInputCount, 1, 0, 1, 0) {} // counts | 231 0, kEffectInputCount, 1, 0, 1, 0) {} // counts |
232 }; | 232 }; |
233 #define CACHED_EFFECT_PHI(input_count) \ | 233 #define CACHED_EFFECT_PHI(input_count) \ |
234 EffectPhiOperator<input_count> kEffectPhi##input_count##Operator; | 234 EffectPhiOperator<input_count> kEffectPhi##input_count##Operator; |
235 CACHED_EFFECT_PHI_LIST(CACHED_EFFECT_PHI) | 235 CACHED_EFFECT_PHI_LIST(CACHED_EFFECT_PHI) |
236 #undef CACHED_EFFECT_PHI | 236 #undef CACHED_EFFECT_PHI |
237 | 237 |
238 template <size_t kInputCount> | 238 template <size_t kInputCount> |
239 struct LoopOperator FINAL : public Operator { | 239 struct LoopOperator final : public Operator { |
240 LoopOperator() | 240 LoopOperator() |
241 : Operator( // -- | 241 : Operator( // -- |
242 IrOpcode::kLoop, Operator::kKontrol, // opcode | 242 IrOpcode::kLoop, Operator::kKontrol, // opcode |
243 "Loop", // name | 243 "Loop", // name |
244 0, 0, kInputCount, 0, 0, 1) {} // counts | 244 0, 0, kInputCount, 0, 0, 1) {} // counts |
245 }; | 245 }; |
246 #define CACHED_LOOP(input_count) \ | 246 #define CACHED_LOOP(input_count) \ |
247 LoopOperator<input_count> kLoop##input_count##Operator; | 247 LoopOperator<input_count> kLoop##input_count##Operator; |
248 CACHED_LOOP_LIST(CACHED_LOOP) | 248 CACHED_LOOP_LIST(CACHED_LOOP) |
249 #undef CACHED_LOOP | 249 #undef CACHED_LOOP |
250 | 250 |
251 template <size_t kInputCount> | 251 template <size_t kInputCount> |
252 struct MergeOperator FINAL : public Operator { | 252 struct MergeOperator final : public Operator { |
253 MergeOperator() | 253 MergeOperator() |
254 : Operator( // -- | 254 : Operator( // -- |
255 IrOpcode::kMerge, Operator::kKontrol, // opcode | 255 IrOpcode::kMerge, Operator::kKontrol, // opcode |
256 "Merge", // name | 256 "Merge", // name |
257 0, 0, kInputCount, 0, 0, 1) {} // counts | 257 0, 0, kInputCount, 0, 0, 1) {} // counts |
258 }; | 258 }; |
259 #define CACHED_MERGE(input_count) \ | 259 #define CACHED_MERGE(input_count) \ |
260 MergeOperator<input_count> kMerge##input_count##Operator; | 260 MergeOperator<input_count> kMerge##input_count##Operator; |
261 CACHED_MERGE_LIST(CACHED_MERGE) | 261 CACHED_MERGE_LIST(CACHED_MERGE) |
262 #undef CACHED_MERGE | 262 #undef CACHED_MERGE |
263 | 263 |
264 template <MachineType kType, int kInputCount> | 264 template <MachineType kType, int kInputCount> |
265 struct PhiOperator FINAL : public Operator1<MachineType> { | 265 struct PhiOperator final : public Operator1<MachineType> { |
266 PhiOperator() | 266 PhiOperator() |
267 : Operator1<MachineType>( //-- | 267 : Operator1<MachineType>( //-- |
268 IrOpcode::kPhi, Operator::kPure, // opcode | 268 IrOpcode::kPhi, Operator::kPure, // opcode |
269 "Phi", // name | 269 "Phi", // name |
270 kInputCount, 0, 1, 1, 0, 0, // counts | 270 kInputCount, 0, 1, 1, 0, 0, // counts |
271 kType) {} // parameter | 271 kType) {} // parameter |
272 }; | 272 }; |
273 #define CACHED_PHI(type, input_count) \ | 273 #define CACHED_PHI(type, input_count) \ |
274 PhiOperator<type, input_count> kPhi##type##input_count##Operator; | 274 PhiOperator<type, input_count> kPhi##type##input_count##Operator; |
275 CACHED_PHI_LIST(CACHED_PHI) | 275 CACHED_PHI_LIST(CACHED_PHI) |
276 #undef CACHED_PHI | 276 #undef CACHED_PHI |
277 | 277 |
278 template <int kIndex> | 278 template <int kIndex> |
279 struct ParameterOperator FINAL : public Operator1<int> { | 279 struct ParameterOperator final : public Operator1<int> { |
280 ParameterOperator() | 280 ParameterOperator() |
281 : Operator1<int>( // -- | 281 : Operator1<int>( // -- |
282 IrOpcode::kParameter, Operator::kPure, // opcode | 282 IrOpcode::kParameter, Operator::kPure, // opcode |
283 "Parameter", // name | 283 "Parameter", // name |
284 1, 0, 0, 1, 0, 0, // counts, | 284 1, 0, 0, 1, 0, 0, // counts, |
285 kIndex) {} // parameter | 285 kIndex) {} // parameter |
286 }; | 286 }; |
287 #define CACHED_PARAMETER(index) \ | 287 #define CACHED_PARAMETER(index) \ |
288 ParameterOperator<index> kParameter##index##Operator; | 288 ParameterOperator<index> kParameter##index##Operator; |
289 CACHED_PARAMETER_LIST(CACHED_PARAMETER) | 289 CACHED_PARAMETER_LIST(CACHED_PARAMETER) |
290 #undef CACHED_PARAMETER | 290 #undef CACHED_PARAMETER |
291 | 291 |
292 template <size_t kIndex> | 292 template <size_t kIndex> |
293 struct ProjectionOperator FINAL : public Operator1<size_t> { | 293 struct ProjectionOperator final : public Operator1<size_t> { |
294 ProjectionOperator() | 294 ProjectionOperator() |
295 : Operator1<size_t>( // -- | 295 : Operator1<size_t>( // -- |
296 IrOpcode::kProjection, // opcode | 296 IrOpcode::kProjection, // opcode |
297 Operator::kPure, // flags | 297 Operator::kPure, // flags |
298 "Projection", // name | 298 "Projection", // name |
299 1, 0, 0, 1, 0, 0, // counts, | 299 1, 0, 0, 1, 0, 0, // counts, |
300 kIndex) {} // parameter | 300 kIndex) {} // parameter |
301 }; | 301 }; |
302 #define CACHED_PROJECTION(index) \ | 302 #define CACHED_PROJECTION(index) \ |
303 ProjectionOperator<index> kProjection##index##Operator; | 303 ProjectionOperator<index> kProjection##index##Operator; |
304 CACHED_PROJECTION_LIST(CACHED_PROJECTION) | 304 CACHED_PROJECTION_LIST(CACHED_PROJECTION) |
305 #undef CACHED_PROJECTION | 305 #undef CACHED_PROJECTION |
306 | 306 |
307 template <int kInputCount> | 307 template <int kInputCount> |
308 struct StateValuesOperator FINAL : public Operator { | 308 struct StateValuesOperator final : public Operator { |
309 StateValuesOperator() | 309 StateValuesOperator() |
310 : Operator( // -- | 310 : Operator( // -- |
311 IrOpcode::kStateValues, // opcode | 311 IrOpcode::kStateValues, // opcode |
312 Operator::kPure, // flags | 312 Operator::kPure, // flags |
313 "StateValues", // name | 313 "StateValues", // name |
314 kInputCount, 0, 0, 1, 0, 0) {} // counts | 314 kInputCount, 0, 0, 1, 0, 0) {} // counts |
315 }; | 315 }; |
316 #define CACHED_STATE_VALUES(input_count) \ | 316 #define CACHED_STATE_VALUES(input_count) \ |
317 StateValuesOperator<input_count> kStateValues##input_count##Operator; | 317 StateValuesOperator<input_count> kStateValues##input_count##Operator; |
318 CACHED_STATE_VALUES_LIST(CACHED_STATE_VALUES) | 318 CACHED_STATE_VALUES_LIST(CACHED_STATE_VALUES) |
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
618 OutputFrameStateCombine state_combine, MaybeHandle<JSFunction> jsfunction) { | 618 OutputFrameStateCombine state_combine, MaybeHandle<JSFunction> jsfunction) { |
619 return new (zone()) Operator1<FrameStateCallInfo>( // -- | 619 return new (zone()) Operator1<FrameStateCallInfo>( // -- |
620 IrOpcode::kFrameState, Operator::kPure, // opcode | 620 IrOpcode::kFrameState, Operator::kPure, // opcode |
621 "FrameState", // name | 621 "FrameState", // name |
622 4, 0, 0, 1, 0, 0, // counts | 622 4, 0, 0, 1, 0, 0, // counts |
623 FrameStateCallInfo(type, bailout_id, state_combine, jsfunction)); | 623 FrameStateCallInfo(type, bailout_id, state_combine, jsfunction)); |
624 } | 624 } |
625 | 625 |
626 | 626 |
627 const Operator* CommonOperatorBuilder::Call(const CallDescriptor* descriptor) { | 627 const Operator* CommonOperatorBuilder::Call(const CallDescriptor* descriptor) { |
628 class CallOperator FINAL : public Operator1<const CallDescriptor*> { | 628 class CallOperator final : public Operator1<const CallDescriptor*> { |
629 public: | 629 public: |
630 CallOperator(const CallDescriptor* descriptor, const char* mnemonic) | 630 CallOperator(const CallDescriptor* descriptor, const char* mnemonic) |
631 : Operator1<const CallDescriptor*>( | 631 : Operator1<const CallDescriptor*>( |
632 IrOpcode::kCall, descriptor->properties(), mnemonic, | 632 IrOpcode::kCall, descriptor->properties(), mnemonic, |
633 descriptor->InputCount() + descriptor->FrameStateCount(), | 633 descriptor->InputCount() + descriptor->FrameStateCount(), |
634 Operator::ZeroIfPure(descriptor->properties()), | 634 Operator::ZeroIfPure(descriptor->properties()), |
635 Operator::ZeroIfEliminatable(descriptor->properties()), | 635 Operator::ZeroIfEliminatable(descriptor->properties()), |
636 descriptor->ReturnCount(), | 636 descriptor->ReturnCount(), |
637 Operator::ZeroIfPure(descriptor->properties()), | 637 Operator::ZeroIfPure(descriptor->properties()), |
638 Operator::ZeroIfNoThrow(descriptor->properties()), descriptor) {} | 638 Operator::ZeroIfNoThrow(descriptor->properties()), descriptor) {} |
639 | 639 |
640 void PrintParameter(std::ostream& os) const OVERRIDE { | 640 void PrintParameter(std::ostream& os) const override { |
641 os << "[" << *parameter() << "]"; | 641 os << "[" << *parameter() << "]"; |
642 } | 642 } |
643 }; | 643 }; |
644 return new (zone()) CallOperator(descriptor, "Call"); | 644 return new (zone()) CallOperator(descriptor, "Call"); |
645 } | 645 } |
646 | 646 |
647 | 647 |
648 const Operator* CommonOperatorBuilder::Projection(size_t index) { | 648 const Operator* CommonOperatorBuilder::Projection(size_t index) { |
649 switch (index) { | 649 switch (index) { |
650 #define CACHED_PROJECTION(index) \ | 650 #define CACHED_PROJECTION(index) \ |
(...skipping 27 matching lines...) Expand all Loading... |
678 } else { | 678 } else { |
679 UNREACHABLE(); | 679 UNREACHABLE(); |
680 return nullptr; | 680 return nullptr; |
681 } | 681 } |
682 } | 682 } |
683 | 683 |
684 | 684 |
685 } // namespace compiler | 685 } // namespace compiler |
686 } // namespace internal | 686 } // namespace internal |
687 } // namespace v8 | 687 } // namespace v8 |
OLD | NEW |