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

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

Issue 2430613003: X87: [ic] Delete old KeyedLoadIC code. (Closed)
Patch Set: Created 4 years, 2 months 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
« no previous file with comments | « no previous file | no next file » | 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 #if V8_TARGET_ARCH_X87 5 #if V8_TARGET_ARCH_X87
6 6
7 #include "src/code-stubs.h" 7 #include "src/code-stubs.h"
8 #include "src/api-arguments.h" 8 #include "src/api-arguments.h"
9 #include "src/base/bits.h" 9 #include "src/base/bits.h"
10 #include "src/bootstrapper.h" 10 #include "src/bootstrapper.h"
(...skipping 2816 matching lines...) Expand 10 before | Expand all | Expand 10 after
2827 StubFailureTrampolineFrameConstants::kArgumentsLengthOffset; 2827 StubFailureTrampolineFrameConstants::kArgumentsLengthOffset;
2828 __ mov(ebx, MemOperand(ebp, parameter_count_offset)); 2828 __ mov(ebx, MemOperand(ebp, parameter_count_offset));
2829 masm->LeaveFrame(StackFrame::STUB_FAILURE_TRAMPOLINE); 2829 masm->LeaveFrame(StackFrame::STUB_FAILURE_TRAMPOLINE);
2830 __ pop(ecx); 2830 __ pop(ecx);
2831 int additional_offset = 2831 int additional_offset =
2832 function_mode() == JS_FUNCTION_STUB_MODE ? kPointerSize : 0; 2832 function_mode() == JS_FUNCTION_STUB_MODE ? kPointerSize : 0;
2833 __ lea(esp, MemOperand(esp, ebx, times_pointer_size, additional_offset)); 2833 __ lea(esp, MemOperand(esp, ebx, times_pointer_size, additional_offset));
2834 __ jmp(ecx); // Return to IC Miss stub, continuation still on stack. 2834 __ jmp(ecx); // Return to IC Miss stub, continuation still on stack.
2835 } 2835 }
2836 2836
2837 static void HandleArrayCases(MacroAssembler* masm, Register receiver,
2838 Register key, Register vector, Register slot,
2839 Register feedback, bool is_polymorphic,
2840 Label* miss) {
2841 // feedback initially contains the feedback array
2842 Label next, next_loop, prepare_next;
2843 Label load_smi_map, compare_map;
2844 Label start_polymorphic;
2845
2846 __ push(receiver);
2847 __ push(vector);
2848
2849 Register receiver_map = receiver;
2850 Register cached_map = vector;
2851
2852 // Receiver might not be a heap object.
2853 __ JumpIfSmi(receiver, &load_smi_map);
2854 __ mov(receiver_map, FieldOperand(receiver, 0));
2855 __ bind(&compare_map);
2856 __ mov(cached_map, FieldOperand(feedback, FixedArray::OffsetOfElementAt(0)));
2857
2858 // A named keyed load might have a 2 element array, all other cases can count
2859 // on an array with at least 2 {map, handler} pairs, so they can go right
2860 // into polymorphic array handling.
2861 __ cmp(receiver_map, FieldOperand(cached_map, WeakCell::kValueOffset));
2862 __ j(not_equal, is_polymorphic ? &start_polymorphic : &next);
2863
2864 // found, now call handler.
2865 Register handler = feedback;
2866 __ mov(handler, FieldOperand(feedback, FixedArray::OffsetOfElementAt(1)));
2867 __ pop(vector);
2868 __ pop(receiver);
2869 __ lea(handler, FieldOperand(handler, Code::kHeaderSize));
2870 __ jmp(handler);
2871
2872 if (!is_polymorphic) {
2873 __ bind(&next);
2874 __ cmp(FieldOperand(feedback, FixedArray::kLengthOffset),
2875 Immediate(Smi::FromInt(2)));
2876 __ j(not_equal, &start_polymorphic);
2877 __ pop(vector);
2878 __ pop(receiver);
2879 __ jmp(miss);
2880 }
2881
2882 // Polymorphic, we have to loop from 2 to N
2883 __ bind(&start_polymorphic);
2884 __ push(key);
2885 Register counter = key;
2886 __ mov(counter, Immediate(Smi::FromInt(2)));
2887 __ bind(&next_loop);
2888 __ mov(cached_map, FieldOperand(feedback, counter, times_half_pointer_size,
2889 FixedArray::kHeaderSize));
2890 __ cmp(receiver_map, FieldOperand(cached_map, WeakCell::kValueOffset));
2891 __ j(not_equal, &prepare_next);
2892 __ mov(handler, FieldOperand(feedback, counter, times_half_pointer_size,
2893 FixedArray::kHeaderSize + kPointerSize));
2894 __ pop(key);
2895 __ pop(vector);
2896 __ pop(receiver);
2897 __ lea(handler, FieldOperand(handler, Code::kHeaderSize));
2898 __ jmp(handler);
2899
2900 __ bind(&prepare_next);
2901 __ add(counter, Immediate(Smi::FromInt(2)));
2902 __ cmp(counter, FieldOperand(feedback, FixedArray::kLengthOffset));
2903 __ j(less, &next_loop);
2904
2905 // We exhausted our array of map handler pairs.
2906 __ pop(key);
2907 __ pop(vector);
2908 __ pop(receiver);
2909 __ jmp(miss);
2910
2911 __ bind(&load_smi_map);
2912 __ LoadRoot(receiver_map, Heap::kHeapNumberMapRootIndex);
2913 __ jmp(&compare_map);
2914 }
2915
2916
2917 static void HandleMonomorphicCase(MacroAssembler* masm, Register receiver,
2918 Register key, Register vector, Register slot,
2919 Register weak_cell, Label* miss) {
2920 // feedback initially contains the feedback array
2921 Label compare_smi_map;
2922
2923 // Move the weak map into the weak_cell register.
2924 Register ic_map = weak_cell;
2925 __ mov(ic_map, FieldOperand(weak_cell, WeakCell::kValueOffset));
2926
2927 // Receiver might not be a heap object.
2928 __ JumpIfSmi(receiver, &compare_smi_map);
2929 __ cmp(ic_map, FieldOperand(receiver, 0));
2930 __ j(not_equal, miss);
2931 Register handler = weak_cell;
2932 __ mov(handler, FieldOperand(vector, slot, times_half_pointer_size,
2933 FixedArray::kHeaderSize + kPointerSize));
2934 __ lea(handler, FieldOperand(handler, Code::kHeaderSize));
2935 __ jmp(handler);
2936
2937 // In microbenchmarks, it made sense to unroll this code so that the call to
2938 // the handler is duplicated for a HeapObject receiver and a Smi receiver.
2939 __ bind(&compare_smi_map);
2940 __ CompareRoot(ic_map, Heap::kHeapNumberMapRootIndex);
2941 __ j(not_equal, miss);
2942 __ mov(handler, FieldOperand(vector, slot, times_half_pointer_size,
2943 FixedArray::kHeaderSize + kPointerSize));
2944 __ lea(handler, FieldOperand(handler, Code::kHeaderSize));
2945 __ jmp(handler);
2946 }
2947
2948 void KeyedStoreICTrampolineStub::Generate(MacroAssembler* masm) { 2837 void KeyedStoreICTrampolineStub::Generate(MacroAssembler* masm) {
2949 __ EmitLoadTypeFeedbackVector(StoreWithVectorDescriptor::VectorRegister()); 2838 __ EmitLoadTypeFeedbackVector(StoreWithVectorDescriptor::VectorRegister());
2950 KeyedStoreICStub stub(isolate(), state()); 2839 KeyedStoreICStub stub(isolate(), state());
2951 stub.GenerateForTrampoline(masm); 2840 stub.GenerateForTrampoline(masm);
2952 } 2841 }
2953 2842
2954 // value is on the stack already. 2843 // value is on the stack already.
2955 static void HandlePolymorphicStoreCase(MacroAssembler* masm, Register receiver, 2844 static void HandlePolymorphicStoreCase(MacroAssembler* masm, Register receiver,
2956 Register key, Register vector, 2845 Register key, Register vector,
2957 Register slot, Register feedback, 2846 Register slot, Register feedback,
(...skipping 1705 matching lines...) Expand 10 before | Expand all | Expand 10 after
4663 kStackUnwindSpace, nullptr, return_value_operand, 4552 kStackUnwindSpace, nullptr, return_value_operand,
4664 NULL); 4553 NULL);
4665 } 4554 }
4666 4555
4667 #undef __ 4556 #undef __
4668 4557
4669 } // namespace internal 4558 } // namespace internal
4670 } // namespace v8 4559 } // namespace v8
4671 4560
4672 #endif // V8_TARGET_ARCH_X87 4561 #endif // V8_TARGET_ARCH_X87
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698