Index: src/x87/code-stubs-x87.cc |
diff --git a/src/x87/code-stubs-x87.cc b/src/x87/code-stubs-x87.cc |
index 0cee91f4216925b5a016246a7a3a59ce43595cb9..40fcd46337677022e9686976c61922f44529827c 100644 |
--- a/src/x87/code-stubs-x87.cc |
+++ b/src/x87/code-stubs-x87.cc |
@@ -333,8 +333,19 @@ void FunctionPrototypeStub::Generate(MacroAssembler* masm) { |
Label miss; |
Register receiver = LoadDescriptor::ReceiverRegister(); |
- NamedLoadHandlerCompiler::GenerateLoadFunctionPrototype(masm, receiver, eax, |
- ebx, &miss); |
+ if (FLAG_vector_ics) { |
+ // With careful management, we won't have to save slot and vector on |
+ // the stack. Simply handle the possibly missing case first. |
+ // TODO(mvstanton): this code can be more efficient. |
+ __ cmp(FieldOperand(receiver, JSFunction::kPrototypeOrInitialMapOffset), |
+ Immediate(isolate()->factory()->the_hole_value())); |
+ __ j(equal, &miss); |
+ __ TryGetFunctionPrototype(receiver, eax, ebx, &miss); |
+ __ ret(0); |
+ } else { |
+ NamedLoadHandlerCompiler::GenerateLoadFunctionPrototype(masm, receiver, eax, |
+ ebx, &miss); |
+ } |
__ bind(&miss); |
PropertyAccessCompiler::TailCallBuiltin( |
masm, PropertyAccessCompiler::MissBuiltin(Code::LOAD_IC)); |
@@ -377,10 +388,17 @@ void LoadIndexedStringStub::Generate(MacroAssembler* masm) { |
Register receiver = LoadDescriptor::ReceiverRegister(); |
Register index = LoadDescriptor::NameRegister(); |
- Register scratch = ebx; |
+ Register scratch = edi; |
DCHECK(!scratch.is(receiver) && !scratch.is(index)); |
Register result = eax; |
DCHECK(!result.is(scratch)); |
+ DCHECK(!FLAG_vector_ics || |
+ (!scratch.is(VectorLoadICDescriptor::VectorRegister()) && |
+ result.is(VectorLoadICDescriptor::SlotRegister()))); |
+ |
+ // StringCharAtGenerator doesn't use the result register until it's passed |
+ // the different miss possibilities. If it did, we would have a conflict |
+ // when FLAG_vector_ics is true. |
StringCharAtGenerator char_at_generator(receiver, index, scratch, result, |
&miss, // When not a string. |