From d8ae78539ff42d3d257dea7f1353d1b63f9c5679 Mon Sep 17 00:00:00 2001 From: "weiliang.lin@intel.com" Date: Fri, 17 Oct 2014 05:23:14 +0000 Subject: [PATCH] X87: Eliminate special keyed load string stub in favor of uniform handlers port r24661. original commit message: Eliminate special keyed load string stub in favor of uniform handlers. KeyedLoadIC installs a special case if the receiver is a string. Although there are several maps for strings, in practice we seem to be able to treat them individually because a given KeyedLoad site only sees 1-2 string types BUG= R=weiliang.lin@intel.com Review URL: https://codereview.chromium.org/643783005 Patch from Chunyang Dai . git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@24674 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/ic/x87/ic-x87.cc | 27 --------------------------- src/x87/code-stubs-x87.cc | 31 +++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 27 deletions(-) diff --git a/src/ic/x87/ic-x87.cc b/src/ic/x87/ic-x87.cc index 05d2409..432c55b 100644 --- a/src/ic/x87/ic-x87.cc +++ b/src/ic/x87/ic-x87.cc @@ -478,33 +478,6 @@ void KeyedLoadIC::GenerateGeneric(MacroAssembler* masm) { } -void KeyedLoadIC::GenerateString(MacroAssembler* masm) { - // Return address is on the stack. - Label miss; - - Register receiver = LoadDescriptor::ReceiverRegister(); - Register index = LoadDescriptor::NameRegister(); - Register scratch = ebx; - DCHECK(!scratch.is(receiver) && !scratch.is(index)); - Register result = eax; - DCHECK(!result.is(scratch)); - - StringCharAtGenerator char_at_generator(receiver, index, scratch, result, - &miss, // When not a string. - &miss, // When not a number. - &miss, // When index out of range. - STRING_INDEX_IS_ARRAY_INDEX); - char_at_generator.GenerateFast(masm); - __ ret(0); - - StubRuntimeCallHelper call_helper; - char_at_generator.GenerateSlow(masm, call_helper); - - __ bind(&miss); - GenerateMiss(masm); -} - - void KeyedStoreIC::GenerateSloppyArguments(MacroAssembler* masm) { // Return address is on the stack. Label slow, notin; diff --git a/src/x87/code-stubs-x87.cc b/src/x87/code-stubs-x87.cc index 4a6083c..690c370 100644 --- a/src/x87/code-stubs-x87.cc +++ b/src/x87/code-stubs-x87.cc @@ -371,6 +371,37 @@ void LoadIndexedInterceptorStub::Generate(MacroAssembler* masm) { } +void LoadIndexedStringStub::Generate(MacroAssembler* masm) { + // Return address is on the stack. + Label miss; + + Register receiver = LoadDescriptor::ReceiverRegister(); + Register index = LoadDescriptor::NameRegister(); + Register scratch = ebx; + DCHECK(!scratch.is(receiver) && !scratch.is(index)); + Register result = eax; + DCHECK(!result.is(scratch)); + + // TODO(mvstanton): the generator doesn't need to verify that + // receiver is a string map, that is done outside the handler. + StringCharAtGenerator char_at_generator(receiver, index, scratch, result, + &miss, // When not a string. + &miss, // When not a number. + &miss, // When index out of range. + STRING_INDEX_IS_ARRAY_INDEX, + RECEIVER_IS_STRING); + char_at_generator.GenerateFast(masm); + __ ret(0); + + StubRuntimeCallHelper call_helper; + char_at_generator.GenerateSlow(masm, call_helper); + + __ bind(&miss); + PropertyAccessCompiler::TailCallBuiltin( + masm, PropertyAccessCompiler::MissBuiltin(Code::KEYED_LOAD_IC)); +} + + void ArgumentsAccessStub::GenerateReadElement(MacroAssembler* masm) { // The key is in edx and the parameter count is in eax. DCHECK(edx.is(ArgumentsAccessReadDescriptor::index())); -- 2.7.4