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 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
267 #define CACHED_MERGE_LIST(V) \ | 267 #define CACHED_MERGE_LIST(V) \ |
268 V(1) \ | 268 V(1) \ |
269 V(2) \ | 269 V(2) \ |
270 V(3) \ | 270 V(3) \ |
271 V(4) \ | 271 V(4) \ |
272 V(5) \ | 272 V(5) \ |
273 V(6) \ | 273 V(6) \ |
274 V(7) \ | 274 V(7) \ |
275 V(8) | 275 V(8) |
276 | 276 |
| 277 #define CACHED_DEOPTIMIZE_LIST(V) \ |
| 278 V(Eager, MinusZero) \ |
| 279 V(Eager, NoReason) \ |
| 280 V(Eager, WrongMap) \ |
| 281 V(Soft, InsufficientTypeFeedbackForGenericKeyedAccess) \ |
| 282 V(Soft, InsufficientTypeFeedbackForGenericNamedAccess) |
| 283 |
| 284 #define CACHED_DEOPTIMIZE_IF_LIST(V) \ |
| 285 V(DivisionByZero) \ |
| 286 V(Hole) \ |
| 287 V(MinusZero) \ |
| 288 V(Overflow) \ |
| 289 V(Smi) |
| 290 |
| 291 #define CACHED_DEOPTIMIZE_UNLESS_LIST(V) \ |
| 292 V(LostPrecision) \ |
| 293 V(LostPrecisionOrNaN) \ |
| 294 V(NoReason) \ |
| 295 V(NotAHeapNumber) \ |
| 296 V(NotAHeapNumberUndefinedBoolean) \ |
| 297 V(NotASmi) \ |
| 298 V(OutOfBounds) \ |
| 299 V(WrongInstanceType) \ |
| 300 V(WrongMap) |
277 | 301 |
278 #define CACHED_PARAMETER_LIST(V) \ | 302 #define CACHED_PARAMETER_LIST(V) \ |
279 V(0) \ | 303 V(0) \ |
280 V(1) \ | 304 V(1) \ |
281 V(2) \ | 305 V(2) \ |
282 V(3) \ | 306 V(3) \ |
283 V(4) \ | 307 V(4) \ |
284 V(5) \ | 308 V(5) \ |
285 V(6) | 309 V(6) |
286 | 310 |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
419 : Operator( // -- | 443 : Operator( // -- |
420 IrOpcode::kMerge, Operator::kKontrol, // opcode | 444 IrOpcode::kMerge, Operator::kKontrol, // opcode |
421 "Merge", // name | 445 "Merge", // name |
422 0, 0, kInputCount, 0, 0, 1) {} // counts | 446 0, 0, kInputCount, 0, 0, 1) {} // counts |
423 }; | 447 }; |
424 #define CACHED_MERGE(input_count) \ | 448 #define CACHED_MERGE(input_count) \ |
425 MergeOperator<input_count> kMerge##input_count##Operator; | 449 MergeOperator<input_count> kMerge##input_count##Operator; |
426 CACHED_MERGE_LIST(CACHED_MERGE) | 450 CACHED_MERGE_LIST(CACHED_MERGE) |
427 #undef CACHED_MERGE | 451 #undef CACHED_MERGE |
428 | 452 |
| 453 template <DeoptimizeKind kKind, DeoptimizeReason kReason> |
| 454 struct DeoptimizeOperator final : public Operator1<DeoptimizeParameters> { |
| 455 DeoptimizeOperator() |
| 456 : Operator1<DeoptimizeParameters>( // -- |
| 457 IrOpcode::kDeoptimize, // opcode |
| 458 Operator::kFoldable | Operator::kNoThrow, // properties |
| 459 "Deoptimize", // name |
| 460 1, 1, 1, 0, 0, 1, // counts |
| 461 DeoptimizeParameters(kKind, kReason)) {} // parameter |
| 462 }; |
| 463 #define CACHED_DEOPTIMIZE(Kind, Reason) \ |
| 464 DeoptimizeOperator<DeoptimizeKind::k##Kind, DeoptimizeReason::k##Reason> \ |
| 465 kDeoptimize##Kind##Reason##Operator; |
| 466 CACHED_DEOPTIMIZE_LIST(CACHED_DEOPTIMIZE) |
| 467 #undef CACHED_DEOPTIMIZE |
| 468 |
| 469 template <DeoptimizeReason kReason> |
| 470 struct DeoptimizeIfOperator final : public Operator1<DeoptimizeReason> { |
| 471 DeoptimizeIfOperator() |
| 472 : Operator1<DeoptimizeReason>( // -- |
| 473 IrOpcode::kDeoptimizeIf, // opcode |
| 474 Operator::kFoldable | Operator::kNoThrow, // properties |
| 475 "DeoptimizeIf", // name |
| 476 2, 1, 1, 0, 1, 1, // counts |
| 477 kReason) {} // parameter |
| 478 }; |
| 479 #define CACHED_DEOPTIMIZE_IF(Reason) \ |
| 480 DeoptimizeIfOperator<DeoptimizeReason::k##Reason> \ |
| 481 kDeoptimizeIf##Reason##Operator; |
| 482 CACHED_DEOPTIMIZE_IF_LIST(CACHED_DEOPTIMIZE_IF) |
| 483 #undef CACHED_DEOPTIMIZE_IF |
| 484 |
| 485 template <DeoptimizeReason kReason> |
| 486 struct DeoptimizeUnlessOperator final : public Operator1<DeoptimizeReason> { |
| 487 DeoptimizeUnlessOperator() |
| 488 : Operator1<DeoptimizeReason>( // -- |
| 489 IrOpcode::kDeoptimizeUnless, // opcode |
| 490 Operator::kFoldable | Operator::kNoThrow, // properties |
| 491 "DeoptimizeUnless", // name |
| 492 2, 1, 1, 0, 1, 1, // counts |
| 493 kReason) {} // parameter |
| 494 }; |
| 495 #define CACHED_DEOPTIMIZE_UNLESS(Reason) \ |
| 496 DeoptimizeUnlessOperator<DeoptimizeReason::k##Reason> \ |
| 497 kDeoptimizeUnless##Reason##Operator; |
| 498 CACHED_DEOPTIMIZE_UNLESS_LIST(CACHED_DEOPTIMIZE_UNLESS) |
| 499 #undef CACHED_DEOPTIMIZE_UNLESS |
| 500 |
429 template <MachineRepresentation kRep, int kInputCount> | 501 template <MachineRepresentation kRep, int kInputCount> |
430 struct PhiOperator final : public Operator1<MachineRepresentation> { | 502 struct PhiOperator final : public Operator1<MachineRepresentation> { |
431 PhiOperator() | 503 PhiOperator() |
432 : Operator1<MachineRepresentation>( //-- | 504 : Operator1<MachineRepresentation>( //-- |
433 IrOpcode::kPhi, Operator::kPure, // opcode | 505 IrOpcode::kPhi, Operator::kPure, // opcode |
434 "Phi", // name | 506 "Phi", // name |
435 kInputCount, 0, 1, 1, 0, 0, // counts | 507 kInputCount, 0, 1, 1, 0, 0, // counts |
436 kRep) {} // parameter | 508 kRep) {} // parameter |
437 }; | 509 }; |
438 #define CACHED_PHI(rep, input_count) \ | 510 #define CACHED_PHI(rep, input_count) \ |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
562 return &cache_.kBranchTrueOperator; | 634 return &cache_.kBranchTrueOperator; |
563 case BranchHint::kFalse: | 635 case BranchHint::kFalse: |
564 return &cache_.kBranchFalseOperator; | 636 return &cache_.kBranchFalseOperator; |
565 } | 637 } |
566 UNREACHABLE(); | 638 UNREACHABLE(); |
567 return nullptr; | 639 return nullptr; |
568 } | 640 } |
569 | 641 |
570 const Operator* CommonOperatorBuilder::Deoptimize(DeoptimizeKind kind, | 642 const Operator* CommonOperatorBuilder::Deoptimize(DeoptimizeKind kind, |
571 DeoptimizeReason reason) { | 643 DeoptimizeReason reason) { |
572 // TODO(turbofan): Cache the most common versions of this. | 644 #define CACHED_DEOPTIMIZE(Kind, Reason) \ |
| 645 if (kind == DeoptimizeKind::k##Kind && \ |
| 646 reason == DeoptimizeReason::k##Reason) { \ |
| 647 return &cache_.kDeoptimize##Kind##Reason##Operator; \ |
| 648 } |
| 649 CACHED_DEOPTIMIZE_LIST(CACHED_DEOPTIMIZE) |
| 650 #undef CACHED_DEOPTIMIZE |
| 651 // Uncached |
573 DeoptimizeParameters parameter(kind, reason); | 652 DeoptimizeParameters parameter(kind, reason); |
574 return new (zone()) Operator1<DeoptimizeParameters>( // -- | 653 return new (zone()) Operator1<DeoptimizeParameters>( // -- |
575 IrOpcode::kDeoptimize, // opcodes | 654 IrOpcode::kDeoptimize, // opcodes |
576 Operator::kFoldable | Operator::kNoThrow, // properties | 655 Operator::kFoldable | Operator::kNoThrow, // properties |
577 "Deoptimize", // name | 656 "Deoptimize", // name |
578 1, 1, 1, 0, 0, 1, // counts | 657 1, 1, 1, 0, 0, 1, // counts |
579 parameter); // parameter | 658 parameter); // parameter |
580 } | 659 } |
581 | 660 |
582 const Operator* CommonOperatorBuilder::DeoptimizeIf(DeoptimizeReason reason) { | 661 const Operator* CommonOperatorBuilder::DeoptimizeIf(DeoptimizeReason reason) { |
583 // TODO(turbofan): Cache the most common versions of this. | 662 switch (reason) { |
| 663 #define CACHED_DEOPTIMIZE_IF(Reason) \ |
| 664 case DeoptimizeReason::k##Reason: \ |
| 665 return &cache_.kDeoptimizeIf##Reason##Operator; |
| 666 CACHED_DEOPTIMIZE_IF_LIST(CACHED_DEOPTIMIZE_IF) |
| 667 #undef CACHED_DEOPTIMIZE_IF |
| 668 default: |
| 669 break; |
| 670 } |
| 671 // Uncached |
584 return new (zone()) Operator1<DeoptimizeReason>( // -- | 672 return new (zone()) Operator1<DeoptimizeReason>( // -- |
585 IrOpcode::kDeoptimizeIf, // opcode | 673 IrOpcode::kDeoptimizeIf, // opcode |
586 Operator::kFoldable | Operator::kNoThrow, // properties | 674 Operator::kFoldable | Operator::kNoThrow, // properties |
587 "DeoptimizeIf", // name | 675 "DeoptimizeIf", // name |
588 2, 1, 1, 0, 1, 1, // counts | 676 2, 1, 1, 0, 1, 1, // counts |
589 reason); // parameter | 677 reason); // parameter |
590 } | 678 } |
591 | 679 |
592 const Operator* CommonOperatorBuilder::DeoptimizeUnless( | 680 const Operator* CommonOperatorBuilder::DeoptimizeUnless( |
593 DeoptimizeReason reason) { | 681 DeoptimizeReason reason) { |
594 // TODO(turbofan): Cache the most common versions of this. | 682 switch (reason) { |
| 683 #define CACHED_DEOPTIMIZE_UNLESS(Reason) \ |
| 684 case DeoptimizeReason::k##Reason: \ |
| 685 return &cache_.kDeoptimizeUnless##Reason##Operator; |
| 686 CACHED_DEOPTIMIZE_UNLESS_LIST(CACHED_DEOPTIMIZE_UNLESS) |
| 687 #undef CACHED_DEOPTIMIZE_UNLESS |
| 688 default: |
| 689 break; |
| 690 } |
| 691 // Uncached |
595 return new (zone()) Operator1<DeoptimizeReason>( // -- | 692 return new (zone()) Operator1<DeoptimizeReason>( // -- |
596 IrOpcode::kDeoptimizeUnless, // opcode | 693 IrOpcode::kDeoptimizeUnless, // opcode |
597 Operator::kFoldable | Operator::kNoThrow, // properties | 694 Operator::kFoldable | Operator::kNoThrow, // properties |
598 "DeoptimizeUnless", // name | 695 "DeoptimizeUnless", // name |
599 2, 1, 1, 0, 1, 1, // counts | 696 2, 1, 1, 0, 1, 1, // counts |
600 reason); // parameter | 697 reason); // parameter |
601 } | 698 } |
602 | 699 |
603 | 700 |
604 const Operator* CommonOperatorBuilder::Switch(size_t control_output_count) { | 701 const Operator* CommonOperatorBuilder::Switch(size_t control_output_count) { |
(...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
988 CommonOperatorBuilder::CreateFrameStateFunctionInfo( | 1085 CommonOperatorBuilder::CreateFrameStateFunctionInfo( |
989 FrameStateType type, int parameter_count, int local_count, | 1086 FrameStateType type, int parameter_count, int local_count, |
990 Handle<SharedFunctionInfo> shared_info) { | 1087 Handle<SharedFunctionInfo> shared_info) { |
991 return new (zone()->New(sizeof(FrameStateFunctionInfo))) | 1088 return new (zone()->New(sizeof(FrameStateFunctionInfo))) |
992 FrameStateFunctionInfo(type, parameter_count, local_count, shared_info); | 1089 FrameStateFunctionInfo(type, parameter_count, local_count, shared_info); |
993 } | 1090 } |
994 | 1091 |
995 } // namespace compiler | 1092 } // namespace compiler |
996 } // namespace internal | 1093 } // namespace internal |
997 } // namespace v8 | 1094 } // namespace v8 |
OLD | NEW |