Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(53)

Unified Diff: src/code-stubs.h

Issue 529773002: Minor-key-ify four stubs. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: fix some compilation issues Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/arm64/macro-assembler-arm64.cc ('k') | src/code-stubs.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
};
« no previous file with comments | « src/arm64/macro-assembler-arm64.cc ('k') | src/code-stubs.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698