Index: src/mips/code-stubs-mips.cc |
diff --git a/src/mips/code-stubs-mips.cc b/src/mips/code-stubs-mips.cc |
index 7a46a30682081cc3239cfacea06049a53c59689b..f8f177ccf6601ed1dd5e1560ec2f40803e64542c 100644 |
--- a/src/mips/code-stubs-mips.cc |
+++ b/src/mips/code-stubs-mips.cc |
@@ -1917,6 +1917,14 @@ void CallConstructStub::Generate(MacroAssembler* masm) { |
__ Jump(isolate()->builtins()->Construct(), RelocInfo::CODE_TARGET); |
} |
+// Note: feedback_vector and slot are clobbered after the call. |
+static void IncrementCallCount(MacroAssembler* masm, Register feedback_vector, |
+ Register slot) { |
+ __ Lsa(at, feedback_vector, slot, kPointerSizeLog2 - kSmiTagSize); |
+ __ lw(slot, FieldMemOperand(at, FixedArray::kHeaderSize + kPointerSize)); |
+ __ Addu(slot, slot, Operand(Smi::FromInt(1))); |
+ __ sw(slot, FieldMemOperand(at, FixedArray::kHeaderSize + kPointerSize)); |
+} |
void CallICStub::HandleArrayCase(MacroAssembler* masm, Label* miss) { |
// a1 - function |
@@ -1929,10 +1937,7 @@ void CallICStub::HandleArrayCase(MacroAssembler* masm, Label* miss) { |
__ li(a0, Operand(arg_count())); |
// Increment the call count for monomorphic function calls. |
- __ Lsa(at, a2, a3, kPointerSizeLog2 - kSmiTagSize); |
- __ lw(a3, FieldMemOperand(at, FixedArray::kHeaderSize + kPointerSize)); |
- __ Addu(a3, a3, Operand(Smi::FromInt(1))); |
- __ sw(a3, FieldMemOperand(at, FixedArray::kHeaderSize + kPointerSize)); |
+ IncrementCallCount(masm, a2, a3); |
__ mov(a2, t0); |
__ mov(a3, a1); |
@@ -1945,7 +1950,7 @@ void CallICStub::Generate(MacroAssembler* masm) { |
// a1 - function |
// a3 - slot id (Smi) |
// a2 - vector |
- Label extra_checks_or_miss, call, call_function; |
+ Label extra_checks_or_miss, call, call_function, call_count_incremented; |
int argc = arg_count(); |
ParameterCount actual(argc); |
@@ -1974,13 +1979,11 @@ void CallICStub::Generate(MacroAssembler* masm) { |
// convincing us that we have a monomorphic JSFunction. |
__ JumpIfSmi(a1, &extra_checks_or_miss); |
+ __ bind(&call_function); |
+ |
// Increment the call count for monomorphic function calls. |
- __ Lsa(at, a2, a3, kPointerSizeLog2 - kSmiTagSize); |
- __ lw(a3, FieldMemOperand(at, FixedArray::kHeaderSize + kPointerSize)); |
- __ Addu(a3, a3, Operand(Smi::FromInt(1))); |
- __ sw(a3, FieldMemOperand(at, FixedArray::kHeaderSize + kPointerSize)); |
+ IncrementCallCount(masm, a2, a3); |
- __ bind(&call_function); |
__ Jump(masm->isolate()->builtins()->CallFunction(convert_mode(), |
tail_call_mode()), |
RelocInfo::CODE_TARGET, al, zero_reg, Operand(zero_reg), |
@@ -2021,6 +2024,10 @@ void CallICStub::Generate(MacroAssembler* masm) { |
__ sw(at, FieldMemOperand(t0, FixedArray::kHeaderSize)); |
__ bind(&call); |
+ IncrementCallCount(masm, a2, a3); |
+ |
+ __ bind(&call_count_incremented); |
+ |
__ Jump(masm->isolate()->builtins()->Call(convert_mode(), tail_call_mode()), |
RelocInfo::CODE_TARGET, al, zero_reg, Operand(zero_reg), |
USE_DELAY_SLOT); |
@@ -2046,11 +2053,6 @@ void CallICStub::Generate(MacroAssembler* masm) { |
__ lw(t1, NativeContextMemOperand()); |
__ Branch(&miss, ne, t0, Operand(t1)); |
- // Initialize the call counter. |
- __ Lsa(at, a2, a3, kPointerSizeLog2 - kSmiTagSize); |
- __ li(t0, Operand(Smi::FromInt(1))); |
- __ sw(t0, FieldMemOperand(at, FixedArray::kHeaderSize + kPointerSize)); |
- |
// Store the function. Use a stub since we need a frame for allocation. |
// a2 - vector |
// a3 - slot |
@@ -2058,9 +2060,11 @@ void CallICStub::Generate(MacroAssembler* masm) { |
{ |
FrameScope scope(masm, StackFrame::INTERNAL); |
CreateWeakCellStub create_stub(masm->isolate()); |
+ __ Push(a2, a3); |
__ Push(cp, a1); |
__ CallStub(&create_stub); |
__ Pop(cp, a1); |
+ __ Pop(a2, a3); |
} |
__ Branch(&call_function); |
@@ -2070,7 +2074,7 @@ void CallICStub::Generate(MacroAssembler* masm) { |
__ bind(&miss); |
GenerateMiss(masm); |
- __ Branch(&call); |
+ __ Branch(&call_count_incremented); |
} |