| 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 611 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 622 class EqualityCompareComp : public ComparisonComp { | 622 class EqualityCompareComp : public ComparisonComp { |
| 623 public: | 623 public: |
| 624 EqualityCompareComp(intptr_t token_pos, | 624 EqualityCompareComp(intptr_t token_pos, |
| 625 intptr_t try_index, | 625 intptr_t try_index, |
| 626 Token::Kind kind, | 626 Token::Kind kind, |
| 627 Value* left, | 627 Value* left, |
| 628 Value* right) | 628 Value* right) |
| 629 : ComparisonComp(kind, left, right), | 629 : ComparisonComp(kind, left, right), |
| 630 token_pos_(token_pos), | 630 token_pos_(token_pos), |
| 631 try_index_(try_index), | 631 try_index_(try_index), |
| 632 receiver_class_id_(kObject) { | 632 receiver_class_id_(kObjectCid) { |
| 633 ASSERT((kind == Token::kEQ) || (kind == Token::kNE)); | 633 ASSERT((kind == Token::kEQ) || (kind == Token::kNE)); |
| 634 } | 634 } |
| 635 | 635 |
| 636 DECLARE_COMPUTATION(EqualityCompare) | 636 DECLARE_COMPUTATION(EqualityCompare) |
| 637 | 637 |
| 638 intptr_t token_pos() const { return token_pos_; } | 638 intptr_t token_pos() const { return token_pos_; } |
| 639 intptr_t try_index() const { return try_index_; } | 639 intptr_t try_index() const { return try_index_; } |
| 640 | 640 |
| 641 void set_receiver_class_id(intptr_t value) { receiver_class_id_ = value; } | 641 void set_receiver_class_id(intptr_t value) { receiver_class_id_ = value; } |
| 642 intptr_t receiver_class_id() const { return receiver_class_id_; } | 642 intptr_t receiver_class_id() const { return receiver_class_id_; } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 656 class RelationalOpComp : public ComparisonComp { | 656 class RelationalOpComp : public ComparisonComp { |
| 657 public: | 657 public: |
| 658 RelationalOpComp(intptr_t token_pos, | 658 RelationalOpComp(intptr_t token_pos, |
| 659 intptr_t try_index, | 659 intptr_t try_index, |
| 660 Token::Kind kind, | 660 Token::Kind kind, |
| 661 Value* left, | 661 Value* left, |
| 662 Value* right) | 662 Value* right) |
| 663 : ComparisonComp(kind, left, right), | 663 : ComparisonComp(kind, left, right), |
| 664 token_pos_(token_pos), | 664 token_pos_(token_pos), |
| 665 try_index_(try_index), | 665 try_index_(try_index), |
| 666 operands_class_id_(kObject) { | 666 operands_class_id_(kObjectCid) { |
| 667 ASSERT(Token::IsRelationalOperator(kind)); | 667 ASSERT(Token::IsRelationalOperator(kind)); |
| 668 } | 668 } |
| 669 | 669 |
| 670 DECLARE_COMPUTATION(RelationalOp) | 670 DECLARE_COMPUTATION(RelationalOp) |
| 671 | 671 |
| 672 intptr_t token_pos() const { return token_pos_; } | 672 intptr_t token_pos() const { return token_pos_; } |
| 673 intptr_t try_index() const { return try_index_; } | 673 intptr_t try_index() const { return try_index_; } |
| 674 | 674 |
| 675 // TODO(srdjan): instead of class-id pass an enum that can differentiate | 675 // TODO(srdjan): instead of class-id pass an enum that can differentiate |
| 676 // between boxed and unboxed doubles and integers. | 676 // between boxed and unboxed doubles and integers. |
| (...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 943 | 943 |
| 944 | 944 |
| 945 class LoadIndexedComp : public TemplateComputation<2> { | 945 class LoadIndexedComp : public TemplateComputation<2> { |
| 946 public: | 946 public: |
| 947 LoadIndexedComp(intptr_t token_pos, | 947 LoadIndexedComp(intptr_t token_pos, |
| 948 intptr_t try_index, | 948 intptr_t try_index, |
| 949 Value* array, | 949 Value* array, |
| 950 Value* index) | 950 Value* index) |
| 951 : token_pos_(token_pos), | 951 : token_pos_(token_pos), |
| 952 try_index_(try_index), | 952 try_index_(try_index), |
| 953 receiver_type_(kIllegalObjectKind) { | 953 receiver_type_(kIllegalCid) { |
| 954 ASSERT(array != NULL); | 954 ASSERT(array != NULL); |
| 955 ASSERT(index != NULL); | 955 ASSERT(index != NULL); |
| 956 inputs_[0] = array; | 956 inputs_[0] = array; |
| 957 inputs_[1] = index; | 957 inputs_[1] = index; |
| 958 } | 958 } |
| 959 | 959 |
| 960 DECLARE_COMPUTATION(LoadIndexed) | 960 DECLARE_COMPUTATION(LoadIndexed) |
| 961 | 961 |
| 962 intptr_t token_pos() const { return token_pos_; } | 962 intptr_t token_pos() const { return token_pos_; } |
| 963 intptr_t try_index() const { return try_index_; } | 963 intptr_t try_index() const { return try_index_; } |
| 964 Value* array() const { return inputs_[0]; } | 964 Value* array() const { return inputs_[0]; } |
| 965 Value* index() const { return inputs_[1]; } | 965 Value* index() const { return inputs_[1]; } |
| 966 | 966 |
| 967 void set_receiver_type(ObjectKind receiver_type) { | 967 void set_receiver_type(intptr_t receiver_type) { |
| 968 receiver_type_ = receiver_type; | 968 receiver_type_ = receiver_type; |
| 969 } | 969 } |
| 970 | 970 |
| 971 ObjectKind receiver_type() const { | 971 intptr_t receiver_type() const { |
| 972 return receiver_type_; | 972 return receiver_type_; |
| 973 } | 973 } |
| 974 | 974 |
| 975 virtual bool CanDeoptimize() const { return true; } | 975 virtual bool CanDeoptimize() const { return true; } |
| 976 | 976 |
| 977 private: | 977 private: |
| 978 const intptr_t token_pos_; | 978 const intptr_t token_pos_; |
| 979 const intptr_t try_index_; | 979 const intptr_t try_index_; |
| 980 ObjectKind receiver_type_; | 980 intptr_t receiver_type_; |
| 981 | 981 |
| 982 DISALLOW_COPY_AND_ASSIGN(LoadIndexedComp); | 982 DISALLOW_COPY_AND_ASSIGN(LoadIndexedComp); |
| 983 }; | 983 }; |
| 984 | 984 |
| 985 | 985 |
| 986 // Not simply an InstanceCall because it has somewhat more complicated | 986 // Not simply an InstanceCall because it has somewhat more complicated |
| 987 // semantics: the value operand is preserved before the call. | 987 // semantics: the value operand is preserved before the call. |
| 988 class StoreIndexedComp : public TemplateComputation<3> { | 988 class StoreIndexedComp : public TemplateComputation<3> { |
| 989 public: | 989 public: |
| 990 StoreIndexedComp(intptr_t token_pos, | 990 StoreIndexedComp(intptr_t token_pos, |
| 991 intptr_t try_index, | 991 intptr_t try_index, |
| 992 Value* array, | 992 Value* array, |
| 993 Value* index, | 993 Value* index, |
| 994 Value* value) | 994 Value* value) |
| 995 : token_pos_(token_pos), | 995 : token_pos_(token_pos), |
| 996 try_index_(try_index), | 996 try_index_(try_index), |
| 997 receiver_type_(kIllegalObjectKind) { | 997 receiver_type_(kIllegalCid) { |
| 998 inputs_[0] = array; | 998 inputs_[0] = array; |
| 999 inputs_[1] = index; | 999 inputs_[1] = index; |
| 1000 inputs_[2] = value; | 1000 inputs_[2] = value; |
| 1001 } | 1001 } |
| 1002 | 1002 |
| 1003 DECLARE_COMPUTATION(StoreIndexed) | 1003 DECLARE_COMPUTATION(StoreIndexed) |
| 1004 | 1004 |
| 1005 intptr_t token_pos() const { return token_pos_; } | 1005 intptr_t token_pos() const { return token_pos_; } |
| 1006 intptr_t try_index() const { return try_index_; } | 1006 intptr_t try_index() const { return try_index_; } |
| 1007 Value* array() const { return inputs_[0]; } | 1007 Value* array() const { return inputs_[0]; } |
| 1008 Value* index() const { return inputs_[1]; } | 1008 Value* index() const { return inputs_[1]; } |
| 1009 Value* value() const { return inputs_[2]; } | 1009 Value* value() const { return inputs_[2]; } |
| 1010 | 1010 |
| 1011 void set_receiver_type(ObjectKind receiver_type) { | 1011 void set_receiver_type(intptr_t receiver_type) { |
| 1012 receiver_type_ = receiver_type; | 1012 receiver_type_ = receiver_type; |
| 1013 } | 1013 } |
| 1014 | 1014 |
| 1015 ObjectKind receiver_type() const { | 1015 intptr_t receiver_type() const { |
| 1016 return receiver_type_; | 1016 return receiver_type_; |
| 1017 } | 1017 } |
| 1018 | 1018 |
| 1019 virtual bool CanDeoptimize() const { return true; } | 1019 virtual bool CanDeoptimize() const { return true; } |
| 1020 | 1020 |
| 1021 private: | 1021 private: |
| 1022 const intptr_t token_pos_; | 1022 const intptr_t token_pos_; |
| 1023 const intptr_t try_index_; | 1023 const intptr_t try_index_; |
| 1024 ObjectKind receiver_type_; | 1024 intptr_t receiver_type_; |
| 1025 | 1025 |
| 1026 DISALLOW_COPY_AND_ASSIGN(StoreIndexedComp); | 1026 DISALLOW_COPY_AND_ASSIGN(StoreIndexedComp); |
| 1027 }; | 1027 }; |
| 1028 | 1028 |
| 1029 | 1029 |
| 1030 // Note overrideable, built-in: value? false : true. | 1030 // Note overrideable, built-in: value? false : true. |
| 1031 class BooleanNegateComp : public TemplateComputation<1> { | 1031 class BooleanNegateComp : public TemplateComputation<1> { |
| 1032 public: | 1032 public: |
| 1033 explicit BooleanNegateComp(Value* value) { | 1033 explicit BooleanNegateComp(Value* value) { |
| 1034 inputs_[0] = value; | 1034 inputs_[0] = value; |
| (...skipping 608 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1643 const intptr_t token_pos_; | 1643 const intptr_t token_pos_; |
| 1644 const intptr_t try_index_; | 1644 const intptr_t try_index_; |
| 1645 | 1645 |
| 1646 DISALLOW_COPY_AND_ASSIGN(CheckStackOverflowComp); | 1646 DISALLOW_COPY_AND_ASSIGN(CheckStackOverflowComp); |
| 1647 }; | 1647 }; |
| 1648 | 1648 |
| 1649 | 1649 |
| 1650 class ToDoubleComp : public TemplateComputation<1> { | 1650 class ToDoubleComp : public TemplateComputation<1> { |
| 1651 public: | 1651 public: |
| 1652 ToDoubleComp(Value* value, | 1652 ToDoubleComp(Value* value, |
| 1653 ObjectKind from, | 1653 intptr_t from, |
| 1654 InstanceCallComp* instance_call) | 1654 InstanceCallComp* instance_call) |
| 1655 : from_(from), instance_call_(instance_call) { | 1655 : from_(from), instance_call_(instance_call) { |
| 1656 ASSERT(value != NULL); | 1656 ASSERT(value != NULL); |
| 1657 inputs_[0] = value; | 1657 inputs_[0] = value; |
| 1658 } | 1658 } |
| 1659 | 1659 |
| 1660 Value* value() const { return inputs_[0]; } | 1660 Value* value() const { return inputs_[0]; } |
| 1661 ObjectKind from() const { return from_; } | 1661 intptr_t from() const { return from_; } |
| 1662 | 1662 |
| 1663 InstanceCallComp* instance_call() const { return instance_call_; } | 1663 InstanceCallComp* instance_call() const { return instance_call_; } |
| 1664 | 1664 |
| 1665 virtual void PrintOperandsTo(BufferFormatter* f) const; | 1665 virtual void PrintOperandsTo(BufferFormatter* f) const; |
| 1666 | 1666 |
| 1667 DECLARE_COMPUTATION(ToDouble) | 1667 DECLARE_COMPUTATION(ToDouble) |
| 1668 | 1668 |
| 1669 virtual bool CanDeoptimize() const { return true; } | 1669 virtual bool CanDeoptimize() const { return true; } |
| 1670 | 1670 |
| 1671 private: | 1671 private: |
| 1672 const ObjectKind from_; | 1672 const intptr_t from_; |
| 1673 InstanceCallComp* instance_call_; | 1673 InstanceCallComp* instance_call_; |
| 1674 | 1674 |
| 1675 DISALLOW_COPY_AND_ASSIGN(ToDoubleComp); | 1675 DISALLOW_COPY_AND_ASSIGN(ToDoubleComp); |
| 1676 }; | 1676 }; |
| 1677 | 1677 |
| 1678 | 1678 |
| 1679 #undef DECLARE_COMPUTATION | 1679 #undef DECLARE_COMPUTATION |
| 1680 | 1680 |
| 1681 | 1681 |
| 1682 // Implementation of type testers and cast functins. | 1682 // Implementation of type testers and cast functins. |
| (...skipping 1082 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2765 const GrowableArray<BlockEntryInstr*>& block_order_; | 2765 const GrowableArray<BlockEntryInstr*>& block_order_; |
| 2766 | 2766 |
| 2767 private: | 2767 private: |
| 2768 DISALLOW_COPY_AND_ASSIGN(FlowGraphVisitor); | 2768 DISALLOW_COPY_AND_ASSIGN(FlowGraphVisitor); |
| 2769 }; | 2769 }; |
| 2770 | 2770 |
| 2771 | 2771 |
| 2772 } // namespace dart | 2772 } // namespace dart |
| 2773 | 2773 |
| 2774 #endif // VM_INTERMEDIATE_LANGUAGE_H_ | 2774 #endif // VM_INTERMEDIATE_LANGUAGE_H_ |
| OLD | NEW |