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