| Index: src/code-stubs.h | 
| diff --git a/src/code-stubs.h b/src/code-stubs.h | 
| index a66d02ff00f051997bf44a2af9ce1586626d9ebd..5e0205f131e9cec99a35610766a10a6a60bf6906 100644 | 
| --- a/src/code-stubs.h | 
| +++ b/src/code-stubs.h | 
| @@ -204,6 +204,8 @@ class CodeStub BASE_EMBEDDED { | 
| Isolate* isolate() const { return isolate_; } | 
|  | 
| protected: | 
| +  explicit CodeStub(uint32_t key) : minor_key_(MinorKeyFromKey(key)) {} | 
| + | 
| // Generates the assembler code for the stub. | 
| virtual Handle<Code> GenerateCode() = 0; | 
|  | 
| @@ -274,6 +276,11 @@ class PlatformCodeStub : public CodeStub { | 
| protected: | 
| // Generates the assembler code for the stub. | 
| virtual void Generate(MacroAssembler* masm) = 0; | 
| + | 
| +  explicit PlatformCodeStub(uint32_t key) : CodeStub(key) {} | 
| + | 
| + private: | 
| +  DISALLOW_COPY_AND_ASSIGN(PlatformCodeStub); | 
| }; | 
|  | 
|  | 
| @@ -416,14 +423,6 @@ class HydrogenCodeStub : public CodeStub { | 
|  | 
| bool IsUninitialized() const { return IsMissBits::decode(minor_key_); } | 
|  | 
| -  // TODO(yangguo): we use this temporarily to construct the minor key. | 
| -  //   We want to remove NotMissMinorKey methods one by one and eventually | 
| -  //   remove HydrogenStub::MinorKey and turn CodeStub::MinorKey into a | 
| -  //   non-virtual method that directly returns minor_key_. | 
| -  virtual int NotMissMinorKey() const { | 
| -    return SubMinorKeyBits::decode(minor_key_); | 
| -  } | 
| - | 
| Handle<Code> GenerateLightweightMissCode(); | 
|  | 
| template<class StateType> | 
| @@ -438,16 +437,13 @@ class HydrogenCodeStub : public CodeStub { | 
|  | 
| static const int kSubMinorKeyBits = kStubMinorKeyBits - 1; | 
|  | 
| -  class SubMinorKeyBits : public BitField<int, 0, kSubMinorKeyBits> {}; | 
| - | 
| private: | 
| class IsMissBits : public BitField<bool, kSubMinorKeyBits, 1> {}; | 
| +  class SubMinorKeyBits : public BitField<int, 0, kSubMinorKeyBits> {}; | 
|  | 
| void GenerateLightweightMiss(MacroAssembler* masm); | 
| -  virtual uint32_t MinorKey() const { | 
| -    return IsMissBits::encode(IsUninitialized()) | | 
| -           SubMinorKeyBits::encode(NotMissMinorKey()); | 
| -  } | 
| + | 
| +  DISALLOW_COPY_AND_ASSIGN(HydrogenCodeStub); | 
| }; | 
|  | 
|  | 
| @@ -1123,10 +1119,15 @@ class BinaryOpICStub : public HydrogenCodeStub { | 
| public: | 
| BinaryOpICStub(Isolate* isolate, Token::Value op, | 
| OverwriteMode mode = NO_OVERWRITE) | 
| -      : HydrogenCodeStub(isolate, UNINITIALIZED), state_(isolate, op, mode) {} | 
| +      : HydrogenCodeStub(isolate, UNINITIALIZED) { | 
| +    BinaryOpIC::State state(isolate, op, mode); | 
| +    set_sub_minor_key(state.GetExtraICState()); | 
| +  } | 
|  | 
| explicit BinaryOpICStub(Isolate* isolate, const BinaryOpIC::State& state) | 
| -      : HydrogenCodeStub(isolate), state_(state) {} | 
| +      : HydrogenCodeStub(isolate) { | 
| +    set_sub_minor_key(state.GetExtraICState()); | 
| +  } | 
|  | 
| static void GenerateAheadOfTime(Isolate* isolate); | 
|  | 
| @@ -1140,34 +1141,31 @@ class BinaryOpICStub : public HydrogenCodeStub { | 
| } | 
|  | 
| virtual InlineCacheState GetICState() const V8_FINAL V8_OVERRIDE { | 
| -    return state_.GetICState(); | 
| +    return state().GetICState(); | 
| } | 
|  | 
| virtual ExtraICState GetExtraICState() const V8_FINAL V8_OVERRIDE { | 
| -    return state_.GetExtraICState(); | 
| +    return static_cast<ExtraICState>(sub_minor_key()); | 
| } | 
|  | 
| virtual Handle<Code> GenerateCode() V8_OVERRIDE; | 
|  | 
| -  const BinaryOpIC::State& state() const { return state_; } | 
| +  BinaryOpIC::State state() const { | 
| +    return BinaryOpIC::State(isolate(), GetExtraICState()); | 
| +  } | 
|  | 
| virtual void PrintState(OStream& os) const V8_FINAL V8_OVERRIDE;  // NOLINT | 
|  | 
| -  virtual Major MajorKey() const V8_OVERRIDE { return BinaryOpIC; } | 
| -  virtual int NotMissMinorKey() const V8_FINAL V8_OVERRIDE { | 
| -    return GetExtraICState(); | 
| -  } | 
| - | 
| // Parameters accessed via CodeStubGraphBuilder::GetParameter() | 
| static const int kLeft = 0; | 
| static const int kRight = 1; | 
|  | 
| private: | 
| +  virtual Major MajorKey() const V8_OVERRIDE { return BinaryOpIC; } | 
| + | 
| static void GenerateAheadOfTime(Isolate* isolate, | 
| const BinaryOpIC::State& state); | 
|  | 
| -  BinaryOpIC::State state_; | 
| - | 
| DISALLOW_COPY_AND_ASSIGN(BinaryOpICStub); | 
| }; | 
|  | 
| @@ -1309,37 +1307,34 @@ class StringAddStub V8_FINAL : public HydrogenCodeStub { | 
|  | 
| class ICCompareStub: public PlatformCodeStub { | 
| public: | 
| -  ICCompareStub(Isolate* isolate, | 
| -                Token::Value op, | 
| -                CompareIC::State left, | 
| -                CompareIC::State right, | 
| -                CompareIC::State handler) | 
| -      : PlatformCodeStub(isolate), | 
| -        op_(op), | 
| -        left_(left), | 
| -        right_(right), | 
| -        state_(handler) { | 
| +  ICCompareStub(Isolate* isolate, Token::Value op, CompareIC::State left, | 
| +                CompareIC::State right, CompareIC::State state) | 
| +      : PlatformCodeStub(isolate) { | 
| DCHECK(Token::IsCompareOp(op)); | 
| +    minor_key_ = OpBits::encode(op - Token::EQ) | LeftStateBits::encode(left) | | 
| +                 RightStateBits::encode(right) | StateBits::encode(state); | 
| } | 
|  | 
| virtual void Generate(MacroAssembler* masm); | 
|  | 
| void set_known_map(Handle<Map> map) { known_map_ = map; } | 
|  | 
| -  static void DecodeKey(uint32_t stub_key, CompareIC::State* left_state, | 
| -                        CompareIC::State* right_state, | 
| -                        CompareIC::State* handler_state, Token::Value* op); | 
| +  explicit ICCompareStub(uint32_t stub_key) : PlatformCodeStub(stub_key) { | 
| +    DCHECK_EQ(MajorKeyFromKey(stub_key), MajorKey()); | 
| +  } | 
|  | 
| virtual InlineCacheState GetICState() const; | 
|  | 
| - private: | 
| -  class OpField: public BitField<int, 0, 3> { }; | 
| -  class LeftStateField: public BitField<int, 3, 4> { }; | 
| -  class RightStateField: public BitField<int, 7, 4> { }; | 
| -  class HandlerStateField: public BitField<int, 11, 4> { }; | 
| +  Token::Value op() const { | 
| +    return static_cast<Token::Value>(Token::EQ + OpBits::decode(minor_key_)); | 
| +  } | 
|  | 
| +  CompareIC::State left() const { return LeftStateBits::decode(minor_key_); } | 
| +  CompareIC::State right() const { return RightStateBits::decode(minor_key_); } | 
| +  CompareIC::State state() const { return StateBits::decode(minor_key_); } | 
| + | 
| + private: | 
| virtual Major MajorKey() const V8_OVERRIDE { return CompareIC; } | 
| -  virtual uint32_t MinorKey() const; | 
|  | 
| virtual Code::Kind GetCodeKind() const { return Code::COMPARE_IC; } | 
|  | 
| @@ -1353,18 +1348,21 @@ class ICCompareStub: public PlatformCodeStub { | 
| void GenerateKnownObjects(MacroAssembler* masm); | 
| void GenerateGeneric(MacroAssembler* masm); | 
|  | 
| -  bool strict() const { return op_ == Token::EQ_STRICT; } | 
| -  Condition GetCondition() const { return CompareIC::ComputeCondition(op_); } | 
| +  bool strict() const { return op() == Token::EQ_STRICT; } | 
| +  Condition GetCondition() const { return CompareIC::ComputeCondition(op()); } | 
|  | 
| virtual void AddToSpecialCache(Handle<Code> new_object); | 
| virtual bool FindCodeInSpecialCache(Code** code_out); | 
| -  virtual bool UseSpecialCache() { return state_ == CompareIC::KNOWN_OBJECT; } | 
| +  virtual bool UseSpecialCache() { return state() == CompareIC::KNOWN_OBJECT; } | 
| + | 
| +  class OpBits : public BitField<int, 0, 3> {}; | 
| +  class LeftStateBits : public BitField<CompareIC::State, 3, 4> {}; | 
| +  class RightStateBits : public BitField<CompareIC::State, 7, 4> {}; | 
| +  class StateBits : public BitField<CompareIC::State, 11, 4> {}; | 
|  | 
| -  Token::Value op_; | 
| -  CompareIC::State left_; | 
| -  CompareIC::State right_; | 
| -  CompareIC::State state_; | 
| Handle<Map> known_map_; | 
| + | 
| +  DISALLOW_COPY_AND_ASSIGN(ICCompareStub); | 
| }; | 
|  | 
|  | 
| @@ -1373,16 +1371,15 @@ class CompareNilICStub : public HydrogenCodeStub  { | 
| Type* GetType(Zone* zone, Handle<Map> map = Handle<Map>()); | 
| Type* GetInputType(Zone* zone, Handle<Map> map); | 
|  | 
| -  CompareNilICStub(Isolate* isolate, NilValue nil) | 
| -      : HydrogenCodeStub(isolate), nil_value_(nil) { } | 
| +  CompareNilICStub(Isolate* isolate, NilValue nil) : HydrogenCodeStub(isolate) { | 
| +    set_sub_minor_key(NilValueBits::encode(nil)); | 
| +  } | 
|  | 
| -  CompareNilICStub(Isolate* isolate, | 
| -                   ExtraICState ic_state, | 
| +  CompareNilICStub(Isolate* isolate, ExtraICState ic_state, | 
| InitializationState init_state = INITIALIZED) | 
| -      : HydrogenCodeStub(isolate, init_state), | 
| -        nil_value_(NilValueField::decode(ic_state)), | 
| -        state_(State(TypesField::decode(ic_state))) { | 
| -      } | 
| +      : HydrogenCodeStub(isolate, init_state) { | 
| +    set_sub_minor_key(ic_state); | 
| +  } | 
|  | 
| static Handle<Code> GetUninitialized(Isolate* isolate, | 
| NilValue nil) { | 
| @@ -1399,9 +1396,10 @@ class CompareNilICStub : public HydrogenCodeStub  { | 
| } | 
|  | 
| virtual InlineCacheState GetICState() const { | 
| -    if (state_.Contains(GENERIC)) { | 
| +    State state = this->state(); | 
| +    if (state.Contains(GENERIC)) { | 
| return MEGAMORPHIC; | 
| -    } else if (state_.Contains(MONOMORPHIC_MAP)) { | 
| +    } else if (state.Contains(MONOMORPHIC_MAP)) { | 
| return MONOMORPHIC; | 
| } else { | 
| return PREMONOMORPHIC; | 
| @@ -1412,22 +1410,29 @@ class CompareNilICStub : public HydrogenCodeStub  { | 
|  | 
| virtual Handle<Code> GenerateCode() V8_OVERRIDE; | 
|  | 
| -  virtual ExtraICState GetExtraICState() const { | 
| -    return NilValueField::encode(nil_value_) | | 
| -           TypesField::encode(state_.ToIntegral()); | 
| -  } | 
| +  virtual ExtraICState GetExtraICState() const { return sub_minor_key(); } | 
|  | 
| void UpdateStatus(Handle<Object> object); | 
|  | 
| -  bool IsMonomorphic() const { return state_.Contains(MONOMORPHIC_MAP); } | 
| -  NilValue GetNilValue() const { return nil_value_; } | 
| -  void ClearState() { state_.RemoveAll(); } | 
| +  bool IsMonomorphic() const { return state().Contains(MONOMORPHIC_MAP); } | 
| + | 
| +  NilValue nil_value() const { return NilValueBits::decode(sub_minor_key()); } | 
| + | 
| +  void ClearState() { | 
| +    set_sub_minor_key(TypesBits::update(sub_minor_key(), 0)); | 
| +  } | 
|  | 
| virtual void PrintState(OStream& os) const V8_OVERRIDE;     // NOLINT | 
| virtual void PrintBaseName(OStream& os) const V8_OVERRIDE;  // NOLINT | 
|  | 
| private: | 
| -  friend class CompareNilIC; | 
| +  CompareNilICStub(Isolate* isolate, NilValue nil, | 
| +                   InitializationState init_state) | 
| +      : HydrogenCodeStub(isolate, init_state) { | 
| +    set_sub_minor_key(NilValueBits::encode(nil)); | 
| +  } | 
| + | 
| +  virtual Major MajorKey() const V8_OVERRIDE { return CompareNilIC; } | 
|  | 
| enum CompareNilType { | 
| UNDEFINED, | 
| @@ -1449,19 +1454,12 @@ class CompareNilICStub : public HydrogenCodeStub  { | 
| }; | 
| friend OStream& operator<<(OStream& os, const State& s); | 
|  | 
| -  CompareNilICStub(Isolate* isolate, | 
| -                   NilValue nil, | 
| -                   InitializationState init_state) | 
| -      : HydrogenCodeStub(isolate, init_state), nil_value_(nil) { } | 
| - | 
| -  class NilValueField : public BitField<NilValue, 0, 1> {}; | 
| -  class TypesField    : public BitField<byte,     1, NUMBER_OF_TYPES> {}; | 
| +  State state() const { return State(TypesBits::decode(sub_minor_key())); } | 
|  | 
| -  virtual Major MajorKey() const V8_OVERRIDE { return CompareNilIC; } | 
| -  virtual int NotMissMinorKey() const { return GetExtraICState(); } | 
| +  class NilValueBits : public BitField<NilValue, 0, 1> {}; | 
| +  class TypesBits : public BitField<byte, 1, NUMBER_OF_TYPES> {}; | 
|  | 
| -  NilValue nil_value_; | 
| -  State state_; | 
| +  friend class CompareNilIC; | 
|  | 
| DISALLOW_COPY_AND_ASSIGN(CompareNilICStub); | 
| }; | 
| @@ -1967,7 +1965,9 @@ class KeyedLoadICTrampolineStub : public LoadICTrampolineStub { | 
| class VectorLoadStub : public HydrogenCodeStub { | 
| public: | 
| explicit VectorLoadStub(Isolate* isolate, const LoadIC::State& state) | 
| -      : HydrogenCodeStub(isolate), state_(state) {} | 
| +      : HydrogenCodeStub(isolate) { | 
| +    set_sub_minor_key(state.GetExtraICState()); | 
| +  } | 
|  | 
| virtual Handle<Code> GenerateCode() V8_OVERRIDE; | 
|  | 
| @@ -1983,15 +1983,13 @@ class VectorLoadStub : public HydrogenCodeStub { | 
| } | 
|  | 
| virtual ExtraICState GetExtraICState() const V8_FINAL V8_OVERRIDE { | 
| -    return state_.GetExtraICState(); | 
| +    return static_cast<ExtraICState>(sub_minor_key()); | 
| } | 
|  | 
| -  virtual Major MajorKey() const V8_OVERRIDE { return VectorLoad; } | 
| - | 
| private: | 
| -  int NotMissMinorKey() const { return state_.GetExtraICState(); } | 
| +  virtual Major MajorKey() const V8_OVERRIDE { return VectorLoad; } | 
|  | 
| -  const LoadIC::State state_; | 
| +  LoadIC::State state() const { return LoadIC::State(GetExtraICState()); } | 
|  | 
| DISALLOW_COPY_AND_ASSIGN(VectorLoadStub); | 
| }; | 
|  |