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:
parent
466df42ae8
commit
78f568d69c
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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() { }
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
12
src/ic.cc
12
src/ic.cc
@ -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);
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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()));
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user