Chromium Code Reviews| Index: runtime/vm/intermediate_language.h |
| diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h |
| index 1fe4377941f990987729271f0acee23ef76ad06c..aac9677fb84b432f1d0997b86e946a7ae23ee792 100644 |
| --- a/runtime/vm/intermediate_language.h |
| +++ b/runtime/vm/intermediate_language.h |
| @@ -497,6 +497,7 @@ class EmbeddedArray<T, 0> { |
| M(UnboxedConstant) \ |
| M(CheckEitherNonSmi) \ |
| M(BinaryDoubleOp) \ |
| + M(DoubleTestOp) \ |
| M(MathUnary) \ |
| M(MathMinMax) \ |
| M(Box) \ |
| @@ -5343,6 +5344,54 @@ class BinaryDoubleOpInstr : public TemplateDefinition<2, NoThrow, Pure> { |
| }; |
| +class DoubleTestOpInstr : public TemplateDefinition<1, NoThrow, Pure> { |
|
Florian Schneider
2016/10/18 16:03:23
Can you make this inherit from ComparisonInstr?
T
zra
2016/10/18 17:20:40
Are there any other cases where we use an inlined
Florian Schneider
2016/10/18 20:34:20
I'm not aware of any. It should be straight-forwar
zra
2016/10/18 22:36:32
Does the inliner magically know that it can take a
|
| + public: |
| + DoubleTestOpInstr(MethodRecognizer::Kind op_kind, |
| + Value* d, |
| + intptr_t deopt_id, |
| + TokenPosition token_pos) |
| + : TemplateDefinition(deopt_id), |
| + op_kind_(op_kind), |
| + token_pos_(token_pos) { |
| + SetInputAt(0, d); |
| + } |
| + |
| + Value* value() const { return inputs_[0]; } |
| + |
| + MethodRecognizer::Kind op_kind() const { return op_kind_; } |
| + |
| + virtual TokenPosition token_pos() const { return token_pos_; } |
| + |
| + virtual bool CanDeoptimize() const { return false; } |
| + |
| + virtual Representation RequiredInputRepresentation(intptr_t idx) const { |
| + ASSERT(idx == 0); |
| + return kUnboxedDouble; |
| + } |
| + |
| + virtual intptr_t DeoptimizationTarget() const { |
| + // Direct access since this instruction cannot deoptimize, and the deopt-id |
| + // was inherited from another instruction that could deoptimize. |
| + return GetDeoptId(); |
| + } |
| + |
| + PRINT_OPERANDS_TO_SUPPORT |
| + |
| + DECLARE_INSTRUCTION(DoubleTestOp) |
| + virtual CompileType ComputeType() const; |
| + |
| + virtual Definition* Canonicalize(FlowGraph* flow_graph); |
| + |
| + virtual bool AttributesEqual(Instruction* other) const { return true; } |
| + |
| + private: |
| + const MethodRecognizer::Kind op_kind_; |
| + const TokenPosition token_pos_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(DoubleTestOpInstr); |
| +}; |
| + |
| + |
| class BinaryFloat32x4OpInstr : public TemplateDefinition<2, NoThrow, Pure> { |
| public: |
| BinaryFloat32x4OpInstr(Token::Kind op_kind, |