Chromium Code Reviews| Index: src/arm/code-stubs-arm.cc |
| diff --git a/src/arm/code-stubs-arm.cc b/src/arm/code-stubs-arm.cc |
| index 664abe027190dd251397031a042a756fab6fd55b..4e92cf87d16fdb3af0c45e2a1d62823557f4b2db 100644 |
| --- a/src/arm/code-stubs-arm.cc |
| +++ b/src/arm/code-stubs-arm.cc |
| @@ -2368,6 +2368,24 @@ void RegExpExecStub::Generate(MacroAssembler* masm) { |
| } |
| +static void CallStubInRecordCallTarget(MacroAssembler* masm, CodeStub* stub) { |
| + // r0 : number of arguments to the construct function |
| + // r2 : Feedback vector |
| + // r3 : slot in feedback vector (Smi) |
| + // r1 : the function to call |
| + FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); |
| + |
| + // Arguments register must be smi-tagged to call out. |
| + __ SmiTag(r0); |
| + __ Push(r3, r2, r1, r0); |
| + |
| + __ CallStub(stub); |
| + |
| + __ Pop(r3, r2, r1, r0); |
| + __ SmiUntag(r0); |
| +} |
| + |
| + |
| static void GenerateRecordCallTarget(MacroAssembler* masm) { |
| // Cache the called function in a feedback vector slot. Cache states |
| // are uninitialized, monomorphic (indicated by a JSFunction), and |
| @@ -2389,7 +2407,23 @@ static void GenerateRecordCallTarget(MacroAssembler* masm) { |
| // A monomorphic cache hit or an already megamorphic state: invoke the |
| // function without changing the state. |
| - __ cmp(r4, r1); |
| + Label check_megamorphic; |
| + Register feedback_map = r5; |
| + Register weak_value = r8; |
| + __ ldr(weak_value, FieldMemOperand(r4, WeakCell::kValueOffset)); |
| + __ cmp(r1, weak_value); |
| + __ b(eq, &done); |
| + __ ldr(feedback_map, FieldMemOperand(r4, 0)); |
| + __ CompareRoot(feedback_map, Heap::kWeakCellMapRootIndex); |
| + __ b(ne, &check_megamorphic); |
| + |
| + // If r1 is not equal to the weak cell value, and the weak cell value is |
| + // cleared, we have a new chance to become monomorphic. |
| + __ JumpIfSmi(weak_value, &initialize); |
| + __ jmp(&megamorphic); |
| + |
| + __ bind(&check_megamorphic); |
| + __ CompareRoot(r4, Heap::kmegamorphic_symbolRootIndex); |
|
Toon Verwaest
2015/03/25 15:25:51
Checking this second might be faster...
mvstanton
2015/03/26 15:28:53
Good idea, done.
|
| __ b(eq, &done); |
| if (!FLAG_pretenuring_call_new) { |
| @@ -2397,8 +2431,7 @@ static void GenerateRecordCallTarget(MacroAssembler* masm) { |
| // If we didn't have a matching function, and we didn't find the megamorph |
| // sentinel, then we have in the slot either some other function or an |
| // AllocationSite. Do a map check on the object in ecx. |
| - __ ldr(r5, FieldMemOperand(r4, 0)); |
| - __ CompareRoot(r5, Heap::kAllocationSiteMapRootIndex); |
| + __ CompareRoot(feedback_map, Heap::kAllocationSiteMapRootIndex); |
| __ b(ne, &miss); |
| // Make sure the function is the Array() function |
| @@ -2434,33 +2467,15 @@ static void GenerateRecordCallTarget(MacroAssembler* masm) { |
| // The target function is the Array constructor, |
| // Create an AllocationSite if we don't already have it, store it in the |
| // slot. |
| - { |
| - FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); |
| - |
| - // Arguments register must be smi-tagged to call out. |
| - __ SmiTag(r0); |
| - __ Push(r3, r2, r1, r0); |
| - |
| - CreateAllocationSiteStub create_stub(masm->isolate()); |
| - __ CallStub(&create_stub); |
| - |
| - __ Pop(r3, r2, r1, r0); |
| - __ SmiUntag(r0); |
| - } |
| + CreateAllocationSiteStub create_stub(masm->isolate()); |
| + CallStubInRecordCallTarget(masm, &create_stub); |
| __ b(&done); |
| __ bind(¬_array_function); |
| } |
| - __ add(r4, r2, Operand::PointerOffsetFromSmiKey(r3)); |
| - __ add(r4, r4, Operand(FixedArray::kHeaderSize - kHeapObjectTag)); |
| - __ str(r1, MemOperand(r4, 0)); |
| - |
| - __ Push(r4, r2, r1); |
| - __ RecordWrite(r2, r4, r1, kLRHasNotBeenSaved, kDontSaveFPRegs, |
| - EMIT_REMEMBERED_SET, OMIT_SMI_CHECK); |
| - __ Pop(r4, r2, r1); |
| - |
| + CreateWeakCellStub create_stub(masm->isolate()); |
| + CallStubInRecordCallTarget(masm, &create_stub); |
| __ bind(&done); |
| } |