From b2e15510a845020554ea6b3430f5cf213a08fc54 Mon Sep 17 00:00:00 2001 From: cdai2 Date: Mon, 9 Feb 2015 14:33:40 +0800 Subject: [PATCH] X87: Megamorphic KeyedLoadIC needs special handling for vector ics port 16843e239d95f5e8eaaa06d2a0a6e371298fe11f (r26381) original commit message: Megamorphic KeyedLoadIC needs special handling for vector ics. When --vector-ics is true, we still tail-call to the hand-written megamorphic KeyedLoadIC (formerly "generic"). Now that this code uses the megamorphic cache, it needs to deal properly with the vector and slot registers. Achieve this with a sentinel vectors/slot combo. BUG= R=weiliang.lin@intel.com Review URL: https://codereview.chromium.org/910623002 Cr-Commit-Position: refs/heads/master@{#26508} --- src/ic/x87/ic-x87.cc | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/ic/x87/ic-x87.cc b/src/ic/x87/ic-x87.cc index 77c9c916da..67cc7142e8 100644 --- a/src/ic/x87/ic-x87.cc +++ b/src/ic/x87/ic-x87.cc @@ -399,10 +399,27 @@ void KeyedLoadIC::GenerateMegamorphic(MacroAssembler* masm) { Immediate(isolate->factory()->hash_table_map())); __ j(equal, &probe_dictionary); + if (FLAG_vector_ics) { + // When vector ics are in use, the handlers in the stub cache expect a + // vector and slot. Since we won't change the IC from any downstream + // misses, a dummy vector can be used. + Handle dummy_vector = Handle::cast( + isolate->factory()->keyed_load_dummy_vector()); + int slot = dummy_vector->GetIndex(FeedbackVectorICSlot(0)); + __ push(Immediate(Smi::FromInt(slot))); + __ push(Immediate(dummy_vector)); + } + Code::Flags flags = Code::RemoveTypeAndHolderFromFlags( Code::ComputeHandlerFlags(Code::LOAD_IC)); - masm->isolate()->stub_cache()->GenerateProbe( - masm, Code::LOAD_IC, flags, false, receiver, key, ebx, no_reg); + masm->isolate()->stub_cache()->GenerateProbe(masm, Code::KEYED_LOAD_IC, flags, + false, receiver, key, ebx, edi); + + if (FLAG_vector_ics) { + __ pop(VectorLoadICDescriptor::VectorRegister()); + __ pop(VectorLoadICDescriptor::SlotRegister()); + } + // Cache miss. GenerateMiss(masm);