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(),
|
||||
GetExtraICState(),
|
||||
GetStubType(),
|
||||
GetStubFlags());
|
||||
GetHandlerKind());
|
||||
Handle<Code> new_object = factory->NewCode(
|
||||
desc, flags, masm.CodeObject(), NeedsImmovableCode());
|
||||
return new_object;
|
||||
|
@ -120,7 +120,7 @@ Handle<Code> PlatformCodeStub::GenerateCode(Isolate* isolate) {
|
||||
GetICState(),
|
||||
GetExtraICState(),
|
||||
GetStubType(),
|
||||
GetStubFlags());
|
||||
GetHandlerKind());
|
||||
Handle<Code> new_object = factory->NewCode(
|
||||
desc, flags, masm.CodeObject(), NeedsImmovableCode());
|
||||
return new_object;
|
||||
|
@ -188,8 +188,8 @@ class CodeStub BASE_EMBEDDED {
|
||||
virtual Code::StubType GetStubType() {
|
||||
return Code::NORMAL;
|
||||
}
|
||||
virtual int GetStubFlags() {
|
||||
return -1;
|
||||
virtual Code::Kind GetHandlerKind() {
|
||||
return Code::STUB;
|
||||
}
|
||||
|
||||
virtual void PrintName(StringStream* stream);
|
||||
@ -883,7 +883,7 @@ class HICStub: public HydrogenCodeStub {
|
||||
class HandlerStub: public HICStub {
|
||||
public:
|
||||
virtual Code::Kind GetCodeKind() const { return Code::HANDLER; }
|
||||
virtual int GetStubFlags() { return kind(); }
|
||||
virtual Code::Kind GetHandlerKind() { return kind(); }
|
||||
|
||||
protected:
|
||||
HandlerStub() : HICStub() { }
|
||||
|
@ -212,7 +212,7 @@ Code::Flags CompilationInfo::flags() const {
|
||||
code_stub()->GetICState(),
|
||||
code_stub()->GetExtraICState(),
|
||||
code_stub()->GetStubType(),
|
||||
code_stub()->GetStubFlags());
|
||||
code_stub()->GetHandlerKind());
|
||||
} else {
|
||||
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);
|
||||
target_ = handle(raw_target(), isolate);
|
||||
state_ = target_->ic_state();
|
||||
extra_ic_state_ = target_->needs_extended_extra_ic_state(target_->kind())
|
||||
? target_->extended_extra_ic_state()
|
||||
: target_->extra_ic_state();
|
||||
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,
|
||||
Handle<Object> left,
|
||||
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.
|
||||
Object* builtin = isolate()->js_builtins_object()->javascript_builtin(
|
||||
@ -2687,7 +2685,7 @@ RUNTIME_FUNCTION(Code*, CompareIC_Miss) {
|
||||
|
||||
void CompareNilIC::Clear(Address address, Code* target) {
|
||||
if (IsCleared(target)) return;
|
||||
ExtraICState state = target->extended_extra_ic_state();
|
||||
ExtraICState state = target->extra_ic_state();
|
||||
|
||||
CompareNilICStub stub(state, HydrogenCodeStub::UNINITIALIZED);
|
||||
stub.ClearState();
|
||||
@ -2709,7 +2707,7 @@ MaybeObject* CompareNilIC::DoCompareNilSlow(NilValue nil,
|
||||
|
||||
|
||||
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);
|
||||
|
||||
@ -2793,7 +2791,7 @@ Builtins::JavaScript BinaryOpIC::TokenToJSBuiltin(Token::Value op) {
|
||||
|
||||
|
||||
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);
|
||||
Handle<Code> code = stub.GetCode(isolate());
|
||||
set_target(*code);
|
||||
|
@ -4194,16 +4194,8 @@ InlineCacheState Code::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(needs_extended_extra_ic_state(kind()));
|
||||
return ExtractExtendedExtraICStateFromFlags(flags());
|
||||
return ExtractExtraICStateFromFlags(flags());
|
||||
}
|
||||
|
||||
|
||||
@ -4421,7 +4413,7 @@ void Code::set_back_edges_patched_for_osr(bool value) {
|
||||
|
||||
|
||||
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,
|
||||
ExtraICState extra_ic_state,
|
||||
StubType type,
|
||||
int argc,
|
||||
Kind handler_kind,
|
||||
InlineCacheHolderFlag holder) {
|
||||
ASSERT(argc <= Code::kMaxArguments);
|
||||
// Compute the bit mask.
|
||||
unsigned int bits = KindField::encode(kind)
|
||||
| ICStateField::encode(ic_state)
|
||||
| TypeField::encode(type)
|
||||
| ExtendedExtraICStateField::encode(extra_ic_state)
|
||||
| ExtraICStateField::encode(extra_ic_state)
|
||||
| CacheHolderField::encode(holder);
|
||||
if (!Code::needs_extended_extra_ic_state(kind)) {
|
||||
bits |= (argc << kArgumentsCountShift);
|
||||
if (handler_kind != STUB) {
|
||||
bits |= (handler_kind << kArgumentsCountShift);
|
||||
}
|
||||
return static_cast<Flags>(bits);
|
||||
}
|
||||
@ -4512,8 +4503,9 @@ Code::Flags Code::ComputeMonomorphicFlags(Kind kind,
|
||||
ExtraICState extra_ic_state,
|
||||
InlineCacheHolderFlag holder,
|
||||
StubType type,
|
||||
int argc) {
|
||||
return ComputeFlags(kind, MONOMORPHIC, extra_ic_state, type, argc, holder);
|
||||
Kind handler_kind) {
|
||||
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) {
|
||||
return TypeField::decode(flags);
|
||||
}
|
||||
|
@ -11091,8 +11091,7 @@ void Code::Disassemble(const char* name, FILE* out) {
|
||||
}
|
||||
if (is_inline_cache_stub()) {
|
||||
PrintF(out, "ic_state = %s\n", ICState2String(ic_state()));
|
||||
PrintExtraICState(out, kind(), needs_extended_extra_ic_state(kind()) ?
|
||||
extended_extra_ic_state() : extra_ic_state());
|
||||
PrintExtraICState(out, kind(), extra_ic_state());
|
||||
if (ic_state() == MONOMORPHIC) {
|
||||
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 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 int arguments_count(); // Only valid for call IC stubs.
|
||||
|
||||
@ -5344,7 +5334,7 @@ class Code: public HeapObject {
|
||||
InlineCacheState ic_state = UNINITIALIZED,
|
||||
ExtraICState extra_ic_state = kNoExtraICState,
|
||||
StubType type = NORMAL,
|
||||
int argc = -1,
|
||||
Kind handler_kind = STUB,
|
||||
InlineCacheHolderFlag holder = OWN_MAP);
|
||||
|
||||
static inline Flags ComputeMonomorphicFlags(
|
||||
@ -5352,14 +5342,13 @@ class Code: public HeapObject {
|
||||
ExtraICState extra_ic_state = kNoExtraICState,
|
||||
InlineCacheHolderFlag holder = OWN_MAP,
|
||||
StubType type = NORMAL,
|
||||
int argc = -1);
|
||||
Kind handler_kind = STUB);
|
||||
|
||||
static inline InlineCacheState ExtractICStateFromFlags(Flags flags);
|
||||
static inline StubType ExtractTypeFromFlags(Flags flags);
|
||||
static inline Kind ExtractKindFromFlags(Flags flags);
|
||||
static inline InlineCacheHolderFlag ExtractCacheHolderFromFlags(Flags flags);
|
||||
static inline ExtraICState ExtractExtraICStateFromFlags(Flags flags);
|
||||
static inline ExtraICState ExtractExtendedExtraICStateFromFlags(Flags flags);
|
||||
static inline int ExtractArgumentsCountFromFlags(Flags flags);
|
||||
|
||||
static inline Flags RemoveTypeFromFlags(Flags flags);
|
||||
@ -5525,10 +5514,8 @@ class Code: public HeapObject {
|
||||
class CacheHolderField: public BitField<InlineCacheHolderFlag, 5, 1> {};
|
||||
class KindField: public BitField<Kind, 6, 4> {};
|
||||
// TODO(bmeurer): Bit 10 is available for free use. :-)
|
||||
class ExtraICStateField: public BitField<ExtraICState, 11, 6> {};
|
||||
class ExtendedExtraICStateField: public BitField<ExtraICState, 11,
|
||||
class ExtraICStateField: public BitField<ExtraICState, 11,
|
||||
PlatformSmiTagging::kSmiValueSize - 11 + 1> {}; // NOLINT
|
||||
STATIC_ASSERT(ExtraICStateField::kShift == ExtendedExtraICStateField::kShift);
|
||||
|
||||
// KindSpecificFlags1 layout (STUB and OPTIMIZED_FUNCTION)
|
||||
static const int kStackSlotsFirstBit = 0;
|
||||
@ -5589,13 +5576,6 @@ class Code: public HeapObject {
|
||||
PlatformSmiTagging::kSmiValueSize - Code::kArgumentsCountShift + 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.
|
||||
static const int kFlagsNotUsedInLookup =
|
||||
TypeField::kMask | CacheHolderField::kMask;
|
||||
|
@ -222,7 +222,7 @@ void TypeFeedbackOracle::CompareType(TypeFeedbackId id,
|
||||
CompareIC::StubInfoToType(
|
||||
stub_minor_key, left_type, right_type, combined_type, map, zone());
|
||||
} 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);
|
||||
*left_type = *right_type = stub.GetInputType(zone(), map);
|
||||
}
|
||||
@ -249,7 +249,7 @@ void TypeFeedbackOracle::BinaryType(TypeFeedbackId id,
|
||||
}
|
||||
Handle<Code> code = Handle<Code>::cast(object);
|
||||
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());
|
||||
|
||||
*left = state.GetLeftType(zone());
|
||||
@ -271,7 +271,7 @@ Type* TypeFeedbackOracle::CountType(TypeFeedbackId id) {
|
||||
if (!object->IsCode()) return Type::None(zone());
|
||||
Handle<Code> code = Handle<Code>::cast(object);
|
||||
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());
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user