From e0e844b490d336ee51d38e83745174c98dde56db Mon Sep 17 00:00:00 2001 From: "weiliang.lin@intel.com" Date: Fri, 10 Oct 2014 05:40:44 +0000 Subject: [PATCH] X87: Add MEGAMORPHIC state support for KeyedStoreIC port r24500. original commit message: Add MEGAMORPHIC state support for KeyedStoreIC BUG= R=weiliang.lin@intel.com Review URL: https://codereview.chromium.org/642843004 Patch from Chunyang Dai . git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@24506 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/ic/x87/ic-x87.cc | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/src/ic/x87/ic-x87.cc b/src/ic/x87/ic-x87.cc index 9c090c5..05d2409 100644 --- a/src/ic/x87/ic-x87.cc +++ b/src/ic/x87/ic-x87.cc @@ -674,12 +674,13 @@ static void KeyedStoreGenerateGenericHelper( } -void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm, - StrictMode strict_mode) { +void KeyedStoreIC::GenerateGeneric( + MacroAssembler* masm, StrictMode strict_mode, + KeyedStoreStubCacheRequirement handler_requirement) { // Return address is on the stack. Label slow, fast_object, fast_object_grow; Label fast_double, fast_double_grow; - Label array, extra, check_if_double_array; + Label array, extra, check_if_double_array, maybe_name_key, miss; Register receiver = StoreDescriptor::ReceiverRegister(); Register key = StoreDescriptor::NameRegister(); DCHECK(receiver.is(edx)); @@ -695,7 +696,7 @@ void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm, 1 << Map::kIsAccessCheckNeeded | 1 << Map::kIsObserved); __ j(not_zero, &slow); // Check that the key is a smi. - __ JumpIfNotSmi(key, &slow); + __ JumpIfNotSmi(key, &maybe_name_key); __ CmpInstanceType(edi, JS_ARRAY_TYPE); __ j(equal, &array); // Check that the object is some kind of JSObject. @@ -713,6 +714,23 @@ void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm, // Slow case: call runtime. __ bind(&slow); PropertyICCompiler::GenerateRuntimeSetProperty(masm, strict_mode); + // Never returns to here. + + __ bind(&maybe_name_key); + __ mov(ebx, FieldOperand(key, HeapObject::kMapOffset)); + __ movzx_b(ebx, FieldOperand(ebx, Map::kInstanceTypeOffset)); + __ JumpIfNotUniqueNameInstanceType(ebx, &slow); + Code::Flags flags = Code::RemoveTypeAndHolderFromFlags( + Code::ComputeHandlerFlags(Code::STORE_IC)); + masm->isolate()->stub_cache()->GenerateProbe(masm, flags, false, receiver, + key, ebx, no_reg); + // Cache miss. + if (handler_requirement == kCallRuntimeOnMissingHandler) { + __ jmp(&slow); + } else { + DCHECK(handler_requirement == kMissOnMissingHandler); + __ jmp(&miss); + } // Extra capacity case: Check if there is extra capacity to // perform the store and update the length. Used for adding one @@ -755,6 +773,11 @@ void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm, kCheckMap, kDontIncrementLength); KeyedStoreGenerateGenericHelper(masm, &fast_object_grow, &fast_double_grow, &slow, kDontCheckMap, kIncrementLength); + + if (handler_requirement == kMissOnMissingHandler) { + __ bind(&miss); + GenerateMiss(masm); + } } -- 2.7.4