Commit 62f76190 authored by jkummerow's avatar jkummerow Committed by Commit bot

Replace generic KeyedStore stub with megamorphic version

This is a follow-up to https://codereview.chromium.org/859943003.

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

Cr-Commit-Position: refs/heads/master@{#26161}
parent cae3a43d
...@@ -1295,16 +1295,6 @@ static void Generate_KeyedStoreIC_Megamorphic_Strict(MacroAssembler* masm) { ...@@ -1295,16 +1295,6 @@ static void Generate_KeyedStoreIC_Megamorphic_Strict(MacroAssembler* masm) {
} }
static void Generate_KeyedStoreIC_Generic(MacroAssembler* masm) {
KeyedStoreIC::GenerateGeneric(masm, SLOPPY);
}
static void Generate_KeyedStoreIC_Generic_Strict(MacroAssembler* masm) {
KeyedStoreIC::GenerateGeneric(masm, STRICT);
}
static void Generate_KeyedStoreIC_Miss(MacroAssembler* masm) { static void Generate_KeyedStoreIC_Miss(MacroAssembler* masm) {
KeyedStoreIC::GenerateMiss(masm); KeyedStoreIC::GenerateMiss(masm);
} }
......
...@@ -95,7 +95,6 @@ enum BuiltinExtraArguments { ...@@ -95,7 +95,6 @@ enum BuiltinExtraArguments {
V(KeyedStoreIC_PreMonomorphic, KEYED_STORE_IC, PREMONOMORPHIC, \ V(KeyedStoreIC_PreMonomorphic, KEYED_STORE_IC, PREMONOMORPHIC, \
kNoExtraICState) \ kNoExtraICState) \
V(KeyedStoreIC_Megamorphic, KEYED_STORE_IC, MEGAMORPHIC, kNoExtraICState) \ V(KeyedStoreIC_Megamorphic, KEYED_STORE_IC, MEGAMORPHIC, kNoExtraICState) \
V(KeyedStoreIC_Generic, KEYED_STORE_IC, GENERIC, kNoExtraICState) \
\ \
V(KeyedStoreIC_Initialize_Strict, KEYED_STORE_IC, UNINITIALIZED, \ V(KeyedStoreIC_Initialize_Strict, KEYED_STORE_IC, UNINITIALIZED, \
StoreIC::kStrictModeState) \ StoreIC::kStrictModeState) \
...@@ -103,8 +102,6 @@ enum BuiltinExtraArguments { ...@@ -103,8 +102,6 @@ enum BuiltinExtraArguments {
StoreIC::kStrictModeState) \ StoreIC::kStrictModeState) \
V(KeyedStoreIC_Megamorphic_Strict, KEYED_STORE_IC, MEGAMORPHIC, \ V(KeyedStoreIC_Megamorphic_Strict, KEYED_STORE_IC, MEGAMORPHIC, \
StoreIC::kStrictModeState) \ StoreIC::kStrictModeState) \
V(KeyedStoreIC_Generic_Strict, KEYED_STORE_IC, GENERIC, \
StoreIC::kStrictModeState) \
V(KeyedStoreIC_SloppyArguments, KEYED_STORE_IC, MONOMORPHIC, \ V(KeyedStoreIC_SloppyArguments, KEYED_STORE_IC, MONOMORPHIC, \
kNoExtraICState) \ kNoExtraICState) \
\ \
......
...@@ -1619,21 +1619,6 @@ Handle<Code> StoreIC::megamorphic_stub() { ...@@ -1619,21 +1619,6 @@ Handle<Code> StoreIC::megamorphic_stub() {
} }
Handle<Code> StoreIC::generic_stub() const {
if (kind() == Code::STORE_IC) {
return PropertyICCompiler::ComputeStore(isolate(), GENERIC,
extra_ic_state());
} else {
DCHECK(kind() == Code::KEYED_STORE_IC);
if (strict_mode() == STRICT) {
return isolate()->builtins()->KeyedStoreIC_Generic_Strict();
} else {
return isolate()->builtins()->KeyedStoreIC_Generic();
}
}
}
Handle<Code> StoreIC::slow_stub() const { Handle<Code> StoreIC::slow_stub() const {
if (kind() == Code::STORE_IC) { if (kind() == Code::STORE_IC) {
return isolate()->builtins()->StoreIC_Slow(); return isolate()->builtins()->StoreIC_Slow();
...@@ -1801,7 +1786,7 @@ Handle<Code> KeyedStoreIC::StoreElementStub(Handle<JSObject> receiver, ...@@ -1801,7 +1786,7 @@ Handle<Code> KeyedStoreIC::StoreElementStub(Handle<JSObject> receiver,
// and so the stubs can't be harvested for the object needed for a map check. // and so the stubs can't be harvested for the object needed for a map check.
if (target()->type() != Code::NORMAL) { if (target()->type() != Code::NORMAL) {
TRACE_GENERIC_IC(isolate(), "KeyedStoreIC", "non-NORMAL target type"); TRACE_GENERIC_IC(isolate(), "KeyedStoreIC", "non-NORMAL target type");
return generic_stub(); return megamorphic_stub();
} }
Handle<Map> receiver_map(receiver->map(), isolate()); Handle<Map> receiver_map(receiver->map(), isolate());
...@@ -1865,11 +1850,7 @@ Handle<Code> KeyedStoreIC::StoreElementStub(Handle<JSObject> receiver, ...@@ -1865,11 +1850,7 @@ Handle<Code> KeyedStoreIC::StoreElementStub(Handle<JSObject> receiver,
if (!map_added) { if (!map_added) {
// If the miss wasn't due to an unseen map, a polymorphic stub // If the miss wasn't due to an unseen map, a polymorphic stub
// won't help. In theory we should use the generic stub, but in // won't help, use the megamorphic stub which can handle everything.
// practice there are a number of hard-to-avoid reasons why this
// can happen occasionally, and where the additional logic in the
// megamorphic stub is beneficial because it can handle most cases
// without calling into the runtime.
TRACE_GENERIC_IC(isolate(), "KeyedStoreIC", "same map added twice"); TRACE_GENERIC_IC(isolate(), "KeyedStoreIC", "same map added twice");
return megamorphic_stub(); return megamorphic_stub();
} }
...@@ -1881,20 +1862,20 @@ Handle<Code> KeyedStoreIC::StoreElementStub(Handle<JSObject> receiver, ...@@ -1881,20 +1862,20 @@ Handle<Code> KeyedStoreIC::StoreElementStub(Handle<JSObject> receiver,
} }
// Make sure all polymorphic handlers have the same store mode, otherwise the // Make sure all polymorphic handlers have the same store mode, otherwise the
// generic stub must be used. // megamorphic stub must be used.
store_mode = GetNonTransitioningStoreMode(store_mode); store_mode = GetNonTransitioningStoreMode(store_mode);
if (old_store_mode != STANDARD_STORE) { if (old_store_mode != STANDARD_STORE) {
if (store_mode == STANDARD_STORE) { if (store_mode == STANDARD_STORE) {
store_mode = old_store_mode; store_mode = old_store_mode;
} else if (store_mode != old_store_mode) { } else if (store_mode != old_store_mode) {
TRACE_GENERIC_IC(isolate(), "KeyedStoreIC", "store mode mismatch"); TRACE_GENERIC_IC(isolate(), "KeyedStoreIC", "store mode mismatch");
return generic_stub(); return megamorphic_stub();
} }
} }
// If the store mode isn't the standard mode, make sure that all polymorphic // If the store mode isn't the standard mode, make sure that all polymorphic
// receivers are either external arrays, or all "normal" arrays. Otherwise, // receivers are either external arrays, or all "normal" arrays. Otherwise,
// use the generic stub. // use the megamorphic stub.
if (store_mode != STANDARD_STORE) { if (store_mode != STANDARD_STORE) {
int external_arrays = 0; int external_arrays = 0;
for (int i = 0; i < target_receiver_maps.length(); ++i) { for (int i = 0; i < target_receiver_maps.length(); ++i) {
...@@ -1907,7 +1888,7 @@ Handle<Code> KeyedStoreIC::StoreElementStub(Handle<JSObject> receiver, ...@@ -1907,7 +1888,7 @@ Handle<Code> KeyedStoreIC::StoreElementStub(Handle<JSObject> receiver,
external_arrays != target_receiver_maps.length()) { external_arrays != target_receiver_maps.length()) {
TRACE_GENERIC_IC(isolate(), "KeyedStoreIC", TRACE_GENERIC_IC(isolate(), "KeyedStoreIC",
"unsupported combination of external and normal arrays"); "unsupported combination of external and normal arrays");
return generic_stub(); return megamorphic_stub();
} }
} }
...@@ -2052,7 +2033,7 @@ MaybeHandle<Object> KeyedStoreIC::Store(Handle<Object> object, ...@@ -2052,7 +2033,7 @@ MaybeHandle<Object> KeyedStoreIC::Store(Handle<Object> object,
key = TryConvertKey(key, isolate()); key = TryConvertKey(key, isolate());
Handle<Object> store_handle; Handle<Object> store_handle;
Handle<Code> stub = generic_stub(); Handle<Code> stub = megamorphic_stub();
if (key->IsInternalizedString()) { if (key->IsInternalizedString()) {
ASSIGN_RETURN_ON_EXCEPTION( ASSIGN_RETURN_ON_EXCEPTION(
...@@ -2126,8 +2107,8 @@ MaybeHandle<Object> KeyedStoreIC::Store(Handle<Object> object, ...@@ -2126,8 +2107,8 @@ MaybeHandle<Object> KeyedStoreIC::Store(Handle<Object> object,
} }
DCHECK(!is_target_set()); DCHECK(!is_target_set());
Code* generic = *generic_stub(); Code* megamorphic = *megamorphic_stub();
if (*stub == generic) { if (*stub == megamorphic) {
TRACE_GENERIC_IC(isolate(), "KeyedStoreIC", "set generic"); TRACE_GENERIC_IC(isolate(), "KeyedStoreIC", "set generic");
} }
if (*stub == *slow_stub()) { if (*stub == *slow_stub()) {
...@@ -2141,13 +2122,6 @@ MaybeHandle<Object> KeyedStoreIC::Store(Handle<Object> object, ...@@ -2141,13 +2122,6 @@ MaybeHandle<Object> KeyedStoreIC::Store(Handle<Object> object,
} }
// static
void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm,
StrictMode strict_mode) {
PropertyICCompiler::GenerateRuntimeSetProperty(masm, strict_mode);
}
bool CallIC::DoCustomHandler(Handle<Object> receiver, Handle<Object> function, bool CallIC::DoCustomHandler(Handle<Object> receiver, Handle<Object> function,
const CallICState& callic_state) { const CallICState& callic_state) {
DCHECK(FLAG_use_ic && function->IsJSFunction()); DCHECK(FLAG_use_ic && function->IsJSFunction());
......
...@@ -561,11 +561,8 @@ class StoreIC : public IC { ...@@ -561,11 +561,8 @@ class StoreIC : public IC {
JSReceiver::StoreFromKeyed store_mode); JSReceiver::StoreFromKeyed store_mode);
protected: protected:
Handle<Code> megamorphic_stub() OVERRIDE;
// Stub accessors. // Stub accessors.
Handle<Code> generic_stub() const; Handle<Code> megamorphic_stub() OVERRIDE;
Handle<Code> slow_stub() const; Handle<Code> slow_stub() const;
virtual Handle<Code> pre_monomorphic_stub() const { virtual Handle<Code> pre_monomorphic_stub() const {
...@@ -640,7 +637,6 @@ class KeyedStoreIC : public StoreIC { ...@@ -640,7 +637,6 @@ class KeyedStoreIC : public StoreIC {
static void GenerateMiss(MacroAssembler* masm); static void GenerateMiss(MacroAssembler* masm);
static void GenerateSlow(MacroAssembler* masm); static void GenerateSlow(MacroAssembler* masm);
static void GenerateMegamorphic(MacroAssembler* masm, StrictMode strict_mode); static void GenerateMegamorphic(MacroAssembler* masm, StrictMode strict_mode);
static void GenerateGeneric(MacroAssembler* masm, StrictMode strict_mode);
static void GenerateSloppyArguments(MacroAssembler* masm); static void GenerateSloppyArguments(MacroAssembler* masm);
protected: protected:
......
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