Move responsibility for definition of ExtraICState bits into the ICs.

Currently it's in the Code object for some ICs and in ICs for other ICs.
This should make it easier to alter bits as needed.

2) Recover an extra bit in the code object to give us 6 bits for the extra ic state. We'll need it soon to store contextual state.

3) Cleanup code that treated StrictMode enum and ExtraICState enum as interchangeble.

R=verwaest@chromium.org

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

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@18136 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent f2351945
......@@ -341,7 +341,7 @@ Object* CallIC_Miss(Arguments args);
void CallICBase::GenerateMonomorphicCacheProbe(MacroAssembler* masm,
int argc,
Code::Kind kind,
Code::ExtraICState extra_state) {
ExtraICState extra_state) {
// ----------- S t a t e -------------
// -- r1 : receiver
// -- r2 : name
......@@ -445,7 +445,7 @@ void CallICBase::GenerateNormal(MacroAssembler* masm, int argc) {
void CallICBase::GenerateMiss(MacroAssembler* masm,
int argc,
IC::UtilityId id,
Code::ExtraICState extra_state) {
ExtraICState extra_state) {
// ----------- S t a t e -------------
// -- r2 : name
// -- lr : return address
......@@ -511,7 +511,7 @@ void CallICBase::GenerateMiss(MacroAssembler* masm,
void CallIC::GenerateMegamorphic(MacroAssembler* masm,
int argc,
Code::ExtraICState extra_ic_state) {
ExtraICState extra_ic_state) {
// ----------- S t a t e -------------
// -- r2 : name
// -- lr : return address
......@@ -610,7 +610,7 @@ void KeyedCallIC::GenerateMegamorphic(MacroAssembler* masm, int argc) {
GenerateMonomorphicCacheProbe(masm,
argc,
Code::KEYED_CALL_IC,
Code::kNoExtraICState);
kNoExtraICState);
// Fall through on miss.
__ bind(&slow_call);
......@@ -656,7 +656,7 @@ void LoadIC::GenerateMegamorphic(MacroAssembler* masm) {
// Probe the stub cache.
Code::Flags flags = Code::ComputeFlags(
Code::HANDLER, MONOMORPHIC, Code::kNoExtraICState,
Code::HANDLER, MONOMORPHIC, kNoExtraICState,
Code::NORMAL, Code::LOAD_IC);
masm->isolate()->stub_cache()->GenerateProbe(
masm, flags, r0, r2, r3, r4, r5, r6);
......
......@@ -928,7 +928,7 @@ class CallInterceptorCompiler BASE_EMBEDDED {
CallInterceptorCompiler(CallStubCompiler* stub_compiler,
const ParameterCount& arguments,
Register name,
Code::ExtraICState extra_ic_state)
ExtraICState extra_ic_state)
: stub_compiler_(stub_compiler),
arguments_(arguments),
name_(name),
......@@ -1107,7 +1107,7 @@ class CallInterceptorCompiler BASE_EMBEDDED {
CallStubCompiler* stub_compiler_;
const ParameterCount& arguments_;
Register name_;
Code::ExtraICState extra_ic_state_;
ExtraICState extra_ic_state_;
};
......
......@@ -1658,7 +1658,7 @@ void Builtins::InitBuiltinFunctionTable() {
functions->s_name = #aname; \
functions->name = k##aname; \
functions->flags = Code::ComputeFlags( \
Code::HANDLER, MONOMORPHIC, Code::kNoExtraICState, \
Code::HANDLER, MONOMORPHIC, kNoExtraICState, \
Code::NORMAL, Code::kind); \
functions->extra_args = NO_EXTRA_ARGUMENTS; \
++functions;
......
This diff is collapsed.
......@@ -193,8 +193,8 @@ class CodeStub BASE_EMBEDDED {
virtual InlineCacheState GetICState() {
return UNINITIALIZED;
}
virtual Code::ExtraICState GetExtraICState() {
return Code::kNoExtraICState;
virtual ExtraICState GetExtraICState() {
return kNoExtraICState;
}
virtual Code::StubType GetStubType() {
return Code::NORMAL;
......@@ -846,8 +846,8 @@ class StoreICStub: public ICStub {
: ICStub(kind), strict_mode_(strict_mode) { }
protected:
virtual Code::ExtraICState GetExtraICState() {
return strict_mode_;
virtual ExtraICState GetExtraICState() {
return StoreIC::ComputeExtraICState(strict_mode_);
}
private:
......@@ -982,7 +982,7 @@ class StoreGlobalStub : public HandlerStub {
Isolate* isolate,
CodeStubInterfaceDescriptor* descriptor);
virtual Code::ExtraICState GetExtraICState() { return bit_field_; }
virtual ExtraICState GetExtraICState() { return bit_field_; }
bool is_constant() {
return IsConstantBits::decode(bit_field_);
......@@ -1036,7 +1036,7 @@ class KeyedArrayCallStub: public HICStub {
}
virtual Code::Kind kind() const { return Code::KEYED_CALL_IC; }
virtual Code::ExtraICState GetExtraICState() { return bit_field_; }
virtual ExtraICState GetExtraICState() { return bit_field_; }
ElementsKind elements_kind() {
return HoleyBits::decode(bit_field_) ? FAST_HOLEY_ELEMENTS : FAST_ELEMENTS;
......@@ -1046,7 +1046,7 @@ class KeyedArrayCallStub: public HICStub {
virtual int GetStubFlags() { return argc(); }
static bool IsHoley(Handle<Code> code) {
Code::ExtraICState state = code->extra_ic_state();
ExtraICState state = code->extra_ic_state();
return HoleyBits::decode(state);
}
......@@ -1081,7 +1081,7 @@ class BinaryOpStub: public HydrogenCodeStub {
Initialize();
}
explicit BinaryOpStub(Code::ExtraICState state)
explicit BinaryOpStub(ExtraICState state)
: op_(decode_token(OpBits::decode(state))),
mode_(OverwriteModeField::decode(state)),
fixed_right_arg_(
......@@ -1124,7 +1124,7 @@ class BinaryOpStub: public HydrogenCodeStub {
ASSERT(CpuFeatures::VerifyCrossCompiling(SSE2));
}
virtual Code::ExtraICState GetExtraICState() {
virtual ExtraICState GetExtraICState() {
bool sse_field = Max(result_state_, Max(left_state_, right_state_)) > SMI &&
CpuFeatures::IsSafeForSnapshot(SSE2);
......@@ -1364,7 +1364,7 @@ class CompareNilICStub : public HydrogenCodeStub {
explicit CompareNilICStub(NilValue nil) : nil_value_(nil) { }
CompareNilICStub(Code::ExtraICState ic_state,
CompareNilICStub(ExtraICState ic_state,
InitializationState init_state = INITIALIZED)
: HydrogenCodeStub(init_state),
nil_value_(NilValueField::decode(ic_state)),
......@@ -1401,7 +1401,7 @@ class CompareNilICStub : public HydrogenCodeStub {
virtual Handle<Code> GenerateCode(Isolate* isolate);
virtual Code::ExtraICState GetExtraICState() {
virtual ExtraICState GetExtraICState() {
return NilValueField::encode(nil_value_) |
TypesField::encode(state_.ToIntegral());
}
......@@ -2330,7 +2330,7 @@ class ToBooleanStub: public HydrogenCodeStub {
explicit ToBooleanStub(Types types = Types())
: types_(types) { }
explicit ToBooleanStub(Code::ExtraICState state)
explicit ToBooleanStub(ExtraICState state)
: types_(static_cast<byte>(state)) { }
bool UpdateStatus(Handle<Object> object);
......@@ -2357,7 +2357,7 @@ class ToBooleanStub: public HydrogenCodeStub {
return ToBooleanStub(UNINITIALIZED).GetCode(isolate);
}
virtual Code::ExtraICState GetExtraICState() {
virtual ExtraICState GetExtraICState() {
return types_.ToIntegral();
}
......
......@@ -952,7 +952,7 @@ void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm,
void CallICBase::GenerateMonomorphicCacheProbe(MacroAssembler* masm,
int argc,
Code::Kind kind,
Code::ExtraICState extra_state) {
ExtraICState extra_state) {
// ----------- S t a t e -------------
// -- ecx : name
// -- edx : receiver
......@@ -1061,7 +1061,7 @@ void CallICBase::GenerateNormal(MacroAssembler* masm, int argc) {
void CallICBase::GenerateMiss(MacroAssembler* masm,
int argc,
IC::UtilityId id,
Code::ExtraICState extra_state) {
ExtraICState extra_state) {
// ----------- S t a t e -------------
// -- ecx : name
// -- esp[0] : return address
......@@ -1132,7 +1132,7 @@ void CallICBase::GenerateMiss(MacroAssembler* masm,
void CallIC::GenerateMegamorphic(MacroAssembler* masm,
int argc,
Code::ExtraICState extra_state) {
ExtraICState extra_state) {
// ----------- S t a t e -------------
// -- ecx : name
// -- esp[0] : return address
......@@ -1249,7 +1249,7 @@ void KeyedCallIC::GenerateMegamorphic(MacroAssembler* masm, int argc) {
__ bind(&lookup_monomorphic_cache);
__ IncrementCounter(counters->keyed_call_generic_lookup_cache(), 1);
CallICBase::GenerateMonomorphicCacheProbe(masm, argc, Code::KEYED_CALL_IC,
Code::kNoExtraICState);
kNoExtraICState);
// Fall through on miss.
__ bind(&slow_call);
......@@ -1327,7 +1327,7 @@ void LoadIC::GenerateMegamorphic(MacroAssembler* masm) {
// Probe the stub cache.
Code::Flags flags = Code::ComputeFlags(
Code::HANDLER, MONOMORPHIC, Code::kNoExtraICState,
Code::HANDLER, MONOMORPHIC, kNoExtraICState,
Code::NORMAL, Code::LOAD_IC);
masm->isolate()->stub_cache()->GenerateProbe(
masm, flags, edx, ecx, ebx, eax);
......
......@@ -648,7 +648,7 @@ class CallInterceptorCompiler BASE_EMBEDDED {
CallInterceptorCompiler(CallStubCompiler* stub_compiler,
const ParameterCount& arguments,
Register name,
Code::ExtraICState extra_state)
ExtraICState extra_state)
: stub_compiler_(stub_compiler),
arguments_(arguments),
name_(name),
......@@ -828,7 +828,7 @@ class CallInterceptorCompiler BASE_EMBEDDED {
CallStubCompiler* stub_compiler_;
const ParameterCount& arguments_;
Register name_;
Code::ExtraICState extra_state_;
ExtraICState extra_state_;
};
......
......@@ -86,8 +86,8 @@ void IC::SetTargetAtAddress(Address address, Code* target) {
// ICs as strict mode. The strict-ness of the IC must be preserved.
if (old_target->kind() == Code::STORE_IC ||
old_target->kind() == Code::KEYED_STORE_IC) {
ASSERT(Code::GetStrictMode(old_target->extra_ic_state()) ==
Code::GetStrictMode(target->extra_ic_state()));
ASSERT(StoreIC::GetStrictMode(old_target->extra_ic_state()) ==
StoreIC::GetStrictMode(target->extra_ic_state()));
}
#endif
Assembler::set_target_address_at(address, target->instruction_start());
......
......@@ -89,9 +89,10 @@ void IC::TraceIC(const char* type,
}
}
JavaScriptFrame::PrintTop(isolate(), stdout, false, true);
Code::ExtraICState extra_state = new_target->extra_ic_state();
ExtraICState extra_state = new_target->extra_ic_state();
const char* modifier =
GetTransitionMarkModifier(Code::GetKeyedAccessStoreMode(extra_state));
GetTransitionMarkModifier(
KeyedStoreIC::GetKeyedAccessStoreMode(extra_state));
PrintF(" (%c->%c%s)",
TransitionMarkFromState(state()),
TransitionMarkFromState(new_state),
......@@ -532,7 +533,7 @@ void StoreIC::Clear(Isolate* isolate, Address address, Code* target) {
if (IsCleared(target)) return;
SetTargetAtAddress(address,
*pre_monomorphic_stub(
isolate, Code::GetStrictMode(target->extra_ic_state())));
isolate, StoreIC::GetStrictMode(target->extra_ic_state())));
}
......@@ -540,7 +541,7 @@ void KeyedStoreIC::Clear(Isolate* isolate, Address address, Code* target) {
if (IsCleared(target)) return;
SetTargetAtAddress(address,
*pre_monomorphic_stub(
isolate, Code::GetStrictMode(target->extra_ic_state())));
isolate, StoreIC::GetStrictMode(target->extra_ic_state())));
}
......@@ -822,7 +823,7 @@ MaybeObject* KeyedCallIC::LoadFunction(Handle<Object> object,
if (stub.is_null()) {
stub = isolate()->stub_cache()->ComputeCallMegamorphic(
argc, Code::KEYED_CALL_IC, Code::kNoExtraICState);
argc, Code::KEYED_CALL_IC, kNoExtraICState);
if (object->IsJSObject()) {
Handle<JSObject> receiver = Handle<JSObject>::cast(object);
if (receiver->elements()->map() ==
......@@ -1005,7 +1006,7 @@ bool IC::UpdatePolymorphicIC(Handle<Type> type,
}
Handle<Code> ic = isolate()->stub_cache()->ComputePolymorphicIC(
&types, &handlers, number_of_valid_types, name, strict_mode());
&types, &handlers, number_of_valid_types, name, extra_ic_state());
set_target(*ic);
return true;
}
......@@ -1043,7 +1044,7 @@ void IC::UpdateMonomorphicIC(Handle<Type> type,
Handle<String> name) {
if (!handler->is_handler()) return set_target(*handler);
Handle<Code> ic = isolate()->stub_cache()->ComputeMonomorphicIC(
name, type, handler, strict_mode());
name, type, handler, extra_ic_state());
set_target(*ic);
}
......@@ -1177,8 +1178,12 @@ Handle<Code> IC::ComputeHandler(LookupResult* lookup,
Handle<HeapObject> stub_holder(GetCodeCacheHolder(
isolate(), *object, cache_holder));
StrictModeFlag strict_mode = kNonStrictMode;
if (kind() == Code::STORE_IC || kind() == Code::KEYED_STORE_IC) {
strict_mode = StoreIC::GetStrictMode(extra_ic_state());
}
Handle<Code> code = isolate()->stub_cache()->FindHandler(
name, handle(stub_holder->map()), kind(), cache_holder, strict_mode());
name, handle(stub_holder->map()), kind(), cache_holder, strict_mode);
if (!code.is_null()) return code;
code = CompileHandler(lookup, object, name, value, cache_holder);
......@@ -1753,7 +1758,7 @@ Handle<Code> KeyedStoreIC::StoreElementStub(Handle<JSObject> receiver,
// superset of the original IC. Handle those here if the receiver map hasn't
// changed or it has transitioned to a more general kind.
KeyedAccessStoreMode old_store_mode =
Code::GetKeyedAccessStoreMode(target()->extra_ic_state());
KeyedStoreIC::GetKeyedAccessStoreMode(target()->extra_ic_state());
Handle<Map> previous_receiver_map = target_receiver_maps.at(0);
if (state() == MONOMORPHIC) {
// If the "old" and "new" maps are in the same elements map family, stay
......@@ -2344,7 +2349,7 @@ const char* BinaryOpIC::GetName(TypeInfo type_info) {
MaybeObject* BinaryOpIC::Transition(Handle<Object> left, Handle<Object> right) {
Code::ExtraICState extra_ic_state = target()->extended_extra_ic_state();
ExtraICState extra_ic_state = target()->extended_extra_ic_state();
BinaryOpStub stub(extra_ic_state);
Handle<Type> left_type = stub.GetLeftType(isolate());
......@@ -2637,7 +2642,7 @@ RUNTIME_FUNCTION(Code*, CompareIC_Miss) {
void CompareNilIC::Clear(Address address, Code* target) {
if (IsCleared(target)) return;
Code::ExtraICState state = target->extended_extra_ic_state();
ExtraICState state = target->extended_extra_ic_state();
CompareNilICStub stub(state, HydrogenCodeStub::UNINITIALIZED);
stub.ClearState();
......@@ -2659,7 +2664,7 @@ MaybeObject* CompareNilIC::DoCompareNilSlow(NilValue nil,
MaybeObject* CompareNilIC::CompareNil(Handle<Object> object) {
Code::ExtraICState extra_ic_state = target()->extended_extra_ic_state();
ExtraICState extra_ic_state = target()->extended_extra_ic_state();
CompareNilICStub stub(extra_ic_state);
......
......@@ -250,11 +250,13 @@ class IC {
UNREACHABLE();
return Handle<Code>::null();
}
virtual StrictModeFlag strict_mode() const { return kNonStrictMode; }
bool TryRemoveInvalidPrototypeDependentStub(Handle<Object> receiver,
Handle<String> name);
void TryRemoveInvalidHandlers(Handle<Map> map, Handle<String> name);
virtual ExtraICState extra_ic_state() { return kNoExtraICState; }
private:
Code* raw_target() const { return GetTargetAtAddress(address()); }
......@@ -296,8 +298,13 @@ class IC_Utility {
class CallICBase: public IC {
public:
class Contextual: public BitField<bool, 0, 1> {};
// ExtraICState bits
class Contextual: public BitField<ContextualMode, 0, 1> {};
class StringStubState: public BitField<StringStubFeedback, 1, 1> {};
static ExtraICState ComputeExtraICState(ContextualMode mode,
StringStubFeedback feedback) {
return Contextual::encode(mode) | StringStubState::encode(feedback);
}
// Returns a JSFunction or a Failure.
MUST_USE_RESULT MaybeObject* LoadFunction(Handle<Object> object,
......@@ -307,8 +314,6 @@ class CallICBase: public IC {
CallICBase(Code::Kind kind, Isolate* isolate)
: IC(EXTRA_CALL_FRAME, isolate), kind_(kind) {}
virtual Code::ExtraICState extra_ic_state() { return Code::kNoExtraICState; }
// Compute a monomorphic stub if possible, otherwise return a null handle.
Handle<Code> ComputeMonomorphicStub(LookupResult* lookup,
Handle<Object> object,
......@@ -334,14 +339,14 @@ class CallICBase: public IC {
static void GenerateMiss(MacroAssembler* masm,
int argc,
IC::UtilityId id,
Code::ExtraICState extra_state);
ExtraICState extra_state);
static void GenerateNormal(MacroAssembler* masm, int argc);
static void GenerateMonomorphicCacheProbe(MacroAssembler* masm,
int argc,
Code::Kind kind,
Code::ExtraICState extra_state);
ExtraICState extra_state);
virtual Handle<Code> megamorphic_stub();
virtual Handle<Code> pre_monomorphic_stub();
......@@ -363,31 +368,31 @@ class CallIC: public CallICBase {
// Code generator routines.
static void GenerateInitialize(MacroAssembler* masm,
int argc,
Code::ExtraICState extra_state) {
ExtraICState extra_state) {
GenerateMiss(masm, argc, extra_state);
}
static void GenerateMiss(MacroAssembler* masm,
int argc,
Code::ExtraICState extra_state) {
ExtraICState extra_state) {
CallICBase::GenerateMiss(masm, argc, IC::kCallIC_Miss, extra_state);
}
static void GenerateMegamorphic(MacroAssembler* masm,
int argc,
Code::ExtraICState extra_ic_state);
ExtraICState extra_ic_state);
static void GenerateNormal(MacroAssembler* masm, int argc) {
CallICBase::GenerateNormal(masm, argc);
GenerateMiss(masm, argc, Code::kNoExtraICState);
GenerateMiss(masm, argc, kNoExtraICState);
}
bool TryUpdateExtraICState(LookupResult* lookup, Handle<Object> object);
protected:
virtual Code::ExtraICState extra_ic_state() { return extra_ic_state_; }
virtual ExtraICState extra_ic_state() { return extra_ic_state_; }
private:
Code::ExtraICState extra_ic_state_;
ExtraICState extra_ic_state_;
};
......@@ -408,7 +413,7 @@ class KeyedCallIC: public CallICBase {
static void GenerateMiss(MacroAssembler* masm, int argc) {
CallICBase::GenerateMiss(masm, argc, IC::kKeyedCallIC_Miss,
Code::kNoExtraICState);
kNoExtraICState);
}
static void GenerateMegamorphic(MacroAssembler* masm, int argc);
......@@ -559,13 +564,28 @@ class KeyedLoadIC: public LoadIC {
class StoreIC: public IC {
public:
// ExtraICState bits
class StrictModeState: public BitField<StrictModeFlag, 0, 1> {};
static ExtraICState ComputeExtraICState(StrictModeFlag flag) {
return StrictModeState::encode(flag);
}
static StrictModeFlag GetStrictMode(ExtraICState state) {
return StrictModeState::decode(state);
}
// For convenience, a statically declared encoding of strict mode extra
// IC state.
static const ExtraICState kStrictModeState =
1 << StrictModeState::kShift;
StoreIC(FrameDepth depth, Isolate* isolate)
: IC(depth, isolate),
strict_mode_(Code::GetStrictMode(target()->extra_ic_state())) {
strict_mode_(GetStrictMode(target()->extra_ic_state())) {
ASSERT(IsStoreStub());
}
virtual StrictModeFlag strict_mode() const { return strict_mode_; }
StrictModeFlag strict_mode() const { return strict_mode_; }
// Code generators for stub routines. Only called once at startup.
static void GenerateSlow(MacroAssembler* masm);
......@@ -642,11 +662,15 @@ class StoreIC: public IC {
Handle<Object> value,
InlineCacheHolderFlag cache_holder);
virtual ExtraICState extra_ic_state() {
return ComputeExtraICState(strict_mode());
}
private:
void set_target(Code* code) {
// Strict mode must be preserved across IC patching.
ASSERT(Code::GetStrictMode(code->extra_ic_state()) ==
Code::GetStrictMode(target()->extra_ic_state()));
ASSERT(GetStrictMode(code->extra_ic_state()) ==
GetStrictMode(target()->extra_ic_state()));
IC::set_target(code);
}
......@@ -681,6 +705,22 @@ enum KeyedStoreIncrementLength {
class KeyedStoreIC: public StoreIC {
public:
// ExtraICState bits (building on IC)
// ExtraICState bits
class ExtraICStateKeyedAccessStoreMode:
public BitField<KeyedAccessStoreMode, 1, 4> {}; // NOLINT
static ExtraICState ComputeExtraICState(StrictModeFlag flag,
KeyedAccessStoreMode mode) {
return StrictModeState::encode(flag) |
ExtraICStateKeyedAccessStoreMode::encode(mode);
}
static KeyedAccessStoreMode GetKeyedAccessStoreMode(
ExtraICState extra_state) {
return ExtraICStateKeyedAccessStoreMode::decode(extra_state);
}
KeyedStoreIC(FrameDepth depth, Isolate* isolate)
: StoreIC(depth, isolate) {
ASSERT(target()->is_keyed_store_stub());
......@@ -707,6 +747,10 @@ class KeyedStoreIC: public StoreIC {
virtual void UpdateMegamorphicCache(Type* type, Name* name, Code* code) { }
virtual ExtraICState extra_ic_state() {
return ComputeExtraICState(strict_mode(), STANDARD_STORE);
}
virtual Handle<Code> pre_monomorphic_stub() {
return pre_monomorphic_stub(isolate(), strict_mode());
}
......@@ -735,7 +779,7 @@ class KeyedStoreIC: public StoreIC {
private:
void set_target(Code* code) {
// Strict mode must be preserved across IC patching.
ASSERT(Code::GetStrictMode(code->extra_ic_state()) == strict_mode());
ASSERT(GetStrictMode(code->extra_ic_state()) == strict_mode());
IC::set_target(code);
}
......
......@@ -346,7 +346,7 @@ Object* CallIC_Miss(Arguments args);
void CallICBase::GenerateMonomorphicCacheProbe(MacroAssembler* masm,
int argc,
Code::Kind kind,
Code::ExtraICState extra_state) {
ExtraICState extra_state) {
// ----------- S t a t e -------------
// -- a1 : receiver
// -- a2 : name
......@@ -448,7 +448,7 @@ void CallICBase::GenerateNormal(MacroAssembler* masm, int argc) {
void CallICBase::GenerateMiss(MacroAssembler* masm,
int argc,
IC::UtilityId id,
Code::ExtraICState extra_state) {
ExtraICState extra_state) {
// ----------- S t a t e -------------
// -- a2 : name
// -- ra : return address
......@@ -512,7 +512,7 @@ void CallICBase::GenerateMiss(MacroAssembler* masm,
void CallIC::GenerateMegamorphic(MacroAssembler* masm,
int argc,
Code::ExtraICState extra_ic_state) {
ExtraICState extra_ic_state) {
// ----------- S t a t e -------------
// -- a2 : name
// -- ra : return address
......@@ -609,7 +609,7 @@ void KeyedCallIC::GenerateMegamorphic(MacroAssembler* masm, int argc) {
GenerateMonomorphicCacheProbe(masm,
argc,
Code::KEYED_CALL_IC,
Code::kNoExtraICState);
kNoExtraICState);
// Fall through on miss.
__ bind(&slow_call);
......@@ -655,7 +655,7 @@ void LoadIC::GenerateMegamorphic(MacroAssembler* masm) {
// Probe the stub cache.
Code::Flags flags = Code::ComputeFlags(
Code::HANDLER, MONOMORPHIC, Code::kNoExtraICState,
Code::HANDLER, MONOMORPHIC, kNoExtraICState,
Code::NORMAL, Code::LOAD_IC);
masm->isolate()->stub_cache()->GenerateProbe(
masm, flags, a0, a2, a3, t0, t1, t2);
......
......@@ -736,7 +736,7 @@ static void GenerateCallFunction(MacroAssembler* masm,
Handle<Object> object,
const ParameterCount& arguments,
Label* miss,
Code::ExtraICState extra_ic_state) {
ExtraICState extra_ic_state) {
// ----------- S t a t e -------------
// -- a0: receiver
// -- a1: function to call
......@@ -945,7 +945,7 @@ class CallInterceptorCompiler BASE_EMBEDDED {
CallInterceptorCompiler(StubCompiler* stub_compiler,
const ParameterCount& arguments,
Register name,
Code::ExtraICState extra_ic_state)
ExtraICState extra_ic_state)
: stub_compiler_(stub_compiler),
arguments_(arguments),
name_(name),
......@@ -1129,7 +1129,7 @@ class CallInterceptorCompiler BASE_EMBEDDED {
StubCompiler* stub_compiler_;
const ParameterCount& arguments_;
Register name_;
Code::ExtraICState extra_ic_state_;
ExtraICState extra_ic_state_;
};
......
......@@ -3889,14 +3889,14 @@ InlineCacheState Code::ic_state() {
}
Code::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());
}
Code::ExtraICState Code::extended_extra_ic_state() {
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());
......@@ -4233,12 +4233,12 @@ InlineCacheState Code::ExtractICStateFromFlags(Flags flags) {
}
Code::ExtraICState Code::ExtractExtraICStateFromFlags(Flags flags) {
ExtraICState Code::ExtractExtraICStateFromFlags(Flags flags) {
return ExtraICStateField::decode(flags);
}
Code::ExtraICState Code::ExtractExtendedExtraICStateFromFlags(
ExtraICState Code::ExtractExtendedExtraICStateFromFlags(
Flags flags) {
return ExtendedExtraICStateField::decode(flags);
}
......
......@@ -179,6 +179,12 @@ enum KeyedAccessStoreMode {
};
enum ContextualMode {
NOT_CONTEXTUAL,
CONTEXTUAL
};
static const int kGrowICDelta = STORE_AND_GROW_NO_TRANSITION -
STANDARD_STORE;
STATIC_ASSERT(STANDARD_STORE == 0);
......@@ -297,6 +303,11 @@ enum MarkingParity {
EVEN_MARKING_PARITY
};
// ICs store extra state in a Code object. The default extra state is
// kNoExtraICState.
typedef int ExtraICState;
static const ExtraICState kNoExtraICState = 0;
// Instance size sentinel for objects of variable size.
const int kVariableSizeSentinel = 0;
......@@ -5036,10 +5047,6 @@ class Code: public HeapObject {
FAST
};
typedef int ExtraICState;
static const ExtraICState kNoExtraICState = 0;
static const int kPrologueOffsetNotSet = -1;
#ifdef ENABLE_DISASSEMBLER
......@@ -5259,26 +5266,6 @@ class Code: public HeapObject {
// out the to-be-overwritten header data for reproducible snapshots.
inline void WipeOutHeader();
class ExtraICStateStrictMode: public BitField<StrictModeFlag, 0, 1> {};
class ExtraICStateKeyedAccessStoreMode:
public BitField<KeyedAccessStoreMode, 1, 4> {}; // NOLINT
static inline StrictModeFlag GetStrictMode(ExtraICState extra_ic_state) {
return ExtraICStateStrictMode::decode(extra_ic_state);
}
static inline KeyedAccessStoreMode GetKeyedAccessStoreMode(
ExtraICState extra_ic_state) {
return ExtraICStateKeyedAccessStoreMode::decode(extra_ic_state);
}
static inline ExtraICState ComputeExtraICState(
KeyedAccessStoreMode store_mode,
StrictModeFlag strict_mode) {
return ExtraICStateKeyedAccessStoreMode::encode(store_mode) |
ExtraICStateStrictMode::encode(strict_mode);
}
// Flags operations.
static inline Flags ComputeFlags(
Kind kind,
......@@ -5462,12 +5449,12 @@ class Code: public HeapObject {
// Flags layout. BitField<type, shift, size>.
class ICStateField: public BitField<InlineCacheState, 0, 3> {};
class TypeField: public BitField<StubType, 3, 1> {};
class CacheHolderField: public BitField<InlineCacheHolderFlag, 6, 1> {};
class KindField: public BitField<Kind, 7, 4> {};
class IsPregeneratedField: public BitField<bool, 11, 1> {};
class ExtraICStateField: public BitField<ExtraICState, 12, 5> {};
class ExtendedExtraICStateField: public BitField<ExtraICState, 12,
PlatformSmiTagging::kSmiValueSize - 12 + 1> {}; // NOLINT
class CacheHolderField: public BitField<InlineCacheHolderFlag, 5, 1> {};
class KindField: public BitField<Kind, 6, 4> {};
class IsPregeneratedField: public BitField<bool, 10, 1> {};
class ExtraICStateField: public BitField<ExtraICState, 11, 6> {};
class ExtendedExtraICStateField: public BitField<ExtraICState, 11,
PlatformSmiTagging::kSmiValueSize - 11 + 1> {}; // NOLINT
STATIC_ASSERT(ExtraICStateField::kShift == ExtendedExtraICStateField::kShift);
// KindSpecificFlags1 layout (STUB and OPTIMIZED_FUNCTION)
......
This diff is collapsed.
......@@ -83,7 +83,7 @@ class StubCache {
Handle<Code> FindIC(Handle<Name> name,
Handle<Map> stub_holder_map,
Code::Kind kind,
Code::ExtraICState extra_state = Code::kNoExtraICState,
ExtraICState extra_state = kNoExtraICState,
InlineCacheHolderFlag cache_holder = OWN_MAP);
Handle<Code> FindHandler(Handle<Name> name,
......@@ -95,7 +95,7 @@ class StubCache {
Handle<Code> ComputeMonomorphicIC(Handle<Name> name,
Handle<Type> type,
Handle<Code> handler,
StrictModeFlag strict_mode);
ExtraICState extra_ic_state);
Handle<Code> ComputeLoadNonexistent(Handle<Name> name, Handle<Type> type);
......@@ -107,7 +107,7 @@ class StubCache {
Handle<Code> ComputeCallField(int argc,
Code::Kind,
Code::ExtraICState extra_state,
ExtraICState extra_state,
Handle<Name> name,
Handle<Object> object,
Handle<JSObject> holder,
......@@ -115,7 +115,7 @@ class StubCache {
Handle<Code> ComputeCallConstant(int argc,
Code::Kind,
Code::ExtraICState extra_state,
ExtraICState extra_state,
Handle<Name> name,
Handle<Object> object,
Handle<JSObject> holder,
......@@ -123,14 +123,14 @@ class StubCache {
Handle<Code> ComputeCallInterceptor(int argc,
Code::Kind,
Code::ExtraICState extra_state,
ExtraICState extra_state,
Handle<Name> name,
Handle<Object> object,
Handle<JSObject> holder);
Handle<Code> ComputeCallGlobal(int argc,
Code::Kind,
Code::ExtraICState extra_state,
ExtraICState extra_state,
Handle<Name> name,
Handle<JSObject> object,
Handle<GlobalObject> holder,
......@@ -145,21 +145,21 @@ class StubCache {
Handle<Code> ComputeCallPreMonomorphic(int argc,
Code::Kind kind,
Code::ExtraICState extra_state);
ExtraICState extra_state);
Handle<Code> ComputeCallNormal(int argc,
Code::Kind kind,
Code::ExtraICState state);
ExtraICState state);
Handle<Code> ComputeCallArguments(int argc);
Handle<Code> ComputeCallMegamorphic(int argc,
Code::Kind kind,
Code::ExtraICState state);
ExtraICState state);
Handle<Code> ComputeCallMiss(int argc,
Code::Kind kind,
Code::ExtraICState state);
ExtraICState state);
// ---
......@@ -177,7 +177,7 @@ class StubCache {
CodeHandleList* handlers,
int number_of_valid_maps,
Handle<Name> name,
StrictModeFlag strict_mode);
ExtraICState extra_ic_state);
// Finds the Code object stored in the Heap::non_monomorphic_cache().
Code* FindCallInitialize(int argc, RelocInfo::Mode mode, Code::Kind kind);
......@@ -590,7 +590,7 @@ class BaseLoadStoreStubCompiler: public StubCompiler {
}
void JitEvent(Handle<Name> name, Handle<Code> code);
virtual Code::ExtraICState extra_state() { return Code::kNoExtraICState; }
virtual ExtraICState extra_state() { return kNoExtraICState; }
virtual Register receiver() = 0;
virtual Register name() = 0;
virtual Register scratch1() = 0;
......@@ -828,7 +828,9 @@ class StoreStubCompiler: public BaseLoadStoreStubCompiler {
virtual Register scratch2() { return registers_[4]; }
virtual Register scratch3() { return registers_[5]; }
StrictModeFlag strict_mode() { return strict_mode_; }
virtual Code::ExtraICState extra_state() { return strict_mode_; }
virtual ExtraICState extra_state() {
return StoreIC::ComputeExtraICState(strict_mode_);
}
protected:
static Register* registers();
......@@ -858,8 +860,8 @@ class KeyedStoreStubCompiler: public StoreStubCompiler {
static void GenerateStoreDictionaryElement(MacroAssembler* masm);
protected:
virtual Code::ExtraICState extra_state() {
return Code::ComputeExtraICState(store_mode_, strict_mode());
virtual ExtraICState extra_state() {
return KeyedStoreIC::ComputeExtraICState(strict_mode(), store_mode_);
}
static Register* registers();
......@@ -898,7 +900,7 @@ class CallStubCompiler: public StubCompiler {
CallStubCompiler(Isolate* isolate,
int argc,
Code::Kind kind,
Code::ExtraICState extra_state,
ExtraICState extra_state,
InlineCacheHolderFlag cache_holder = OWN_MAP);
Handle<Code> CompileCallField(Handle<JSObject> object,
......@@ -999,7 +1001,7 @@ class CallStubCompiler: public StubCompiler {
const ParameterCount arguments_;
const Code::Kind kind_;
const Code::ExtraICState extra_state_;
const ExtraICState extra_state_;
const InlineCacheHolderFlag cache_holder_;
};
......
......@@ -268,7 +268,7 @@ KeyedAccessStoreMode TypeFeedbackOracle::GetStoreMode(
if (map_or_code->IsCode()) {
Handle<Code> code = Handle<Code>::cast(map_or_code);
if (code->kind() == Code::KEYED_STORE_IC) {
return Code::GetKeyedAccessStoreMode(code->extra_ic_state());
return KeyedStoreIC::GetKeyedAccessStoreMode(code->extra_ic_state());
}
}
return STANDARD_STORE;
......@@ -279,7 +279,7 @@ void TypeFeedbackOracle::LoadReceiverTypes(TypeFeedbackId id,
Handle<String> name,
SmallMapList* types) {
Code::Flags flags = Code::ComputeFlags(
Code::HANDLER, MONOMORPHIC, Code::kNoExtraICState,
Code::HANDLER, MONOMORPHIC, kNoExtraICState,
Code::NORMAL, Code::LOAD_IC);
CollectReceiverTypes(id, name, flags, types);
}
......@@ -289,7 +289,7 @@ void TypeFeedbackOracle::StoreReceiverTypes(Assignment* expr,
Handle<String> name,
SmallMapList* types) {
Code::Flags flags = Code::ComputeFlags(
Code::HANDLER, MONOMORPHIC, Code::kNoExtraICState,
Code::HANDLER, MONOMORPHIC, kNoExtraICState,
Code::NORMAL, Code::STORE_IC);
CollectReceiverTypes(expr->AssignmentFeedbackId(), name, flags, types);
}
......@@ -303,8 +303,11 @@ void TypeFeedbackOracle::CallReceiverTypes(Call* expr,
// Note: Currently we do not take string extra ic data into account
// here.
Code::ExtraICState extra_ic_state =
CallIC::Contextual::encode(call_kind == CALL_AS_FUNCTION);
ContextualMode contextual_mode = call_kind == CALL_AS_FUNCTION
? CONTEXTUAL
: NOT_CONTEXTUAL;
ExtraICState extra_ic_state =
CallIC::Contextual::encode(contextual_mode);
Code::Flags flags = Code::ComputeMonomorphicFlags(
Code::CALL_IC, extra_ic_state, OWN_MAP, Code::NORMAL, arity);
......
......@@ -833,7 +833,7 @@ void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm,
void CallICBase::GenerateMonomorphicCacheProbe(MacroAssembler* masm,
int argc,
Code::Kind kind,
Code::ExtraICState extra_state) {
ExtraICState extra_state) {
// ----------- S t a t e -------------
// rcx : function name
// rdx : receiver
......@@ -946,7 +946,7 @@ void CallICBase::GenerateNormal(MacroAssembler* masm, int argc) {
void CallICBase::GenerateMiss(MacroAssembler* masm,
int argc,
IC::UtilityId id,
Code::ExtraICState extra_state) {
ExtraICState extra_state) {
// ----------- S t a t e -------------
// rcx : function name
// rsp[0] : return address
......@@ -1018,7 +1018,7 @@ void CallICBase::GenerateMiss(MacroAssembler* masm,
void CallIC::GenerateMegamorphic(MacroAssembler* masm,
int argc,
Code::ExtraICState extra_ic_state) {
ExtraICState extra_ic_state) {
// ----------- S t a t e -------------
// rcx : function name
// rsp[0] : return address
......@@ -1127,7 +1127,7 @@ void KeyedCallIC::GenerateMegamorphic(MacroAssembler* masm, int argc) {
GenerateMonomorphicCacheProbe(masm,
argc,
Code::KEYED_CALL_IC,
Code::kNoExtraICState);
kNoExtraICState);
// Fall through on miss.
__ bind(&slow_call);
......@@ -1354,7 +1354,7 @@ void LoadIC::GenerateMegamorphic(MacroAssembler* masm) {
// Probe the stub cache.
Code::Flags flags = Code::ComputeFlags(
Code::HANDLER, MONOMORPHIC, Code::kNoExtraICState,
Code::HANDLER, MONOMORPHIC, kNoExtraICState,
Code::NORMAL, Code::LOAD_IC);
masm->isolate()->stub_cache()->GenerateProbe(
masm, flags, rax, rcx, rbx, rdx);
......
......@@ -640,7 +640,7 @@ class CallInterceptorCompiler BASE_EMBEDDED {
CallInterceptorCompiler(CallStubCompiler* stub_compiler,
const ParameterCount& arguments,
Register name,
Code::ExtraICState extra_ic_state)
ExtraICState extra_ic_state)
: stub_compiler_(stub_compiler),
arguments_(arguments),
name_(name),
......@@ -820,7 +820,7 @@ class CallInterceptorCompiler BASE_EMBEDDED {
CallStubCompiler* stub_compiler_;
const ParameterCount& arguments_;
Register name_;
Code::ExtraICState extra_ic_state_;
ExtraICState extra_ic_state_;
};
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment