Index: runtime/vm/intermediate_language.h |
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h |
index 588d082bc70a03551fc685729f18f6c3db2a823a..cb50a2a0e0c7dfcea0aa311def2bf8184667eaff 100644 |
--- a/runtime/vm/intermediate_language.h |
+++ b/runtime/vm/intermediate_language.h |
@@ -536,6 +536,26 @@ FOR_EACH_ABSTRACT_INSTRUCTION(FORWARD_DECLARATION) |
DECLARE_INSTRUCTION_NO_BACKEND(type) \ |
DECLARE_INSTRUCTION_BACKEND() |
+#if defined(TARGET_ARCH_DBC) |
+#define DECLARE_COMPARISON_METHODS \ |
+ virtual LocationSummary* MakeLocationSummary(Zone* zone, bool optimizing) \ |
+ const; \ |
+ virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler, \ |
+ BranchLabels labels); \ |
+ virtual Condition GetNextInstructionCondition(FlowGraphCompiler* compiler, \ |
+ BranchLabels labels); |
+#else |
+#define DECLARE_COMPARISON_METHODS \ |
+ virtual LocationSummary* MakeLocationSummary(Zone* zone, bool optimizing) \ |
+ const; \ |
+ virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler, \ |
+ BranchLabels labels); |
+#endif |
+ |
+#define DECLARE_COMPARISON_INSTRUCTION(type) \ |
+ DECLARE_INSTRUCTION_NO_BACKEND(type) \ |
+ DECLARE_COMPARISON_METHODS |
+ |
#ifndef PRODUCT |
#define PRINT_TO_SUPPORT virtual void PrintTo(BufferFormatter* f) const; |
#else |
@@ -966,6 +986,13 @@ class Instruction : public ZoneAllocated { |
}; |
+struct BranchLabels { |
+ Label* true_label; |
+ Label* false_label; |
+ Label* fall_through; |
+}; |
+ |
+ |
class PureInstruction : public Instruction { |
public: |
explicit PureInstruction(intptr_t deopt_id) : Instruction(deopt_id) {} |
@@ -1920,13 +1947,6 @@ class TemplateDefinition : public CSETrait<Definition, PureDefinition>::Base { |
}; |
-struct BranchLabels { |
- Label* true_label; |
- Label* false_label; |
- Label* fall_through; |
-}; |
- |
- |
class InductionVariableInfo; |
@@ -2345,12 +2365,34 @@ class ComparisonInstr : public Definition { |
virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right) = 0; |
- virtual void EmitBranchCode(FlowGraphCompiler* compiler, |
- BranchInstr* branch) = 0; |
+ // Emits instructions to do the comparison and branch to the true or false |
+ // label depending on the result. This implementation will call |
+ // EmitComparisonCode and then generate the branch instructions afterwards. |
+ virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch); |
+ // Used by EmitBranchCode and EmitNativeCode depending on whether the boolean |
+ // is to be turned into branches or instantiated. May return a valid |
+ // condition in which case the caller is expected to emit a branch to the |
+ // true label based on that condition (or a branch to the false label on the |
+ // opposite condition). May also branch directly to the labels. |
virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler, |
BranchLabels labels) = 0; |
+#if defined(TARGET_ARCH_DBC) |
+ // On the DBC platform EmitNativeCode needs to know ahead of time what |
+ // 'Condition' will be returned by EmitComparisonCode. This call must return |
+ // the same result as EmitComparisonCode, but should not emit any |
+ // instructions. |
+ virtual Condition GetNextInstructionCondition(FlowGraphCompiler* compiler, |
+ BranchLabels labels) = 0; |
+#endif |
+ |
+ // Emits code that generates 'true' or 'false', depending on the comparison. |
+ // This implementation will call EmitComparisonCode. If EmitComparisonCode |
+ // does not use the labels (merely returning a condition) then EmitNativeCode |
+ // may be able to use the condition to avoid a branch. |
+ virtual void EmitNativeCode(FlowGraphCompiler* compiler); |
+ |
void SetDeoptId(const Instruction& instr) { CopyDeoptIdFrom(instr); } |
// Operation class id is computed from collected ICData. |
@@ -3038,7 +3080,7 @@ class StrictCompareInstr : public TemplateComparison<2, NoThrow, Pure> { |
bool needs_number_check, |
intptr_t deopt_id); |
- DECLARE_INSTRUCTION(StrictCompare) |
+ DECLARE_COMPARISON_INSTRUCTION(StrictCompare) |
virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); |
@@ -3048,11 +3090,6 @@ class StrictCompareInstr : public TemplateComparison<2, NoThrow, Pure> { |
virtual Definition* Canonicalize(FlowGraph* flow_graph); |
- virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch); |
- |
- virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler, |
- BranchLabels labels); |
- |
bool needs_number_check() const { return needs_number_check_; } |
void set_needs_number_check(bool value) { needs_number_check_ = value; } |
@@ -3083,7 +3120,7 @@ class TestSmiInstr : public TemplateComparison<2, NoThrow, Pure> { |
SetInputAt(1, right); |
} |
- DECLARE_INSTRUCTION(TestSmi); |
+ DECLARE_COMPARISON_INSTRUCTION(TestSmi); |
virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); |
@@ -3095,11 +3132,6 @@ class TestSmiInstr : public TemplateComparison<2, NoThrow, Pure> { |
return kTagged; |
} |
- virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch); |
- |
- virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler, |
- BranchLabels labels); |
- |
private: |
DISALLOW_COPY_AND_ASSIGN(TestSmiInstr); |
}; |
@@ -3124,7 +3156,7 @@ class TestCidsInstr : public TemplateComparison<1, NoThrow, Pure> { |
return cid_results_; |
} |
- DECLARE_INSTRUCTION(TestCids); |
+ DECLARE_COMPARISON_INSTRUCTION(TestCids); |
virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); |
@@ -3142,11 +3174,6 @@ class TestCidsInstr : public TemplateComparison<1, NoThrow, Pure> { |
virtual bool AttributesEqual(Instruction* other) const; |
- virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch); |
- |
- virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler, |
- BranchLabels labels); |
- |
void set_licm_hoisted(bool value) { licm_hoisted_ = value; } |
PRINT_OPERANDS_TO_SUPPORT |
@@ -3173,7 +3200,7 @@ class EqualityCompareInstr : public TemplateComparison<2, NoThrow, Pure> { |
set_operation_cid(cid); |
} |
- DECLARE_INSTRUCTION(EqualityCompare) |
+ DECLARE_COMPARISON_INSTRUCTION(EqualityCompare) |
virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); |
@@ -3181,11 +3208,6 @@ class EqualityCompareInstr : public TemplateComparison<2, NoThrow, Pure> { |
virtual bool ComputeCanDeoptimize() const { return false; } |
- virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch); |
- |
- virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler, |
- BranchLabels labels); |
- |
virtual Representation RequiredInputRepresentation(intptr_t idx) const { |
ASSERT((idx == 0) || (idx == 1)); |
if (operation_cid() == kDoubleCid) return kUnboxedDouble; |
@@ -3215,7 +3237,7 @@ class RelationalOpInstr : public TemplateComparison<2, NoThrow, Pure> { |
set_operation_cid(cid); |
} |
- DECLARE_INSTRUCTION(RelationalOp) |
+ DECLARE_COMPARISON_INSTRUCTION(RelationalOp) |
virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); |
@@ -3223,11 +3245,6 @@ class RelationalOpInstr : public TemplateComparison<2, NoThrow, Pure> { |
virtual bool ComputeCanDeoptimize() const { return false; } |
- virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch); |
- |
- virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler, |
- BranchLabels labels); |
- |
virtual Representation RequiredInputRepresentation(intptr_t idx) const { |
ASSERT((idx == 0) || (idx == 1)); |
if (operation_cid() == kDoubleCid) return kUnboxedDouble; |
@@ -5348,7 +5365,8 @@ class DoubleTestOpInstr : public TemplateComparison<1, NoThrow, Pure> { |
PRINT_OPERANDS_TO_SUPPORT |
- DECLARE_INSTRUCTION(DoubleTestOp) |
+ DECLARE_COMPARISON_INSTRUCTION(DoubleTestOp) |
+ |
virtual CompileType ComputeType() const; |
virtual Definition* Canonicalize(FlowGraph* flow_graph); |
@@ -5360,11 +5378,6 @@ class DoubleTestOpInstr : public TemplateComparison<1, NoThrow, Pure> { |
virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); |
- virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch); |
- |
- virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler, |
- BranchLabels labels); |
- |
private: |
const MethodRecognizer::Kind op_kind_; |
@@ -6934,6 +6947,14 @@ class CheckedSmiComparisonInstr : public TemplateComparison<2, Throws> { |
virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler, |
BranchLabels labels); |
+#if defined(TARGET_ARCH_DBC) |
+ virtual Condition GetNextInstructionCondition(FlowGraphCompiler* compiler, |
+ BranchLabels labels) { |
+ UNREACHABLE(); |
+ return INVALID_CONDITION; |
+ } |
+#endif |
+ |
virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); |
private: |