| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #if V8_TARGET_ARCH_MIPS | 5 #if V8_TARGET_ARCH_MIPS |
| 6 | 6 |
| 7 #include "src/base/bits.h" | 7 #include "src/base/bits.h" |
| 8 #include "src/bootstrapper.h" | 8 #include "src/bootstrapper.h" |
| 9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
| 10 #include "src/codegen.h" | 10 #include "src/codegen.h" |
| (...skipping 2669 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2680 | 2680 |
| 2681 static void EmitLoadTypeFeedbackVector(MacroAssembler* masm, Register vector) { | 2681 static void EmitLoadTypeFeedbackVector(MacroAssembler* masm, Register vector) { |
| 2682 __ lw(vector, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset)); | 2682 __ lw(vector, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset)); |
| 2683 __ lw(vector, FieldMemOperand(vector, | 2683 __ lw(vector, FieldMemOperand(vector, |
| 2684 JSFunction::kSharedFunctionInfoOffset)); | 2684 JSFunction::kSharedFunctionInfoOffset)); |
| 2685 __ lw(vector, FieldMemOperand(vector, | 2685 __ lw(vector, FieldMemOperand(vector, |
| 2686 SharedFunctionInfo::kFeedbackVectorOffset)); | 2686 SharedFunctionInfo::kFeedbackVectorOffset)); |
| 2687 } | 2687 } |
| 2688 | 2688 |
| 2689 | 2689 |
| 2690 void CallIC_ArrayStub::Generate(MacroAssembler* masm) { | 2690 void CallICStub::HandleArrayCase(MacroAssembler* masm, Label* miss) { |
| 2691 // a1 - function | 2691 // a1 - function |
| 2692 // a3 - slot id | 2692 // a3 - slot id |
| 2693 // a2 - vector | 2693 // a2 - vector |
| 2694 Label miss; | 2694 // t0 - loaded from vector[slot] |
| 2695 | |
| 2696 __ LoadGlobalFunction(Context::ARRAY_FUNCTION_INDEX, at); | 2695 __ LoadGlobalFunction(Context::ARRAY_FUNCTION_INDEX, at); |
| 2697 __ Branch(&miss, ne, a1, Operand(at)); | 2696 __ Branch(miss, ne, a1, Operand(at)); |
| 2698 | 2697 |
| 2699 __ li(a0, Operand(arg_count())); | 2698 __ li(a0, Operand(arg_count())); |
| 2700 __ sll(at, a3, kPointerSizeLog2 - kSmiTagSize); | |
| 2701 __ Addu(at, a2, Operand(at)); | |
| 2702 __ lw(t0, FieldMemOperand(at, FixedArray::kHeaderSize)); | |
| 2703 | |
| 2704 // Verify that t0 contains an AllocationSite | |
| 2705 __ lw(t1, FieldMemOperand(t0, HeapObject::kMapOffset)); | |
| 2706 __ LoadRoot(at, Heap::kAllocationSiteMapRootIndex); | |
| 2707 __ Branch(&miss, ne, t1, Operand(at)); | |
| 2708 | 2699 |
| 2709 // Increment the call count for monomorphic function calls. | 2700 // Increment the call count for monomorphic function calls. |
| 2710 __ sll(at, a3, kPointerSizeLog2 - kSmiTagSize); | 2701 __ sll(at, a3, kPointerSizeLog2 - kSmiTagSize); |
| 2711 __ Addu(at, a2, Operand(at)); | 2702 __ Addu(at, a2, Operand(at)); |
| 2712 __ lw(a3, FieldMemOperand(at, FixedArray::kHeaderSize + kPointerSize)); | 2703 __ lw(a3, FieldMemOperand(at, FixedArray::kHeaderSize + kPointerSize)); |
| 2713 __ Addu(a3, a3, Operand(Smi::FromInt(CallICNexus::kCallCountIncrement))); | 2704 __ Addu(a3, a3, Operand(Smi::FromInt(CallICNexus::kCallCountIncrement))); |
| 2714 __ sw(a3, FieldMemOperand(at, FixedArray::kHeaderSize + kPointerSize)); | 2705 __ sw(a3, FieldMemOperand(at, FixedArray::kHeaderSize + kPointerSize)); |
| 2715 | 2706 |
| 2716 __ mov(a2, t0); | 2707 __ mov(a2, t0); |
| 2717 __ mov(a3, a1); | 2708 __ mov(a3, a1); |
| 2718 ArrayConstructorStub stub(masm->isolate(), arg_count()); | 2709 ArrayConstructorStub stub(masm->isolate(), arg_count()); |
| 2719 __ TailCallStub(&stub); | 2710 __ TailCallStub(&stub); |
| 2720 | |
| 2721 __ bind(&miss); | |
| 2722 GenerateMiss(masm); | |
| 2723 | |
| 2724 // The slow case, we need this no matter what to complete a call after a miss. | |
| 2725 __ li(a0, Operand(arg_count())); | |
| 2726 __ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET); | |
| 2727 } | 2711 } |
| 2728 | 2712 |
| 2729 | 2713 |
| 2730 void CallICStub::Generate(MacroAssembler* masm) { | 2714 void CallICStub::Generate(MacroAssembler* masm) { |
| 2731 // a1 - function | 2715 // a1 - function |
| 2732 // a3 - slot id (Smi) | 2716 // a3 - slot id (Smi) |
| 2733 // a2 - vector | 2717 // a2 - vector |
| 2734 const int with_types_offset = | 2718 const int with_types_offset = |
| 2735 FixedArray::OffsetOfElementAt(TypeFeedbackVector::kWithTypesIndex); | 2719 FixedArray::OffsetOfElementAt(TypeFeedbackVector::kWithTypesIndex); |
| 2736 const int generic_offset = | 2720 const int generic_offset = |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2791 | 2775 |
| 2792 __ bind(&slow); | 2776 __ bind(&slow); |
| 2793 EmitSlowCase(masm, argc); | 2777 EmitSlowCase(masm, argc); |
| 2794 | 2778 |
| 2795 if (CallAsMethod()) { | 2779 if (CallAsMethod()) { |
| 2796 __ bind(&wrap); | 2780 __ bind(&wrap); |
| 2797 EmitWrapCase(masm, argc, &cont); | 2781 EmitWrapCase(masm, argc, &cont); |
| 2798 } | 2782 } |
| 2799 | 2783 |
| 2800 __ bind(&extra_checks_or_miss); | 2784 __ bind(&extra_checks_or_miss); |
| 2801 Label uninitialized, miss; | 2785 Label uninitialized, miss, not_allocation_site; |
| 2802 | 2786 |
| 2803 __ LoadRoot(at, Heap::kmegamorphic_symbolRootIndex); | 2787 __ LoadRoot(at, Heap::kmegamorphic_symbolRootIndex); |
| 2804 __ Branch(&slow_start, eq, t0, Operand(at)); | 2788 __ Branch(&slow_start, eq, t0, Operand(at)); |
| 2805 | 2789 |
| 2790 // Verify that t0 contains an AllocationSite |
| 2791 __ lw(t1, FieldMemOperand(t0, HeapObject::kMapOffset)); |
| 2792 __ LoadRoot(at, Heap::kAllocationSiteMapRootIndex); |
| 2793 __ Branch(¬_allocation_site, ne, t1, Operand(at)); |
| 2794 |
| 2795 HandleArrayCase(masm, &miss); |
| 2796 |
| 2797 __ bind(¬_allocation_site); |
| 2798 |
| 2806 // The following cases attempt to handle MISS cases without going to the | 2799 // The following cases attempt to handle MISS cases without going to the |
| 2807 // runtime. | 2800 // runtime. |
| 2808 if (FLAG_trace_ic) { | 2801 if (FLAG_trace_ic) { |
| 2809 __ Branch(&miss); | 2802 __ Branch(&miss); |
| 2810 } | 2803 } |
| 2811 | 2804 |
| 2812 __ LoadRoot(at, Heap::kuninitialized_symbolRootIndex); | 2805 __ LoadRoot(at, Heap::kuninitialized_symbolRootIndex); |
| 2813 __ Branch(&uninitialized, eq, t0, Operand(at)); | 2806 __ Branch(&uninitialized, eq, t0, Operand(at)); |
| 2814 | 2807 |
| 2815 // We are going megamorphic. If the feedback is a JSFunction, it is fine | 2808 // We are going megamorphic. If the feedback is a JSFunction, it is fine |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2887 } | 2880 } |
| 2888 | 2881 |
| 2889 | 2882 |
| 2890 void CallICStub::GenerateMiss(MacroAssembler* masm) { | 2883 void CallICStub::GenerateMiss(MacroAssembler* masm) { |
| 2891 FrameScope scope(masm, StackFrame::INTERNAL); | 2884 FrameScope scope(masm, StackFrame::INTERNAL); |
| 2892 | 2885 |
| 2893 // Push the receiver and the function and feedback info. | 2886 // Push the receiver and the function and feedback info. |
| 2894 __ Push(a1, a2, a3); | 2887 __ Push(a1, a2, a3); |
| 2895 | 2888 |
| 2896 // Call the entry. | 2889 // Call the entry. |
| 2897 Runtime::FunctionId id = GetICState() == DEFAULT | 2890 __ CallRuntime(Runtime::kCallIC_Miss, 3); |
| 2898 ? Runtime::kCallIC_Miss | |
| 2899 : Runtime::kCallIC_Customization_Miss; | |
| 2900 __ CallRuntime(id, 3); | |
| 2901 | 2891 |
| 2902 // Move result to a1 and exit the internal frame. | 2892 // Move result to a1 and exit the internal frame. |
| 2903 __ mov(a1, v0); | 2893 __ mov(a1, v0); |
| 2904 } | 2894 } |
| 2905 | 2895 |
| 2906 | 2896 |
| 2907 // StringCharCodeAtGenerator. | 2897 // StringCharCodeAtGenerator. |
| 2908 void StringCharCodeAtGenerator::GenerateFast(MacroAssembler* masm) { | 2898 void StringCharCodeAtGenerator::GenerateFast(MacroAssembler* masm) { |
| 2909 DCHECK(!t0.is(index_)); | 2899 DCHECK(!t0.is(index_)); |
| 2910 DCHECK(!t0.is(result_)); | 2900 DCHECK(!t0.is(result_)); |
| (...skipping 1581 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4492 } | 4482 } |
| 4493 | 4483 |
| 4494 | 4484 |
| 4495 void CallICTrampolineStub::Generate(MacroAssembler* masm) { | 4485 void CallICTrampolineStub::Generate(MacroAssembler* masm) { |
| 4496 EmitLoadTypeFeedbackVector(masm, a2); | 4486 EmitLoadTypeFeedbackVector(masm, a2); |
| 4497 CallICStub stub(isolate(), state()); | 4487 CallICStub stub(isolate(), state()); |
| 4498 __ Jump(stub.GetCode(), RelocInfo::CODE_TARGET); | 4488 __ Jump(stub.GetCode(), RelocInfo::CODE_TARGET); |
| 4499 } | 4489 } |
| 4500 | 4490 |
| 4501 | 4491 |
| 4502 void CallIC_ArrayTrampolineStub::Generate(MacroAssembler* masm) { | |
| 4503 EmitLoadTypeFeedbackVector(masm, a2); | |
| 4504 CallIC_ArrayStub stub(isolate(), state()); | |
| 4505 __ Jump(stub.GetCode(), RelocInfo::CODE_TARGET); | |
| 4506 } | |
| 4507 | |
| 4508 | |
| 4509 void LoadICStub::Generate(MacroAssembler* masm) { GenerateImpl(masm, false); } | 4492 void LoadICStub::Generate(MacroAssembler* masm) { GenerateImpl(masm, false); } |
| 4510 | 4493 |
| 4511 | 4494 |
| 4512 void LoadICStub::GenerateForTrampoline(MacroAssembler* masm) { | 4495 void LoadICStub::GenerateForTrampoline(MacroAssembler* masm) { |
| 4513 GenerateImpl(masm, true); | 4496 GenerateImpl(masm, true); |
| 4514 } | 4497 } |
| 4515 | 4498 |
| 4516 | 4499 |
| 4517 static void HandleArrayCases(MacroAssembler* masm, Register feedback, | 4500 static void HandleArrayCases(MacroAssembler* masm, Register feedback, |
| 4518 Register receiver_map, Register scratch1, | 4501 Register receiver_map, Register scratch1, |
| (...skipping 1245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5764 MemOperand(fp, 6 * kPointerSize), NULL); | 5747 MemOperand(fp, 6 * kPointerSize), NULL); |
| 5765 } | 5748 } |
| 5766 | 5749 |
| 5767 | 5750 |
| 5768 #undef __ | 5751 #undef __ |
| 5769 | 5752 |
| 5770 } // namespace internal | 5753 } // namespace internal |
| 5771 } // namespace v8 | 5754 } // namespace v8 |
| 5772 | 5755 |
| 5773 #endif // V8_TARGET_ARCH_MIPS | 5756 #endif // V8_TARGET_ARCH_MIPS |
| OLD | NEW |