Index: runtime/vm/intermediate_language.h |
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h |
index 7307344385661d950e42e516f05ba5c558cf60b5..bfcb8a767726f7262ab23fc717f2cc414d8a554f 100644 |
--- a/runtime/vm/intermediate_language.h |
+++ b/runtime/vm/intermediate_language.h |
@@ -512,6 +512,7 @@ class EmbeddedArray<T, 0> { |
M(ShiftMintOp) \ |
M(UnaryMintOp) \ |
M(CheckArrayBound) \ |
+ M(GenericCheckBound) \ |
M(Constraint) \ |
M(StringToCharCode) \ |
M(OneByteStringFromCharCode) \ |
@@ -7928,6 +7929,35 @@ class CheckArrayBoundInstr : public TemplateInstruction<2, NoThrow, Pure> { |
}; |
+class GenericCheckBoundInstr : public TemplateInstruction<2, Throws, NoCSE> { |
+ public: |
+ GenericCheckBoundInstr(Value* length, Value* index, intptr_t deopt_id) |
+ : TemplateInstruction(deopt_id) { |
+ SetInputAt(kLengthPos, length); |
+ SetInputAt(kIndexPos, index); |
+ } |
+ |
+ Value* length() const { return inputs_[kLengthPos]; } |
+ Value* index() const { return inputs_[kIndexPos]; } |
+ |
+ virtual EffectSet Effects() const { return EffectSet::None(); } |
+ virtual EffectSet Dependencies() const { return EffectSet::None(); } |
+ |
+ DECLARE_INSTRUCTION(GenericCheckBound) |
+ |
+ virtual bool CanDeoptimize() const { return true; } |
+ |
+ // Give a name to the location/input indices. |
+ enum { |
+ kLengthPos = 0, |
+ kIndexPos = 1 |
+ }; |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(GenericCheckBoundInstr); |
+}; |
+ |
+ |
class UnboxedIntConverterInstr : public TemplateDefinition<1, NoThrow> { |
public: |
UnboxedIntConverterInstr(Representation from, |