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 RUNTIME_VM_INTERMEDIATE_LANGUAGE_H_ | 5 #ifndef RUNTIME_VM_INTERMEDIATE_LANGUAGE_H_ |
6 #define RUNTIME_VM_INTERMEDIATE_LANGUAGE_H_ | 6 #define RUNTIME_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 518 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
529 #define DECLARE_INSTRUCTION_BACKEND() \ | 529 #define DECLARE_INSTRUCTION_BACKEND() \ |
530 virtual LocationSummary* MakeLocationSummary(Zone* zone, bool optimizing) \ | 530 virtual LocationSummary* MakeLocationSummary(Zone* zone, bool optimizing) \ |
531 const; \ | 531 const; \ |
532 virtual void EmitNativeCode(FlowGraphCompiler* compiler); | 532 virtual void EmitNativeCode(FlowGraphCompiler* compiler); |
533 | 533 |
534 // Functions required in all concrete instruction classes. | 534 // Functions required in all concrete instruction classes. |
535 #define DECLARE_INSTRUCTION(type) \ | 535 #define DECLARE_INSTRUCTION(type) \ |
536 DECLARE_INSTRUCTION_NO_BACKEND(type) \ | 536 DECLARE_INSTRUCTION_NO_BACKEND(type) \ |
537 DECLARE_INSTRUCTION_BACKEND() | 537 DECLARE_INSTRUCTION_BACKEND() |
538 | 538 |
539 #if defined(TARGET_ARCH_DBC) | |
540 #define DECLARE_COMPARISON_METHODS \ | |
541 virtual LocationSummary* MakeLocationSummary(Zone* zone, bool optimizing) \ | |
542 const; \ | |
543 virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler, \ | |
544 BranchLabels labels); \ | |
545 virtual Condition GetPredictedCondition(FlowGraphCompiler* compiler, \ | |
546 BranchLabels labels); | |
547 #else | |
548 #define DECLARE_COMPARISON_METHODS \ | |
549 virtual LocationSummary* MakeLocationSummary(Zone* zone, bool optimizing) \ | |
550 const; \ | |
551 virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler, \ | |
552 BranchLabels labels); | |
553 #endif | |
554 | |
555 #define DECLARE_COMPARISON_INSTRUCTION(type) \ | |
556 DECLARE_INSTRUCTION_NO_BACKEND(type) \ | |
557 DECLARE_COMPARISON_METHODS | |
558 | |
539 #ifndef PRODUCT | 559 #ifndef PRODUCT |
540 #define PRINT_TO_SUPPORT virtual void PrintTo(BufferFormatter* f) const; | 560 #define PRINT_TO_SUPPORT virtual void PrintTo(BufferFormatter* f) const; |
541 #else | 561 #else |
542 #define PRINT_TO_SUPPORT | 562 #define PRINT_TO_SUPPORT |
543 #endif // !PRODUCT | 563 #endif // !PRODUCT |
544 | 564 |
545 #ifndef PRODUCT | 565 #ifndef PRODUCT |
546 #define PRINT_OPERANDS_TO_SUPPORT \ | 566 #define PRINT_OPERANDS_TO_SUPPORT \ |
547 virtual void PrintOperandsTo(BufferFormatter* f) const; | 567 virtual void PrintOperandsTo(BufferFormatter* f) const; |
548 #else | 568 #else |
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
959 Instruction* previous_; | 979 Instruction* previous_; |
960 Instruction* next_; | 980 Instruction* next_; |
961 Environment* env_; | 981 Environment* env_; |
962 LocationSummary* locs_; | 982 LocationSummary* locs_; |
963 intptr_t inlining_id_; | 983 intptr_t inlining_id_; |
964 | 984 |
965 DISALLOW_COPY_AND_ASSIGN(Instruction); | 985 DISALLOW_COPY_AND_ASSIGN(Instruction); |
966 }; | 986 }; |
967 | 987 |
968 | 988 |
989 struct BranchLabels { | |
990 Label* true_label; | |
991 Label* false_label; | |
992 Label* fall_through; | |
993 }; | |
994 | |
995 | |
969 class PureInstruction : public Instruction { | 996 class PureInstruction : public Instruction { |
970 public: | 997 public: |
971 explicit PureInstruction(intptr_t deopt_id) : Instruction(deopt_id) {} | 998 explicit PureInstruction(intptr_t deopt_id) : Instruction(deopt_id) {} |
972 | 999 |
973 virtual bool AllowsCSE() const { return true; } | 1000 virtual bool AllowsCSE() const { return true; } |
974 virtual EffectSet Dependencies() const { return EffectSet::None(); } | 1001 virtual EffectSet Dependencies() const { return EffectSet::None(); } |
975 | 1002 |
976 virtual EffectSet Effects() const { return EffectSet::None(); } | 1003 virtual EffectSet Effects() const { return EffectSet::None(); } |
977 }; | 1004 }; |
978 | 1005 |
(...skipping 934 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1913 EmbeddedArray<Value*, N> inputs_; | 1940 EmbeddedArray<Value*, N> inputs_; |
1914 | 1941 |
1915 private: | 1942 private: |
1916 friend class BranchInstr; | 1943 friend class BranchInstr; |
1917 friend class IfThenElseInstr; | 1944 friend class IfThenElseInstr; |
1918 | 1945 |
1919 virtual void RawSetInputAt(intptr_t i, Value* value) { inputs_[i] = value; } | 1946 virtual void RawSetInputAt(intptr_t i, Value* value) { inputs_[i] = value; } |
1920 }; | 1947 }; |
1921 | 1948 |
1922 | 1949 |
1923 struct BranchLabels { | |
1924 Label* true_label; | |
1925 Label* false_label; | |
1926 Label* fall_through; | |
1927 }; | |
1928 | |
1929 | |
1930 class InductionVariableInfo; | 1950 class InductionVariableInfo; |
1931 | 1951 |
1932 | 1952 |
1933 class PhiInstr : public Definition { | 1953 class PhiInstr : public Definition { |
1934 public: | 1954 public: |
1935 PhiInstr(JoinEntryInstr* block, intptr_t num_inputs) | 1955 PhiInstr(JoinEntryInstr* block, intptr_t num_inputs) |
1936 : block_(block), | 1956 : block_(block), |
1937 inputs_(num_inputs), | 1957 inputs_(num_inputs), |
1938 representation_(kTagged), | 1958 representation_(kTagged), |
1939 reaching_defs_(NULL), | 1959 reaching_defs_(NULL), |
(...skipping 473 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2413 : CSETrait<ComparisonInstr, PureComparison>::Base(token_pos, | 2433 : CSETrait<ComparisonInstr, PureComparison>::Base(token_pos, |
2414 kind, | 2434 kind, |
2415 deopt_id), | 2435 deopt_id), |
2416 inputs_() {} | 2436 inputs_() {} |
2417 | 2437 |
2418 virtual intptr_t InputCount() const { return N; } | 2438 virtual intptr_t InputCount() const { return N; } |
2419 virtual Value* InputAt(intptr_t i) const { return inputs_[i]; } | 2439 virtual Value* InputAt(intptr_t i) const { return inputs_[i]; } |
2420 | 2440 |
2421 virtual bool MayThrow() const { return ThrowsTrait::kCanThrow; } | 2441 virtual bool MayThrow() const { return ThrowsTrait::kCanThrow; } |
2422 | 2442 |
2443 virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch); | |
Vyacheslav Egorov (Google)
2017/06/15 11:32:46
I think all of these methods should simply go into
Vyacheslav Egorov (Google)
2017/06/15 11:32:46
Also comment what this does.
erikcorry
2017/06/19 07:15:09
I was sure there was some reason that would not wo
erikcorry
2017/06/19 07:15:09
Done.
| |
2444 | |
2445 // Used by EmitBranchCode and EmitNativeCode depending on whether the boolean | |
2446 // is to be turned into branches or instantiated. | |
2447 // May return a valid condition in which case the caller is expected to emit | |
2448 // a branch based on that condition. May also branch directly to the labels. | |
Vyacheslav Egorov (Google)
2017/06/15 11:32:46
"emit a branch based on that condition" <- specify
erikcorry
2017/06/19 07:15:09
Done.
| |
2449 virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler, | |
2450 BranchLabels labels) = 0; | |
2451 | |
2452 #if defined(TARGET_ARCH_DBC) | |
2453 virtual Condition GetPredictedCondition(FlowGraphCompiler* compiler, | |
Vyacheslav Egorov (Google)
2017/06/15 11:32:46
Comment what this does.
erikcorry
2017/06/19 07:15:09
Done.
| |
2454 BranchLabels labels) = 0; | |
2455 #endif | |
2456 | |
2457 virtual void EmitNativeCode(FlowGraphCompiler* compiler); | |
2458 | |
2423 protected: | 2459 protected: |
2424 EmbeddedArray<Value*, N> inputs_; | 2460 EmbeddedArray<Value*, N> inputs_; |
2425 | 2461 |
2426 private: | 2462 private: |
2427 virtual void RawSetInputAt(intptr_t i, Value* value) { inputs_[i] = value; } | 2463 virtual void RawSetInputAt(intptr_t i, Value* value) { inputs_[i] = value; } |
2428 }; | 2464 }; |
2429 | 2465 |
2430 | 2466 |
2431 class BranchInstr : public Instruction { | 2467 class BranchInstr : public Instruction { |
2432 public: | 2468 public: |
(...skipping 598 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3031 | 3067 |
3032 class StrictCompareInstr : public TemplateComparison<2, NoThrow, Pure> { | 3068 class StrictCompareInstr : public TemplateComparison<2, NoThrow, Pure> { |
3033 public: | 3069 public: |
3034 StrictCompareInstr(TokenPosition token_pos, | 3070 StrictCompareInstr(TokenPosition token_pos, |
3035 Token::Kind kind, | 3071 Token::Kind kind, |
3036 Value* left, | 3072 Value* left, |
3037 Value* right, | 3073 Value* right, |
3038 bool needs_number_check, | 3074 bool needs_number_check, |
3039 intptr_t deopt_id); | 3075 intptr_t deopt_id); |
3040 | 3076 |
3041 DECLARE_INSTRUCTION(StrictCompare) | 3077 DECLARE_COMPARISON_INSTRUCTION(StrictCompare) |
3042 | 3078 |
3043 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); | 3079 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); |
3044 | 3080 |
3045 virtual CompileType ComputeType() const; | 3081 virtual CompileType ComputeType() const; |
3046 | 3082 |
3047 virtual bool ComputeCanDeoptimize() const { return false; } | 3083 virtual bool ComputeCanDeoptimize() const { return false; } |
3048 | 3084 |
3049 virtual Definition* Canonicalize(FlowGraph* flow_graph); | 3085 virtual Definition* Canonicalize(FlowGraph* flow_graph); |
3050 | 3086 |
3051 virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch); | |
3052 | |
3053 virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler, | |
3054 BranchLabels labels); | |
3055 | |
3056 bool needs_number_check() const { return needs_number_check_; } | 3087 bool needs_number_check() const { return needs_number_check_; } |
3057 void set_needs_number_check(bool value) { needs_number_check_ = value; } | 3088 void set_needs_number_check(bool value) { needs_number_check_ = value; } |
3058 | 3089 |
3059 bool AttributesEqual(Instruction* other) const; | 3090 bool AttributesEqual(Instruction* other) const; |
3060 | 3091 |
3061 PRINT_OPERANDS_TO_SUPPORT | 3092 PRINT_OPERANDS_TO_SUPPORT |
3062 | 3093 |
3063 private: | 3094 private: |
3064 // True if the comparison must check for double, Mint or Bigint and | 3095 // True if the comparison must check for double, Mint or Bigint and |
3065 // use value comparison instead. | 3096 // use value comparison instead. |
(...skipping 10 matching lines...) Expand all Loading... | |
3076 TestSmiInstr(TokenPosition token_pos, | 3107 TestSmiInstr(TokenPosition token_pos, |
3077 Token::Kind kind, | 3108 Token::Kind kind, |
3078 Value* left, | 3109 Value* left, |
3079 Value* right) | 3110 Value* right) |
3080 : TemplateComparison(token_pos, kind) { | 3111 : TemplateComparison(token_pos, kind) { |
3081 ASSERT(kind == Token::kEQ || kind == Token::kNE); | 3112 ASSERT(kind == Token::kEQ || kind == Token::kNE); |
3082 SetInputAt(0, left); | 3113 SetInputAt(0, left); |
3083 SetInputAt(1, right); | 3114 SetInputAt(1, right); |
3084 } | 3115 } |
3085 | 3116 |
3086 DECLARE_INSTRUCTION(TestSmi); | 3117 DECLARE_COMPARISON_INSTRUCTION(TestSmi); |
3087 | 3118 |
3088 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); | 3119 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); |
3089 | 3120 |
3090 virtual CompileType ComputeType() const; | 3121 virtual CompileType ComputeType() const; |
3091 | 3122 |
3092 virtual bool ComputeCanDeoptimize() const { return false; } | 3123 virtual bool ComputeCanDeoptimize() const { return false; } |
3093 | 3124 |
3094 virtual Representation RequiredInputRepresentation(intptr_t idx) const { | 3125 virtual Representation RequiredInputRepresentation(intptr_t idx) const { |
3095 return kTagged; | 3126 return kTagged; |
3096 } | 3127 } |
3097 | 3128 |
3098 virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch); | |
3099 | |
3100 virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler, | |
3101 BranchLabels labels); | |
3102 | |
3103 private: | 3129 private: |
3104 DISALLOW_COPY_AND_ASSIGN(TestSmiInstr); | 3130 DISALLOW_COPY_AND_ASSIGN(TestSmiInstr); |
3105 }; | 3131 }; |
3106 | 3132 |
3107 | 3133 |
3108 // Checks the input value cid against cids stored in a table and returns either | 3134 // Checks the input value cid against cids stored in a table and returns either |
3109 // a result or deoptimizes. If the cid is not in the list and there is a deopt | 3135 // a result or deoptimizes. If the cid is not in the list and there is a deopt |
3110 // id, then the instruction deoptimizes. If there is no deopt id, all the | 3136 // id, then the instruction deoptimizes. If there is no deopt id, all the |
3111 // results must be the same (all true or all false) and the instruction returns | 3137 // results must be the same (all true or all false) and the instruction returns |
3112 // the opposite for cids not on the list. The first element in the table must | 3138 // the opposite for cids not on the list. The first element in the table must |
3113 // always be the result for the Smi class-id and is allowed to differ from the | 3139 // always be the result for the Smi class-id and is allowed to differ from the |
3114 // other results even in the no-deopt case. | 3140 // other results even in the no-deopt case. |
3115 class TestCidsInstr : public TemplateComparison<1, NoThrow, Pure> { | 3141 class TestCidsInstr : public TemplateComparison<1, NoThrow, Pure> { |
3116 public: | 3142 public: |
3117 TestCidsInstr(TokenPosition token_pos, | 3143 TestCidsInstr(TokenPosition token_pos, |
3118 Token::Kind kind, | 3144 Token::Kind kind, |
3119 Value* value, | 3145 Value* value, |
3120 const ZoneGrowableArray<intptr_t>& cid_results, | 3146 const ZoneGrowableArray<intptr_t>& cid_results, |
3121 intptr_t deopt_id); | 3147 intptr_t deopt_id); |
3122 | 3148 |
3123 const ZoneGrowableArray<intptr_t>& cid_results() const { | 3149 const ZoneGrowableArray<intptr_t>& cid_results() const { |
3124 return cid_results_; | 3150 return cid_results_; |
3125 } | 3151 } |
3126 | 3152 |
3127 DECLARE_INSTRUCTION(TestCids); | 3153 DECLARE_COMPARISON_INSTRUCTION(TestCids); |
3128 | 3154 |
3129 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); | 3155 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); |
3130 | 3156 |
3131 virtual CompileType ComputeType() const; | 3157 virtual CompileType ComputeType() const; |
3132 | 3158 |
3133 virtual Definition* Canonicalize(FlowGraph* flow_graph); | 3159 virtual Definition* Canonicalize(FlowGraph* flow_graph); |
3134 | 3160 |
3135 virtual bool ComputeCanDeoptimize() const { | 3161 virtual bool ComputeCanDeoptimize() const { |
3136 return GetDeoptId() != Thread::kNoDeoptId; | 3162 return GetDeoptId() != Thread::kNoDeoptId; |
3137 } | 3163 } |
3138 | 3164 |
3139 virtual Representation RequiredInputRepresentation(intptr_t idx) const { | 3165 virtual Representation RequiredInputRepresentation(intptr_t idx) const { |
3140 return kTagged; | 3166 return kTagged; |
3141 } | 3167 } |
3142 | 3168 |
3143 virtual bool AttributesEqual(Instruction* other) const; | 3169 virtual bool AttributesEqual(Instruction* other) const; |
3144 | 3170 |
3145 virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch); | |
3146 | |
3147 virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler, | |
3148 BranchLabels labels); | |
3149 | |
3150 void set_licm_hoisted(bool value) { licm_hoisted_ = value; } | 3171 void set_licm_hoisted(bool value) { licm_hoisted_ = value; } |
3151 | 3172 |
3152 PRINT_OPERANDS_TO_SUPPORT | 3173 PRINT_OPERANDS_TO_SUPPORT |
3153 | 3174 |
3154 private: | 3175 private: |
3155 const ZoneGrowableArray<intptr_t>& cid_results_; | 3176 const ZoneGrowableArray<intptr_t>& cid_results_; |
3156 bool licm_hoisted_; | 3177 bool licm_hoisted_; |
3157 DISALLOW_COPY_AND_ASSIGN(TestCidsInstr); | 3178 DISALLOW_COPY_AND_ASSIGN(TestCidsInstr); |
3158 }; | 3179 }; |
3159 | 3180 |
3160 | 3181 |
3161 class EqualityCompareInstr : public TemplateComparison<2, NoThrow, Pure> { | 3182 class EqualityCompareInstr : public TemplateComparison<2, NoThrow, Pure> { |
3162 public: | 3183 public: |
3163 EqualityCompareInstr(TokenPosition token_pos, | 3184 EqualityCompareInstr(TokenPosition token_pos, |
3164 Token::Kind kind, | 3185 Token::Kind kind, |
3165 Value* left, | 3186 Value* left, |
3166 Value* right, | 3187 Value* right, |
3167 intptr_t cid, | 3188 intptr_t cid, |
3168 intptr_t deopt_id) | 3189 intptr_t deopt_id) |
3169 : TemplateComparison(token_pos, kind, deopt_id) { | 3190 : TemplateComparison(token_pos, kind, deopt_id) { |
3170 ASSERT(Token::IsEqualityOperator(kind)); | 3191 ASSERT(Token::IsEqualityOperator(kind)); |
3171 SetInputAt(0, left); | 3192 SetInputAt(0, left); |
3172 SetInputAt(1, right); | 3193 SetInputAt(1, right); |
3173 set_operation_cid(cid); | 3194 set_operation_cid(cid); |
3174 } | 3195 } |
3175 | 3196 |
3176 DECLARE_INSTRUCTION(EqualityCompare) | 3197 DECLARE_COMPARISON_INSTRUCTION(EqualityCompare) |
3177 | 3198 |
3178 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); | 3199 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); |
3179 | 3200 |
3180 virtual CompileType ComputeType() const; | 3201 virtual CompileType ComputeType() const; |
3181 | 3202 |
3182 virtual bool ComputeCanDeoptimize() const { return false; } | 3203 virtual bool ComputeCanDeoptimize() const { return false; } |
3183 | 3204 |
3184 virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch); | |
3185 | |
3186 virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler, | |
3187 BranchLabels labels); | |
3188 | |
3189 virtual Representation RequiredInputRepresentation(intptr_t idx) const { | 3205 virtual Representation RequiredInputRepresentation(intptr_t idx) const { |
3190 ASSERT((idx == 0) || (idx == 1)); | 3206 ASSERT((idx == 0) || (idx == 1)); |
3191 if (operation_cid() == kDoubleCid) return kUnboxedDouble; | 3207 if (operation_cid() == kDoubleCid) return kUnboxedDouble; |
3192 if (operation_cid() == kMintCid) return kUnboxedMint; | 3208 if (operation_cid() == kMintCid) return kUnboxedMint; |
3193 return kTagged; | 3209 return kTagged; |
3194 } | 3210 } |
3195 | 3211 |
3196 PRINT_OPERANDS_TO_SUPPORT | 3212 PRINT_OPERANDS_TO_SUPPORT |
3197 | 3213 |
3198 private: | 3214 private: |
3199 DISALLOW_COPY_AND_ASSIGN(EqualityCompareInstr); | 3215 DISALLOW_COPY_AND_ASSIGN(EqualityCompareInstr); |
3200 }; | 3216 }; |
3201 | 3217 |
3202 | 3218 |
3203 class RelationalOpInstr : public TemplateComparison<2, NoThrow, Pure> { | 3219 class RelationalOpInstr : public TemplateComparison<2, NoThrow, Pure> { |
3204 public: | 3220 public: |
3205 RelationalOpInstr(TokenPosition token_pos, | 3221 RelationalOpInstr(TokenPosition token_pos, |
3206 Token::Kind kind, | 3222 Token::Kind kind, |
3207 Value* left, | 3223 Value* left, |
3208 Value* right, | 3224 Value* right, |
3209 intptr_t cid, | 3225 intptr_t cid, |
3210 intptr_t deopt_id) | 3226 intptr_t deopt_id) |
3211 : TemplateComparison(token_pos, kind, deopt_id) { | 3227 : TemplateComparison(token_pos, kind, deopt_id) { |
3212 ASSERT(Token::IsRelationalOperator(kind)); | 3228 ASSERT(Token::IsRelationalOperator(kind)); |
3213 SetInputAt(0, left); | 3229 SetInputAt(0, left); |
3214 SetInputAt(1, right); | 3230 SetInputAt(1, right); |
3215 set_operation_cid(cid); | 3231 set_operation_cid(cid); |
3216 } | 3232 } |
3217 | 3233 |
3218 DECLARE_INSTRUCTION(RelationalOp) | 3234 DECLARE_COMPARISON_INSTRUCTION(RelationalOp) |
3219 | 3235 |
3220 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); | 3236 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); |
3221 | 3237 |
3222 virtual CompileType ComputeType() const; | 3238 virtual CompileType ComputeType() const; |
3223 | 3239 |
3224 virtual bool ComputeCanDeoptimize() const { return false; } | 3240 virtual bool ComputeCanDeoptimize() const { return false; } |
3225 | 3241 |
3226 virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch); | |
3227 | |
3228 virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler, | |
3229 BranchLabels labels); | |
3230 | |
3231 virtual Representation RequiredInputRepresentation(intptr_t idx) const { | 3242 virtual Representation RequiredInputRepresentation(intptr_t idx) const { |
3232 ASSERT((idx == 0) || (idx == 1)); | 3243 ASSERT((idx == 0) || (idx == 1)); |
3233 if (operation_cid() == kDoubleCid) return kUnboxedDouble; | 3244 if (operation_cid() == kDoubleCid) return kUnboxedDouble; |
3234 if (operation_cid() == kMintCid) return kUnboxedMint; | 3245 if (operation_cid() == kMintCid) return kUnboxedMint; |
3235 return kTagged; | 3246 return kTagged; |
3236 } | 3247 } |
3237 | 3248 |
3238 PRINT_OPERANDS_TO_SUPPORT | 3249 PRINT_OPERANDS_TO_SUPPORT |
3239 | 3250 |
3240 private: | 3251 private: |
(...skipping 2100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5341 | 5352 |
5342 virtual bool ComputeCanDeoptimize() const { return false; } | 5353 virtual bool ComputeCanDeoptimize() const { return false; } |
5343 | 5354 |
5344 virtual Representation RequiredInputRepresentation(intptr_t idx) const { | 5355 virtual Representation RequiredInputRepresentation(intptr_t idx) const { |
5345 ASSERT(idx == 0); | 5356 ASSERT(idx == 0); |
5346 return kUnboxedDouble; | 5357 return kUnboxedDouble; |
5347 } | 5358 } |
5348 | 5359 |
5349 PRINT_OPERANDS_TO_SUPPORT | 5360 PRINT_OPERANDS_TO_SUPPORT |
5350 | 5361 |
5351 DECLARE_INSTRUCTION(DoubleTestOp) | 5362 DECLARE_COMPARISON_INSTRUCTION(DoubleTestOp) |
5363 | |
5352 virtual CompileType ComputeType() const; | 5364 virtual CompileType ComputeType() const; |
5353 | 5365 |
5354 virtual Definition* Canonicalize(FlowGraph* flow_graph); | 5366 virtual Definition* Canonicalize(FlowGraph* flow_graph); |
5355 | 5367 |
5356 virtual bool AttributesEqual(Instruction* other) const { | 5368 virtual bool AttributesEqual(Instruction* other) const { |
5357 return op_kind_ == other->AsDoubleTestOp()->op_kind() && | 5369 return op_kind_ == other->AsDoubleTestOp()->op_kind() && |
5358 ComparisonInstr::AttributesEqual(other); | 5370 ComparisonInstr::AttributesEqual(other); |
5359 } | 5371 } |
5360 | 5372 |
5361 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); | 5373 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); |
5362 | 5374 |
5363 virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch); | |
5364 | |
5365 virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler, | |
5366 BranchLabels labels); | |
5367 | |
5368 private: | 5375 private: |
5369 const MethodRecognizer::Kind op_kind_; | 5376 const MethodRecognizer::Kind op_kind_; |
5370 | 5377 |
5371 DISALLOW_COPY_AND_ASSIGN(DoubleTestOpInstr); | 5378 DISALLOW_COPY_AND_ASSIGN(DoubleTestOpInstr); |
5372 }; | 5379 }; |
5373 | 5380 |
5374 | 5381 |
5375 class BinaryFloat32x4OpInstr : public TemplateDefinition<2, NoThrow, Pure> { | 5382 class BinaryFloat32x4OpInstr : public TemplateDefinition<2, NoThrow, Pure> { |
5376 public: | 5383 public: |
5377 BinaryFloat32x4OpInstr(Token::Kind op_kind, | 5384 BinaryFloat32x4OpInstr(Token::Kind op_kind, |
(...skipping 1549 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
6927 | 6934 |
6928 PRINT_OPERANDS_TO_SUPPORT | 6935 PRINT_OPERANDS_TO_SUPPORT |
6929 | 6936 |
6930 DECLARE_INSTRUCTION(CheckedSmiComparison) | 6937 DECLARE_INSTRUCTION(CheckedSmiComparison) |
6931 | 6938 |
6932 virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch); | 6939 virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch); |
6933 | 6940 |
6934 virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler, | 6941 virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler, |
6935 BranchLabels labels); | 6942 BranchLabels labels); |
6936 | 6943 |
6944 #if defined(TARGET_ARCH_DBC) | |
6945 virtual Condition GetPredictedCondition(FlowGraphCompiler* compiler, | |
6946 BranchLabels labels) { | |
6947 UNREACHABLE(); | |
6948 return INVALID_CONDITION; | |
6949 } | |
6950 #endif | |
6951 | |
6937 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); | 6952 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); |
6938 | 6953 |
6939 private: | 6954 private: |
6940 InstanceCallInstr* call_; | 6955 InstanceCallInstr* call_; |
6941 bool is_negated_; | 6956 bool is_negated_; |
6942 DISALLOW_COPY_AND_ASSIGN(CheckedSmiComparisonInstr); | 6957 DISALLOW_COPY_AND_ASSIGN(CheckedSmiComparisonInstr); |
6943 }; | 6958 }; |
6944 | 6959 |
6945 | 6960 |
6946 class BinaryIntegerOpInstr : public TemplateDefinition<2, NoThrow, Pure> { | 6961 class BinaryIntegerOpInstr : public TemplateDefinition<2, NoThrow, Pure> { |
(...skipping 1288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
8235 LocationSummary* Name::MakeLocationSummary(Zone* zone, bool opt) const { \ | 8250 LocationSummary* Name::MakeLocationSummary(Zone* zone, bool opt) const { \ |
8236 UNIMPLEMENTED(); \ | 8251 UNIMPLEMENTED(); \ |
8237 return NULL; \ | 8252 return NULL; \ |
8238 } \ | 8253 } \ |
8239 void Name::EmitNativeCode(FlowGraphCompiler* compiler) { UNIMPLEMENTED(); } | 8254 void Name::EmitNativeCode(FlowGraphCompiler* compiler) { UNIMPLEMENTED(); } |
8240 | 8255 |
8241 | 8256 |
8242 } // namespace dart | 8257 } // namespace dart |
8243 | 8258 |
8244 #endif // RUNTIME_VM_INTERMEDIATE_LANGUAGE_H_ | 8259 #endif // RUNTIME_VM_INTERMEDIATE_LANGUAGE_H_ |
OLD | NEW |