| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef VM_INTERMEDIATE_LANGUAGE_H_ | 5 #ifndef VM_INTERMEDIATE_LANGUAGE_H_ |
| 6 #define VM_INTERMEDIATE_LANGUAGE_H_ | 6 #define VM_INTERMEDIATE_LANGUAGE_H_ |
| 7 | 7 |
| 8 #include "vm/allocation.h" | 8 #include "vm/allocation.h" |
| 9 #include "vm/ast.h" | 9 #include "vm/ast.h" |
| 10 #include "vm/growable_array.h" | 10 #include "vm/growable_array.h" |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 182 virtual bool AttributesEqual(Computation* other) const { return true; } | 182 virtual bool AttributesEqual(Computation* other) const { return true; } |
| 183 | 183 |
| 184 // Returns true if the instruction may have side effects. | 184 // Returns true if the instruction may have side effects. |
| 185 // TODO(fschneider): Make this abstract and implement for all computations | 185 // TODO(fschneider): Make this abstract and implement for all computations |
| 186 // instead of returning the safe default (true). | 186 // instead of returning the safe default (true). |
| 187 virtual bool HasSideEffect() const { return true; } | 187 virtual bool HasSideEffect() const { return true; } |
| 188 | 188 |
| 189 // Compile time type of the computation, which typically depends on the | 189 // Compile time type of the computation, which typically depends on the |
| 190 // compile time types (and possibly propagated types) of its inputs. | 190 // compile time types (and possibly propagated types) of its inputs. |
| 191 virtual RawAbstractType* CompileType() const = 0; | 191 virtual RawAbstractType* CompileType() const = 0; |
| 192 virtual intptr_t ResultCid() const { return kDynamicCid; } | 192 virtual intptr_t ResultCid() const = 0; |
| 193 | 193 |
| 194 // Mutate assigned_vars to add the local variable index for all | 194 // Mutate assigned_vars to add the local variable index for all |
| 195 // frame-allocated locals assigned to by the computation. | 195 // frame-allocated locals assigned to by the computation. |
| 196 virtual void RecordAssignedVars(BitVector* assigned_vars, | 196 virtual void RecordAssignedVars(BitVector* assigned_vars, |
| 197 intptr_t fixed_parameter_count); | 197 intptr_t fixed_parameter_count); |
| 198 | 198 |
| 199 virtual const char* DebugName() const = 0; | 199 virtual const char* DebugName() const = 0; |
| 200 | 200 |
| 201 // Printing support. These functions are sometimes overridden for custom | 201 // Printing support. These functions are sometimes overridden for custom |
| 202 // formatting. Otherwise, it prints in the format "opcode(op1, op2, op3)". | 202 // formatting. Otherwise, it prints in the format "opcode(op1, op2, op3)". |
| (...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 549 return is_eliminated_; | 549 return is_eliminated_; |
| 550 } | 550 } |
| 551 void eliminate() { | 551 void eliminate() { |
| 552 ASSERT(!is_eliminated_); | 552 ASSERT(!is_eliminated_); |
| 553 is_eliminated_ = true; | 553 is_eliminated_ = true; |
| 554 } | 554 } |
| 555 | 555 |
| 556 virtual void PrintOperandsTo(BufferFormatter* f) const; | 556 virtual void PrintOperandsTo(BufferFormatter* f) const; |
| 557 | 557 |
| 558 virtual bool CanDeoptimize() const { return false; } | 558 virtual bool CanDeoptimize() const { return false; } |
| 559 virtual intptr_t ResultCid() const { return kDynamicCid; } |
| 559 | 560 |
| 560 private: | 561 private: |
| 561 const intptr_t token_pos_; | 562 const intptr_t token_pos_; |
| 562 const intptr_t try_index_; | 563 const intptr_t try_index_; |
| 563 const AbstractType& dst_type_; | 564 const AbstractType& dst_type_; |
| 564 const String& dst_name_; | 565 const String& dst_name_; |
| 565 bool is_eliminated_; | 566 bool is_eliminated_; |
| 566 | 567 |
| 567 DISALLOW_COPY_AND_ASSIGN(AssertAssignableComp); | 568 DISALLOW_COPY_AND_ASSIGN(AssertAssignableComp); |
| 568 }; | 569 }; |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 610 | 611 |
| 611 // Denotes the current context, normally held in a register. This is | 612 // Denotes the current context, normally held in a register. This is |
| 612 // a computation, not a value, because it's mutable. | 613 // a computation, not a value, because it's mutable. |
| 613 class CurrentContextComp : public TemplateComputation<0> { | 614 class CurrentContextComp : public TemplateComputation<0> { |
| 614 public: | 615 public: |
| 615 CurrentContextComp() { } | 616 CurrentContextComp() { } |
| 616 | 617 |
| 617 DECLARE_COMPUTATION(CurrentContext) | 618 DECLARE_COMPUTATION(CurrentContext) |
| 618 | 619 |
| 619 virtual bool CanDeoptimize() const { return false; } | 620 virtual bool CanDeoptimize() const { return false; } |
| 621 virtual intptr_t ResultCid() const { return kDynamicCid; } |
| 620 | 622 |
| 621 private: | 623 private: |
| 622 DISALLOW_COPY_AND_ASSIGN(CurrentContextComp); | 624 DISALLOW_COPY_AND_ASSIGN(CurrentContextComp); |
| 623 }; | 625 }; |
| 624 | 626 |
| 625 | 627 |
| 626 class StoreContextComp : public TemplateComputation<1> { | 628 class StoreContextComp : public TemplateComputation<1> { |
| 627 public: | 629 public: |
| 628 explicit StoreContextComp(Value* value) { | 630 explicit StoreContextComp(Value* value) { |
| 629 ASSERT(value != NULL); | 631 ASSERT(value != NULL); |
| 630 inputs_[0] = value; | 632 inputs_[0] = value; |
| 631 } | 633 } |
| 632 | 634 |
| 633 DECLARE_COMPUTATION(StoreContext); | 635 DECLARE_COMPUTATION(StoreContext); |
| 634 | 636 |
| 635 Value* value() const { return inputs_[0]; } | 637 Value* value() const { return inputs_[0]; } |
| 636 | 638 |
| 637 virtual bool CanDeoptimize() const { return false; } | 639 virtual bool CanDeoptimize() const { return false; } |
| 640 virtual intptr_t ResultCid() const { return kIllegalCid; } |
| 638 | 641 |
| 639 private: | 642 private: |
| 640 DISALLOW_COPY_AND_ASSIGN(StoreContextComp); | 643 DISALLOW_COPY_AND_ASSIGN(StoreContextComp); |
| 641 }; | 644 }; |
| 642 | 645 |
| 643 | 646 |
| 644 class ClosureCallComp : public TemplateComputation<0> { | 647 class ClosureCallComp : public TemplateComputation<0> { |
| 645 public: | 648 public: |
| 646 ClosureCallComp(ClosureCallNode* node, | 649 ClosureCallComp(ClosureCallNode* node, |
| 647 intptr_t try_index, | 650 intptr_t try_index, |
| 648 ZoneGrowableArray<PushArgumentInstr*>* arguments) | 651 ZoneGrowableArray<PushArgumentInstr*>* arguments) |
| 649 : ast_node_(*node), | 652 : ast_node_(*node), |
| 650 try_index_(try_index), | 653 try_index_(try_index), |
| 651 arguments_(arguments) { } | 654 arguments_(arguments) { } |
| 652 | 655 |
| 653 DECLARE_CALL_COMPUTATION(ClosureCall) | 656 DECLARE_CALL_COMPUTATION(ClosureCall) |
| 654 | 657 |
| 655 const Array& argument_names() const { return ast_node_.arguments()->names(); } | 658 const Array& argument_names() const { return ast_node_.arguments()->names(); } |
| 656 intptr_t token_pos() const { return ast_node_.token_pos(); } | 659 intptr_t token_pos() const { return ast_node_.token_pos(); } |
| 657 intptr_t try_index() const { return try_index_; } | 660 intptr_t try_index() const { return try_index_; } |
| 658 | 661 |
| 659 virtual intptr_t ArgumentCount() const { return arguments_->length(); } | 662 virtual intptr_t ArgumentCount() const { return arguments_->length(); } |
| 660 PushArgumentInstr* ArgumentAt(intptr_t index) const { | 663 PushArgumentInstr* ArgumentAt(intptr_t index) const { |
| 661 return (*arguments_)[index]; | 664 return (*arguments_)[index]; |
| 662 } | 665 } |
| 663 | 666 |
| 664 virtual void PrintOperandsTo(BufferFormatter* f) const; | 667 virtual void PrintOperandsTo(BufferFormatter* f) const; |
| 665 | 668 |
| 666 virtual bool CanDeoptimize() const { return false; } | 669 virtual bool CanDeoptimize() const { return false; } |
| 670 virtual intptr_t ResultCid() const { return kDynamicCid; } |
| 667 | 671 |
| 668 private: | 672 private: |
| 669 const ClosureCallNode& ast_node_; | 673 const ClosureCallNode& ast_node_; |
| 670 const intptr_t try_index_; | 674 const intptr_t try_index_; |
| 671 ZoneGrowableArray<PushArgumentInstr*>* arguments_; | 675 ZoneGrowableArray<PushArgumentInstr*>* arguments_; |
| 672 | 676 |
| 673 DISALLOW_COPY_AND_ASSIGN(ClosureCallComp); | 677 DISALLOW_COPY_AND_ASSIGN(ClosureCallComp); |
| 674 }; | 678 }; |
| 675 | 679 |
| 676 | 680 |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 710 virtual intptr_t ArgumentCount() const { return arguments_->length(); } | 714 virtual intptr_t ArgumentCount() const { return arguments_->length(); } |
| 711 PushArgumentInstr* ArgumentAt(intptr_t index) const { | 715 PushArgumentInstr* ArgumentAt(intptr_t index) const { |
| 712 return (*arguments_)[index]; | 716 return (*arguments_)[index]; |
| 713 } | 717 } |
| 714 const Array& argument_names() const { return argument_names_; } | 718 const Array& argument_names() const { return argument_names_; } |
| 715 intptr_t checked_argument_count() const { return checked_argument_count_; } | 719 intptr_t checked_argument_count() const { return checked_argument_count_; } |
| 716 | 720 |
| 717 virtual void PrintOperandsTo(BufferFormatter* f) const; | 721 virtual void PrintOperandsTo(BufferFormatter* f) const; |
| 718 | 722 |
| 719 virtual bool CanDeoptimize() const { return false; } | 723 virtual bool CanDeoptimize() const { return false; } |
| 724 virtual intptr_t ResultCid() const { return kDynamicCid; } |
| 720 | 725 |
| 721 private: | 726 private: |
| 722 const intptr_t token_pos_; | 727 const intptr_t token_pos_; |
| 723 const intptr_t try_index_; | 728 const intptr_t try_index_; |
| 724 const String& function_name_; | 729 const String& function_name_; |
| 725 const Token::Kind token_kind_; // Binary op, unary op, kGET or kILLEGAL. | 730 const Token::Kind token_kind_; // Binary op, unary op, kGET or kILLEGAL. |
| 726 ZoneGrowableArray<PushArgumentInstr*>* const arguments_; | 731 ZoneGrowableArray<PushArgumentInstr*>* const arguments_; |
| 727 const Array& argument_names_; | 732 const Array& argument_names_; |
| 728 const intptr_t checked_argument_count_; | 733 const intptr_t checked_argument_count_; |
| 729 | 734 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 743 | 748 |
| 744 void PrintTo(BufferFormatter* f) const; | 749 void PrintTo(BufferFormatter* f) const; |
| 745 | 750 |
| 746 virtual intptr_t ArgumentCount() const { | 751 virtual intptr_t ArgumentCount() const { |
| 747 return instance_call()->ArgumentCount(); | 752 return instance_call()->ArgumentCount(); |
| 748 } | 753 } |
| 749 | 754 |
| 750 DECLARE_CALL_COMPUTATION(PolymorphicInstanceCall) | 755 DECLARE_CALL_COMPUTATION(PolymorphicInstanceCall) |
| 751 | 756 |
| 752 virtual bool CanDeoptimize() const { return true; } | 757 virtual bool CanDeoptimize() const { return true; } |
| 758 virtual intptr_t ResultCid() const { return kDynamicCid; } |
| 753 | 759 |
| 754 private: | 760 private: |
| 755 InstanceCallComp* instance_call_; | 761 InstanceCallComp* instance_call_; |
| 756 const bool with_checks_; | 762 const bool with_checks_; |
| 757 | 763 |
| 758 DISALLOW_COPY_AND_ASSIGN(PolymorphicInstanceCallComp); | 764 DISALLOW_COPY_AND_ASSIGN(PolymorphicInstanceCallComp); |
| 759 }; | 765 }; |
| 760 | 766 |
| 761 | 767 |
| 762 class ComparisonComp : public TemplateComputation<2> { | 768 class ComparisonComp : public TemplateComputation<2> { |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 909 PushArgumentInstr* ArgumentAt(intptr_t index) const { | 915 PushArgumentInstr* ArgumentAt(intptr_t index) const { |
| 910 return (*arguments_)[index]; | 916 return (*arguments_)[index]; |
| 911 } | 917 } |
| 912 | 918 |
| 913 MethodRecognizer::Kind recognized() const { return recognized_; } | 919 MethodRecognizer::Kind recognized() const { return recognized_; } |
| 914 void set_recognized(MethodRecognizer::Kind kind) { recognized_ = kind; } | 920 void set_recognized(MethodRecognizer::Kind kind) { recognized_ = kind; } |
| 915 | 921 |
| 916 virtual void PrintOperandsTo(BufferFormatter* f) const; | 922 virtual void PrintOperandsTo(BufferFormatter* f) const; |
| 917 | 923 |
| 918 virtual bool CanDeoptimize() const { return false; } | 924 virtual bool CanDeoptimize() const { return false; } |
| 925 virtual intptr_t ResultCid() const { return kDynamicCid; } |
| 919 | 926 |
| 920 private: | 927 private: |
| 921 const intptr_t token_pos_; | 928 const intptr_t token_pos_; |
| 922 const intptr_t try_index_; | 929 const intptr_t try_index_; |
| 923 const Function& function_; | 930 const Function& function_; |
| 924 const Array& argument_names_; | 931 const Array& argument_names_; |
| 925 ZoneGrowableArray<PushArgumentInstr*>* arguments_; | 932 ZoneGrowableArray<PushArgumentInstr*>* arguments_; |
| 926 MethodRecognizer::Kind recognized_; | 933 MethodRecognizer::Kind recognized_; |
| 927 | 934 |
| 928 DISALLOW_COPY_AND_ASSIGN(StaticCallComp); | 935 DISALLOW_COPY_AND_ASSIGN(StaticCallComp); |
| 929 }; | 936 }; |
| 930 | 937 |
| 931 | 938 |
| 932 class LoadLocalComp : public TemplateComputation<0> { | 939 class LoadLocalComp : public TemplateComputation<0> { |
| 933 public: | 940 public: |
| 934 LoadLocalComp(const LocalVariable& local, intptr_t context_level) | 941 LoadLocalComp(const LocalVariable& local, intptr_t context_level) |
| 935 : local_(local), | 942 : local_(local), |
| 936 context_level_(context_level) { } | 943 context_level_(context_level) { } |
| 937 | 944 |
| 938 DECLARE_COMPUTATION(LoadLocal) | 945 DECLARE_COMPUTATION(LoadLocal) |
| 939 | 946 |
| 940 const LocalVariable& local() const { return local_; } | 947 const LocalVariable& local() const { return local_; } |
| 941 intptr_t context_level() const { return context_level_; } | 948 intptr_t context_level() const { return context_level_; } |
| 942 | 949 |
| 943 virtual void PrintOperandsTo(BufferFormatter* f) const; | 950 virtual void PrintOperandsTo(BufferFormatter* f) const; |
| 944 | 951 |
| 945 virtual bool CanDeoptimize() const { return false; } | 952 virtual bool CanDeoptimize() const { return false; } |
| 953 virtual intptr_t ResultCid() const { return kDynamicCid; } |
| 946 | 954 |
| 947 private: | 955 private: |
| 948 const LocalVariable& local_; | 956 const LocalVariable& local_; |
| 949 const intptr_t context_level_; | 957 const intptr_t context_level_; |
| 950 | 958 |
| 951 DISALLOW_COPY_AND_ASSIGN(LoadLocalComp); | 959 DISALLOW_COPY_AND_ASSIGN(LoadLocalComp); |
| 952 }; | 960 }; |
| 953 | 961 |
| 954 | 962 |
| 955 class StoreLocalComp : public TemplateComputation<1> { | 963 class StoreLocalComp : public TemplateComputation<1> { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 968 const LocalVariable& local() const { return local_; } | 976 const LocalVariable& local() const { return local_; } |
| 969 Value* value() const { return inputs_[0]; } | 977 Value* value() const { return inputs_[0]; } |
| 970 intptr_t context_level() const { return context_level_; } | 978 intptr_t context_level() const { return context_level_; } |
| 971 | 979 |
| 972 virtual void RecordAssignedVars(BitVector* assigned_vars, | 980 virtual void RecordAssignedVars(BitVector* assigned_vars, |
| 973 intptr_t fixed_parameter_count); | 981 intptr_t fixed_parameter_count); |
| 974 | 982 |
| 975 virtual void PrintOperandsTo(BufferFormatter* f) const; | 983 virtual void PrintOperandsTo(BufferFormatter* f) const; |
| 976 | 984 |
| 977 virtual bool CanDeoptimize() const { return false; } | 985 virtual bool CanDeoptimize() const { return false; } |
| 986 virtual intptr_t ResultCid() const { return kDynamicCid; } |
| 978 | 987 |
| 979 private: | 988 private: |
| 980 const LocalVariable& local_; | 989 const LocalVariable& local_; |
| 981 const intptr_t context_level_; | 990 const intptr_t context_level_; |
| 982 | 991 |
| 983 DISALLOW_COPY_AND_ASSIGN(StoreLocalComp); | 992 DISALLOW_COPY_AND_ASSIGN(StoreLocalComp); |
| 984 }; | 993 }; |
| 985 | 994 |
| 986 | 995 |
| 987 class NativeCallComp : public TemplateComputation<0> { | 996 class NativeCallComp : public TemplateComputation<0> { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1008 return ast_node_.has_optional_parameters(); | 1017 return ast_node_.has_optional_parameters(); |
| 1009 } | 1018 } |
| 1010 | 1019 |
| 1011 bool is_native_instance_closure() const { | 1020 bool is_native_instance_closure() const { |
| 1012 return ast_node_.is_native_instance_closure(); | 1021 return ast_node_.is_native_instance_closure(); |
| 1013 } | 1022 } |
| 1014 | 1023 |
| 1015 virtual void PrintOperandsTo(BufferFormatter* f) const; | 1024 virtual void PrintOperandsTo(BufferFormatter* f) const; |
| 1016 | 1025 |
| 1017 virtual bool CanDeoptimize() const { return false; } | 1026 virtual bool CanDeoptimize() const { return false; } |
| 1027 virtual intptr_t ResultCid() const { return kDynamicCid; } |
| 1018 | 1028 |
| 1019 private: | 1029 private: |
| 1020 const NativeBodyNode& ast_node_; | 1030 const NativeBodyNode& ast_node_; |
| 1021 const intptr_t try_index_; | 1031 const intptr_t try_index_; |
| 1022 | 1032 |
| 1023 DISALLOW_COPY_AND_ASSIGN(NativeCallComp); | 1033 DISALLOW_COPY_AND_ASSIGN(NativeCallComp); |
| 1024 }; | 1034 }; |
| 1025 | 1035 |
| 1026 | 1036 |
| 1027 class LoadInstanceFieldComp : public TemplateComputation<1> { | 1037 class LoadInstanceFieldComp : public TemplateComputation<1> { |
| 1028 public: | 1038 public: |
| 1029 // Set 'original' to NULL if LoadInstanceFieldComp cannot deoptimize. | 1039 // Set 'original' to NULL if LoadInstanceFieldComp cannot deoptimize. |
| 1030 LoadInstanceFieldComp(const Field& field, | 1040 LoadInstanceFieldComp(const Field& field, |
| 1031 Value* instance, | 1041 Value* instance, |
| 1032 InstanceCallComp* original) | 1042 InstanceCallComp* original) |
| 1033 : field_(field), original_(original) { | 1043 : field_(field), original_(original) { |
| 1034 ASSERT(instance != NULL); | 1044 ASSERT(instance != NULL); |
| 1035 inputs_[0] = instance; | 1045 inputs_[0] = instance; |
| 1036 } | 1046 } |
| 1037 | 1047 |
| 1038 DECLARE_COMPUTATION(LoadInstanceField) | 1048 DECLARE_COMPUTATION(LoadInstanceField) |
| 1039 | 1049 |
| 1040 const Field& field() const { return field_; } | 1050 const Field& field() const { return field_; } |
| 1041 Value* instance() const { return inputs_[0]; } | 1051 Value* instance() const { return inputs_[0]; } |
| 1042 const InstanceCallComp* original() const { return original_; } | 1052 const InstanceCallComp* original() const { return original_; } |
| 1043 | 1053 |
| 1044 virtual void PrintOperandsTo(BufferFormatter* f) const; | 1054 virtual void PrintOperandsTo(BufferFormatter* f) const; |
| 1045 | 1055 |
| 1046 virtual bool CanDeoptimize() const { return original_ != NULL; } | 1056 virtual bool CanDeoptimize() const { return original_ != NULL; } |
| 1057 virtual intptr_t ResultCid() const { return kDynamicCid; } |
| 1047 | 1058 |
| 1048 private: | 1059 private: |
| 1049 const Field& field_; | 1060 const Field& field_; |
| 1050 const InstanceCallComp* original_; // For optimizations. | 1061 const InstanceCallComp* original_; // For optimizations. |
| 1051 | 1062 |
| 1052 DISALLOW_COPY_AND_ASSIGN(LoadInstanceFieldComp); | 1063 DISALLOW_COPY_AND_ASSIGN(LoadInstanceFieldComp); |
| 1053 }; | 1064 }; |
| 1054 | 1065 |
| 1055 | 1066 |
| 1056 class StoreInstanceFieldComp : public TemplateComputation<2> { | 1067 class StoreInstanceFieldComp : public TemplateComputation<2> { |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1072 const Field& field() const { return field_; } | 1083 const Field& field() const { return field_; } |
| 1073 | 1084 |
| 1074 Value* instance() const { return inputs_[0]; } | 1085 Value* instance() const { return inputs_[0]; } |
| 1075 Value* value() const { return inputs_[1]; } | 1086 Value* value() const { return inputs_[1]; } |
| 1076 | 1087 |
| 1077 const InstanceCallComp* original() const { return original_; } | 1088 const InstanceCallComp* original() const { return original_; } |
| 1078 | 1089 |
| 1079 virtual void PrintOperandsTo(BufferFormatter* f) const; | 1090 virtual void PrintOperandsTo(BufferFormatter* f) const; |
| 1080 | 1091 |
| 1081 virtual bool CanDeoptimize() const { return original_ != NULL; } | 1092 virtual bool CanDeoptimize() const { return original_ != NULL; } |
| 1093 virtual intptr_t ResultCid() const { return kDynamicCid; } |
| 1082 | 1094 |
| 1083 private: | 1095 private: |
| 1084 const Field& field_; | 1096 const Field& field_; |
| 1085 const InstanceCallComp* original_; // For optimizations. | 1097 const InstanceCallComp* original_; // For optimizations. |
| 1086 | 1098 |
| 1087 DISALLOW_COPY_AND_ASSIGN(StoreInstanceFieldComp); | 1099 DISALLOW_COPY_AND_ASSIGN(StoreInstanceFieldComp); |
| 1088 }; | 1100 }; |
| 1089 | 1101 |
| 1090 | 1102 |
| 1091 class LoadStaticFieldComp : public TemplateComputation<0> { | 1103 class LoadStaticFieldComp : public TemplateComputation<0> { |
| 1092 public: | 1104 public: |
| 1093 explicit LoadStaticFieldComp(const Field& field) : field_(field) {} | 1105 explicit LoadStaticFieldComp(const Field& field) : field_(field) {} |
| 1094 | 1106 |
| 1095 DECLARE_COMPUTATION(LoadStaticField); | 1107 DECLARE_COMPUTATION(LoadStaticField); |
| 1096 | 1108 |
| 1097 const Field& field() const { return field_; } | 1109 const Field& field() const { return field_; } |
| 1098 | 1110 |
| 1099 virtual void PrintOperandsTo(BufferFormatter* f) const; | 1111 virtual void PrintOperandsTo(BufferFormatter* f) const; |
| 1100 | 1112 |
| 1101 virtual bool CanDeoptimize() const { return false; } | 1113 virtual bool CanDeoptimize() const { return false; } |
| 1114 virtual intptr_t ResultCid() const { return kDynamicCid; } |
| 1102 | 1115 |
| 1103 private: | 1116 private: |
| 1104 const Field& field_; | 1117 const Field& field_; |
| 1105 | 1118 |
| 1106 DISALLOW_COPY_AND_ASSIGN(LoadStaticFieldComp); | 1119 DISALLOW_COPY_AND_ASSIGN(LoadStaticFieldComp); |
| 1107 }; | 1120 }; |
| 1108 | 1121 |
| 1109 | 1122 |
| 1110 class StoreStaticFieldComp : public TemplateComputation<1> { | 1123 class StoreStaticFieldComp : public TemplateComputation<1> { |
| 1111 public: | 1124 public: |
| 1112 StoreStaticFieldComp(const Field& field, Value* value) | 1125 StoreStaticFieldComp(const Field& field, Value* value) |
| 1113 : field_(field) { | 1126 : field_(field) { |
| 1114 ASSERT(field.IsZoneHandle()); | 1127 ASSERT(field.IsZoneHandle()); |
| 1115 ASSERT(value != NULL); | 1128 ASSERT(value != NULL); |
| 1116 inputs_[0] = value; | 1129 inputs_[0] = value; |
| 1117 } | 1130 } |
| 1118 | 1131 |
| 1119 DECLARE_COMPUTATION(StoreStaticField); | 1132 DECLARE_COMPUTATION(StoreStaticField); |
| 1120 | 1133 |
| 1121 const Field& field() const { return field_; } | 1134 const Field& field() const { return field_; } |
| 1122 Value* value() const { return inputs_[0]; } | 1135 Value* value() const { return inputs_[0]; } |
| 1123 | 1136 |
| 1124 virtual void PrintOperandsTo(BufferFormatter* f) const; | 1137 virtual void PrintOperandsTo(BufferFormatter* f) const; |
| 1125 | 1138 |
| 1126 virtual bool CanDeoptimize() const { return false; } | 1139 virtual bool CanDeoptimize() const { return false; } |
| 1140 virtual intptr_t ResultCid() const { return kDynamicCid; } |
| 1127 | 1141 |
| 1128 private: | 1142 private: |
| 1129 const Field& field_; | 1143 const Field& field_; |
| 1130 | 1144 |
| 1131 DISALLOW_COPY_AND_ASSIGN(StoreStaticFieldComp); | 1145 DISALLOW_COPY_AND_ASSIGN(StoreStaticFieldComp); |
| 1132 }; | 1146 }; |
| 1133 | 1147 |
| 1134 | 1148 |
| 1135 class LoadIndexedComp : public TemplateComputation<2> { | 1149 class LoadIndexedComp : public TemplateComputation<2> { |
| 1136 public: | 1150 public: |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1149 DECLARE_COMPUTATION(LoadIndexed) | 1163 DECLARE_COMPUTATION(LoadIndexed) |
| 1150 | 1164 |
| 1151 Value* array() const { return inputs_[0]; } | 1165 Value* array() const { return inputs_[0]; } |
| 1152 Value* index() const { return inputs_[1]; } | 1166 Value* index() const { return inputs_[1]; } |
| 1153 | 1167 |
| 1154 intptr_t receiver_type() const { return receiver_type_; } | 1168 intptr_t receiver_type() const { return receiver_type_; } |
| 1155 | 1169 |
| 1156 InstanceCallComp* original() const { return original_; } | 1170 InstanceCallComp* original() const { return original_; } |
| 1157 | 1171 |
| 1158 virtual bool CanDeoptimize() const { return true; } | 1172 virtual bool CanDeoptimize() const { return true; } |
| 1173 virtual intptr_t ResultCid() const { return kDynamicCid; } |
| 1159 | 1174 |
| 1160 private: | 1175 private: |
| 1161 intptr_t receiver_type_; | 1176 intptr_t receiver_type_; |
| 1162 InstanceCallComp* original_; | 1177 InstanceCallComp* original_; |
| 1163 | 1178 |
| 1164 DISALLOW_COPY_AND_ASSIGN(LoadIndexedComp); | 1179 DISALLOW_COPY_AND_ASSIGN(LoadIndexedComp); |
| 1165 }; | 1180 }; |
| 1166 | 1181 |
| 1167 | 1182 |
| 1168 class StoreIndexedComp : public TemplateComputation<3> { | 1183 class StoreIndexedComp : public TemplateComputation<3> { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1186 | 1201 |
| 1187 Value* array() const { return inputs_[0]; } | 1202 Value* array() const { return inputs_[0]; } |
| 1188 Value* index() const { return inputs_[1]; } | 1203 Value* index() const { return inputs_[1]; } |
| 1189 Value* value() const { return inputs_[2]; } | 1204 Value* value() const { return inputs_[2]; } |
| 1190 | 1205 |
| 1191 InstanceCallComp* original() const { return original_; } | 1206 InstanceCallComp* original() const { return original_; } |
| 1192 | 1207 |
| 1193 intptr_t receiver_type() const { return receiver_type_; } | 1208 intptr_t receiver_type() const { return receiver_type_; } |
| 1194 | 1209 |
| 1195 virtual bool CanDeoptimize() const { return true; } | 1210 virtual bool CanDeoptimize() const { return true; } |
| 1211 virtual intptr_t ResultCid() const { return kDynamicCid; } |
| 1196 | 1212 |
| 1197 private: | 1213 private: |
| 1198 intptr_t receiver_type_; | 1214 intptr_t receiver_type_; |
| 1199 InstanceCallComp* original_; | 1215 InstanceCallComp* original_; |
| 1200 | 1216 |
| 1201 DISALLOW_COPY_AND_ASSIGN(StoreIndexedComp); | 1217 DISALLOW_COPY_AND_ASSIGN(StoreIndexedComp); |
| 1202 }; | 1218 }; |
| 1203 | 1219 |
| 1204 | 1220 |
| 1205 // Note overrideable, built-in: value? false : true. | 1221 // Note overrideable, built-in: value? false : true. |
| 1206 class BooleanNegateComp : public TemplateComputation<1> { | 1222 class BooleanNegateComp : public TemplateComputation<1> { |
| 1207 public: | 1223 public: |
| 1208 explicit BooleanNegateComp(Value* value) { | 1224 explicit BooleanNegateComp(Value* value) { |
| 1209 ASSERT(value != NULL); | 1225 ASSERT(value != NULL); |
| 1210 inputs_[0] = value; | 1226 inputs_[0] = value; |
| 1211 } | 1227 } |
| 1212 | 1228 |
| 1213 DECLARE_COMPUTATION(BooleanNegate) | 1229 DECLARE_COMPUTATION(BooleanNegate) |
| 1214 | 1230 |
| 1215 Value* value() const { return inputs_[0]; } | 1231 Value* value() const { return inputs_[0]; } |
| 1216 | 1232 |
| 1217 virtual bool CanDeoptimize() const { return false; } | 1233 virtual bool CanDeoptimize() const { return false; } |
| 1234 virtual intptr_t ResultCid() const { return kBoolCid; } |
| 1218 | 1235 |
| 1219 private: | 1236 private: |
| 1220 DISALLOW_COPY_AND_ASSIGN(BooleanNegateComp); | 1237 DISALLOW_COPY_AND_ASSIGN(BooleanNegateComp); |
| 1221 }; | 1238 }; |
| 1222 | 1239 |
| 1223 | 1240 |
| 1224 class InstanceOfComp : public TemplateComputation<3> { | 1241 class InstanceOfComp : public TemplateComputation<3> { |
| 1225 public: | 1242 public: |
| 1226 InstanceOfComp(intptr_t token_pos, | 1243 InstanceOfComp(intptr_t token_pos, |
| 1227 intptr_t try_index, | 1244 intptr_t try_index, |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1289 return (*arguments_)[index]; | 1306 return (*arguments_)[index]; |
| 1290 } | 1307 } |
| 1291 | 1308 |
| 1292 const Function& constructor() const { return ast_node_.constructor(); } | 1309 const Function& constructor() const { return ast_node_.constructor(); } |
| 1293 intptr_t token_pos() const { return ast_node_.token_pos(); } | 1310 intptr_t token_pos() const { return ast_node_.token_pos(); } |
| 1294 intptr_t try_index() const { return try_index_; } | 1311 intptr_t try_index() const { return try_index_; } |
| 1295 | 1312 |
| 1296 virtual void PrintOperandsTo(BufferFormatter* f) const; | 1313 virtual void PrintOperandsTo(BufferFormatter* f) const; |
| 1297 | 1314 |
| 1298 virtual bool CanDeoptimize() const { return false; } | 1315 virtual bool CanDeoptimize() const { return false; } |
| 1316 virtual intptr_t ResultCid() const { return kDynamicCid; } |
| 1299 | 1317 |
| 1300 private: | 1318 private: |
| 1301 const ConstructorCallNode& ast_node_; | 1319 const ConstructorCallNode& ast_node_; |
| 1302 const intptr_t try_index_; | 1320 const intptr_t try_index_; |
| 1303 ZoneGrowableArray<PushArgumentInstr*>* const arguments_; | 1321 ZoneGrowableArray<PushArgumentInstr*>* const arguments_; |
| 1304 | 1322 |
| 1305 DISALLOW_COPY_AND_ASSIGN(AllocateObjectComp); | 1323 DISALLOW_COPY_AND_ASSIGN(AllocateObjectComp); |
| 1306 }; | 1324 }; |
| 1307 | 1325 |
| 1308 | 1326 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1321 | 1339 |
| 1322 DECLARE_COMPUTATION(AllocateObjectWithBoundsCheck) | 1340 DECLARE_COMPUTATION(AllocateObjectWithBoundsCheck) |
| 1323 | 1341 |
| 1324 const Function& constructor() const { return ast_node_.constructor(); } | 1342 const Function& constructor() const { return ast_node_.constructor(); } |
| 1325 intptr_t token_pos() const { return ast_node_.token_pos(); } | 1343 intptr_t token_pos() const { return ast_node_.token_pos(); } |
| 1326 intptr_t try_index() const { return try_index_; } | 1344 intptr_t try_index() const { return try_index_; } |
| 1327 | 1345 |
| 1328 virtual void PrintOperandsTo(BufferFormatter* f) const; | 1346 virtual void PrintOperandsTo(BufferFormatter* f) const; |
| 1329 | 1347 |
| 1330 virtual bool CanDeoptimize() const { return false; } | 1348 virtual bool CanDeoptimize() const { return false; } |
| 1349 virtual intptr_t ResultCid() const { return kDynamicCid; } |
| 1331 | 1350 |
| 1332 private: | 1351 private: |
| 1333 const ConstructorCallNode& ast_node_; | 1352 const ConstructorCallNode& ast_node_; |
| 1334 const intptr_t try_index_; | 1353 const intptr_t try_index_; |
| 1335 | 1354 |
| 1336 DISALLOW_COPY_AND_ASSIGN(AllocateObjectWithBoundsCheckComp); | 1355 DISALLOW_COPY_AND_ASSIGN(AllocateObjectWithBoundsCheckComp); |
| 1337 }; | 1356 }; |
| 1338 | 1357 |
| 1339 | 1358 |
| 1340 class CreateArrayComp : public TemplateComputation<1> { | 1359 class CreateArrayComp : public TemplateComputation<1> { |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1366 | 1385 |
| 1367 intptr_t token_pos() const { return token_pos_; } | 1386 intptr_t token_pos() const { return token_pos_; } |
| 1368 intptr_t try_index() const { return try_index_; } | 1387 intptr_t try_index() const { return try_index_; } |
| 1369 PushArgumentInstr* ArgumentAt(intptr_t i) const { return (*arguments_)[i]; } | 1388 PushArgumentInstr* ArgumentAt(intptr_t i) const { return (*arguments_)[i]; } |
| 1370 const AbstractType& type() const { return type_; } | 1389 const AbstractType& type() const { return type_; } |
| 1371 Value* element_type() const { return inputs_[0]; } | 1390 Value* element_type() const { return inputs_[0]; } |
| 1372 | 1391 |
| 1373 virtual void PrintOperandsTo(BufferFormatter* f) const; | 1392 virtual void PrintOperandsTo(BufferFormatter* f) const; |
| 1374 | 1393 |
| 1375 virtual bool CanDeoptimize() const { return false; } | 1394 virtual bool CanDeoptimize() const { return false; } |
| 1395 virtual intptr_t ResultCid() const { return kDynamicCid; } |
| 1376 | 1396 |
| 1377 private: | 1397 private: |
| 1378 const intptr_t token_pos_; | 1398 const intptr_t token_pos_; |
| 1379 const intptr_t try_index_; | 1399 const intptr_t try_index_; |
| 1380 ZoneGrowableArray<PushArgumentInstr*>* const arguments_; | 1400 ZoneGrowableArray<PushArgumentInstr*>* const arguments_; |
| 1381 const AbstractType& type_; | 1401 const AbstractType& type_; |
| 1382 | 1402 |
| 1383 DISALLOW_COPY_AND_ASSIGN(CreateArrayComp); | 1403 DISALLOW_COPY_AND_ASSIGN(CreateArrayComp); |
| 1384 }; | 1404 }; |
| 1385 | 1405 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1400 const Function& function() const { return ast_node_.function(); } | 1420 const Function& function() const { return ast_node_.function(); } |
| 1401 | 1421 |
| 1402 virtual intptr_t ArgumentCount() const { return arguments_->length(); } | 1422 virtual intptr_t ArgumentCount() const { return arguments_->length(); } |
| 1403 PushArgumentInstr* ArgumentAt(intptr_t index) const { | 1423 PushArgumentInstr* ArgumentAt(intptr_t index) const { |
| 1404 return (*arguments_)[index]; | 1424 return (*arguments_)[index]; |
| 1405 } | 1425 } |
| 1406 | 1426 |
| 1407 virtual void PrintOperandsTo(BufferFormatter* f) const; | 1427 virtual void PrintOperandsTo(BufferFormatter* f) const; |
| 1408 | 1428 |
| 1409 virtual bool CanDeoptimize() const { return false; } | 1429 virtual bool CanDeoptimize() const { return false; } |
| 1430 virtual intptr_t ResultCid() const { return kDynamicCid; } |
| 1410 | 1431 |
| 1411 private: | 1432 private: |
| 1412 const ClosureNode& ast_node_; | 1433 const ClosureNode& ast_node_; |
| 1413 const intptr_t try_index_; | 1434 const intptr_t try_index_; |
| 1414 ZoneGrowableArray<PushArgumentInstr*>* arguments_; | 1435 ZoneGrowableArray<PushArgumentInstr*>* arguments_; |
| 1415 | 1436 |
| 1416 DISALLOW_COPY_AND_ASSIGN(CreateClosureComp); | 1437 DISALLOW_COPY_AND_ASSIGN(CreateClosureComp); |
| 1417 }; | 1438 }; |
| 1418 | 1439 |
| 1419 | 1440 |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1473 DECLARE_COMPUTATION(StoreVMField) | 1494 DECLARE_COMPUTATION(StoreVMField) |
| 1474 | 1495 |
| 1475 Value* value() const { return inputs_[0]; } | 1496 Value* value() const { return inputs_[0]; } |
| 1476 Value* dest() const { return inputs_[1]; } | 1497 Value* dest() const { return inputs_[1]; } |
| 1477 intptr_t offset_in_bytes() const { return offset_in_bytes_; } | 1498 intptr_t offset_in_bytes() const { return offset_in_bytes_; } |
| 1478 const AbstractType& type() const { return type_; } | 1499 const AbstractType& type() const { return type_; } |
| 1479 | 1500 |
| 1480 virtual void PrintOperandsTo(BufferFormatter* f) const; | 1501 virtual void PrintOperandsTo(BufferFormatter* f) const; |
| 1481 | 1502 |
| 1482 virtual bool CanDeoptimize() const { return false; } | 1503 virtual bool CanDeoptimize() const { return false; } |
| 1504 virtual intptr_t ResultCid() const { return kDynamicCid; } |
| 1483 | 1505 |
| 1484 private: | 1506 private: |
| 1485 const intptr_t offset_in_bytes_; | 1507 const intptr_t offset_in_bytes_; |
| 1486 const AbstractType& type_; | 1508 const AbstractType& type_; |
| 1487 | 1509 |
| 1488 DISALLOW_COPY_AND_ASSIGN(StoreVMFieldComp); | 1510 DISALLOW_COPY_AND_ASSIGN(StoreVMFieldComp); |
| 1489 }; | 1511 }; |
| 1490 | 1512 |
| 1491 | 1513 |
| 1492 class InstantiateTypeArgumentsComp : public TemplateComputation<1> { | 1514 class InstantiateTypeArgumentsComp : public TemplateComputation<1> { |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1508 Value* instantiator() const { return inputs_[0]; } | 1530 Value* instantiator() const { return inputs_[0]; } |
| 1509 const AbstractTypeArguments& type_arguments() const { | 1531 const AbstractTypeArguments& type_arguments() const { |
| 1510 return type_arguments_; | 1532 return type_arguments_; |
| 1511 } | 1533 } |
| 1512 intptr_t token_pos() const { return token_pos_; } | 1534 intptr_t token_pos() const { return token_pos_; } |
| 1513 intptr_t try_index() const { return try_index_; } | 1535 intptr_t try_index() const { return try_index_; } |
| 1514 | 1536 |
| 1515 virtual void PrintOperandsTo(BufferFormatter* f) const; | 1537 virtual void PrintOperandsTo(BufferFormatter* f) const; |
| 1516 | 1538 |
| 1517 virtual bool CanDeoptimize() const { return false; } | 1539 virtual bool CanDeoptimize() const { return false; } |
| 1540 virtual intptr_t ResultCid() const { return kDynamicCid; } |
| 1518 | 1541 |
| 1519 private: | 1542 private: |
| 1520 const intptr_t token_pos_; | 1543 const intptr_t token_pos_; |
| 1521 const intptr_t try_index_; | 1544 const intptr_t try_index_; |
| 1522 const AbstractTypeArguments& type_arguments_; | 1545 const AbstractTypeArguments& type_arguments_; |
| 1523 | 1546 |
| 1524 DISALLOW_COPY_AND_ASSIGN(InstantiateTypeArgumentsComp); | 1547 DISALLOW_COPY_AND_ASSIGN(InstantiateTypeArgumentsComp); |
| 1525 }; | 1548 }; |
| 1526 | 1549 |
| 1527 | 1550 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1544 Value* instantiator() const { return inputs_[0]; } | 1567 Value* instantiator() const { return inputs_[0]; } |
| 1545 const AbstractTypeArguments& type_arguments() const { | 1568 const AbstractTypeArguments& type_arguments() const { |
| 1546 return type_arguments_; | 1569 return type_arguments_; |
| 1547 } | 1570 } |
| 1548 intptr_t token_pos() const { return token_pos_; } | 1571 intptr_t token_pos() const { return token_pos_; } |
| 1549 intptr_t try_index() const { return try_index_; } | 1572 intptr_t try_index() const { return try_index_; } |
| 1550 | 1573 |
| 1551 virtual void PrintOperandsTo(BufferFormatter* f) const; | 1574 virtual void PrintOperandsTo(BufferFormatter* f) const; |
| 1552 | 1575 |
| 1553 virtual bool CanDeoptimize() const { return false; } | 1576 virtual bool CanDeoptimize() const { return false; } |
| 1577 virtual intptr_t ResultCid() const { return kDynamicCid; } |
| 1554 | 1578 |
| 1555 private: | 1579 private: |
| 1556 const intptr_t token_pos_; | 1580 const intptr_t token_pos_; |
| 1557 const intptr_t try_index_; | 1581 const intptr_t try_index_; |
| 1558 const AbstractTypeArguments& type_arguments_; | 1582 const AbstractTypeArguments& type_arguments_; |
| 1559 | 1583 |
| 1560 DISALLOW_COPY_AND_ASSIGN(ExtractConstructorTypeArgumentsComp); | 1584 DISALLOW_COPY_AND_ASSIGN(ExtractConstructorTypeArgumentsComp); |
| 1561 }; | 1585 }; |
| 1562 | 1586 |
| 1563 | 1587 |
| 1564 class ExtractConstructorInstantiatorComp : public TemplateComputation<1> { | 1588 class ExtractConstructorInstantiatorComp : public TemplateComputation<1> { |
| 1565 public: | 1589 public: |
| 1566 ExtractConstructorInstantiatorComp(ConstructorCallNode* ast_node, | 1590 ExtractConstructorInstantiatorComp(ConstructorCallNode* ast_node, |
| 1567 Value* instantiator) | 1591 Value* instantiator) |
| 1568 : ast_node_(*ast_node) { | 1592 : ast_node_(*ast_node) { |
| 1569 ASSERT(instantiator != NULL); | 1593 ASSERT(instantiator != NULL); |
| 1570 inputs_[0] = instantiator; | 1594 inputs_[0] = instantiator; |
| 1571 } | 1595 } |
| 1572 | 1596 |
| 1573 DECLARE_COMPUTATION(ExtractConstructorInstantiator) | 1597 DECLARE_COMPUTATION(ExtractConstructorInstantiator) |
| 1574 | 1598 |
| 1575 Value* instantiator() const { return inputs_[0]; } | 1599 Value* instantiator() const { return inputs_[0]; } |
| 1576 const AbstractTypeArguments& type_arguments() const { | 1600 const AbstractTypeArguments& type_arguments() const { |
| 1577 return ast_node_.type_arguments(); | 1601 return ast_node_.type_arguments(); |
| 1578 } | 1602 } |
| 1579 const Function& constructor() const { return ast_node_.constructor(); } | 1603 const Function& constructor() const { return ast_node_.constructor(); } |
| 1580 intptr_t token_pos() const { return ast_node_.token_pos(); } | 1604 intptr_t token_pos() const { return ast_node_.token_pos(); } |
| 1581 | 1605 |
| 1582 virtual bool CanDeoptimize() const { return false; } | 1606 virtual bool CanDeoptimize() const { return false; } |
| 1607 virtual intptr_t ResultCid() const { return kDynamicCid; } |
| 1583 | 1608 |
| 1584 private: | 1609 private: |
| 1585 const ConstructorCallNode& ast_node_; | 1610 const ConstructorCallNode& ast_node_; |
| 1586 | 1611 |
| 1587 DISALLOW_COPY_AND_ASSIGN(ExtractConstructorInstantiatorComp); | 1612 DISALLOW_COPY_AND_ASSIGN(ExtractConstructorInstantiatorComp); |
| 1588 }; | 1613 }; |
| 1589 | 1614 |
| 1590 | 1615 |
| 1591 class AllocateContextComp : public TemplateComputation<0> { | 1616 class AllocateContextComp : public TemplateComputation<0> { |
| 1592 public: | 1617 public: |
| 1593 AllocateContextComp(intptr_t token_pos, | 1618 AllocateContextComp(intptr_t token_pos, |
| 1594 intptr_t try_index, | 1619 intptr_t try_index, |
| 1595 intptr_t num_context_variables) | 1620 intptr_t num_context_variables) |
| 1596 : token_pos_(token_pos), | 1621 : token_pos_(token_pos), |
| 1597 try_index_(try_index), | 1622 try_index_(try_index), |
| 1598 num_context_variables_(num_context_variables) {} | 1623 num_context_variables_(num_context_variables) {} |
| 1599 | 1624 |
| 1600 DECLARE_COMPUTATION(AllocateContext); | 1625 DECLARE_COMPUTATION(AllocateContext); |
| 1601 | 1626 |
| 1602 intptr_t token_pos() const { return token_pos_; } | 1627 intptr_t token_pos() const { return token_pos_; } |
| 1603 intptr_t try_index() const { return try_index_; } | 1628 intptr_t try_index() const { return try_index_; } |
| 1604 intptr_t num_context_variables() const { return num_context_variables_; } | 1629 intptr_t num_context_variables() const { return num_context_variables_; } |
| 1605 | 1630 |
| 1606 virtual void PrintOperandsTo(BufferFormatter* f) const; | 1631 virtual void PrintOperandsTo(BufferFormatter* f) const; |
| 1607 | 1632 |
| 1608 virtual bool CanDeoptimize() const { return false; } | 1633 virtual bool CanDeoptimize() const { return false; } |
| 1634 virtual intptr_t ResultCid() const { return kDynamicCid; } |
| 1609 | 1635 |
| 1610 private: | 1636 private: |
| 1611 const intptr_t token_pos_; | 1637 const intptr_t token_pos_; |
| 1612 const intptr_t try_index_; | 1638 const intptr_t try_index_; |
| 1613 const intptr_t num_context_variables_; | 1639 const intptr_t num_context_variables_; |
| 1614 | 1640 |
| 1615 DISALLOW_COPY_AND_ASSIGN(AllocateContextComp); | 1641 DISALLOW_COPY_AND_ASSIGN(AllocateContextComp); |
| 1616 }; | 1642 }; |
| 1617 | 1643 |
| 1618 | 1644 |
| 1619 class ChainContextComp : public TemplateComputation<1> { | 1645 class ChainContextComp : public TemplateComputation<1> { |
| 1620 public: | 1646 public: |
| 1621 explicit ChainContextComp(Value* context_value) { | 1647 explicit ChainContextComp(Value* context_value) { |
| 1622 ASSERT(context_value != NULL); | 1648 ASSERT(context_value != NULL); |
| 1623 inputs_[0] = context_value; | 1649 inputs_[0] = context_value; |
| 1624 } | 1650 } |
| 1625 | 1651 |
| 1626 DECLARE_COMPUTATION(ChainContext) | 1652 DECLARE_COMPUTATION(ChainContext) |
| 1627 | 1653 |
| 1628 Value* context_value() const { return inputs_[0]; } | 1654 Value* context_value() const { return inputs_[0]; } |
| 1629 | 1655 |
| 1630 virtual bool CanDeoptimize() const { return false; } | 1656 virtual bool CanDeoptimize() const { return false; } |
| 1657 virtual intptr_t ResultCid() const { return kIllegalCid; } |
| 1631 | 1658 |
| 1632 private: | 1659 private: |
| 1633 DISALLOW_COPY_AND_ASSIGN(ChainContextComp); | 1660 DISALLOW_COPY_AND_ASSIGN(ChainContextComp); |
| 1634 }; | 1661 }; |
| 1635 | 1662 |
| 1636 | 1663 |
| 1637 class CloneContextComp : public TemplateComputation<1> { | 1664 class CloneContextComp : public TemplateComputation<1> { |
| 1638 public: | 1665 public: |
| 1639 CloneContextComp(intptr_t token_pos, | 1666 CloneContextComp(intptr_t token_pos, |
| 1640 intptr_t try_index, | 1667 intptr_t try_index, |
| 1641 Value* context_value) | 1668 Value* context_value) |
| 1642 : token_pos_(token_pos), | 1669 : token_pos_(token_pos), |
| 1643 try_index_(try_index) { | 1670 try_index_(try_index) { |
| 1644 ASSERT(context_value != NULL); | 1671 ASSERT(context_value != NULL); |
| 1645 inputs_[0] = context_value; | 1672 inputs_[0] = context_value; |
| 1646 } | 1673 } |
| 1647 | 1674 |
| 1648 intptr_t token_pos() const { return token_pos_; } | 1675 intptr_t token_pos() const { return token_pos_; } |
| 1649 intptr_t try_index() const { return try_index_; } | 1676 intptr_t try_index() const { return try_index_; } |
| 1650 Value* context_value() const { return inputs_[0]; } | 1677 Value* context_value() const { return inputs_[0]; } |
| 1651 | 1678 |
| 1652 DECLARE_COMPUTATION(CloneContext) | 1679 DECLARE_COMPUTATION(CloneContext) |
| 1653 | 1680 |
| 1654 virtual bool CanDeoptimize() const { return false; } | 1681 virtual bool CanDeoptimize() const { return false; } |
| 1682 virtual intptr_t ResultCid() const { return kIllegalCid; } |
| 1655 | 1683 |
| 1656 private: | 1684 private: |
| 1657 const intptr_t token_pos_; | 1685 const intptr_t token_pos_; |
| 1658 const intptr_t try_index_; | 1686 const intptr_t try_index_; |
| 1659 | 1687 |
| 1660 DISALLOW_COPY_AND_ASSIGN(CloneContextComp); | 1688 DISALLOW_COPY_AND_ASSIGN(CloneContextComp); |
| 1661 }; | 1689 }; |
| 1662 | 1690 |
| 1663 | 1691 |
| 1664 class CatchEntryComp : public TemplateComputation<0> { | 1692 class CatchEntryComp : public TemplateComputation<0> { |
| 1665 public: | 1693 public: |
| 1666 CatchEntryComp(const LocalVariable& exception_var, | 1694 CatchEntryComp(const LocalVariable& exception_var, |
| 1667 const LocalVariable& stacktrace_var) | 1695 const LocalVariable& stacktrace_var) |
| 1668 : exception_var_(exception_var), stacktrace_var_(stacktrace_var) {} | 1696 : exception_var_(exception_var), stacktrace_var_(stacktrace_var) {} |
| 1669 | 1697 |
| 1670 const LocalVariable& exception_var() const { return exception_var_; } | 1698 const LocalVariable& exception_var() const { return exception_var_; } |
| 1671 const LocalVariable& stacktrace_var() const { return stacktrace_var_; } | 1699 const LocalVariable& stacktrace_var() const { return stacktrace_var_; } |
| 1672 | 1700 |
| 1673 DECLARE_COMPUTATION(CatchEntry) | 1701 DECLARE_COMPUTATION(CatchEntry) |
| 1674 | 1702 |
| 1675 virtual void PrintOperandsTo(BufferFormatter* f) const; | 1703 virtual void PrintOperandsTo(BufferFormatter* f) const; |
| 1676 | 1704 |
| 1677 virtual bool CanDeoptimize() const { return false; } | 1705 virtual bool CanDeoptimize() const { return false; } |
| 1706 virtual intptr_t ResultCid() const { return kIllegalCid; } |
| 1678 | 1707 |
| 1679 private: | 1708 private: |
| 1680 const LocalVariable& exception_var_; | 1709 const LocalVariable& exception_var_; |
| 1681 const LocalVariable& stacktrace_var_; | 1710 const LocalVariable& stacktrace_var_; |
| 1682 | 1711 |
| 1683 DISALLOW_COPY_AND_ASSIGN(CatchEntryComp); | 1712 DISALLOW_COPY_AND_ASSIGN(CatchEntryComp); |
| 1684 }; | 1713 }; |
| 1685 | 1714 |
| 1686 | 1715 |
| 1687 class CheckEitherNonSmiComp : public TemplateComputation<2> { | 1716 class CheckEitherNonSmiComp : public TemplateComputation<2> { |
| 1688 public: | 1717 public: |
| 1689 CheckEitherNonSmiComp(Value* left, | 1718 CheckEitherNonSmiComp(Value* left, |
| 1690 Value* right, | 1719 Value* right, |
| 1691 InstanceCallComp* instance_call) | 1720 InstanceCallComp* instance_call) |
| 1692 : instance_call_(instance_call) { | 1721 : instance_call_(instance_call) { |
| 1693 ASSERT(left != NULL); | 1722 ASSERT(left != NULL); |
| 1694 ASSERT(right != NULL); | 1723 ASSERT(right != NULL); |
| 1695 inputs_[0] = left; | 1724 inputs_[0] = left; |
| 1696 inputs_[1] = right; | 1725 inputs_[1] = right; |
| 1697 } | 1726 } |
| 1698 | 1727 |
| 1699 DECLARE_COMPUTATION(CheckEitherNonSmi) | 1728 DECLARE_COMPUTATION(CheckEitherNonSmi) |
| 1700 | 1729 |
| 1701 virtual bool CanDeoptimize() const { return true; } | 1730 virtual bool CanDeoptimize() const { return true; } |
| 1731 virtual intptr_t ResultCid() const { return kIllegalCid; } |
| 1702 | 1732 |
| 1703 virtual bool HasSideEffect() const { return false; } | 1733 virtual bool HasSideEffect() const { return false; } |
| 1704 | 1734 |
| 1705 Value* left() const { return inputs_[0]; } | 1735 Value* left() const { return inputs_[0]; } |
| 1706 | 1736 |
| 1707 Value* right() const { return inputs_[1]; } | 1737 Value* right() const { return inputs_[1]; } |
| 1708 | 1738 |
| 1709 virtual Definition* TryReplace(BindInstr* instr) const; | 1739 virtual Definition* TryReplace(BindInstr* instr) const; |
| 1710 | 1740 |
| 1711 private: | 1741 private: |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1746 ASSERT(value != NULL); | 1776 ASSERT(value != NULL); |
| 1747 inputs_[0] = value; | 1777 inputs_[0] = value; |
| 1748 } | 1778 } |
| 1749 | 1779 |
| 1750 Value* value() const { return inputs_[0]; } | 1780 Value* value() const { return inputs_[0]; } |
| 1751 InstanceCallComp* instance_call() const { return instance_call_; } | 1781 InstanceCallComp* instance_call() const { return instance_call_; } |
| 1752 | 1782 |
| 1753 virtual bool CanDeoptimize() const { | 1783 virtual bool CanDeoptimize() const { |
| 1754 return value()->ResultCid() != kDoubleCid; | 1784 return value()->ResultCid() != kDoubleCid; |
| 1755 } | 1785 } |
| 1786 // The output is not an instance. |
| 1787 virtual intptr_t ResultCid() const { return kDynamicCid; } |
| 1756 | 1788 |
| 1757 virtual Representation representation() const { | 1789 virtual Representation representation() const { |
| 1758 return kUnboxedDouble; | 1790 return kUnboxedDouble; |
| 1759 } | 1791 } |
| 1760 | 1792 |
| 1761 DECLARE_COMPUTATION(UnboxDouble) | 1793 DECLARE_COMPUTATION(UnboxDouble) |
| 1762 | 1794 |
| 1763 private: | 1795 private: |
| 1764 InstanceCallComp* instance_call_; | 1796 InstanceCallComp* instance_call_; |
| 1765 | 1797 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1780 } | 1812 } |
| 1781 | 1813 |
| 1782 Value* left() const { return inputs_[0]; } | 1814 Value* left() const { return inputs_[0]; } |
| 1783 Value* right() const { return inputs_[1]; } | 1815 Value* right() const { return inputs_[1]; } |
| 1784 | 1816 |
| 1785 Token::Kind op_kind() const { return op_kind_; } | 1817 Token::Kind op_kind() const { return op_kind_; } |
| 1786 | 1818 |
| 1787 virtual void PrintOperandsTo(BufferFormatter* f) const; | 1819 virtual void PrintOperandsTo(BufferFormatter* f) const; |
| 1788 | 1820 |
| 1789 virtual bool CanDeoptimize() const { return false; } | 1821 virtual bool CanDeoptimize() const { return false; } |
| 1822 // The output is not an instance. |
| 1823 virtual intptr_t ResultCid() const { return kDynamicCid; } |
| 1790 | 1824 |
| 1791 virtual Representation representation() const { | 1825 virtual Representation representation() const { |
| 1792 return kUnboxedDouble; | 1826 return kUnboxedDouble; |
| 1793 } | 1827 } |
| 1794 | 1828 |
| 1795 DECLARE_COMPUTATION(UnboxedDoubleBinaryOp) | 1829 DECLARE_COMPUTATION(UnboxedDoubleBinaryOp) |
| 1796 | 1830 |
| 1797 private: | 1831 private: |
| 1798 const Token::Kind op_kind_; | 1832 const Token::Kind op_kind_; |
| 1799 | 1833 |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1940 inputs_[0] = value; | 1974 inputs_[0] = value; |
| 1941 } | 1975 } |
| 1942 | 1976 |
| 1943 Value* value() const { return inputs_[0]; } | 1977 Value* value() const { return inputs_[0]; } |
| 1944 | 1978 |
| 1945 InstanceCallComp* instance_call() const { return instance_call_; } | 1979 InstanceCallComp* instance_call() const { return instance_call_; } |
| 1946 | 1980 |
| 1947 DECLARE_COMPUTATION(NumberNegate) | 1981 DECLARE_COMPUTATION(NumberNegate) |
| 1948 | 1982 |
| 1949 virtual bool CanDeoptimize() const { return true; } | 1983 virtual bool CanDeoptimize() const { return true; } |
| 1984 virtual intptr_t ResultCid() const { return kDoubleCid; } |
| 1950 | 1985 |
| 1951 private: | 1986 private: |
| 1952 InstanceCallComp* instance_call_; | 1987 InstanceCallComp* instance_call_; |
| 1953 | 1988 |
| 1954 DISALLOW_COPY_AND_ASSIGN(NumberNegateComp); | 1989 DISALLOW_COPY_AND_ASSIGN(NumberNegateComp); |
| 1955 }; | 1990 }; |
| 1956 | 1991 |
| 1957 | 1992 |
| 1958 class CheckStackOverflowComp : public TemplateComputation<0> { | 1993 class CheckStackOverflowComp : public TemplateComputation<0> { |
| 1959 public: | 1994 public: |
| 1960 CheckStackOverflowComp(intptr_t token_pos, intptr_t try_index) | 1995 CheckStackOverflowComp(intptr_t token_pos, intptr_t try_index) |
| 1961 : token_pos_(token_pos), | 1996 : token_pos_(token_pos), |
| 1962 try_index_(try_index) {} | 1997 try_index_(try_index) {} |
| 1963 | 1998 |
| 1964 intptr_t token_pos() const { return token_pos_; } | 1999 intptr_t token_pos() const { return token_pos_; } |
| 1965 intptr_t try_index() const { return try_index_; } | 2000 intptr_t try_index() const { return try_index_; } |
| 1966 | 2001 |
| 1967 DECLARE_COMPUTATION(CheckStackOverflow) | 2002 DECLARE_COMPUTATION(CheckStackOverflow) |
| 1968 | 2003 |
| 1969 virtual bool CanDeoptimize() const { return false; } | 2004 virtual bool CanDeoptimize() const { return false; } |
| 2005 virtual intptr_t ResultCid() const { return kIllegalCid; } |
| 1970 | 2006 |
| 1971 private: | 2007 private: |
| 1972 const intptr_t token_pos_; | 2008 const intptr_t token_pos_; |
| 1973 const intptr_t try_index_; | 2009 const intptr_t try_index_; |
| 1974 | 2010 |
| 1975 DISALLOW_COPY_AND_ASSIGN(CheckStackOverflowComp); | 2011 DISALLOW_COPY_AND_ASSIGN(CheckStackOverflowComp); |
| 1976 }; | 2012 }; |
| 1977 | 2013 |
| 1978 | 2014 |
| 1979 class DoubleToDoubleComp : public TemplateComputation<1> { | 2015 class DoubleToDoubleComp : public TemplateComputation<1> { |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2025 public: | 2061 public: |
| 2026 CheckClassComp(Value* value, InstanceCallComp* original) | 2062 CheckClassComp(Value* value, InstanceCallComp* original) |
| 2027 : original_(original) { | 2063 : original_(original) { |
| 2028 ASSERT(value != NULL); | 2064 ASSERT(value != NULL); |
| 2029 inputs_[0] = value; | 2065 inputs_[0] = value; |
| 2030 } | 2066 } |
| 2031 | 2067 |
| 2032 DECLARE_COMPUTATION(CheckClass) | 2068 DECLARE_COMPUTATION(CheckClass) |
| 2033 | 2069 |
| 2034 virtual bool CanDeoptimize() const { return true; } | 2070 virtual bool CanDeoptimize() const { return true; } |
| 2071 virtual intptr_t ResultCid() const { return kIllegalCid; } |
| 2035 | 2072 |
| 2036 virtual bool AttributesEqual(Computation* other) const; | 2073 virtual bool AttributesEqual(Computation* other) const; |
| 2037 | 2074 |
| 2038 virtual bool HasSideEffect() const { return false; } | 2075 virtual bool HasSideEffect() const { return false; } |
| 2039 | 2076 |
| 2040 Value* value() const { return inputs_[0]; } | 2077 Value* value() const { return inputs_[0]; } |
| 2041 | 2078 |
| 2042 intptr_t deopt_id() const { return original_->deopt_id(); } | 2079 intptr_t deopt_id() const { return original_->deopt_id(); } |
| 2043 intptr_t try_index() const { return original_->try_index(); } | 2080 intptr_t try_index() const { return original_->try_index(); } |
| 2044 | 2081 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2055 public: | 2092 public: |
| 2056 CheckSmiComp(Value* value, InstanceCallComp* original) | 2093 CheckSmiComp(Value* value, InstanceCallComp* original) |
| 2057 : original_(original) { | 2094 : original_(original) { |
| 2058 ASSERT(value != NULL); | 2095 ASSERT(value != NULL); |
| 2059 inputs_[0] = value; | 2096 inputs_[0] = value; |
| 2060 } | 2097 } |
| 2061 | 2098 |
| 2062 DECLARE_COMPUTATION(CheckSmi) | 2099 DECLARE_COMPUTATION(CheckSmi) |
| 2063 | 2100 |
| 2064 virtual bool CanDeoptimize() const { return true; } | 2101 virtual bool CanDeoptimize() const { return true; } |
| 2102 virtual intptr_t ResultCid() const { return kIllegalCid; } |
| 2065 | 2103 |
| 2066 virtual bool AttributesEqual(Computation* other) const { return true; } | 2104 virtual bool AttributesEqual(Computation* other) const { return true; } |
| 2067 | 2105 |
| 2068 virtual bool HasSideEffect() const { return false; } | 2106 virtual bool HasSideEffect() const { return false; } |
| 2069 | 2107 |
| 2070 virtual Definition* TryReplace(BindInstr* instr) const; | 2108 virtual Definition* TryReplace(BindInstr* instr) const; |
| 2071 | 2109 |
| 2072 Value* value() const { return inputs_[0]; } | 2110 Value* value() const { return inputs_[0]; } |
| 2073 | 2111 |
| 2074 intptr_t deopt_id() const { return original_->deopt_id(); } | 2112 intptr_t deopt_id() const { return original_->deopt_id(); } |
| (...skipping 1210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3285 ForwardInstructionIterator* current_iterator_; | 3323 ForwardInstructionIterator* current_iterator_; |
| 3286 | 3324 |
| 3287 private: | 3325 private: |
| 3288 DISALLOW_COPY_AND_ASSIGN(FlowGraphVisitor); | 3326 DISALLOW_COPY_AND_ASSIGN(FlowGraphVisitor); |
| 3289 }; | 3327 }; |
| 3290 | 3328 |
| 3291 | 3329 |
| 3292 } // namespace dart | 3330 } // namespace dart |
| 3293 | 3331 |
| 3294 #endif // VM_INTERMEDIATE_LANGUAGE_H_ | 3332 #endif // VM_INTERMEDIATE_LANGUAGE_H_ |
| OLD | NEW |