Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(199)

Side by Side Diff: src/mips/code-stubs-mips.cc

Issue 684653007: MIPS: Try avoiding MISS for callic monomorphic case. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | src/mips64/code-stubs-mips64.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #if V8_TARGET_ARCH_MIPS 7 #if V8_TARGET_ARCH_MIPS
8 8
9 #include "src/base/bits.h" 9 #include "src/base/bits.h"
10 #include "src/bootstrapper.h" 10 #include "src/bootstrapper.h"
(...skipping 2811 matching lines...) Expand 10 before | Expand all | Expand 10 after
2822 arg_count(), 2822 arg_count(),
2823 true, 2823 true,
2824 CallAsMethod()); 2824 CallAsMethod());
2825 2825
2826 // Unreachable. 2826 // Unreachable.
2827 __ stop("Unexpected code address"); 2827 __ stop("Unexpected code address");
2828 } 2828 }
2829 2829
2830 2830
2831 void CallICStub::Generate(MacroAssembler* masm) { 2831 void CallICStub::Generate(MacroAssembler* masm) {
2832 // r1 - function 2832 // a1 - function
2833 // r3 - slot id (Smi) 2833 // a3 - slot id (Smi)
2834 const int with_types_offset =
2835 FixedArray::OffsetOfElementAt(TypeFeedbackVector::kWithTypesIndex);
2836 const int generic_offset =
2837 FixedArray::OffsetOfElementAt(TypeFeedbackVector::kGenericCountIndex);
2834 Label extra_checks_or_miss, slow_start; 2838 Label extra_checks_or_miss, slow_start;
2835 Label slow, non_function, wrap, cont; 2839 Label slow, non_function, wrap, cont;
2836 Label have_js_function; 2840 Label have_js_function;
2837 int argc = arg_count(); 2841 int argc = arg_count();
2838 ParameterCount actual(argc); 2842 ParameterCount actual(argc);
2839 2843
2840 EmitLoadTypeFeedbackVector(masm, a2); 2844 EmitLoadTypeFeedbackVector(masm, a2);
2841 2845
2842 // The checks. First, does r1 match the recorded monomorphic target? 2846 // The checks. First, does r1 match the recorded monomorphic target?
2843 __ sll(t0, a3, kPointerSizeLog2 - kSmiTagSize); 2847 __ sll(t0, a3, kPointerSizeLog2 - kSmiTagSize);
(...skipping 18 matching lines...) Expand all
2862 2866
2863 __ bind(&slow); 2867 __ bind(&slow);
2864 EmitSlowCase(masm, argc, &non_function); 2868 EmitSlowCase(masm, argc, &non_function);
2865 2869
2866 if (CallAsMethod()) { 2870 if (CallAsMethod()) {
2867 __ bind(&wrap); 2871 __ bind(&wrap);
2868 EmitWrapCase(masm, argc, &cont); 2872 EmitWrapCase(masm, argc, &cont);
2869 } 2873 }
2870 2874
2871 __ bind(&extra_checks_or_miss); 2875 __ bind(&extra_checks_or_miss);
2872 Label miss; 2876 Label uninitialized, miss;
2873 2877
2874 __ LoadRoot(at, Heap::kmegamorphic_symbolRootIndex); 2878 __ LoadRoot(at, Heap::kmegamorphic_symbolRootIndex);
2875 __ Branch(&slow_start, eq, t0, Operand(at)); 2879 __ Branch(&slow_start, eq, t0, Operand(at));
2876 __ LoadRoot(at, Heap::kuninitialized_symbolRootIndex);
2877 __ Branch(&miss, eq, t0, Operand(at));
2878 2880
2879 if (!FLAG_trace_ic) { 2881 // The following cases attempt to handle MISS cases without going to the
2880 // We are going megamorphic. If the feedback is a JSFunction, it is fine 2882 // runtime.
2881 // to handle it here. More complex cases are dealt with in the runtime. 2883 if (FLAG_trace_ic) {
2882 __ AssertNotSmi(t0); 2884 __ Branch(&miss);
2883 __ GetObjectType(t0, t1, t1);
2884 __ Branch(&miss, ne, t1, Operand(JS_FUNCTION_TYPE));
2885 __ sll(t0, a3, kPointerSizeLog2 - kSmiTagSize);
2886 __ Addu(t0, a2, Operand(t0));
2887 __ LoadRoot(at, Heap::kmegamorphic_symbolRootIndex);
2888 __ sw(at, FieldMemOperand(t0, FixedArray::kHeaderSize));
2889 // We have to update statistics for runtime profiling.
2890 const int with_types_offset =
2891 FixedArray::OffsetOfElementAt(TypeFeedbackVector::kWithTypesIndex);
2892 __ lw(t0, FieldMemOperand(a2, with_types_offset));
2893 __ Subu(t0, t0, Operand(Smi::FromInt(1)));
2894 __ sw(t0, FieldMemOperand(a2, with_types_offset));
2895 const int generic_offset =
2896 FixedArray::OffsetOfElementAt(TypeFeedbackVector::kGenericCountIndex);
2897 __ lw(t0, FieldMemOperand(a2, generic_offset));
2898 __ Addu(t0, t0, Operand(Smi::FromInt(1)));
2899 __ sw(t0, FieldMemOperand(a2, generic_offset));
2900 __ Branch(&slow_start);
2901 } 2885 }
2902 2886
2903 // We are here because tracing is on or we are going monomorphic. 2887 __ LoadRoot(at, Heap::kuninitialized_symbolRootIndex);
2888 __ Branch(&uninitialized, eq, t0, Operand(at));
2889
2890 // We are going megamorphic. If the feedback is a JSFunction, it is fine
2891 // to handle it here. More complex cases are dealt with in the runtime.
2892 __ AssertNotSmi(t0);
2893 __ GetObjectType(t0, t1, t1);
2894 __ Branch(&miss, ne, t1, Operand(JS_FUNCTION_TYPE));
2895 __ sll(t0, a3, kPointerSizeLog2 - kSmiTagSize);
2896 __ Addu(t0, a2, Operand(t0));
2897 __ LoadRoot(at, Heap::kmegamorphic_symbolRootIndex);
2898 __ sw(at, FieldMemOperand(t0, FixedArray::kHeaderSize));
2899 // We have to update statistics for runtime profiling.
2900 __ lw(t0, FieldMemOperand(a2, with_types_offset));
2901 __ Subu(t0, t0, Operand(Smi::FromInt(1)));
2902 __ sw(t0, FieldMemOperand(a2, with_types_offset));
2903 __ lw(t0, FieldMemOperand(a2, generic_offset));
2904 __ Addu(t0, t0, Operand(Smi::FromInt(1)));
2905 __ Branch(USE_DELAY_SLOT, &slow_start);
2906 __ sw(t0, FieldMemOperand(a2, generic_offset)); // In delay slot.
2907
2908 __ bind(&uninitialized);
2909
2910 // We are going monomorphic, provided we actually have a JSFunction.
2911 __ JumpIfSmi(a1, &miss);
2912
2913 // Goto miss case if we do not have a function.
2914 __ GetObjectType(a1, t0, t0);
2915 __ Branch(&miss, ne, t0, Operand(JS_FUNCTION_TYPE));
2916
2917 // Make sure the function is not the Array() function, which requires special
2918 // behavior on MISS.
2919 __ LoadGlobalFunction(Context::ARRAY_FUNCTION_INDEX, t0);
2920 __ Branch(&miss, eq, a1, Operand(t0));
2921
2922 // Update stats.
2923 __ lw(t0, FieldMemOperand(a2, with_types_offset));
2924 __ Addu(t0, t0, Operand(Smi::FromInt(1)));
2925 __ sw(t0, FieldMemOperand(a2, with_types_offset));
2926
2927 // Store the function.
2928 __ sll(t0, a3, kPointerSizeLog2 - kSmiTagSize);
2929 __ Addu(t0, a2, Operand(t0));
2930 __ Addu(t0, t0, Operand(FixedArray::kHeaderSize - kHeapObjectTag));
2931 __ sw(a1, MemOperand(t0, 0));
2932
2933 // Update the write barrier.
2934 __ mov(t1, a1);
2935 __ RecordWrite(a2, t0, t1, kRAHasNotBeenSaved, kDontSaveFPRegs,
2936 EMIT_REMEMBERED_SET, OMIT_SMI_CHECK);
2937 __ Branch(&have_js_function);
2938
2939 // We are here because tracing is on or we encountered a MISS case we can't
2940 // handle here.
2904 __ bind(&miss); 2941 __ bind(&miss);
2905 GenerateMiss(masm); 2942 GenerateMiss(masm);
2906 2943
2907 // the slow case 2944 // the slow case
2908 __ bind(&slow_start); 2945 __ bind(&slow_start);
2909 // Check that the function is really a JavaScript function. 2946 // Check that the function is really a JavaScript function.
2910 // r1: pushed function (to be verified) 2947 // r1: pushed function (to be verified)
2911 __ JumpIfSmi(a1, &non_function); 2948 __ JumpIfSmi(a1, &non_function);
2912 2949
2913 // Goto slow case if we do not have a function. 2950 // Goto slow case if we do not have a function.
(...skipping 2042 matching lines...) Expand 10 before | Expand all | Expand 10 after
4956 MemOperand(fp, 6 * kPointerSize), 4993 MemOperand(fp, 6 * kPointerSize),
4957 NULL); 4994 NULL);
4958 } 4995 }
4959 4996
4960 4997
4961 #undef __ 4998 #undef __
4962 4999
4963 } } // namespace v8::internal 5000 } } // namespace v8::internal
4964 5001
4965 #endif // V8_TARGET_ARCH_MIPS 5002 #endif // V8_TARGET_ARCH_MIPS
OLDNEW
« no previous file with comments | « no previous file | src/mips64/code-stubs-mips64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698