Index: src/hydrogen-instructions.h |
diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h |
index fcd7c2c24bfb5647cf17b2e51a0fe1a8ebebf297..ff02212dcb892945caa1a9c538d2da43f3bc3ae8 100644 |
--- a/src/hydrogen-instructions.h |
+++ b/src/hydrogen-instructions.h |
@@ -127,6 +127,7 @@ class LChunkBuilder; |
V(MapEnumLength) \ |
V(MathFloorOfDiv) \ |
V(MathMinMax) \ |
+ V(MaybeGrowElements) \ |
V(Mod) \ |
V(Mul) \ |
V(OsrEntry) \ |
@@ -965,6 +966,12 @@ std::ostream& operator<<(std::ostream& os, const ChangesOf& v); |
return new (zone) I(context, p1, p2, p3, p4, p5); \ |
} |
+#define DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P6(I, P1, P2, P3, P4, P5, P6) \ |
+ static I* New(Isolate* isolate, Zone* zone, HValue* context, P1 p1, P2 p2, \ |
+ P3 p3, P4 p4, P5 p5, P6 p6) { \ |
+ return new (zone) I(context, p1, p2, p3, p4, p5, p6); \ |
+ } |
+ |
// A helper class to represent per-operand position information attached to |
// the HInstruction in the compact form. Uses tagging to distinguish between |
@@ -7558,6 +7565,58 @@ class HTrapAllocationMemento final : public HTemplateInstruction<1> { |
}; |
+class HMaybeGrowElements final : public HTemplateInstruction<5> { |
+ public: |
+ DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P6(HMaybeGrowElements, HValue*, |
+ HValue*, HValue*, HValue*, bool, |
+ ElementsKind); |
+ |
+ Representation RequiredInputRepresentation(int index) override { |
+ if (index < 3) { |
+ return Representation::Tagged(); |
+ } |
+ DCHECK(index == 3 || index == 4); |
+ return Representation::Integer32(); |
+ } |
+ |
+ HValue* context() const { return OperandAt(0); } |
+ HValue* object() const { return OperandAt(1); } |
+ HValue* elements() const { return OperandAt(2); } |
+ HValue* key() const { return OperandAt(3); } |
+ HValue* current_capacity() const { return OperandAt(4); } |
+ |
+ bool is_js_array() const { return is_js_array_; } |
+ ElementsKind kind() const { return kind_; } |
+ |
+ DECLARE_CONCRETE_INSTRUCTION(MaybeGrowElements) |
+ |
+ protected: |
+ bool DataEquals(HValue* other) override { return true; } |
+ |
+ private: |
+ explicit HMaybeGrowElements(HValue* context, HValue* object, HValue* elements, |
+ HValue* key, HValue* current_capacity, |
+ bool is_js_array, ElementsKind kind) { |
+ is_js_array_ = is_js_array; |
+ kind_ = kind; |
+ |
+ SetOperandAt(0, context); |
+ SetOperandAt(1, object); |
+ SetOperandAt(2, elements); |
+ SetOperandAt(3, key); |
+ SetOperandAt(4, current_capacity); |
+ |
+ SetFlag(kUseGVN); |
+ SetChangesFlag(kElementsPointer); |
+ SetChangesFlag(kNewSpacePromotion); |
+ set_representation(Representation::Tagged()); |
+ } |
+ |
+ bool is_js_array_; |
+ ElementsKind kind_; |
+}; |
+ |
+ |
class HToFastProperties final : public HUnaryOperation { |
public: |
DECLARE_INSTRUCTION_FACTORY_P1(HToFastProperties, HValue*); |