MIPS: Eliminate special keyed load string stub in favor of uniform handlers.
Port r24661 (5499efb) Original commit message: 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=paul.lind@imgtec.com Review URL: https://codereview.chromium.org/657413002 git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@24668 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
ec68f95987
commit
17b5b71bf7
@ -599,32 +599,6 @@ void KeyedLoadIC::GenerateGeneric(MacroAssembler* masm) {
|
||||
}
|
||||
|
||||
|
||||
void KeyedLoadIC::GenerateString(MacroAssembler* masm) {
|
||||
// Return address is in ra.
|
||||
Label miss;
|
||||
|
||||
Register receiver = LoadDescriptor::ReceiverRegister();
|
||||
Register index = LoadDescriptor::NameRegister();
|
||||
Register scratch = a3;
|
||||
Register result = v0;
|
||||
DCHECK(!scratch.is(receiver) && !scratch.is(index));
|
||||
|
||||
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();
|
||||
|
||||
StubRuntimeCallHelper call_helper;
|
||||
char_at_generator.GenerateSlow(masm, call_helper);
|
||||
|
||||
__ bind(&miss);
|
||||
GenerateMiss(masm);
|
||||
}
|
||||
|
||||
|
||||
static void KeyedStoreGenerateGenericHelper(
|
||||
MacroAssembler* masm, Label* fast_object, Label* fast_double, Label* slow,
|
||||
KeyedStoreCheckMap check_map, KeyedStoreIncrementLength increment_length,
|
||||
|
@ -1405,6 +1405,34 @@ void JSEntryStub::Generate(MacroAssembler* masm) {
|
||||
}
|
||||
|
||||
|
||||
void LoadIndexedStringStub::Generate(MacroAssembler* masm) {
|
||||
// Return address is in ra.
|
||||
Label miss;
|
||||
|
||||
Register receiver = LoadDescriptor::ReceiverRegister();
|
||||
Register index = LoadDescriptor::NameRegister();
|
||||
Register scratch = a3;
|
||||
Register result = v0;
|
||||
DCHECK(!scratch.is(receiver) && !scratch.is(index));
|
||||
|
||||
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();
|
||||
|
||||
StubRuntimeCallHelper call_helper;
|
||||
char_at_generator.GenerateSlow(masm, call_helper);
|
||||
|
||||
__ bind(&miss);
|
||||
PropertyAccessCompiler::TailCallBuiltin(
|
||||
masm, PropertyAccessCompiler::MissBuiltin(Code::KEYED_LOAD_IC));
|
||||
}
|
||||
|
||||
|
||||
// Uses registers a0 to a4.
|
||||
// Expected input (depending on whether args are in registers or on the stack):
|
||||
// * object: a0 or at sp + 1 * kPointerSize.
|
||||
|
Loading…
Reference in New Issue
Block a user