Use enum instead of bool for force_generic (MISS / MISS_FORCE_GENERIC)

Review URL: https://chromiumcodereview.appspot.com/11737032

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@13314 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
verwaest@chromium.org 2013-01-04 15:37:59 +00:00
parent 4ee20d857b
commit a8962e89b3
7 changed files with 61 additions and 52 deletions

View File

@ -862,7 +862,7 @@ void KeyedLoadIC::GenerateNonStrictArguments(MacroAssembler* masm) {
__ mov(r0, r2); __ mov(r0, r2);
__ Ret(); __ Ret();
__ bind(&slow); __ bind(&slow);
GenerateMiss(masm, false); GenerateMiss(masm, MISS);
} }
@ -891,7 +891,7 @@ void KeyedStoreIC::GenerateNonStrictArguments(MacroAssembler* masm) {
__ RecordWrite(r3, r6, r9, kLRHasNotBeenSaved, kDontSaveFPRegs); __ RecordWrite(r3, r6, r9, kLRHasNotBeenSaved, kDontSaveFPRegs);
__ Ret(); __ Ret();
__ bind(&slow); __ bind(&slow);
GenerateMiss(masm, false); GenerateMiss(masm, MISS);
} }
@ -925,7 +925,7 @@ void KeyedCallIC::GenerateNonStrictArguments(MacroAssembler* masm,
Object* KeyedLoadIC_Miss(Arguments args); Object* KeyedLoadIC_Miss(Arguments args);
void KeyedLoadIC::GenerateMiss(MacroAssembler* masm, bool force_generic) { void KeyedLoadIC::GenerateMiss(MacroAssembler* masm, ICMissMode miss_mode) {
// ---------- S t a t e -------------- // ---------- S t a t e --------------
// -- lr : return address // -- lr : return address
// -- r0 : key // -- r0 : key
@ -938,7 +938,7 @@ void KeyedLoadIC::GenerateMiss(MacroAssembler* masm, bool force_generic) {
__ Push(r1, r0); __ Push(r1, r0);
// Perform tail call to the entry. // Perform tail call to the entry.
ExternalReference ref = force_generic ExternalReference ref = miss_mode == MISS_FORCE_GENERIC
? ExternalReference(IC_Utility(kKeyedLoadIC_MissForceGeneric), isolate) ? ExternalReference(IC_Utility(kKeyedLoadIC_MissForceGeneric), isolate)
: ExternalReference(IC_Utility(kKeyedLoadIC_Miss), isolate); : ExternalReference(IC_Utility(kKeyedLoadIC_Miss), isolate);
@ -1158,7 +1158,7 @@ void KeyedLoadIC::GenerateString(MacroAssembler* masm) {
char_at_generator.GenerateSlow(masm, call_helper); char_at_generator.GenerateSlow(masm, call_helper);
__ bind(&miss); __ bind(&miss);
GenerateMiss(masm, false); GenerateMiss(masm, MISS);
} }
@ -1198,11 +1198,11 @@ void KeyedLoadIC::GenerateIndexedInterceptor(MacroAssembler* masm) {
1); 1);
__ bind(&slow); __ bind(&slow);
GenerateMiss(masm, false); GenerateMiss(masm, MISS);
} }
void KeyedStoreIC::GenerateMiss(MacroAssembler* masm, bool force_generic) { void KeyedStoreIC::GenerateMiss(MacroAssembler* masm, ICMissMode miss_mode) {
// ---------- S t a t e -------------- // ---------- S t a t e --------------
// -- r0 : value // -- r0 : value
// -- r1 : key // -- r1 : key
@ -1213,7 +1213,7 @@ void KeyedStoreIC::GenerateMiss(MacroAssembler* masm, bool force_generic) {
// Push receiver, key and value for runtime call. // Push receiver, key and value for runtime call.
__ Push(r2, r1, r0); __ Push(r2, r1, r0);
ExternalReference ref = force_generic ExternalReference ref = miss_mode == MISS_FORCE_GENERIC
? ExternalReference(IC_Utility(kKeyedStoreIC_MissForceGeneric), ? ExternalReference(IC_Utility(kKeyedStoreIC_MissForceGeneric),
masm->isolate()) masm->isolate())
: ExternalReference(IC_Utility(kKeyedStoreIC_Miss), masm->isolate()); : ExternalReference(IC_Utility(kKeyedStoreIC_Miss), masm->isolate());

View File

@ -1536,12 +1536,12 @@ static void Generate_KeyedLoadIC_Slow(MacroAssembler* masm) {
static void Generate_KeyedLoadIC_Miss(MacroAssembler* masm) { static void Generate_KeyedLoadIC_Miss(MacroAssembler* masm) {
KeyedLoadIC::GenerateMiss(masm, false); KeyedLoadIC::GenerateMiss(masm, MISS);
} }
static void Generate_KeyedLoadIC_MissForceGeneric(MacroAssembler* masm) { static void Generate_KeyedLoadIC_MissForceGeneric(MacroAssembler* masm) {
KeyedLoadIC::GenerateMiss(masm, true); KeyedLoadIC::GenerateMiss(masm, MISS_FORCE_GENERIC);
} }
@ -1638,12 +1638,12 @@ static void Generate_KeyedStoreIC_Generic_Strict(MacroAssembler* masm) {
static void Generate_KeyedStoreIC_Miss(MacroAssembler* masm) { static void Generate_KeyedStoreIC_Miss(MacroAssembler* masm) {
KeyedStoreIC::GenerateMiss(masm, false); KeyedStoreIC::GenerateMiss(masm, MISS);
} }
static void Generate_KeyedStoreIC_MissForceGeneric(MacroAssembler* masm) { static void Generate_KeyedStoreIC_MissForceGeneric(MacroAssembler* masm) {
KeyedStoreIC::GenerateMiss(masm, true); KeyedStoreIC::GenerateMiss(masm, MISS_FORCE_GENERIC);
} }

View File

@ -647,7 +647,7 @@ void KeyedLoadIC::GenerateString(MacroAssembler* masm) {
char_at_generator.GenerateSlow(masm, call_helper); char_at_generator.GenerateSlow(masm, call_helper);
__ bind(&miss); __ bind(&miss);
GenerateMiss(masm, false); GenerateMiss(masm, MISS);
} }
@ -689,7 +689,7 @@ void KeyedLoadIC::GenerateIndexedInterceptor(MacroAssembler* masm) {
__ TailCallExternalReference(ref, 2, 1); __ TailCallExternalReference(ref, 2, 1);
__ bind(&slow); __ bind(&slow);
GenerateMiss(masm, false); GenerateMiss(masm, MISS);
} }
@ -714,7 +714,7 @@ void KeyedLoadIC::GenerateNonStrictArguments(MacroAssembler* masm) {
__ mov(eax, unmapped_location); __ mov(eax, unmapped_location);
__ Ret(); __ Ret();
__ bind(&slow); __ bind(&slow);
GenerateMiss(masm, false); GenerateMiss(masm, MISS);
} }
@ -743,7 +743,7 @@ void KeyedStoreIC::GenerateNonStrictArguments(MacroAssembler* masm) {
__ RecordWrite(ebx, edi, edx, kDontSaveFPRegs); __ RecordWrite(ebx, edi, edx, kDontSaveFPRegs);
__ Ret(); __ Ret();
__ bind(&slow); __ bind(&slow);
GenerateMiss(masm, false); GenerateMiss(masm, MISS);
} }
@ -1385,7 +1385,7 @@ void LoadIC::GenerateMiss(MacroAssembler* masm) {
} }
void KeyedLoadIC::GenerateMiss(MacroAssembler* masm, bool force_generic) { void KeyedLoadIC::GenerateMiss(MacroAssembler* masm, ICMissMode miss_mode) {
// ----------- S t a t e ------------- // ----------- S t a t e -------------
// -- ecx : key // -- ecx : key
// -- edx : receiver // -- edx : receiver
@ -1400,7 +1400,7 @@ void KeyedLoadIC::GenerateMiss(MacroAssembler* masm, bool force_generic) {
__ push(ebx); // return address __ push(ebx); // return address
// Perform tail call to the entry. // Perform tail call to the entry.
ExternalReference ref = force_generic ExternalReference ref = miss_mode == MISS_FORCE_GENERIC
? ExternalReference(IC_Utility(kKeyedLoadIC_MissForceGeneric), ? ExternalReference(IC_Utility(kKeyedLoadIC_MissForceGeneric),
masm->isolate()) masm->isolate())
: ExternalReference(IC_Utility(kKeyedLoadIC_Miss), masm->isolate()); : ExternalReference(IC_Utility(kKeyedLoadIC_Miss), masm->isolate());
@ -1598,7 +1598,7 @@ void KeyedStoreIC::GenerateRuntimeSetProperty(MacroAssembler* masm,
} }
void KeyedStoreIC::GenerateMiss(MacroAssembler* masm, bool force_generic) { void KeyedStoreIC::GenerateMiss(MacroAssembler* masm, ICMissMode miss_mode) {
// ----------- S t a t e ------------- // ----------- S t a t e -------------
// -- eax : value // -- eax : value
// -- ecx : key // -- ecx : key
@ -1613,7 +1613,7 @@ void KeyedStoreIC::GenerateMiss(MacroAssembler* masm, bool force_generic) {
__ push(ebx); __ push(ebx);
// Do tail-call to runtime routine. // Do tail-call to runtime routine.
ExternalReference ref = force_generic ExternalReference ref = miss_mode == MISS_FORCE_GENERIC
? ExternalReference(IC_Utility(kKeyedStoreIC_MissForceGeneric), ? ExternalReference(IC_Utility(kKeyedStoreIC_MissForceGeneric),
masm->isolate()) masm->isolate())
: ExternalReference(IC_Utility(kKeyedStoreIC_Miss), masm->isolate()); : ExternalReference(IC_Utility(kKeyedStoreIC_Miss), masm->isolate());

View File

@ -1108,7 +1108,7 @@ static Handle<Object> TryConvertKey(Handle<Object> key, Isolate* isolate) {
MaybeObject* KeyedLoadIC::Load(State state, MaybeObject* KeyedLoadIC::Load(State state,
Handle<Object> object, Handle<Object> object,
Handle<Object> key, Handle<Object> key,
bool force_generic_stub) { ICMissMode miss_mode) {
// Check for values that can be converted into a symbol directly or // Check for values that can be converted into a symbol directly or
// is representable as a smi. // is representable as a smi.
key = TryConvertKey(key, isolate()); key = TryConvertKey(key, isolate());
@ -1209,7 +1209,7 @@ MaybeObject* KeyedLoadIC::Load(State state,
if (use_ic) { if (use_ic) {
Handle<Code> stub = generic_stub(); Handle<Code> stub = generic_stub();
if (!force_generic_stub) { if (miss_mode != MISS_FORCE_GENERIC) {
if (object->IsString() && key->IsNumber()) { if (object->IsString() && key->IsNumber()) {
if (state == UNINITIALIZED) { if (state == UNINITIALIZED) {
stub = string_stub(); stub = string_stub();
@ -1880,7 +1880,7 @@ MaybeObject* KeyedStoreIC::Store(State state,
Handle<Object> object, Handle<Object> object,
Handle<Object> key, Handle<Object> key,
Handle<Object> value, Handle<Object> value,
bool force_generic) { ICMissMode miss_mode) {
// Check for values that can be converted into a symbol directly or // Check for values that can be converted into a symbol directly or
// is representable as a smi. // is representable as a smi.
key = TryConvertKey(key, isolate()); key = TryConvertKey(key, isolate());
@ -1942,7 +1942,7 @@ MaybeObject* KeyedStoreIC::Store(State state,
if (receiver->elements()->map() == if (receiver->elements()->map() ==
isolate()->heap()->non_strict_arguments_elements_map()) { isolate()->heap()->non_strict_arguments_elements_map()) {
stub = non_strict_arguments_stub(); stub = non_strict_arguments_stub();
} else if (!force_generic) { } else if (miss_mode != MISS_FORCE_GENERIC) {
if (key->IsSmi() && (target() != *non_strict_arguments_stub())) { if (key->IsSmi() && (target() != *non_strict_arguments_stub())) {
StubKind stub_kind = GetStubKind(receiver, key, value); StubKind stub_kind = GetStubKind(receiver, key, value);
stub = ComputeStub(receiver, stub_kind, strict_mode, stub); stub = ComputeStub(receiver, stub_kind, strict_mode, stub);
@ -2110,7 +2110,7 @@ RUNTIME_FUNCTION(MaybeObject*, KeyedLoadIC_Miss) {
ASSERT(args.length() == 2); ASSERT(args.length() == 2);
KeyedLoadIC ic(isolate); KeyedLoadIC ic(isolate);
IC::State state = IC::StateFrom(ic.target(), args[0], args[1]); IC::State state = IC::StateFrom(ic.target(), args[0], args[1]);
return ic.Load(state, args.at<Object>(0), args.at<Object>(1), false); return ic.Load(state, args.at<Object>(0), args.at<Object>(1), MISS);
} }
@ -2119,7 +2119,10 @@ RUNTIME_FUNCTION(MaybeObject*, KeyedLoadIC_MissForceGeneric) {
ASSERT(args.length() == 2); ASSERT(args.length() == 2);
KeyedLoadIC ic(isolate); KeyedLoadIC ic(isolate);
IC::State state = IC::StateFrom(ic.target(), args[0], args[1]); IC::State state = IC::StateFrom(ic.target(), args[0], args[1]);
return ic.Load(state, args.at<Object>(0), args.at<Object>(1), true); return ic.Load(state,
args.at<Object>(0),
args.at<Object>(1),
MISS_FORCE_GENERIC);
} }
@ -2211,7 +2214,7 @@ RUNTIME_FUNCTION(MaybeObject*, KeyedStoreIC_Miss) {
args.at<Object>(0), args.at<Object>(0),
args.at<Object>(1), args.at<Object>(1),
args.at<Object>(2), args.at<Object>(2),
false); MISS);
} }
@ -2244,7 +2247,7 @@ RUNTIME_FUNCTION(MaybeObject*, KeyedStoreIC_MissForceGeneric) {
args.at<Object>(0), args.at<Object>(0),
args.at<Object>(1), args.at<Object>(1),
args.at<Object>(2), args.at<Object>(2),
true); MISS_FORCE_GENERIC);
} }

View File

@ -476,6 +476,12 @@ class KeyedIC: public IC {
}; };
enum ICMissMode {
MISS_FORCE_GENERIC,
MISS
};
class KeyedLoadIC: public KeyedIC { class KeyedLoadIC: public KeyedIC {
public: public:
explicit KeyedLoadIC(Isolate* isolate) : KeyedIC(isolate) { explicit KeyedLoadIC(Isolate* isolate) : KeyedIC(isolate) {
@ -485,16 +491,16 @@ class KeyedLoadIC: public KeyedIC {
MUST_USE_RESULT MaybeObject* Load(State state, MUST_USE_RESULT MaybeObject* Load(State state,
Handle<Object> object, Handle<Object> object,
Handle<Object> key, Handle<Object> key,
bool force_generic_stub); ICMissMode force_generic);
// Code generator routines. // Code generator routines.
static void GenerateMiss(MacroAssembler* masm, bool force_generic); static void GenerateMiss(MacroAssembler* masm, ICMissMode force_generic);
static void GenerateRuntimeGetProperty(MacroAssembler* masm); static void GenerateRuntimeGetProperty(MacroAssembler* masm);
static void GenerateInitialize(MacroAssembler* masm) { static void GenerateInitialize(MacroAssembler* masm) {
GenerateMiss(masm, false); GenerateMiss(masm, MISS);
} }
static void GeneratePreMonomorphic(MacroAssembler* masm) { static void GeneratePreMonomorphic(MacroAssembler* masm) {
GenerateMiss(masm, false); GenerateMiss(masm, MISS);
} }
static void GenerateGeneric(MacroAssembler* masm); static void GenerateGeneric(MacroAssembler* masm);
static void GenerateString(MacroAssembler* masm); static void GenerateString(MacroAssembler* masm);
@ -654,13 +660,13 @@ class KeyedStoreIC: public KeyedIC {
Handle<Object> object, Handle<Object> object,
Handle<Object> name, Handle<Object> name,
Handle<Object> value, Handle<Object> value,
bool force_generic); ICMissMode force_generic);
// Code generators for stub routines. Only called once at startup. // Code generators for stub routines. Only called once at startup.
static void GenerateInitialize(MacroAssembler* masm) { static void GenerateInitialize(MacroAssembler* masm) {
GenerateMiss(masm, false); GenerateMiss(masm, MISS);
} }
static void GenerateMiss(MacroAssembler* masm, bool force_generic); static void GenerateMiss(MacroAssembler* masm, ICMissMode force_generic);
static void GenerateSlow(MacroAssembler* masm); static void GenerateSlow(MacroAssembler* masm);
static void GenerateRuntimeSetProperty(MacroAssembler* masm, static void GenerateRuntimeSetProperty(MacroAssembler* masm,
StrictModeFlag strict_mode); StrictModeFlag strict_mode);
@ -686,7 +692,7 @@ class KeyedStoreIC: public KeyedIC {
StrictModeFlag strict_mode, StrictModeFlag strict_mode,
KeyedAccessGrowMode grow_mode); KeyedAccessGrowMode grow_mode);
private: private:
// Update the inline cache. // Update the inline cache.
void UpdateCaches(LookupResult* lookup, void UpdateCaches(LookupResult* lookup,
State state, State state,

View File

@ -858,7 +858,7 @@ void KeyedLoadIC::GenerateNonStrictArguments(MacroAssembler* masm) {
__ Ret(USE_DELAY_SLOT); __ Ret(USE_DELAY_SLOT);
__ mov(v0, a2); __ mov(v0, a2);
__ bind(&slow); __ bind(&slow);
GenerateMiss(masm, false); GenerateMiss(masm, MISS);
} }
@ -893,7 +893,7 @@ void KeyedStoreIC::GenerateNonStrictArguments(MacroAssembler* masm) {
__ Ret(USE_DELAY_SLOT); __ Ret(USE_DELAY_SLOT);
__ mov(v0, a0); // (In delay slot) return the value stored in v0. __ mov(v0, a0); // (In delay slot) return the value stored in v0.
__ bind(&slow); __ bind(&slow);
GenerateMiss(masm, false); GenerateMiss(masm, MISS);
} }
@ -926,7 +926,7 @@ void KeyedCallIC::GenerateNonStrictArguments(MacroAssembler* masm,
Object* KeyedLoadIC_Miss(Arguments args); Object* KeyedLoadIC_Miss(Arguments args);
void KeyedLoadIC::GenerateMiss(MacroAssembler* masm, bool force_generic) { void KeyedLoadIC::GenerateMiss(MacroAssembler* masm, ICMissMode miss_mode) {
// ---------- S t a t e -------------- // ---------- S t a t e --------------
// -- ra : return address // -- ra : return address
// -- a0 : key // -- a0 : key
@ -939,7 +939,7 @@ void KeyedLoadIC::GenerateMiss(MacroAssembler* masm, bool force_generic) {
__ Push(a1, a0); __ Push(a1, a0);
// Perform tail call to the entry. // Perform tail call to the entry.
ExternalReference ref = force_generic ExternalReference ref = miss_mode == MISS_FORCE_GENERIC
? ExternalReference(IC_Utility(kKeyedLoadIC_MissForceGeneric), isolate) ? ExternalReference(IC_Utility(kKeyedLoadIC_MissForceGeneric), isolate)
: ExternalReference(IC_Utility(kKeyedLoadIC_Miss), isolate); : ExternalReference(IC_Utility(kKeyedLoadIC_Miss), isolate);
@ -1166,7 +1166,7 @@ void KeyedLoadIC::GenerateString(MacroAssembler* masm) {
char_at_generator.GenerateSlow(masm, call_helper); char_at_generator.GenerateSlow(masm, call_helper);
__ bind(&miss); __ bind(&miss);
GenerateMiss(masm, false); GenerateMiss(masm, MISS);
} }
@ -1452,11 +1452,11 @@ void KeyedLoadIC::GenerateIndexedInterceptor(MacroAssembler* masm) {
IC_Utility(kKeyedLoadPropertyWithInterceptor), masm->isolate()), 2, 1); IC_Utility(kKeyedLoadPropertyWithInterceptor), masm->isolate()), 2, 1);
__ bind(&slow); __ bind(&slow);
GenerateMiss(masm, false); GenerateMiss(masm, MISS);
} }
void KeyedStoreIC::GenerateMiss(MacroAssembler* masm, bool force_generic) { void KeyedStoreIC::GenerateMiss(MacroAssembler* masm, ICMissMode miss_mode) {
// ---------- S t a t e -------------- // ---------- S t a t e --------------
// -- a0 : value // -- a0 : value
// -- a1 : key // -- a1 : key
@ -1467,7 +1467,7 @@ void KeyedStoreIC::GenerateMiss(MacroAssembler* masm, bool force_generic) {
// Push receiver, key and value for runtime call. // Push receiver, key and value for runtime call.
__ Push(a2, a1, a0); __ Push(a2, a1, a0);
ExternalReference ref = force_generic ExternalReference ref = miss_mode == MISS_FORCE_GENERIC
? ExternalReference(IC_Utility(kKeyedStoreIC_MissForceGeneric), ? ExternalReference(IC_Utility(kKeyedStoreIC_MissForceGeneric),
masm->isolate()) masm->isolate())
: ExternalReference(IC_Utility(kKeyedStoreIC_Miss), masm->isolate()); : ExternalReference(IC_Utility(kKeyedStoreIC_Miss), masm->isolate());

View File

@ -576,7 +576,7 @@ void KeyedLoadIC::GenerateString(MacroAssembler* masm) {
char_at_generator.GenerateSlow(masm, call_helper); char_at_generator.GenerateSlow(masm, call_helper);
__ bind(&miss); __ bind(&miss);
GenerateMiss(masm, false); GenerateMiss(masm, MISS);
} }
@ -619,7 +619,7 @@ void KeyedLoadIC::GenerateIndexedInterceptor(MacroAssembler* masm) {
1); 1);
__ bind(&slow); __ bind(&slow);
GenerateMiss(masm, false); GenerateMiss(masm, MISS);
} }
@ -1278,7 +1278,7 @@ void KeyedLoadIC::GenerateNonStrictArguments(MacroAssembler* masm) {
__ movq(rax, unmapped_location); __ movq(rax, unmapped_location);
__ Ret(); __ Ret();
__ bind(&slow); __ bind(&slow);
GenerateMiss(masm, false); GenerateMiss(masm, MISS);
} }
@ -1317,7 +1317,7 @@ void KeyedStoreIC::GenerateNonStrictArguments(MacroAssembler* masm) {
INLINE_SMI_CHECK); INLINE_SMI_CHECK);
__ Ret(); __ Ret();
__ bind(&slow); __ bind(&slow);
GenerateMiss(masm, false); GenerateMiss(masm, MISS);
} }
@ -1411,7 +1411,7 @@ void LoadIC::GenerateMiss(MacroAssembler* masm) {
} }
void KeyedLoadIC::GenerateMiss(MacroAssembler* masm, bool force_generic) { void KeyedLoadIC::GenerateMiss(MacroAssembler* masm, ICMissMode miss_mode) {
// ----------- S t a t e ------------- // ----------- S t a t e -------------
// -- rax : key // -- rax : key
// -- rdx : receiver // -- rdx : receiver
@ -1427,7 +1427,7 @@ void KeyedLoadIC::GenerateMiss(MacroAssembler* masm, bool force_generic) {
__ push(rbx); // return address __ push(rbx); // return address
// Perform tail call to the entry. // Perform tail call to the entry.
ExternalReference ref = force_generic ExternalReference ref = miss_mode == MISS_FORCE_GENERIC
? ExternalReference(IC_Utility(kKeyedLoadIC_MissForceGeneric), ? ExternalReference(IC_Utility(kKeyedLoadIC_MissForceGeneric),
masm->isolate()) masm->isolate())
: ExternalReference(IC_Utility(kKeyedLoadIC_Miss), masm->isolate()); : ExternalReference(IC_Utility(kKeyedLoadIC_Miss), masm->isolate());
@ -1638,7 +1638,7 @@ void KeyedStoreIC::GenerateSlow(MacroAssembler* masm) {
} }
void KeyedStoreIC::GenerateMiss(MacroAssembler* masm, bool force_generic) { void KeyedStoreIC::GenerateMiss(MacroAssembler* masm, ICMissMode miss_mode) {
// ----------- S t a t e ------------- // ----------- S t a t e -------------
// -- rax : value // -- rax : value
// -- rcx : key // -- rcx : key
@ -1653,7 +1653,7 @@ void KeyedStoreIC::GenerateMiss(MacroAssembler* masm, bool force_generic) {
__ push(rbx); // return address __ push(rbx); // return address
// Do tail-call to runtime routine. // Do tail-call to runtime routine.
ExternalReference ref = force_generic ExternalReference ref = miss_mode == MISS_FORCE_GENERIC
? ExternalReference(IC_Utility(kKeyedStoreIC_MissForceGeneric), ? ExternalReference(IC_Utility(kKeyedStoreIC_MissForceGeneric),
masm->isolate()) masm->isolate())
: ExternalReference(IC_Utility(kKeyedStoreIC_Miss), masm->isolate()); : ExternalReference(IC_Utility(kKeyedStoreIC_Miss), masm->isolate());