Remove extended_extra_ic_state and extend extra_ic_state instead.

BUG=
R=ishell@chromium.org

Review URL: https://codereview.chromium.org/159013003

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@19287 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
verwaest@chromium.org 2014-02-11 15:01:44 +00:00
parent 466df42ae8
commit 78f568d69c
9 changed files with 27 additions and 64 deletions

View File

@ -248,7 +248,7 @@ Handle<Code> HydrogenCodeStub::GenerateLightweightMissCode(Isolate* isolate) {
GetICState(), GetICState(),
GetExtraICState(), GetExtraICState(),
GetStubType(), GetStubType(),
GetStubFlags()); GetHandlerKind());
Handle<Code> new_object = factory->NewCode( Handle<Code> new_object = factory->NewCode(
desc, flags, masm.CodeObject(), NeedsImmovableCode()); desc, flags, masm.CodeObject(), NeedsImmovableCode());
return new_object; return new_object;

View File

@ -120,7 +120,7 @@ Handle<Code> PlatformCodeStub::GenerateCode(Isolate* isolate) {
GetICState(), GetICState(),
GetExtraICState(), GetExtraICState(),
GetStubType(), GetStubType(),
GetStubFlags()); GetHandlerKind());
Handle<Code> new_object = factory->NewCode( Handle<Code> new_object = factory->NewCode(
desc, flags, masm.CodeObject(), NeedsImmovableCode()); desc, flags, masm.CodeObject(), NeedsImmovableCode());
return new_object; return new_object;

View File

