| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/simplified-operator.h" | 5 #include "src/compiler/simplified-operator.h" |
| 6 | 6 |
| 7 #include "src/base/lazy-instance.h" | 7 #include "src/base/lazy-instance.h" |
| 8 #include "src/compiler/opcodes.h" | 8 #include "src/compiler/opcodes.h" |
| 9 #include "src/compiler/operator.h" | 9 #include "src/compiler/operator.h" |
| 10 #include "src/compiler/types.h" | 10 #include "src/compiler/types.h" |
| (...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 381 op->opcode() == IrOpcode::kSpeculativeNumberShiftRightLogical || | 381 op->opcode() == IrOpcode::kSpeculativeNumberShiftRightLogical || |
| 382 op->opcode() == IrOpcode::kSpeculativeNumberBitwiseAnd || | 382 op->opcode() == IrOpcode::kSpeculativeNumberBitwiseAnd || |
| 383 op->opcode() == IrOpcode::kSpeculativeNumberBitwiseOr || | 383 op->opcode() == IrOpcode::kSpeculativeNumberBitwiseOr || |
| 384 op->opcode() == IrOpcode::kSpeculativeNumberBitwiseXor || | 384 op->opcode() == IrOpcode::kSpeculativeNumberBitwiseXor || |
| 385 op->opcode() == IrOpcode::kSpeculativeNumberEqual || | 385 op->opcode() == IrOpcode::kSpeculativeNumberEqual || |
| 386 op->opcode() == IrOpcode::kSpeculativeNumberLessThan || | 386 op->opcode() == IrOpcode::kSpeculativeNumberLessThan || |
| 387 op->opcode() == IrOpcode::kSpeculativeNumberLessThanOrEqual); | 387 op->opcode() == IrOpcode::kSpeculativeNumberLessThanOrEqual); |
| 388 return OpParameter<NumberOperationHint>(op); | 388 return OpParameter<NumberOperationHint>(op); |
| 389 } | 389 } |
| 390 | 390 |
| 391 int ParameterCountOf(const Operator* op) { | |
| 392 DCHECK(op->opcode() == IrOpcode::kNewUnmappedArgumentsElements || | |
| 393 op->opcode() == IrOpcode::kNewRestParameterElements); | |
| 394 return OpParameter<int>(op); | |
| 395 } | |
| 396 | |
| 397 PretenureFlag PretenureFlagOf(const Operator* op) { | 391 PretenureFlag PretenureFlagOf(const Operator* op) { |
| 398 DCHECK_EQ(IrOpcode::kAllocate, op->opcode()); | 392 DCHECK_EQ(IrOpcode::kAllocate, op->opcode()); |
| 399 return OpParameter<PretenureFlag>(op); | 393 return OpParameter<PretenureFlag>(op); |
| 400 } | 394 } |
| 401 | 395 |
| 402 UnicodeEncoding UnicodeEncodingOf(const Operator* op) { | 396 UnicodeEncoding UnicodeEncodingOf(const Operator* op) { |
| 403 DCHECK(op->opcode() == IrOpcode::kStringFromCodePoint); | 397 DCHECK(op->opcode() == IrOpcode::kStringFromCodePoint); |
| 404 return OpParameter<UnicodeEncoding>(op); | 398 return OpParameter<UnicodeEncoding>(op); |
| 405 } | 399 } |
| 406 | 400 |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 557 StringFromCodePointOperator<UnicodeEncoding::UTF32> | 551 StringFromCodePointOperator<UnicodeEncoding::UTF32> |
| 558 kStringFromCodePointOperatorUTF32; | 552 kStringFromCodePointOperatorUTF32; |
| 559 | 553 |
| 560 struct ArrayBufferWasNeuteredOperator final : public Operator { | 554 struct ArrayBufferWasNeuteredOperator final : public Operator { |
| 561 ArrayBufferWasNeuteredOperator() | 555 ArrayBufferWasNeuteredOperator() |
| 562 : Operator(IrOpcode::kArrayBufferWasNeutered, Operator::kEliminatable, | 556 : Operator(IrOpcode::kArrayBufferWasNeutered, Operator::kEliminatable, |
| 563 "ArrayBufferWasNeutered", 1, 1, 1, 1, 1, 0) {} | 557 "ArrayBufferWasNeutered", 1, 1, 1, 1, 1, 0) {} |
| 564 }; | 558 }; |
| 565 ArrayBufferWasNeuteredOperator kArrayBufferWasNeutered; | 559 ArrayBufferWasNeuteredOperator kArrayBufferWasNeutered; |
| 566 | 560 |
| 561 struct ArgumentsFrameOperator final : public Operator { |
| 562 ArgumentsFrameOperator() |
| 563 : Operator(IrOpcode::kArgumentsFrame, Operator::kPure, "ArgumentsFrame", |
| 564 0, 0, 0, 1, 0, 0) {} |
| 565 }; |
| 566 ArgumentsFrameOperator kArgumentsFrame; |
| 567 |
| 568 struct NewUnmappedArgumentsElementsOperator final : public Operator { |
| 569 NewUnmappedArgumentsElementsOperator() |
| 570 : Operator(IrOpcode::kNewUnmappedArgumentsElements, |
| 571 Operator::kEliminatable, "NewUnmappedArgumentsElements", 2, |
| 572 1, 0, 1, 1, 0) {} |
| 573 }; |
| 574 NewUnmappedArgumentsElementsOperator kNewUnmappedArgumentsElements; |
| 575 |
| 567 template <CheckForMinusZeroMode kMode> | 576 template <CheckForMinusZeroMode kMode> |
| 568 struct CheckedInt32MulOperator final | 577 struct CheckedInt32MulOperator final |
| 569 : public Operator1<CheckForMinusZeroMode> { | 578 : public Operator1<CheckForMinusZeroMode> { |
| 570 CheckedInt32MulOperator() | 579 CheckedInt32MulOperator() |
| 571 : Operator1<CheckForMinusZeroMode>( | 580 : Operator1<CheckForMinusZeroMode>( |
| 572 IrOpcode::kCheckedInt32Mul, | 581 IrOpcode::kCheckedInt32Mul, |
| 573 Operator::kFoldable | Operator::kNoThrow, "CheckedInt32Mul", 2, 1, | 582 Operator::kFoldable | Operator::kNoThrow, "CheckedInt32Mul", 2, 1, |
| 574 1, 1, 1, 0, kMode) {} | 583 1, 1, 1, 0, kMode) {} |
| 575 }; | 584 }; |
| 576 CheckedInt32MulOperator<CheckForMinusZeroMode::kCheckForMinusZero> | 585 CheckedInt32MulOperator<CheckForMinusZeroMode::kCheckForMinusZero> |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 701 | 710 |
| 702 | 711 |
| 703 SimplifiedOperatorBuilder::SimplifiedOperatorBuilder(Zone* zone) | 712 SimplifiedOperatorBuilder::SimplifiedOperatorBuilder(Zone* zone) |
| 704 : cache_(kCache.Get()), zone_(zone) {} | 713 : cache_(kCache.Get()), zone_(zone) {} |
| 705 | 714 |
| 706 #define GET_FROM_CACHE(Name, ...) \ | 715 #define GET_FROM_CACHE(Name, ...) \ |
| 707 const Operator* SimplifiedOperatorBuilder::Name() { return &cache_.k##Name; } | 716 const Operator* SimplifiedOperatorBuilder::Name() { return &cache_.k##Name; } |
| 708 PURE_OP_LIST(GET_FROM_CACHE) | 717 PURE_OP_LIST(GET_FROM_CACHE) |
| 709 CHECKED_OP_LIST(GET_FROM_CACHE) | 718 CHECKED_OP_LIST(GET_FROM_CACHE) |
| 710 GET_FROM_CACHE(ArrayBufferWasNeutered) | 719 GET_FROM_CACHE(ArrayBufferWasNeutered) |
| 720 GET_FROM_CACHE(ArgumentsFrame) |
| 721 GET_FROM_CACHE(NewUnmappedArgumentsElements) |
| 711 #undef GET_FROM_CACHE | 722 #undef GET_FROM_CACHE |
| 712 | 723 |
| 713 const Operator* SimplifiedOperatorBuilder::CheckedInt32Mul( | 724 const Operator* SimplifiedOperatorBuilder::CheckedInt32Mul( |
| 714 CheckForMinusZeroMode mode) { | 725 CheckForMinusZeroMode mode) { |
| 715 switch (mode) { | 726 switch (mode) { |
| 716 case CheckForMinusZeroMode::kCheckForMinusZero: | 727 case CheckForMinusZeroMode::kCheckForMinusZero: |
| 717 return &cache_.kCheckedInt32MulCheckForMinusZeroOperator; | 728 return &cache_.kCheckedInt32MulCheckForMinusZeroOperator; |
| 718 case CheckForMinusZeroMode::kDontCheckForMinusZero: | 729 case CheckForMinusZeroMode::kDontCheckForMinusZero: |
| 719 return &cache_.kCheckedInt32MulDontCheckForMinusZeroOperator; | 730 return &cache_.kCheckedInt32MulDontCheckForMinusZeroOperator; |
| 720 } | 731 } |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 798 const Operator* SimplifiedOperatorBuilder::TransitionElementsKind( | 809 const Operator* SimplifiedOperatorBuilder::TransitionElementsKind( |
| 799 ElementsTransition transition) { | 810 ElementsTransition transition) { |
| 800 return new (zone()) Operator1<ElementsTransition>( // -- | 811 return new (zone()) Operator1<ElementsTransition>( // -- |
| 801 IrOpcode::kTransitionElementsKind, // opcode | 812 IrOpcode::kTransitionElementsKind, // opcode |
| 802 Operator::kNoDeopt | Operator::kNoThrow, // flags | 813 Operator::kNoDeopt | Operator::kNoThrow, // flags |
| 803 "TransitionElementsKind", // name | 814 "TransitionElementsKind", // name |
| 804 1, 1, 1, 0, 1, 0, // counts | 815 1, 1, 1, 0, 1, 0, // counts |
| 805 transition); // parameter | 816 transition); // parameter |
| 806 } | 817 } |
| 807 | 818 |
| 808 const Operator* SimplifiedOperatorBuilder::NewUnmappedArgumentsElements( | 819 namespace { |
| 809 int parameter_count) { | 820 |
| 810 return new (zone()) Operator1<int>( // -- | 821 struct ArgumentsLengthParameters { |
| 811 IrOpcode::kNewUnmappedArgumentsElements, // opcode | 822 int formal_parameter_count; |
| 812 Operator::kEliminatable, // flags | 823 bool is_rest_length; |
| 813 "NewUnmappedArgumentsElements", // name | 824 }; |
| 814 0, 1, 0, 1, 1, 0, // counts | 825 |
| 815 parameter_count); // parameter | 826 bool operator==(ArgumentsLengthParameters first, |
| 827 ArgumentsLengthParameters second) { |
| 828 return first.formal_parameter_count == second.formal_parameter_count && |
| 829 first.is_rest_length == second.is_rest_length; |
| 816 } | 830 } |
| 817 | 831 |
| 818 const Operator* SimplifiedOperatorBuilder::NewRestParameterElements( | 832 size_t hash_value(ArgumentsLengthParameters param) { |
| 819 int parameter_count) { | 833 return base::hash_combine(param.formal_parameter_count, param.is_rest_length); |
| 820 return new (zone()) Operator1<int>( // -- | 834 } |
| 821 IrOpcode::kNewRestParameterElements, // opcode | 835 |
| 822 Operator::kEliminatable, // flags | 836 std::ostream& operator<<(std::ostream& os, ArgumentsLengthParameters param) { |
| 823 "NewRestParameterElements", // name | 837 return os << param.formal_parameter_count << ", " |
| 824 0, 1, 0, 1, 1, 0, // counts | 838 << (param.is_rest_length ? "rest length" : "not rest length"); |
| 825 parameter_count); // parameter | 839 } |
| 840 |
| 841 } // namespace |
| 842 |
| 843 const Operator* SimplifiedOperatorBuilder::ArgumentsLength( |
| 844 int formal_parameter_count, bool is_rest_length) { |
| 845 return new (zone()) Operator1<ArgumentsLengthParameters>( // -- |
| 846 IrOpcode::kArgumentsLength, // opcode |
| 847 Operator::kPure, // flags |
| 848 "ArgumentsLength", // name |
| 849 1, 0, 0, 1, 0, 0, // counts |
| 850 ArgumentsLengthParameters{formal_parameter_count, |
| 851 is_rest_length}); // parameter |
| 852 } |
| 853 |
| 854 int FormalParameterCountOf(const Operator* op) { |
| 855 DCHECK(op->opcode() == IrOpcode::kArgumentsLength); |
| 856 return OpParameter<ArgumentsLengthParameters>(op).formal_parameter_count; |
| 857 } |
| 858 |
| 859 bool IsRestLengthOf(const Operator* op) { |
| 860 DCHECK(op->opcode() == IrOpcode::kArgumentsLength); |
| 861 return OpParameter<ArgumentsLengthParameters>(op).is_rest_length; |
| 826 } | 862 } |
| 827 | 863 |
| 828 const Operator* SimplifiedOperatorBuilder::Allocate(PretenureFlag pretenure) { | 864 const Operator* SimplifiedOperatorBuilder::Allocate(PretenureFlag pretenure) { |
| 829 switch (pretenure) { | 865 switch (pretenure) { |
| 830 case NOT_TENURED: | 866 case NOT_TENURED: |
| 831 return &cache_.kAllocateNotTenuredOperator; | 867 return &cache_.kAllocateNotTenuredOperator; |
| 832 case TENURED: | 868 case TENURED: |
| 833 return &cache_.kAllocateTenuredOperator; | 869 return &cache_.kAllocateTenuredOperator; |
| 834 } | 870 } |
| 835 UNREACHABLE(); | 871 UNREACHABLE(); |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 908 Operator::kNoDeopt | Operator::kNoThrow | properties, \ | 944 Operator::kNoDeopt | Operator::kNoThrow | properties, \ |
| 909 #Name, value_input_count, 1, control_input_count, \ | 945 #Name, value_input_count, 1, control_input_count, \ |
| 910 output_count, 1, 0, access); \ | 946 output_count, 1, 0, access); \ |
| 911 } | 947 } |
| 912 ACCESS_OP_LIST(ACCESS) | 948 ACCESS_OP_LIST(ACCESS) |
| 913 #undef ACCESS | 949 #undef ACCESS |
| 914 | 950 |
| 915 } // namespace compiler | 951 } // namespace compiler |
| 916 } // namespace internal | 952 } // namespace internal |
| 917 } // namespace v8 | 953 } // namespace v8 |
| OLD | NEW |