| Index: src/hydrogen-instructions.h
|
| diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h
|
| index cf3497f20d3a39ea321ae8ba49a4e18a153652cf..e43d0927d12df1e5c77e07bd629e5eb0890e5333 100644
|
| --- a/src/hydrogen-instructions.h
|
| +++ b/src/hydrogen-instructions.h
|
| @@ -1079,6 +1079,18 @@ class HValue : public ZoneObject {
|
| return new(zone) I(p1, p2, p3, p4, p5); \
|
| }
|
|
|
| +#define DECLARE_INSTRUCTION_FACTORY_P6(I, P1, P2, P3, P4, P5, P6) \
|
| + static I* New(Zone* zone, \
|
| + HValue* context, \
|
| + P1 p1, \
|
| + P2 p2, \
|
| + P3 p3, \
|
| + P4 p4, \
|
| + P5 p5, \
|
| + P6 p6) { \
|
| + return new(zone) I(p1, p2, p3, p4, p5, p6); \
|
| + }
|
| +
|
| #define DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P0(I) \
|
| static I* New(Zone* zone, HValue* context) { \
|
| return new(zone) I(context); \
|
| @@ -6413,8 +6425,9 @@ class ArrayInstructionInterface {
|
| public:
|
| virtual HValue* GetKey() = 0;
|
| virtual void SetKey(HValue* key) = 0;
|
| - virtual void SetIndexOffset(uint32_t index_offset) = 0;
|
| - virtual int MaxIndexOffsetBits() = 0;
|
| + virtual ElementsKind elements_kind() const = 0;
|
| + virtual void IncreaseBaseOffset(uint32_t base_offset) = 0;
|
| + virtual int MaxBaseOffsetBits() = 0;
|
| virtual bool IsDehoisted() = 0;
|
| virtual void SetDehoisted(bool is_dehoisted) = 0;
|
| virtual ~ArrayInstructionInterface() { }
|
| @@ -6426,6 +6439,8 @@ class ArrayInstructionInterface {
|
| };
|
|
|
|
|
| +static const int kDefaultKeyedHeaderOffsetSentinel = -1;
|
| +
|
| enum LoadKeyedHoleMode {
|
| NEVER_RETURN_HOLE,
|
| ALLOW_RETURN_HOLE
|
| @@ -6439,6 +6454,8 @@ class HLoadKeyed V8_FINAL
|
| ElementsKind);
|
| DECLARE_INSTRUCTION_FACTORY_P5(HLoadKeyed, HValue*, HValue*, HValue*,
|
| ElementsKind, LoadKeyedHoleMode);
|
| + DECLARE_INSTRUCTION_FACTORY_P6(HLoadKeyed, HValue*, HValue*, HValue*,
|
| + ElementsKind, LoadKeyedHoleMode, int);
|
|
|
| bool is_external() const {
|
| return IsExternalArrayElementsKind(elements_kind());
|
| @@ -6456,12 +6473,13 @@ class HLoadKeyed V8_FINAL
|
| return OperandAt(2);
|
| }
|
| bool HasDependency() const { return OperandAt(0) != OperandAt(2); }
|
| - uint32_t index_offset() { return IndexOffsetField::decode(bit_field_); }
|
| - void SetIndexOffset(uint32_t index_offset) {
|
| - bit_field_ = IndexOffsetField::update(bit_field_, index_offset);
|
| + uint32_t base_offset() { return BaseOffsetField::decode(bit_field_); }
|
| + void IncreaseBaseOffset(uint32_t base_offset) {
|
| + base_offset += BaseOffsetField::decode(bit_field_);
|
| + bit_field_ = BaseOffsetField::update(bit_field_, base_offset);
|
| }
|
| - virtual int MaxIndexOffsetBits() {
|
| - return kBitsForIndexOffset;
|
| + virtual int MaxBaseOffsetBits() {
|
| + return kBitsForBaseOffset;
|
| }
|
| HValue* GetKey() { return key(); }
|
| void SetKey(HValue* key) { SetOperandAt(1, key); }
|
| @@ -6511,7 +6529,7 @@ class HLoadKeyed V8_FINAL
|
| if (!other->IsLoadKeyed()) return false;
|
| HLoadKeyed* other_load = HLoadKeyed::cast(other);
|
|
|
| - if (IsDehoisted() && index_offset() != other_load->index_offset())
|
| + if (IsDehoisted() && base_offset() != other_load->base_offset())
|
| return false;
|
| return elements_kind() == other_load->elements_kind();
|
| }
|
| @@ -6521,10 +6539,15 @@ class HLoadKeyed V8_FINAL
|
| HValue* key,
|
| HValue* dependency,
|
| ElementsKind elements_kind,
|
| - LoadKeyedHoleMode mode = NEVER_RETURN_HOLE)
|
| + LoadKeyedHoleMode mode = NEVER_RETURN_HOLE,
|
| + int offset = kDefaultKeyedHeaderOffsetSentinel)
|
| : bit_field_(0) {
|
| + offset = offset == kDefaultKeyedHeaderOffsetSentinel
|
| + ? GetDefaultHeaderSizeForElementsKind(elements_kind)
|
| + : offset;
|
| bit_field_ = ElementsKindField::encode(elements_kind) |
|
| - HoleModeField::encode(mode);
|
| + HoleModeField::encode(mode) |
|
| + BaseOffsetField::encode(offset);
|
|
|
| SetOperandAt(0, obj);
|
| SetOperandAt(1, key);
|
| @@ -6587,16 +6610,16 @@ class HLoadKeyed V8_FINAL
|
| enum LoadKeyedBits {
|
| kBitsForElementsKind = 5,
|
| kBitsForHoleMode = 1,
|
| - kBitsForIndexOffset = 25,
|
| + kBitsForBaseOffset = 25,
|
| kBitsForIsDehoisted = 1,
|
|
|
| kStartElementsKind = 0,
|
| kStartHoleMode = kStartElementsKind + kBitsForElementsKind,
|
| - kStartIndexOffset = kStartHoleMode + kBitsForHoleMode,
|
| - kStartIsDehoisted = kStartIndexOffset + kBitsForIndexOffset
|
| + kStartBaseOffset = kStartHoleMode + kBitsForHoleMode,
|
| + kStartIsDehoisted = kStartBaseOffset + kBitsForBaseOffset
|
| };
|
|
|
| - STATIC_ASSERT((kBitsForElementsKind + kBitsForIndexOffset +
|
| + STATIC_ASSERT((kBitsForElementsKind + kBitsForBaseOffset +
|
| kBitsForIsDehoisted) <= sizeof(uint32_t)*8);
|
| STATIC_ASSERT(kElementsKindCount <= (1 << kBitsForElementsKind));
|
| class ElementsKindField:
|
| @@ -6605,8 +6628,8 @@ class HLoadKeyed V8_FINAL
|
| class HoleModeField:
|
| public BitField<LoadKeyedHoleMode, kStartHoleMode, kBitsForHoleMode>
|
| {}; // NOLINT
|
| - class IndexOffsetField:
|
| - public BitField<uint32_t, kStartIndexOffset, kBitsForIndexOffset>
|
| + class BaseOffsetField:
|
| + public BitField<uint32_t, kStartBaseOffset, kBitsForBaseOffset>
|
| {}; // NOLINT
|
| class IsDehoistedField:
|
| public BitField<bool, kStartIsDehoisted, kBitsForIsDehoisted>
|
| @@ -6823,6 +6846,8 @@ class HStoreKeyed V8_FINAL
|
| ElementsKind);
|
| DECLARE_INSTRUCTION_FACTORY_P5(HStoreKeyed, HValue*, HValue*, HValue*,
|
| ElementsKind, StoreFieldOrKeyedMode);
|
| + DECLARE_INSTRUCTION_FACTORY_P6(HStoreKeyed, HValue*, HValue*, HValue*,
|
| + ElementsKind, StoreFieldOrKeyedMode, int);
|
|
|
| virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE {
|
| // kind_fast: tagged[int32] = tagged
|
| @@ -6895,9 +6920,11 @@ class HStoreKeyed V8_FINAL
|
| }
|
| StoreFieldOrKeyedMode store_mode() const { return store_mode_; }
|
| ElementsKind elements_kind() const { return elements_kind_; }
|
| - uint32_t index_offset() { return index_offset_; }
|
| - void SetIndexOffset(uint32_t index_offset) { index_offset_ = index_offset; }
|
| - virtual int MaxIndexOffsetBits() {
|
| + uint32_t base_offset() { return base_offset_; }
|
| + void IncreaseBaseOffset(uint32_t base_offset) {
|
| + base_offset_ += base_offset;
|
| + }
|
| + virtual int MaxBaseOffsetBits() {
|
| return 31 - ElementsKindToShiftSize(elements_kind_);
|
| }
|
| HValue* GetKey() { return key(); }
|
| @@ -6941,9 +6968,12 @@ class HStoreKeyed V8_FINAL
|
| private:
|
| HStoreKeyed(HValue* obj, HValue* key, HValue* val,
|
| ElementsKind elements_kind,
|
| - StoreFieldOrKeyedMode store_mode = INITIALIZING_STORE)
|
| + StoreFieldOrKeyedMode store_mode = INITIALIZING_STORE,
|
| + int offset = kDefaultKeyedHeaderOffsetSentinel)
|
| : elements_kind_(elements_kind),
|
| - index_offset_(0),
|
| + base_offset_(offset == kDefaultKeyedHeaderOffsetSentinel
|
| + ? GetDefaultHeaderSizeForElementsKind(elements_kind)
|
| + : offset),
|
| is_dehoisted_(false),
|
| is_uninitialized_(false),
|
| store_mode_(store_mode),
|
| @@ -6983,7 +7013,7 @@ class HStoreKeyed V8_FINAL
|
| }
|
|
|
| ElementsKind elements_kind_;
|
| - uint32_t index_offset_;
|
| + uint32_t base_offset_;
|
| bool is_dehoisted_ : 1;
|
| bool is_uninitialized_ : 1;
|
| StoreFieldOrKeyedMode store_mode_: 1;
|
|
|