@ -188,8 +188,8 @@ class CodeStub BASE_EMBEDDED {
virtual Code::StubType GetStubType() { virtual Code::StubType GetStubType() {
return Code::NORMAL; return Code::NORMAL;
} }
virtual int GetStubFlags() { virtual Code::Kind GetHandlerKind() {
return -1; return Code::STUB;
} }
virtual void PrintName(StringStream* stream); virtual void PrintName(StringStream* stream);
@ -883,7 +883,7 @@ class HICStub: public HydrogenCodeStub {
class HandlerStub: public HICStub { class HandlerStub: public HICStub {
public: public:
virtual Code::Kind GetCodeKind() const { return Code::HANDLER; } virtual Code::Kind GetCodeKind() const { return Code::HANDLER; }
virtual int GetStubFlags() { return kind(); } virtual Code::Kind GetHandlerKind() { return kind(); }
protected: protected:
HandlerStub() : HICStub() { } HandlerStub() : HICStub() { }

View File

@ -212,7 +212,7 @@ Code::Flags CompilationInfo::flags() const {
code_stub()->GetICState(), code_stub()->GetICState(),
code_stub()->GetExtraICState(), code_stub()->GetExtraICState(),
code_stub()->GetStubType(), code_stub()->GetStubType(),
code_stub()->GetStubFlags()); code_stub()->GetHandlerKind());
} else { } else {
return Code::ComputeFlags(Code::OPTIMIZED_FUNCTION); return Code::ComputeFlags(Code::OPTIMIZED_FUNCTION);
} }

View File

@ -148,9 +148,7 @@ IC::IC(FrameDepth depth, Isolate* isolate)
pc_address_ = StackFrame::ResolveReturnAddressLocation(pc_address); pc_address_ = StackFrame::ResolveReturnAddressLocation(pc_address);
target_ = handle(raw_target(), isolate); target_ = handle(raw_target(), isolate);
state_ = target_->ic_state(); state_ = target_->ic_state();
extra_ic_state_ = target_->needs_extended_extra_ic_state(target_->kind()) extra_ic_state_ = target_->extra_ic_state();
? target_->extended_extra_ic_state()
: target_->extra_ic_state();
} }
@ -2371,7 +2369,7 @@ Type* BinaryOpIC::State::KindToType(Kind kind, Zone* zone) {
MaybeObject* BinaryOpIC::Transition(Handle<AllocationSite> allocation_site, MaybeObject* BinaryOpIC::Transition(Handle<AllocationSite> allocation_site,
Handle<Object> left, Handle<Object> left,
Handle<Object> right) { Handle<Object> right) {
State state(target()->extended_extra_ic_state()); State state(target()->extra_ic_state());
// Compute the actual result using the builtin for the binary operation. // Compute the actual result using the builtin for the binary operation.
Object* builtin = isolate()->js_builtins_object()->javascript_builtin( Object* builtin = isolate()->js_builtins_object()->javascript_builtin(
@ -2687,7 +2685,7 @@ RUNTIME_FUNCTION(Code*, CompareIC_Miss) {
void CompareNilIC::Clear(Address address, Code* target) { void CompareNilIC::Clear(Address address, Code* target) {
if (IsCleared(target)) return; if (IsCleared(target)) return;
ExtraICState state = target->extended_extra_ic_state(); ExtraICState state = target->extra_ic_state();
CompareNilICStub stub(state, HydrogenCodeStub::UNINITIALIZED); CompareNilICStub stub(state, HydrogenCodeStub::UNINITIALIZED);
stub.ClearState(); stub.ClearState();
@ -2709,7 +2707,7 @@ MaybeObject* CompareNilIC::DoCompareNilSlow(NilValue nil,
MaybeObject* CompareNilIC::CompareNil(Handle<Object> object) { MaybeObject* CompareNilIC::CompareNil(Handle<Object> object) {
ExtraICState extra_ic_state = target()->extended_extra_ic_state(); ExtraICState extra_ic_state = target()->extra_ic_state();
CompareNilICStub stub(extra_ic_state); CompareNilICStub stub(extra_ic_state);
@ -2793,7 +2791,7 @@ Builtins::JavaScript BinaryOpIC::TokenToJSBuiltin(Token::Value op) {
MaybeObject* ToBooleanIC::ToBoolean(Handle<Object> object) { MaybeObject* ToBooleanIC::ToBoolean(Handle<Object> object) {
ToBooleanStub stub(target()->extended_extra_ic_state()); ToBooleanStub stub(target()->extra_ic_state());
bool to_boolean_value = stub.UpdateStatus(object); bool to_boolean_value = stub.UpdateStatus(object);
Handle<Code> code = stub.GetCode(isolate()); Handle<Code> code = stub.GetCode(isolate());
set_target(*code); set_target(*code);

View File

@ -4194,16 +4194,8 @@ InlineCacheState Code::ic_state() {
ExtraICState Code::extra_ic_state() { ExtraICState Code::extra_ic_state() {
ASSERT((is_inline_cache_stub() && !needs_extended_extra_ic_state(kind()))
|| ic_state() == DEBUG_STUB);
return ExtractExtraICStateFromFlags(flags());
}
ExtraICState Code::extended_extra_ic_state() {
ASSERT(is_inline_cache_stub() || ic_state() == DEBUG_STUB); ASSERT(is_inline_cache_stub() || ic_state() == DEBUG_STUB);
ASSERT(needs_extended_extra_ic_state(kind())); return ExtractExtraICStateFromFlags(flags());
return ExtractExtendedExtraICStateFromFlags(flags());
} }
@ -4421,7 +4413,7 @@ void Code::set_back_edges_patched_for_osr(bool value) {
byte Code::to_boolean_state() { byte Code::to_boolean_state() {
return extended_extra_ic_state(); return extra_ic_state();
} }
@ -4492,17 +4484,16 @@ Code::Flags Code::ComputeFlags(Kind kind,
InlineCacheState ic_state, InlineCacheState ic_state,
ExtraICState extra_ic_state, ExtraICState extra_ic_state,
StubType type, StubType type,
int argc, Kind handler_kind,
InlineCacheHolderFlag holder) { InlineCacheHolderFlag holder) {
ASSERT(argc <= Code::kMaxArguments);
// Compute the bit mask. // Compute the bit mask.
unsigned int bits = KindField::encode(kind) unsigned int bits = KindField::encode(kind)
| ICStateField::encode(ic_state) | ICStateField::encode(ic_state)
| TypeField::encode(type) | TypeField::encode(type)
| ExtendedExtraICStateField::encode(extra_ic_state) | ExtraICStateField::encode(extra_ic_state)
| CacheHolderField::encode(holder); | CacheHolderField::encode(holder);
if (!Code::needs_extended_extra_ic_state(kind)) { if (handler_kind != STUB) {
bits |= (argc << kArgumentsCountShift); bits |= (handler_kind << kArgumentsCountShift);
} }
return static_cast<Flags>(bits); return static_cast<Flags>(bits);
} }
@ -4512,8 +4503,9 @@ Code::Flags Code::ComputeMonomorphicFlags(Kind kind,
ExtraICState extra_ic_state, ExtraICState extra_ic_state,
InlineCacheHolderFlag holder, InlineCacheHolderFlag holder,
StubType type, StubType type,
int argc) { Kind handler_kind) {
return ComputeFlags(kind, MONOMORPHIC, extra_ic_state, type, argc, holder); return ComputeFlags(kind, MONOMORPHIC, extra_ic_state, type,
handler_kind, holder);
} }
@ -4532,12 +4524,6 @@ ExtraICState Code::ExtractExtraICStateFromFlags(Flags flags) {
} }
ExtraICState Code::ExtractExtendedExtraICStateFromFlags(
Flags flags) {
return ExtendedExtraICStateField::decode(flags);
}
Code::StubType Code::ExtractTypeFromFlags(Flags flags) { Code::StubType Code::ExtractTypeFromFlags(Flags flags) {
return TypeField::decode(flags); return TypeField::decode(flags);
} }

View File

@ -11091,8 +11091,7 @@ void Code::Disassemble(const char* name, FILE* out) {
} }
if (is_inline_cache_stub()) { if (is_inline_cache_stub()) {
PrintF(out, "ic_state = %s\n", ICState2String(ic_state())); PrintF(out, "ic_state = %s\n", ICState2String(ic_state()));
PrintExtraICState(out, kind(), needs_extended_extra_ic_state(kind()) ? PrintExtraICState(out, kind(), extra_ic_state());
extended_extra_ic_state() : extra_ic_state());
if (ic_state() == MONOMORPHIC) { if (ic_state() == MONOMORPHIC) {
PrintF(out, "type = %s\n", StubType2String(type())); PrintF(out, "type = %s\n", StubType2String(type()));
} }

View File

@ -5194,16 +5194,6 @@ class Code: public HeapObject {
inline InlineCacheState ic_state(); // Only valid for IC stubs. inline InlineCacheState ic_state(); // Only valid for IC stubs.
inline ExtraICState extra_ic_state(); // Only valid for IC stubs. inline ExtraICState extra_ic_state(); // Only valid for IC stubs.
inline ExtraICState extended_extra_ic_state(); // Only valid for
// non-call IC stubs.
static bool needs_extended_extra_ic_state(Kind kind) {
// TODO(danno): This is a bit of a hack right now since there are still
// clients of this API that pass "extra" values in for argc. These clients
// should be retrofitted to used ExtendedExtraICState.
return kind == COMPARE_NIL_IC || kind == TO_BOOLEAN_IC ||
kind == BINARY_OP_IC;
}
inline StubType type(); // Only valid for monomorphic IC stubs. inline StubType type(); // Only valid for monomorphic IC stubs.
inline int arguments_count(); // Only valid for call IC stubs. inline int arguments_count(); // Only valid for call IC stubs.
@ -5344,7 +5334,7 @@ class Code: public HeapObject {
InlineCacheState ic_state = UNINITIALIZED, InlineCacheState ic_state = UNINITIALIZED,
ExtraICState extra_ic_state = kNoExtraICState, ExtraICState extra_ic_state = kNoExtraICState,
StubType type = NORMAL, StubType type = NORMAL,
int argc = -1, Kind handler_kind = STUB,
InlineCacheHolderFlag holder = OWN_MAP); InlineCacheHolderFlag holder = OWN_MAP);
static inline Flags ComputeMonomorphicFlags( static inline Flags ComputeMonomorphicFlags(
@ -5352,14 +5342,13 @@ class Code: public HeapObject {
ExtraICState extra_ic_state = kNoExtraICState, ExtraICState extra_ic_state = kNoExtraICState,
InlineCacheHolderFlag holder = OWN_MAP, InlineCacheHolderFlag holder = OWN_MAP,
StubType type = NORMAL, StubType type = NORMAL,
int argc = -1); Kind handler_kind = STUB);
static inline InlineCacheState ExtractICStateFromFlags(Flags flags); static inline InlineCacheState ExtractICStateFromFlags(Flags flags);
static inline StubType ExtractTypeFromFlags(Flags flags); static inline StubType ExtractTypeFromFlags(Flags flags);
static inline Kind ExtractKindFromFlags(Flags flags); static inline Kind ExtractKindFromFlags(Flags flags);
static inline InlineCacheHolderFlag ExtractCacheHolderFromFlags(Flags flags); static inline InlineCacheHolderFlag ExtractCacheHolderFromFlags(Flags flags);
static inline ExtraICState ExtractExtraICStateFromFlags(Flags flags); static inline ExtraICState ExtractExtraICStateFromFlags(Flags flags);
static inline ExtraICState ExtractExtendedExtraICStateFromFlags(Flags flags);
static inline int ExtractArgumentsCountFromFlags(Flags flags); static inline int ExtractArgumentsCountFromFlags(Flags flags);
static inline Flags RemoveTypeFromFlags(Flags flags); static inline Flags RemoveTypeFromFlags(Flags flags);
@ -5525,10 +5514,8 @@ class Code: public HeapObject {
class CacheHolderField: public BitField<InlineCacheHolderFlag, 5, 1> {}; class CacheHolderField: public BitField<InlineCacheHolderFlag, 5, 1> {};
class KindField: public BitField<Kind, 6, 4> {}; class KindField: public BitField<Kind, 6, 4> {};
// TODO(bmeurer): Bit 10 is available for free use. :-) // TODO(bmeurer): Bit 10 is available for free use. :-)
class ExtraICStateField: public BitField<ExtraICState, 11, 6> {}; class ExtraICStateField: public BitField<ExtraICState, 11,
class ExtendedExtraICStateField: public BitField<ExtraICState, 11,
PlatformSmiTagging::kSmiValueSize - 11 + 1> {}; // NOLINT PlatformSmiTagging::kSmiValueSize - 11 + 1> {}; // NOLINT
STATIC_ASSERT(ExtraICStateField::kShift == ExtendedExtraICStateField::kShift);
// KindSpecificFlags1 layout (STUB and OPTIMIZED_FUNCTION) // KindSpecificFlags1 layout (STUB and OPTIMIZED_FUNCTION)
static const int kStackSlotsFirstBit = 0; static const int kStackSlotsFirstBit = 0;
@ -5589,13 +5576,6 @@ class Code: public HeapObject {
PlatformSmiTagging::kSmiValueSize - Code::kArgumentsCountShift + 1; PlatformSmiTagging::kSmiValueSize - Code::kArgumentsCountShift + 1;
static const int kMaxArguments = (1 << kArgumentsBits) - 1; static const int kMaxArguments = (1 << kArgumentsBits) - 1;
// ICs can use either argument count or ExtendedExtraIC, since their storage
// overlaps.
STATIC_ASSERT(ExtraICStateField::kShift +
ExtraICStateField::kSize + kArgumentsBits ==
ExtendedExtraICStateField::kShift +
ExtendedExtraICStateField::kSize);
// This constant should be encodable in an ARM instruction. // This constant should be encodable in an ARM instruction.
static const int kFlagsNotUsedInLookup = static const int kFlagsNotUsedInLookup =
TypeField::kMask | CacheHolderField::kMask; TypeField::kMask | CacheHolderField::kMask;

View File

@ -222,7 +222,7 @@ void TypeFeedbackOracle::CompareType(TypeFeedbackId id,
CompareIC::StubInfoToType( CompareIC::StubInfoToType(
stub_minor_key, left_type, right_type, combined_type, map, zone()); stub_minor_key, left_type, right_type, combined_type, map, zone());
} else if (code->is_compare_nil_ic_stub()) { } else if (code->is_compare_nil_ic_stub()) {
CompareNilICStub stub(code->extended_extra_ic_state()); CompareNilICStub stub(code->extra_ic_state());
*combined_type = stub.GetType(zone(), map); *combined_type = stub.GetType(zone(), map);
*left_type = *right_type = stub.GetInputType(zone(), map); *left_type = *right_type = stub.GetInputType(zone(), map);
} }
@ -249,7 +249,7 @@ void TypeFeedbackOracle::BinaryType(TypeFeedbackId id,
} }
Handle<Code> code = Handle<Code>::cast(object); Handle<Code> code = Handle<Code>::cast(object);
ASSERT_EQ(Code::BINARY_OP_IC, code->kind()); ASSERT_EQ(Code::BINARY_OP_IC, code->kind());
BinaryOpIC::State state(code->extended_extra_ic_state()); BinaryOpIC::State state(code->extra_ic_state());
ASSERT_EQ(op, state.op()); ASSERT_EQ(op, state.op());
*left = state.GetLeftType(zone()); *left = state.GetLeftType(zone());
@ -271,7 +271,7 @@ Type* TypeFeedbackOracle::CountType(TypeFeedbackId id) {
if (!object->IsCode()) return Type::None(zone()); if (!object->IsCode()) return Type::None(zone());
Handle<Code> code = Handle<Code>::cast(object); Handle<Code> code = Handle<Code>::cast(object);
ASSERT_EQ(Code::BINARY_OP_IC, code->kind()); ASSERT_EQ(Code::BINARY_OP_IC, code->kind());
BinaryOpIC::State state(code->extended_extra_ic_state()); BinaryOpIC::State state(code->extra_ic_state());
return state.GetLeftType(zone()); return state.GetLeftType(zone());
} }