OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 643 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
654 M(CheckSmi) \ | 654 M(CheckSmi) \ |
655 M(Constant) \ | 655 M(Constant) \ |
656 M(CheckEitherNonSmi) \ | 656 M(CheckEitherNonSmi) \ |
657 M(BinaryDoubleOp) \ | 657 M(BinaryDoubleOp) \ |
658 M(MathUnary) \ | 658 M(MathUnary) \ |
659 M(MathMinMax) \ | 659 M(MathMinMax) \ |
660 M(UnboxDouble) \ | 660 M(UnboxDouble) \ |
661 M(BoxDouble) \ | 661 M(BoxDouble) \ |
662 M(BoxFloat32x4) \ | 662 M(BoxFloat32x4) \ |
663 M(UnboxFloat32x4) \ | 663 M(UnboxFloat32x4) \ |
664 M(BoxInt32x4) \ | 664 M(BoxInt32x4) \ |
665 M(UnboxInt32x4) \ | 665 M(UnboxInt32x4) \ |
666 M(UnboxInteger) \ | 666 M(UnboxInteger) \ |
667 M(BoxInteger) \ | 667 M(BoxInteger) \ |
668 M(BinaryMintOp) \ | 668 M(BinaryMintOp) \ |
669 M(ShiftMintOp) \ | 669 M(ShiftMintOp) \ |
670 M(UnaryMintOp) \ | 670 M(UnaryMintOp) \ |
671 M(CheckArrayBound) \ | 671 M(CheckArrayBound) \ |
672 M(Constraint) \ | 672 M(Constraint) \ |
673 M(StringFromCharCode) \ | 673 M(StringFromCharCode) \ |
674 M(StringInterpolate) \ | 674 M(StringInterpolate) \ |
675 M(InvokeMathCFunction) \ | 675 M(InvokeMathCFunction) \ |
676 M(GuardField) \ | 676 M(GuardField) \ |
677 M(IfThenElse) \ | 677 M(IfThenElse) \ |
678 M(BinaryFloat32x4Op) \ | 678 M(BinaryFloat32x4Op) \ |
679 M(Simd32x4Shuffle) \ | 679 M(Simd32x4Shuffle) \ |
680 M(Simd32x4ShuffleMix) \ | 680 M(Simd32x4ShuffleMix) \ |
681 M(Simd32x4GetSignMask) \ | 681 M(Simd32x4GetSignMask) \ |
682 M(Float32x4Constructor) \ | 682 M(Float32x4Constructor) \ |
683 M(Float32x4Zero) \ | 683 M(Float32x4Zero) \ |
684 M(Float32x4Splat) \ | 684 M(Float32x4Splat) \ |
685 M(Float32x4Comparison) \ | 685 M(Float32x4Comparison) \ |
686 M(Float32x4MinMax) \ | 686 M(Float32x4MinMax) \ |
687 M(Float32x4Scale) \ | 687 M(Float32x4Scale) \ |
688 M(Float32x4Sqrt) \ | 688 M(Float32x4Sqrt) \ |
689 M(Float32x4ZeroArg) \ | 689 M(Float32x4ZeroArg) \ |
690 M(Float32x4Clamp) \ | 690 M(Float32x4Clamp) \ |
691 M(Float32x4With) \ | 691 M(Float32x4With) \ |
692 M(Float32x4ToInt32x4) \ | 692 M(Float32x4ToInt32x4) \ |
693 M(MaterializeObject) \ | 693 M(MaterializeObject) \ |
694 M(Int32x4BoolConstructor) \ | 694 M(Int32x4BoolConstructor) \ |
695 M(Int32x4GetFlag) \ | 695 M(Int32x4GetFlag) \ |
696 M(Int32x4Select) \ | 696 M(Int32x4Select) \ |
697 M(Int32x4SetFlag) \ | 697 M(Int32x4SetFlag) \ |
698 M(Int32x4ToFloat32x4) \ | 698 M(Int32x4ToFloat32x4) \ |
699 M(BinaryInt32x4Op) \ | 699 M(BinaryInt32x4Op) \ |
| 700 M(TestSmi) \ |
700 | 701 |
701 | 702 |
702 #define FORWARD_DECLARATION(type) class type##Instr; | 703 #define FORWARD_DECLARATION(type) class type##Instr; |
703 FOR_EACH_INSTRUCTION(FORWARD_DECLARATION) | 704 FOR_EACH_INSTRUCTION(FORWARD_DECLARATION) |
704 #undef FORWARD_DECLARATION | 705 #undef FORWARD_DECLARATION |
705 | 706 |
706 | 707 |
707 // Functions required in all concrete instruction classes. | 708 // Functions required in all concrete instruction classes. |
708 #define DECLARE_INSTRUCTION(type) \ | 709 #define DECLARE_INSTRUCTION(type) \ |
709 virtual Tag tag() const { return k##type; } \ | 710 virtual Tag tag() const { return k##type; } \ |
(...skipping 2268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2978 | 2979 |
2979 private: | 2980 private: |
2980 // True if the comparison must check for double, Mint or Bigint and | 2981 // True if the comparison must check for double, Mint or Bigint and |
2981 // use value comparison instead. | 2982 // use value comparison instead. |
2982 bool needs_number_check_; | 2983 bool needs_number_check_; |
2983 | 2984 |
2984 DISALLOW_COPY_AND_ASSIGN(StrictCompareInstr); | 2985 DISALLOW_COPY_AND_ASSIGN(StrictCompareInstr); |
2985 }; | 2986 }; |
2986 | 2987 |
2987 | 2988 |
| 2989 // Comparison instruction that is equivalent to the (left & right) == 0 |
| 2990 // comparison pattern. |
| 2991 class TestSmiInstr : public ComparisonInstr { |
| 2992 public: |
| 2993 TestSmiInstr(intptr_t token_pos, Token::Kind kind, Value* left, Value* right) |
| 2994 : ComparisonInstr(token_pos, kind, left, right) { |
| 2995 ASSERT(kind == Token::kEQ || kind == Token::kNE); |
| 2996 } |
| 2997 |
| 2998 DECLARE_INSTRUCTION(TestSmi); |
| 2999 virtual CompileType ComputeType() const; |
| 3000 |
| 3001 virtual bool CanDeoptimize() const { return false; } |
| 3002 |
| 3003 virtual bool CanBecomeDeoptimizationTarget() const { |
| 3004 // TestSmi can be merged into Branch and thus needs an environment. |
| 3005 return true; |
| 3006 } |
| 3007 |
| 3008 virtual intptr_t DeoptimizationTarget() const { |
| 3009 return GetDeoptId(); |
| 3010 } |
| 3011 |
| 3012 virtual Representation RequiredInputRepresentation(intptr_t idx) const { |
| 3013 return kTagged; |
| 3014 } |
| 3015 |
| 3016 virtual EffectSet Effects() const { return EffectSet::None(); } |
| 3017 |
| 3018 virtual bool MayThrow() const { return false; } |
| 3019 |
| 3020 virtual void EmitBranchCode(FlowGraphCompiler* compiler, |
| 3021 BranchInstr* branch); |
| 3022 |
| 3023 private: |
| 3024 DISALLOW_COPY_AND_ASSIGN(TestSmiInstr); |
| 3025 }; |
| 3026 |
| 3027 |
2988 class EqualityCompareInstr : public ComparisonInstr { | 3028 class EqualityCompareInstr : public ComparisonInstr { |
2989 public: | 3029 public: |
2990 EqualityCompareInstr(intptr_t token_pos, | 3030 EqualityCompareInstr(intptr_t token_pos, |
2991 Token::Kind kind, | 3031 Token::Kind kind, |
2992 Value* left, | 3032 Value* left, |
2993 Value* right, | 3033 Value* right, |
2994 intptr_t cid, | 3034 intptr_t cid, |
2995 intptr_t deopt_id) | 3035 intptr_t deopt_id) |
2996 : ComparisonInstr(token_pos, kind, left, right) { | 3036 : ComparisonInstr(token_pos, kind, left, right) { |
2997 ASSERT(Token::IsEqualityOperator(kind)); | 3037 ASSERT(Token::IsEqualityOperator(kind)); |
2998 set_operation_cid(cid); | 3038 set_operation_cid(cid); |
2999 deopt_id_ = deopt_id; // Override generated deopt-id. | 3039 deopt_id_ = deopt_id; // Override generated deopt-id. |
3000 } | 3040 } |
3001 | 3041 |
3002 DECLARE_INSTRUCTION(EqualityCompare) | 3042 DECLARE_INSTRUCTION(EqualityCompare) |
3003 virtual CompileType ComputeType() const; | 3043 virtual CompileType ComputeType() const; |
3004 virtual bool RecomputeType(); | |
3005 | 3044 |
3006 virtual void PrintOperandsTo(BufferFormatter* f) const; | 3045 virtual void PrintOperandsTo(BufferFormatter* f) const; |
3007 | 3046 |
3008 virtual bool CanDeoptimize() const { return false; } | 3047 virtual bool CanDeoptimize() const { return false; } |
3009 | 3048 |
3010 virtual bool CanBecomeDeoptimizationTarget() const { | 3049 virtual bool CanBecomeDeoptimizationTarget() const { |
3011 // EqualityCompare can be merged into Branch and thus needs an environment. | 3050 // EqualityCompare can be merged into Branch and thus needs an environment. |
3012 return true; | 3051 return true; |
3013 } | 3052 } |
3014 | 3053 |
(...skipping 29 matching lines...) Expand all Loading... |
3044 intptr_t cid, | 3083 intptr_t cid, |
3045 intptr_t deopt_id) | 3084 intptr_t deopt_id) |
3046 : ComparisonInstr(token_pos, kind, left, right) { | 3085 : ComparisonInstr(token_pos, kind, left, right) { |
3047 ASSERT(Token::IsRelationalOperator(kind)); | 3086 ASSERT(Token::IsRelationalOperator(kind)); |
3048 set_operation_cid(cid); | 3087 set_operation_cid(cid); |
3049 deopt_id_ = deopt_id; // Override generated deopt-id. | 3088 deopt_id_ = deopt_id; // Override generated deopt-id. |
3050 } | 3089 } |
3051 | 3090 |
3052 DECLARE_INSTRUCTION(RelationalOp) | 3091 DECLARE_INSTRUCTION(RelationalOp) |
3053 virtual CompileType ComputeType() const; | 3092 virtual CompileType ComputeType() const; |
3054 virtual bool RecomputeType(); | |
3055 | 3093 |
3056 virtual void PrintOperandsTo(BufferFormatter* f) const; | 3094 virtual void PrintOperandsTo(BufferFormatter* f) const; |
3057 | 3095 |
3058 virtual bool CanDeoptimize() const { return false; } | 3096 virtual bool CanDeoptimize() const { return false; } |
3059 | 3097 |
3060 virtual bool CanBecomeDeoptimizationTarget() const { | 3098 virtual bool CanBecomeDeoptimizationTarget() const { |
3061 // RelationalOp can be merged into Branch and thus needs an environment. | 3099 // RelationalOp can be merged into Branch and thus needs an environment. |
3062 return true; | 3100 return true; |
3063 } | 3101 } |
3064 | 3102 |
(...skipping 3836 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6901 ForwardInstructionIterator* current_iterator_; | 6939 ForwardInstructionIterator* current_iterator_; |
6902 | 6940 |
6903 private: | 6941 private: |
6904 DISALLOW_COPY_AND_ASSIGN(FlowGraphVisitor); | 6942 DISALLOW_COPY_AND_ASSIGN(FlowGraphVisitor); |
6905 }; | 6943 }; |
6906 | 6944 |
6907 | 6945 |
6908 } // namespace dart | 6946 } // namespace dart |
6909 | 6947 |
6910 #endif // VM_INTERMEDIATE_LANGUAGE_H_ | 6948 #endif // VM_INTERMEDIATE_LANGUAGE_H_ |
OLD | NEW |