Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(938)

Side by Side Diff: runtime/vm/intermediate_language.h

Issue 2949513002: Revert "Reduce copying, redundancy & repetition for codegen of comparison instructions" (Closed)
Patch Set: Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « runtime/vm/disassembler_arm64.cc ('k') | runtime/vm/intermediate_language_arm.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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 GetNextInstructionCondition(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
559 #ifndef PRODUCT 539 #ifndef PRODUCT
560 #define PRINT_TO_SUPPORT virtual void PrintTo(BufferFormatter* f) const; 540 #define PRINT_TO_SUPPORT virtual void PrintTo(BufferFormatter* f) const;
561 #else 541 #else
562 #define PRINT_TO_SUPPORT 542 #define PRINT_TO_SUPPORT
563 #endif // !PRODUCT 543 #endif // !PRODUCT
564 544
565 #ifndef PRODUCT 545 #ifndef PRODUCT
566 #define PRINT_OPERANDS_TO_SUPPORT \ 546 #define PRINT_OPERANDS_TO_SUPPORT \
567 virtual void PrintOperandsTo(BufferFormatter* f) const; 547 virtual void PrintOperandsTo(BufferFormatter* f) const;
568 #else 548 #else
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after
979 Instruction* previous_; 959 Instruction* previous_;
980 Instruction* next_; 960 Instruction* next_;
981 Environment* env_; 961 Environment* env_;
982 LocationSummary* locs_; 962 LocationSummary* locs_;
983 intptr_t inlining_id_; 963 intptr_t inlining_id_;
984 964
985 DISALLOW_COPY_AND_ASSIGN(Instruction); 965 DISALLOW_COPY_AND_ASSIGN(Instruction);
986 }; 966 };
987 967
988 968
989 struct BranchLabels {
990 Label* true_label;
991 Label* false_label;
992 Label* fall_through;
993 };
994
995
996 class PureInstruction : public Instruction { 969 class PureInstruction : public Instruction {
997 public: 970 public:
998 explicit PureInstruction(intptr_t deopt_id) : Instruction(deopt_id) {} 971 explicit PureInstruction(intptr_t deopt_id) : Instruction(deopt_id) {}
999 972
1000 virtual bool AllowsCSE() const { return true; } 973 virtual bool AllowsCSE() const { return true; }
1001 virtual EffectSet Dependencies() const { return EffectSet::None(); } 974 virtual EffectSet Dependencies() const { return EffectSet::None(); }
1002 975
1003 virtual EffectSet Effects() const { return EffectSet::None(); } 976 virtual EffectSet Effects() const { return EffectSet::None(); }
1004 }; 977 };
1005 978
(...skipping 934 matching lines...) Expand 10 before | Expand all | Expand 10 after
1940 EmbeddedArray<Value*, N> inputs_; 1913 EmbeddedArray<Value*, N> inputs_;
1941 1914
1942 private: 1915 private:
1943 friend class BranchInstr; 1916 friend class BranchInstr;
1944 friend class IfThenElseInstr; 1917 friend class IfThenElseInstr;
1945 1918
1946 virtual void RawSetInputAt(intptr_t i, Value* value) { inputs_[i] = value; } 1919 virtual void RawSetInputAt(intptr_t i, Value* value) { inputs_[i] = value; }
1947 }; 1920 };
1948 1921
1949 1922
1923 struct BranchLabels {
1924 Label* true_label;
1925 Label* false_label;
1926 Label* fall_through;
1927 };
1928
1929
1950 class InductionVariableInfo; 1930 class InductionVariableInfo;
1951 1931
1952 1932
1953 class PhiInstr : public Definition { 1933 class PhiInstr : public Definition {
1954 public: 1934 public:
1955 PhiInstr(JoinEntryInstr* block, intptr_t num_inputs) 1935 PhiInstr(JoinEntryInstr* block, intptr_t num_inputs)
1956 : block_(block), 1936 : block_(block),
1957 inputs_(num_inputs), 1937 inputs_(num_inputs),
1958 representation_(kTagged), 1938 representation_(kTagged),
1959 reaching_defs_(NULL), 1939 reaching_defs_(NULL),
(...skipping 398 matching lines...) Expand 10 before | Expand all | Expand 10 after
2358 class ComparisonInstr : public Definition { 2338 class ComparisonInstr : public Definition {
2359 public: 2339 public:
2360 Value* left() const { return InputAt(0); } 2340 Value* left() const { return InputAt(0); }
2361 Value* right() const { return InputAt(1); } 2341 Value* right() const { return InputAt(1); }
2362 2342
2363 virtual TokenPosition token_pos() const { return token_pos_; } 2343 virtual TokenPosition token_pos() const { return token_pos_; }
2364 Token::Kind kind() const { return kind_; } 2344 Token::Kind kind() const { return kind_; }
2365 2345
2366 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right) = 0; 2346 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right) = 0;
2367 2347
2368 // Emits instructions to do the comparison and branch to the true or false 2348 virtual void EmitBranchCode(FlowGraphCompiler* compiler,
2369 // label depending on the result. This implementation will call 2349 BranchInstr* branch) = 0;
2370 // EmitComparisonCode and then generate the branch instructions afterwards.
2371 virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch);
2372 2350
2373 // Used by EmitBranchCode and EmitNativeCode depending on whether the boolean
2374 // is to be turned into branches or instantiated. May return a valid
2375 // condition in which case the caller is expected to emit a branch to the
2376 // true label based on that condition (or a branch to the false label on the
2377 // opposite condition). May also branch directly to the labels.
2378 virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler, 2351 virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler,
2379 BranchLabels labels) = 0; 2352 BranchLabels labels) = 0;
2380 2353
2381 #if defined(TARGET_ARCH_DBC)
2382 // On the DBC platform EmitNativeCode needs to know ahead of time what
2383 // 'Condition' will be returned by EmitComparisonCode. This call must return
2384 // the same result as EmitComparisonCode, but should not emit any
2385 // instructions.
2386 virtual Condition GetNextInstructionCondition(FlowGraphCompiler* compiler,
2387 BranchLabels labels) = 0;
2388 #endif
2389
2390 // Emits code that generates 'true' or 'false', depending on the comparison.
2391 // This implementation will call EmitComparisonCode. If EmitComparisonCode
2392 // does not use the labels (merely returning a condition) then EmitNativeCode
2393 // may be able to use the condition to avoid a branch.
2394 virtual void EmitNativeCode(FlowGraphCompiler* compiler);
2395
2396 void SetDeoptId(const Instruction& instr) { CopyDeoptIdFrom(instr); } 2354 void SetDeoptId(const Instruction& instr) { CopyDeoptIdFrom(instr); }
2397 2355
2398 // Operation class id is computed from collected ICData. 2356 // Operation class id is computed from collected ICData.
2399 void set_operation_cid(intptr_t value) { operation_cid_ = value; } 2357 void set_operation_cid(intptr_t value) { operation_cid_ = value; }
2400 intptr_t operation_cid() const { return operation_cid_; } 2358 intptr_t operation_cid() const { return operation_cid_; }
2401 2359
2402 virtual void NegateComparison() { kind_ = Token::NegateComparison(kind_); } 2360 virtual void NegateComparison() { kind_ = Token::NegateComparison(kind_); }
2403 2361
2404 virtual bool CanBecomeDeoptimizationTarget() const { return true; } 2362 virtual bool CanBecomeDeoptimizationTarget() const { return true; }
2405 virtual intptr_t DeoptimizationTarget() const { return GetDeoptId(); } 2363 virtual intptr_t DeoptimizationTarget() const { return GetDeoptId(); }
(...skipping 667 matching lines...) Expand 10 before | Expand all | Expand 10 after
3073 3031
3074 class StrictCompareInstr : public TemplateComparison<2, NoThrow, Pure> { 3032 class StrictCompareInstr : public TemplateComparison<2, NoThrow, Pure> {
3075 public: 3033 public:
3076 StrictCompareInstr(TokenPosition token_pos, 3034 StrictCompareInstr(TokenPosition token_pos,
3077 Token::Kind kind, 3035 Token::Kind kind,
3078 Value* left, 3036 Value* left,
3079 Value* right, 3037 Value* right,
3080 bool needs_number_check, 3038 bool needs_number_check,
3081 intptr_t deopt_id); 3039 intptr_t deopt_id);
3082 3040
3083 DECLARE_COMPARISON_INSTRUCTION(StrictCompare) 3041 DECLARE_INSTRUCTION(StrictCompare)
3084 3042
3085 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); 3043 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right);
3086 3044
3087 virtual CompileType ComputeType() const; 3045 virtual CompileType ComputeType() const;
3088 3046
3089 virtual bool ComputeCanDeoptimize() const { return false; } 3047 virtual bool ComputeCanDeoptimize() const { return false; }
3090 3048
3091 virtual Definition* Canonicalize(FlowGraph* flow_graph); 3049 virtual Definition* Canonicalize(FlowGraph* flow_graph);
3092 3050
3051 virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch);
3052
3053 virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler,
3054 BranchLabels labels);
3055
3093 bool needs_number_check() const { return needs_number_check_; } 3056 bool needs_number_check() const { return needs_number_check_; }
3094 void set_needs_number_check(bool value) { needs_number_check_ = value; } 3057 void set_needs_number_check(bool value) { needs_number_check_ = value; }
3095 3058
3096 bool AttributesEqual(Instruction* other) const; 3059 bool AttributesEqual(Instruction* other) const;
3097 3060
3098 PRINT_OPERANDS_TO_SUPPORT 3061 PRINT_OPERANDS_TO_SUPPORT
3099 3062
3100 private: 3063 private:
3101 // True if the comparison must check for double, Mint or Bigint and 3064 // True if the comparison must check for double, Mint or Bigint and
3102 // use value comparison instead. 3065 // use value comparison instead.
(...skipping 10 matching lines...) Expand all
3113 TestSmiInstr(TokenPosition token_pos, 3076 TestSmiInstr(TokenPosition token_pos,
3114 Token::Kind kind, 3077 Token::Kind kind,
3115 Value* left, 3078 Value* left,
3116 Value* right) 3079 Value* right)
3117 : TemplateComparison(token_pos, kind) { 3080 : TemplateComparison(token_pos, kind) {
3118 ASSERT(kind == Token::kEQ || kind == Token::kNE); 3081 ASSERT(kind == Token::kEQ || kind == Token::kNE);
3119 SetInputAt(0, left); 3082 SetInputAt(0, left);
3120 SetInputAt(1, right); 3083 SetInputAt(1, right);
3121 } 3084 }
3122 3085
3123 DECLARE_COMPARISON_INSTRUCTION(TestSmi); 3086 DECLARE_INSTRUCTION(TestSmi);
3124 3087
3125 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); 3088 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right);
3126 3089
3127 virtual CompileType ComputeType() const; 3090 virtual CompileType ComputeType() const;
3128 3091
3129 virtual bool ComputeCanDeoptimize() const { return false; } 3092 virtual bool ComputeCanDeoptimize() const { return false; }
3130 3093
3131 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 3094 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
3132 return kTagged; 3095 return kTagged;
3133 } 3096 }
3134 3097
3098 virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch);
3099
3100 virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler,
3101 BranchLabels labels);
3102
3135 private: 3103 private:
3136 DISALLOW_COPY_AND_ASSIGN(TestSmiInstr); 3104 DISALLOW_COPY_AND_ASSIGN(TestSmiInstr);
3137 }; 3105 };
3138 3106
3139 3107
3140 // Checks the input value cid against cids stored in a table and returns either 3108 // Checks the input value cid against cids stored in a table and returns either
3141 // a result or deoptimizes. If the cid is not in the list and there is a deopt 3109 // a result or deoptimizes. If the cid is not in the list and there is a deopt
3142 // id, then the instruction deoptimizes. If there is no deopt id, all the 3110 // id, then the instruction deoptimizes. If there is no deopt id, all the
3143 // results must be the same (all true or all false) and the instruction returns 3111 // results must be the same (all true or all false) and the instruction returns
3144 // the opposite for cids not on the list. The first element in the table must 3112 // the opposite for cids not on the list. The first element in the table must
3145 // always be the result for the Smi class-id and is allowed to differ from the 3113 // always be the result for the Smi class-id and is allowed to differ from the
3146 // other results even in the no-deopt case. 3114 // other results even in the no-deopt case.
3147 class TestCidsInstr : public TemplateComparison<1, NoThrow, Pure> { 3115 class TestCidsInstr : public TemplateComparison<1, NoThrow, Pure> {
3148 public: 3116 public:
3149 TestCidsInstr(TokenPosition token_pos, 3117 TestCidsInstr(TokenPosition token_pos,
3150 Token::Kind kind, 3118 Token::Kind kind,
3151 Value* value, 3119 Value* value,
3152 const ZoneGrowableArray<intptr_t>& cid_results, 3120 const ZoneGrowableArray<intptr_t>& cid_results,
3153 intptr_t deopt_id); 3121 intptr_t deopt_id);
3154 3122
3155 const ZoneGrowableArray<intptr_t>& cid_results() const { 3123 const ZoneGrowableArray<intptr_t>& cid_results() const {
3156 return cid_results_; 3124 return cid_results_;
3157 } 3125 }
3158 3126
3159 DECLARE_COMPARISON_INSTRUCTION(TestCids); 3127 DECLARE_INSTRUCTION(TestCids);
3160 3128
3161 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); 3129 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right);
3162 3130
3163 virtual CompileType ComputeType() const; 3131 virtual CompileType ComputeType() const;
3164 3132
3165 virtual Definition* Canonicalize(FlowGraph* flow_graph); 3133 virtual Definition* Canonicalize(FlowGraph* flow_graph);
3166 3134
3167 virtual bool ComputeCanDeoptimize() const { 3135 virtual bool ComputeCanDeoptimize() const {
3168 return GetDeoptId() != Thread::kNoDeoptId; 3136 return GetDeoptId() != Thread::kNoDeoptId;
3169 } 3137 }
3170 3138
3171 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 3139 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
3172 return kTagged; 3140 return kTagged;
3173 } 3141 }
3174 3142
3175 virtual bool AttributesEqual(Instruction* other) const; 3143 virtual bool AttributesEqual(Instruction* other) const;
3176 3144
3145 virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch);
3146
3147 virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler,
3148 BranchLabels labels);
3149
3177 void set_licm_hoisted(bool value) { licm_hoisted_ = value; } 3150 void set_licm_hoisted(bool value) { licm_hoisted_ = value; }
3178 3151
3179 PRINT_OPERANDS_TO_SUPPORT 3152 PRINT_OPERANDS_TO_SUPPORT
3180 3153
3181 private: 3154 private:
3182 const ZoneGrowableArray<intptr_t>& cid_results_; 3155 const ZoneGrowableArray<intptr_t>& cid_results_;
3183 bool licm_hoisted_; 3156 bool licm_hoisted_;
3184 DISALLOW_COPY_AND_ASSIGN(TestCidsInstr); 3157 DISALLOW_COPY_AND_ASSIGN(TestCidsInstr);
3185 }; 3158 };
3186 3159
3187 3160
3188 class EqualityCompareInstr : public TemplateComparison<2, NoThrow, Pure> { 3161 class EqualityCompareInstr : public TemplateComparison<2, NoThrow, Pure> {
3189 public: 3162 public:
3190 EqualityCompareInstr(TokenPosition token_pos, 3163 EqualityCompareInstr(TokenPosition token_pos,
3191 Token::Kind kind, 3164 Token::Kind kind,
3192 Value* left, 3165 Value* left,
3193 Value* right, 3166 Value* right,
3194 intptr_t cid, 3167 intptr_t cid,
3195 intptr_t deopt_id) 3168 intptr_t deopt_id)
3196 : TemplateComparison(token_pos, kind, deopt_id) { 3169 : TemplateComparison(token_pos, kind, deopt_id) {
3197 ASSERT(Token::IsEqualityOperator(kind)); 3170 ASSERT(Token::IsEqualityOperator(kind));
3198 SetInputAt(0, left); 3171 SetInputAt(0, left);
3199 SetInputAt(1, right); 3172 SetInputAt(1, right);
3200 set_operation_cid(cid); 3173 set_operation_cid(cid);
3201 } 3174 }
3202 3175
3203 DECLARE_COMPARISON_INSTRUCTION(EqualityCompare) 3176 DECLARE_INSTRUCTION(EqualityCompare)
3204 3177
3205 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); 3178 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right);
3206 3179
3207 virtual CompileType ComputeType() const; 3180 virtual CompileType ComputeType() const;
3208 3181
3209 virtual bool ComputeCanDeoptimize() const { return false; } 3182 virtual bool ComputeCanDeoptimize() const { return false; }
3210 3183
3184 virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch);
3185
3186 virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler,
3187 BranchLabels labels);
3188
3211 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 3189 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
3212 ASSERT((idx == 0) || (idx == 1)); 3190 ASSERT((idx == 0) || (idx == 1));
3213 if (operation_cid() == kDoubleCid) return kUnboxedDouble; 3191 if (operation_cid() == kDoubleCid) return kUnboxedDouble;
3214 if (operation_cid() == kMintCid) return kUnboxedMint; 3192 if (operation_cid() == kMintCid) return kUnboxedMint;
3215 return kTagged; 3193 return kTagged;
3216 } 3194 }
3217 3195
3218 PRINT_OPERANDS_TO_SUPPORT 3196 PRINT_OPERANDS_TO_SUPPORT
3219 3197
3220 private: 3198 private:
3221 DISALLOW_COPY_AND_ASSIGN(EqualityCompareInstr); 3199 DISALLOW_COPY_AND_ASSIGN(EqualityCompareInstr);
3222 }; 3200 };
3223 3201
3224 3202
3225 class RelationalOpInstr : public TemplateComparison<2, NoThrow, Pure> { 3203 class RelationalOpInstr : public TemplateComparison<2, NoThrow, Pure> {
3226 public: 3204 public:
3227 RelationalOpInstr(TokenPosition token_pos, 3205 RelationalOpInstr(TokenPosition token_pos,
3228 Token::Kind kind, 3206 Token::Kind kind,
3229 Value* left, 3207 Value* left,
3230 Value* right, 3208 Value* right,
3231 intptr_t cid, 3209 intptr_t cid,
3232 intptr_t deopt_id) 3210 intptr_t deopt_id)
3233 : TemplateComparison(token_pos, kind, deopt_id) { 3211 : TemplateComparison(token_pos, kind, deopt_id) {
3234 ASSERT(Token::IsRelationalOperator(kind)); 3212 ASSERT(Token::IsRelationalOperator(kind));
3235 SetInputAt(0, left); 3213 SetInputAt(0, left);
3236 SetInputAt(1, right); 3214 SetInputAt(1, right);
3237 set_operation_cid(cid); 3215 set_operation_cid(cid);
3238 } 3216 }
3239 3217
3240 DECLARE_COMPARISON_INSTRUCTION(RelationalOp) 3218 DECLARE_INSTRUCTION(RelationalOp)
3241 3219
3242 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); 3220 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right);
3243 3221
3244 virtual CompileType ComputeType() const; 3222 virtual CompileType ComputeType() const;
3245 3223
3246 virtual bool ComputeCanDeoptimize() const { return false; } 3224 virtual bool ComputeCanDeoptimize() const { return false; }
3247 3225
3226 virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch);
3227
3228 virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler,
3229 BranchLabels labels);
3230
3248 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 3231 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
3249 ASSERT((idx == 0) || (idx == 1)); 3232 ASSERT((idx == 0) || (idx == 1));
3250 if (operation_cid() == kDoubleCid) return kUnboxedDouble; 3233 if (operation_cid() == kDoubleCid) return kUnboxedDouble;
3251 if (operation_cid() == kMintCid) return kUnboxedMint; 3234 if (operation_cid() == kMintCid) return kUnboxedMint;
3252 return kTagged; 3235 return kTagged;
3253 } 3236 }
3254 3237
3255 PRINT_OPERANDS_TO_SUPPORT 3238 PRINT_OPERANDS_TO_SUPPORT
3256 3239
3257 private: 3240 private:
(...skipping 2100 matching lines...) Expand 10 before | Expand all | Expand 10 after
5358 5341
5359 virtual bool ComputeCanDeoptimize() const { return false; } 5342 virtual bool ComputeCanDeoptimize() const { return false; }
5360 5343
5361 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 5344 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
5362 ASSERT(idx == 0); 5345 ASSERT(idx == 0);
5363 return kUnboxedDouble; 5346 return kUnboxedDouble;
5364 } 5347 }
5365 5348
5366 PRINT_OPERANDS_TO_SUPPORT 5349 PRINT_OPERANDS_TO_SUPPORT
5367 5350
5368 DECLARE_COMPARISON_INSTRUCTION(DoubleTestOp) 5351 DECLARE_INSTRUCTION(DoubleTestOp)
5369
5370 virtual CompileType ComputeType() const; 5352 virtual CompileType ComputeType() const;
5371 5353
5372 virtual Definition* Canonicalize(FlowGraph* flow_graph); 5354 virtual Definition* Canonicalize(FlowGraph* flow_graph);
5373 5355
5374 virtual bool AttributesEqual(Instruction* other) const { 5356 virtual bool AttributesEqual(Instruction* other) const {
5375 return op_kind_ == other->AsDoubleTestOp()->op_kind() && 5357 return op_kind_ == other->AsDoubleTestOp()->op_kind() &&
5376 ComparisonInstr::AttributesEqual(other); 5358 ComparisonInstr::AttributesEqual(other);
5377 } 5359 }
5378 5360
5379 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); 5361 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right);
5380 5362
5363 virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch);
5364
5365 virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler,
5366 BranchLabels labels);
5367
5381 private: 5368 private:
5382 const MethodRecognizer::Kind op_kind_; 5369 const MethodRecognizer::Kind op_kind_;
5383 5370
5384 DISALLOW_COPY_AND_ASSIGN(DoubleTestOpInstr); 5371 DISALLOW_COPY_AND_ASSIGN(DoubleTestOpInstr);
5385 }; 5372 };
5386 5373
5387 5374
5388 class BinaryFloat32x4OpInstr : public TemplateDefinition<2, NoThrow, Pure> { 5375 class BinaryFloat32x4OpInstr : public TemplateDefinition<2, NoThrow, Pure> {
5389 public: 5376 public:
5390 BinaryFloat32x4OpInstr(Token::Kind op_kind, 5377 BinaryFloat32x4OpInstr(Token::Kind op_kind,
(...skipping 1549 matching lines...) Expand 10 before | Expand all | Expand 10 after
6940 6927
6941 PRINT_OPERANDS_TO_SUPPORT 6928 PRINT_OPERANDS_TO_SUPPORT
6942 6929
6943 DECLARE_INSTRUCTION(CheckedSmiComparison) 6930 DECLARE_INSTRUCTION(CheckedSmiComparison)
6944 6931
6945 virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch); 6932 virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch);
6946 6933
6947 virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler, 6934 virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler,
6948 BranchLabels labels); 6935 BranchLabels labels);
6949 6936
6950 #if defined(TARGET_ARCH_DBC)
6951 virtual Condition GetNextInstructionCondition(FlowGraphCompiler* compiler,
6952 BranchLabels labels) {
6953 UNREACHABLE();
6954 return INVALID_CONDITION;
6955 }
6956 #endif
6957
6958 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); 6937 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right);
6959 6938
6960 private: 6939 private:
6961 InstanceCallInstr* call_; 6940 InstanceCallInstr* call_;
6962 bool is_negated_; 6941 bool is_negated_;
6963 DISALLOW_COPY_AND_ASSIGN(CheckedSmiComparisonInstr); 6942 DISALLOW_COPY_AND_ASSIGN(CheckedSmiComparisonInstr);
6964 }; 6943 };
6965 6944
6966 6945
6967 class BinaryIntegerOpInstr : public TemplateDefinition<2, NoThrow, Pure> { 6946 class BinaryIntegerOpInstr : public TemplateDefinition<2, NoThrow, Pure> {
(...skipping 1288 matching lines...) Expand 10 before | Expand all | Expand 10 after
8256 LocationSummary* Name::MakeLocationSummary(Zone* zone, bool opt) const { \ 8235 LocationSummary* Name::MakeLocationSummary(Zone* zone, bool opt) const { \
8257 UNIMPLEMENTED(); \ 8236 UNIMPLEMENTED(); \
8258 return NULL; \ 8237 return NULL; \
8259 } \ 8238 } \
8260 void Name::EmitNativeCode(FlowGraphCompiler* compiler) { UNIMPLEMENTED(); } 8239 void Name::EmitNativeCode(FlowGraphCompiler* compiler) { UNIMPLEMENTED(); }
8261 8240
8262 8241
8263 } // namespace dart 8242 } // namespace dart
8264 8243
8265 #endif // RUNTIME_VM_INTERMEDIATE_LANGUAGE_H_ 8244 #endif // RUNTIME_VM_INTERMEDIATE_LANGUAGE_H_
OLDNEW
« no previous file with comments | « runtime/vm/disassembler_arm64.cc ('k') | runtime/vm/intermediate_language_arm.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698