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/js-operator.h" | 5 #include "src/compiler/js-operator.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 | 8 |
9 #include "src/base/lazy-instance.h" | 9 #include "src/base/lazy-instance.h" |
10 #include "src/compiler/opcodes.h" | 10 #include "src/compiler/opcodes.h" |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
56 case TailCallMode::kAllow: | 56 case TailCallMode::kAllow: |
57 return os << "ALLOW_TAIL_CALLS"; | 57 return os << "ALLOW_TAIL_CALLS"; |
58 case TailCallMode::kDisallow: | 58 case TailCallMode::kDisallow: |
59 return os << "DISALLOW_TAIL_CALLS"; | 59 return os << "DISALLOW_TAIL_CALLS"; |
60 } | 60 } |
61 UNREACHABLE(); | 61 UNREACHABLE(); |
62 return os; | 62 return os; |
63 } | 63 } |
64 | 64 |
65 | 65 |
| 66 bool operator==(CallConstructParameters const& lhs, |
| 67 CallConstructParameters const& rhs) { |
| 68 return lhs.arity() == rhs.arity() && lhs.feedback() == rhs.feedback(); |
| 69 } |
| 70 |
| 71 |
| 72 bool operator!=(CallConstructParameters const& lhs, |
| 73 CallConstructParameters const& rhs) { |
| 74 return !(lhs == rhs); |
| 75 } |
| 76 |
| 77 |
| 78 size_t hash_value(CallConstructParameters const& p) { |
| 79 return base::hash_combine(p.arity(), p.feedback()); |
| 80 } |
| 81 |
| 82 |
| 83 std::ostream& operator<<(std::ostream& os, CallConstructParameters const& p) { |
| 84 return os << p.arity(); |
| 85 } |
| 86 |
| 87 |
| 88 CallConstructParameters const& CallConstructParametersOf(Operator const* op) { |
| 89 DCHECK_EQ(IrOpcode::kJSCallConstruct, op->opcode()); |
| 90 return OpParameter<CallConstructParameters>(op); |
| 91 } |
| 92 |
| 93 |
66 std::ostream& operator<<(std::ostream& os, CallFunctionParameters const& p) { | 94 std::ostream& operator<<(std::ostream& os, CallFunctionParameters const& p) { |
67 os << p.arity() << ", " << p.language_mode() << ", " << p.convert_mode() | 95 os << p.arity() << ", " << p.language_mode() << ", " << p.convert_mode() |
68 << ", " << p.tail_call_mode(); | 96 << ", " << p.tail_call_mode(); |
69 return os; | 97 return os; |
70 } | 98 } |
71 | 99 |
72 | 100 |
73 const CallFunctionParameters& CallFunctionParametersOf(const Operator* op) { | 101 const CallFunctionParameters& CallFunctionParametersOf(const Operator* op) { |
74 DCHECK_EQ(IrOpcode::kJSCallFunction, op->opcode()); | 102 DCHECK_EQ(IrOpcode::kJSCallFunction, op->opcode()); |
75 return OpParameter<CallFunctionParameters>(op); | 103 return OpParameter<CallFunctionParameters>(op); |
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
315 } | 343 } |
316 | 344 |
317 | 345 |
318 const CreateArgumentsParameters& CreateArgumentsParametersOf( | 346 const CreateArgumentsParameters& CreateArgumentsParametersOf( |
319 const Operator* op) { | 347 const Operator* op) { |
320 DCHECK_EQ(IrOpcode::kJSCreateArguments, op->opcode()); | 348 DCHECK_EQ(IrOpcode::kJSCreateArguments, op->opcode()); |
321 return OpParameter<CreateArgumentsParameters>(op); | 349 return OpParameter<CreateArgumentsParameters>(op); |
322 } | 350 } |
323 | 351 |
324 | 352 |
| 353 bool operator==(CreateArrayParameters const& lhs, |
| 354 CreateArrayParameters const& rhs) { |
| 355 return lhs.arity() == rhs.arity() && |
| 356 lhs.site().location() == rhs.site().location(); |
| 357 } |
| 358 |
| 359 |
| 360 bool operator!=(CreateArrayParameters const& lhs, |
| 361 CreateArrayParameters const& rhs) { |
| 362 return !(lhs == rhs); |
| 363 } |
| 364 |
| 365 |
| 366 size_t hash_value(CreateArrayParameters const& p) { |
| 367 return base::hash_combine(p.arity(), p.site().location()); |
| 368 } |
| 369 |
| 370 |
| 371 std::ostream& operator<<(std::ostream& os, CreateArrayParameters const& p) { |
| 372 os << p.arity(); |
| 373 if (!p.site().is_null()) os << ", " << Brief(*p.site()); |
| 374 return os; |
| 375 } |
| 376 |
| 377 |
| 378 const CreateArrayParameters& CreateArrayParametersOf(const Operator* op) { |
| 379 DCHECK_EQ(IrOpcode::kJSCreateArray, op->opcode()); |
| 380 return OpParameter<CreateArrayParameters>(op); |
| 381 } |
| 382 |
| 383 |
325 bool operator==(CreateClosureParameters const& lhs, | 384 bool operator==(CreateClosureParameters const& lhs, |
326 CreateClosureParameters const& rhs) { | 385 CreateClosureParameters const& rhs) { |
327 return lhs.pretenure() == rhs.pretenure() && | 386 return lhs.pretenure() == rhs.pretenure() && |
328 lhs.shared_info().location() == rhs.shared_info().location(); | 387 lhs.shared_info().location() == rhs.shared_info().location(); |
329 } | 388 } |
330 | 389 |
331 | 390 |
332 bool operator!=(CreateClosureParameters const& lhs, | 391 bool operator!=(CreateClosureParameters const& lhs, |
333 CreateClosureParameters const& rhs) { | 392 CreateClosureParameters const& rhs) { |
334 return !(lhs == rhs); | 393 return !(lhs == rhs); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
367 V(HasProperty, Operator::kNoProperties, 2, 1) \ | 426 V(HasProperty, Operator::kNoProperties, 2, 1) \ |
368 V(TypeOf, Operator::kEliminatable, 1, 1) \ | 427 V(TypeOf, Operator::kEliminatable, 1, 1) \ |
369 V(InstanceOf, Operator::kNoProperties, 2, 1) \ | 428 V(InstanceOf, Operator::kNoProperties, 2, 1) \ |
370 V(ForInDone, Operator::kPure, 2, 1) \ | 429 V(ForInDone, Operator::kPure, 2, 1) \ |
371 V(ForInNext, Operator::kNoProperties, 4, 1) \ | 430 V(ForInNext, Operator::kNoProperties, 4, 1) \ |
372 V(ForInPrepare, Operator::kNoProperties, 1, 3) \ | 431 V(ForInPrepare, Operator::kNoProperties, 1, 3) \ |
373 V(ForInStep, Operator::kPure, 1, 1) \ | 432 V(ForInStep, Operator::kPure, 1, 1) \ |
374 V(LoadMessage, Operator::kNoThrow, 0, 1) \ | 433 V(LoadMessage, Operator::kNoThrow, 0, 1) \ |
375 V(StoreMessage, Operator::kNoThrow, 1, 0) \ | 434 V(StoreMessage, Operator::kNoThrow, 1, 0) \ |
376 V(StackCheck, Operator::kNoProperties, 0, 0) \ | 435 V(StackCheck, Operator::kNoProperties, 0, 0) \ |
| 436 V(LoadNativeContext, Operator::kEliminatable, 1, 1) \ |
377 V(CreateWithContext, Operator::kNoProperties, 2, 1) \ | 437 V(CreateWithContext, Operator::kNoProperties, 2, 1) \ |
378 V(CreateModuleContext, Operator::kNoProperties, 2, 1) | 438 V(CreateModuleContext, Operator::kNoProperties, 2, 1) |
379 | 439 |
380 | 440 |
381 #define CACHED_OP_LIST_WITH_LANGUAGE_MODE(V) \ | 441 #define CACHED_OP_LIST_WITH_LANGUAGE_MODE(V) \ |
382 V(LessThan, Operator::kNoProperties, 2, 1) \ | 442 V(LessThan, Operator::kNoProperties, 2, 1) \ |
383 V(GreaterThan, Operator::kNoProperties, 2, 1) \ | 443 V(GreaterThan, Operator::kNoProperties, 2, 1) \ |
384 V(LessThanOrEqual, Operator::kNoProperties, 2, 1) \ | 444 V(LessThanOrEqual, Operator::kNoProperties, 2, 1) \ |
385 V(GreaterThanOrEqual, Operator::kNoProperties, 2, 1) \ | 445 V(GreaterThanOrEqual, Operator::kNoProperties, 2, 1) \ |
386 V(BitwiseOr, Operator::kNoProperties, 2, 1) \ | 446 V(BitwiseOr, Operator::kNoProperties, 2, 1) \ |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
486 const Runtime::Function* f = Runtime::FunctionForId(parameters.id()); | 546 const Runtime::Function* f = Runtime::FunctionForId(parameters.id()); |
487 DCHECK(f->nargs == -1 || f->nargs == static_cast<int>(parameters.arity())); | 547 DCHECK(f->nargs == -1 || f->nargs == static_cast<int>(parameters.arity())); |
488 return new (zone()) Operator1<CallRuntimeParameters>( // -- | 548 return new (zone()) Operator1<CallRuntimeParameters>( // -- |
489 IrOpcode::kJSCallRuntime, Operator::kNoProperties, // opcode | 549 IrOpcode::kJSCallRuntime, Operator::kNoProperties, // opcode |
490 "JSCallRuntime", // name | 550 "JSCallRuntime", // name |
491 parameters.arity(), 1, 1, f->result_size, 1, 2, // inputs/outputs | 551 parameters.arity(), 1, 1, f->result_size, 1, 2, // inputs/outputs |
492 parameters); // parameter | 552 parameters); // parameter |
493 } | 553 } |
494 | 554 |
495 | 555 |
496 const Operator* JSOperatorBuilder::CallConstruct(int arguments) { | 556 const Operator* JSOperatorBuilder::CallConstruct( |
497 return new (zone()) Operator1<int>( // -- | 557 size_t arity, VectorSlotPair const& feedback) { |
| 558 CallConstructParameters parameters(arity, feedback); |
| 559 return new (zone()) Operator1<CallConstructParameters>( // -- |
498 IrOpcode::kJSCallConstruct, Operator::kNoProperties, // opcode | 560 IrOpcode::kJSCallConstruct, Operator::kNoProperties, // opcode |
499 "JSCallConstruct", // name | 561 "JSCallConstruct", // name |
500 arguments, 1, 1, 1, 1, 2, // counts | 562 parameters.arity(), 1, 1, 1, 1, 2, // counts |
501 arguments); // parameter | 563 parameters); // parameter |
502 } | 564 } |
503 | 565 |
504 | 566 |
505 const Operator* JSOperatorBuilder::ConvertReceiver( | 567 const Operator* JSOperatorBuilder::ConvertReceiver( |
506 ConvertReceiverMode convert_mode) { | 568 ConvertReceiverMode convert_mode) { |
507 return new (zone()) Operator1<ConvertReceiverMode>( // -- | 569 return new (zone()) Operator1<ConvertReceiverMode>( // -- |
508 IrOpcode::kJSConvertReceiver, Operator::kNoThrow, // opcode | 570 IrOpcode::kJSConvertReceiver, Operator::kNoThrow, // opcode |
509 "JSConvertReceiver", // name | 571 "JSConvertReceiver", // name |
510 1, 1, 1, 1, 1, 0, // counts | 572 1, 1, 1, 1, 1, 0, // counts |
511 convert_mode); // parameter | 573 convert_mode); // parameter |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
630 DCHECK_IMPLIES(start_index, type == CreateArgumentsParameters::kRestArray); | 692 DCHECK_IMPLIES(start_index, type == CreateArgumentsParameters::kRestArray); |
631 CreateArgumentsParameters parameters(type, start_index); | 693 CreateArgumentsParameters parameters(type, start_index); |
632 return new (zone()) Operator1<CreateArgumentsParameters>( // -- | 694 return new (zone()) Operator1<CreateArgumentsParameters>( // -- |
633 IrOpcode::kJSCreateArguments, Operator::kNoThrow, // opcode | 695 IrOpcode::kJSCreateArguments, Operator::kNoThrow, // opcode |
634 "JSCreateArguments", // name | 696 "JSCreateArguments", // name |
635 1, 1, 1, 1, 1, 0, // counts | 697 1, 1, 1, 1, 1, 0, // counts |
636 parameters); // parameter | 698 parameters); // parameter |
637 } | 699 } |
638 | 700 |
639 | 701 |
| 702 const Operator* JSOperatorBuilder::CreateArray(size_t arity, |
| 703 Handle<AllocationSite> site) { |
| 704 // constructor, new_target, arg1, ..., argN |
| 705 int const value_input_count = static_cast<int>(arity) + 2; |
| 706 CreateArrayParameters parameters(arity, site); |
| 707 return new (zone()) Operator1<CreateArrayParameters>( // -- |
| 708 IrOpcode::kJSCreateArray, Operator::kNoProperties, // opcode |
| 709 "JSCreateArray", // name |
| 710 value_input_count, 1, 1, 1, 1, 2, // counts |
| 711 parameters); // parameter |
| 712 } |
| 713 |
| 714 |
640 const Operator* JSOperatorBuilder::CreateClosure( | 715 const Operator* JSOperatorBuilder::CreateClosure( |
641 Handle<SharedFunctionInfo> shared_info, PretenureFlag pretenure) { | 716 Handle<SharedFunctionInfo> shared_info, PretenureFlag pretenure) { |
642 CreateClosureParameters parameters(shared_info, pretenure); | 717 CreateClosureParameters parameters(shared_info, pretenure); |
643 return new (zone()) Operator1<CreateClosureParameters>( // -- | 718 return new (zone()) Operator1<CreateClosureParameters>( // -- |
644 IrOpcode::kJSCreateClosure, Operator::kNoThrow, // opcode | 719 IrOpcode::kJSCreateClosure, Operator::kNoThrow, // opcode |
645 "JSCreateClosure", // name | 720 "JSCreateClosure", // name |
646 0, 1, 1, 1, 1, 0, // counts | 721 0, 1, 1, 1, 1, 0, // counts |
647 parameters); // parameter | 722 parameters); // parameter |
648 } | 723 } |
649 | 724 |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
700 return new (zone()) Operator1<Handle<ScopeInfo>>( // -- | 775 return new (zone()) Operator1<Handle<ScopeInfo>>( // -- |
701 IrOpcode::kJSCreateScriptContext, Operator::kNoProperties, // opcode | 776 IrOpcode::kJSCreateScriptContext, Operator::kNoProperties, // opcode |
702 "JSCreateScriptContext", // name | 777 "JSCreateScriptContext", // name |
703 1, 1, 1, 1, 1, 2, // counts | 778 1, 1, 1, 1, 1, 2, // counts |
704 scpope_info); // parameter | 779 scpope_info); // parameter |
705 } | 780 } |
706 | 781 |
707 } // namespace compiler | 782 } // namespace compiler |
708 } // namespace internal | 783 } // namespace internal |
709 } // namespace v8 | 784 } // namespace v8 |
OLD | NEW |