Index: src/mips/code-stubs-mips.cc |
diff --git a/src/mips/code-stubs-mips.cc b/src/mips/code-stubs-mips.cc |
index 97ef020af5775649cb795488b16ecd604ec533a9..43d8999d0db38a10df74856dc7ffb9f2157a1c98 100644 |
--- a/src/mips/code-stubs-mips.cc |
+++ b/src/mips/code-stubs-mips.cc |
@@ -328,6 +328,29 @@ void ElementsTransitionAndStoreStub::InitializeInterfaceDescriptor( |
} |
+void BinaryOpICStub::InitializeInterfaceDescriptor( |
+ Isolate* isolate, |
+ CodeStubInterfaceDescriptor* descriptor) { |
+ static Register registers[] = { a1, a0 }; |
+ descriptor->register_param_count_ = 2; |
+ descriptor->register_params_ = registers; |
+ descriptor->deoptimization_handler_ = FUNCTION_ADDR(BinaryOpIC_Miss); |
+ descriptor->SetMissHandler( |
+ ExternalReference(IC_Utility(IC::kBinaryOpIC_Miss), isolate)); |
+} |
+ |
+ |
+void BinaryOpWithAllocationSiteStub::InitializeInterfaceDescriptor( |
+ Isolate* isolate, |
+ CodeStubInterfaceDescriptor* descriptor) { |
+ static Register registers[] = { a2, a1, a0 }; |
+ descriptor->register_param_count_ = 3; |
+ descriptor->register_params_ = registers; |
+ descriptor->deoptimization_handler_ = |
+ FUNCTION_ADDR(BinaryOpIC_MissWithAllocationSite); |
+} |
+ |
+ |
void NewStringAddStub::InitializeInterfaceDescriptor( |
Isolate* isolate, |
CodeStubInterfaceDescriptor* descriptor) { |
@@ -1286,18 +1309,6 @@ void StoreBufferOverflowStub::Generate(MacroAssembler* masm) { |
} |
-void BinaryOpICStub::InitializeInterfaceDescriptor( |
- Isolate* isolate, |
- CodeStubInterfaceDescriptor* descriptor) { |
- static Register registers[] = { a1, a0 }; |
- descriptor->register_param_count_ = 2; |
- descriptor->register_params_ = registers; |
- descriptor->deoptimization_handler_ = FUNCTION_ADDR(BinaryOpIC_Miss); |
- descriptor->SetMissHandler( |
- ExternalReference(IC_Utility(IC::kBinaryOpIC_Miss), isolate)); |
-} |
- |
- |
void MathPowStub::Generate(MacroAssembler* masm) { |
const Register base = a1; |
const Register exponent = a2; |
@@ -1528,6 +1539,7 @@ void CodeStub::GenerateStubsAheadOfTime(Isolate* isolate) { |
BinaryOpICStub::GenerateAheadOfTime(isolate); |
StoreRegistersStateStub::GenerateAheadOfTime(isolate); |
RestoreRegistersStateStub::GenerateAheadOfTime(isolate); |
+ BinaryOpICWithAllocationSiteStub::GenerateAheadOfTime(isolate); |
} |
@@ -4306,6 +4318,35 @@ void StringCompareStub::Generate(MacroAssembler* masm) { |
} |
+void BinaryOpICWithAllocationSiteStub::Generate(MacroAssembler* masm) { |
+ // ----------- S t a t e ------------- |
+ // -- a1 : left |
+ // -- a0 : right |
+ // -- ar : return address |
Paul Lind
2014/01/02 21:36:14
nit: typo on ra
|
+ // ----------------------------------- |
+ Isolate* isolate = masm->isolate(); |
+ |
+ // Load a2 with the allocation site. We stick an undefined dummy value here |
+ // and replace it with the real allocation site later when we instantiate this |
+ // stub in BinaryOpICWithAllocationSiteStub::GetCodeCopyFromTemplate(). |
+ __ li(a2, handle(isolate->heap()->undefined_value())); |
+ |
+ // Make sure that we actually patched the allocation site. |
+ if (FLAG_debug_code) { |
+ __ And(at, a2, Operand(kSmiTagMask)); |
+ __ Assert(ne, kExpectedAllocationSite, at, Operand(zero_reg)); |
+ __ lw(t0, FieldMemOperand(a2, HeapObject::kMapOffset)); |
+ __ LoadRoot(at, Heap::kAllocationSiteMapRootIndex); |
+ __ Assert(eq, kExpectedAllocationSite, t0, Operand(at)); |
+ } |
+ |
+ // Tail call into the stub that handles binary operations with allocation |
+ // sites. |
+ BinaryOpWithAllocationSiteStub stub(state_); |
+ __ TailCallStub(&stub); |
+} |
+ |
+ |
void StringAddStub::Generate(MacroAssembler* masm) { |
Label call_runtime, call_builtin; |
Builtins::JavaScript builtin_id = Builtins::ADD; |