| 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;
|
|
|
|
|