Index: runtime/vm/intermediate_language.h |
=================================================================== |
--- runtime/vm/intermediate_language.h (revision 29964) |
+++ runtime/vm/intermediate_language.h (working copy) |
@@ -661,8 +661,8 @@ |
M(BoxDouble) \ |
M(BoxFloat32x4) \ |
M(UnboxFloat32x4) \ |
- M(BoxInt32x4) \ |
- M(UnboxInt32x4) \ |
+ M(BoxInt32x4) \ |
+ M(UnboxInt32x4) \ |
M(UnboxInteger) \ |
M(BoxInteger) \ |
M(BinaryMintOp) \ |
@@ -689,14 +689,15 @@ |
M(Float32x4ZeroArg) \ |
M(Float32x4Clamp) \ |
M(Float32x4With) \ |
- M(Float32x4ToInt32x4) \ |
+ M(Float32x4ToInt32x4) \ |
M(MaterializeObject) \ |
- M(Int32x4BoolConstructor) \ |
- M(Int32x4GetFlag) \ |
- M(Int32x4Select) \ |
- M(Int32x4SetFlag) \ |
- M(Int32x4ToFloat32x4) \ |
- M(BinaryInt32x4Op) \ |
+ M(Int32x4BoolConstructor) \ |
+ M(Int32x4GetFlag) \ |
+ M(Int32x4Select) \ |
+ M(Int32x4SetFlag) \ |
+ M(Int32x4ToFloat32x4) \ |
+ M(BinaryInt32x4Op) \ |
+ M(TestSmi) \ |
#define FORWARD_DECLARATION(type) class type##Instr; |
@@ -2985,6 +2986,45 @@ |
}; |
+// Comparison instruction that is equivalent to the (left & right) == 0 |
+// comparison pattern. |
+class TestSmiInstr : public ComparisonInstr { |
+ public: |
+ TestSmiInstr(intptr_t token_pos, Token::Kind kind, Value* left, Value* right) |
+ : ComparisonInstr(token_pos, kind, left, right) { |
+ ASSERT(kind == Token::kEQ || kind == Token::kNE); |
+ } |
+ |
+ DECLARE_INSTRUCTION(TestSmi); |
+ virtual CompileType ComputeType() const; |
+ |
+ virtual bool CanDeoptimize() const { return false; } |
+ |
+ virtual bool CanBecomeDeoptimizationTarget() const { |
+ // TestSmi can be merged into Branch and thus needs an environment. |
+ return true; |
+ } |
+ |
+ virtual intptr_t DeoptimizationTarget() const { |
+ return GetDeoptId(); |
+ } |
+ |
+ virtual Representation RequiredInputRepresentation(intptr_t idx) const { |
+ return kTagged; |
+ } |
+ |
+ virtual EffectSet Effects() const { return EffectSet::None(); } |
+ |
+ virtual bool MayThrow() const { return false; } |
+ |
+ virtual void EmitBranchCode(FlowGraphCompiler* compiler, |
+ BranchInstr* branch); |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(TestSmiInstr); |
+}; |
+ |
+ |
class EqualityCompareInstr : public ComparisonInstr { |
public: |
EqualityCompareInstr(intptr_t token_pos, |
@@ -3001,7 +3041,6 @@ |
DECLARE_INSTRUCTION(EqualityCompare) |
virtual CompileType ComputeType() const; |
- virtual bool RecomputeType(); |
virtual void PrintOperandsTo(BufferFormatter* f) const; |
@@ -3051,7 +3090,6 @@ |
DECLARE_INSTRUCTION(RelationalOp) |
virtual CompileType ComputeType() const; |
- virtual bool RecomputeType(); |
virtual void PrintOperandsTo(BufferFormatter* f) const; |