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_IA32 | 5 #if V8_TARGET_ARCH_IA32 |
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 3001 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3012 __ mov(ebx, MemOperand(ebp, parameter_count_offset)); | 3012 __ mov(ebx, MemOperand(ebp, parameter_count_offset)); |
3013 masm->LeaveFrame(StackFrame::STUB_FAILURE_TRAMPOLINE); | 3013 masm->LeaveFrame(StackFrame::STUB_FAILURE_TRAMPOLINE); |
3014 __ pop(ecx); | 3014 __ pop(ecx); |
3015 int additional_offset = | 3015 int additional_offset = |
3016 function_mode() == JS_FUNCTION_STUB_MODE ? kPointerSize : 0; | 3016 function_mode() == JS_FUNCTION_STUB_MODE ? kPointerSize : 0; |
3017 __ lea(esp, MemOperand(esp, ebx, times_pointer_size, additional_offset)); | 3017 __ lea(esp, MemOperand(esp, ebx, times_pointer_size, additional_offset)); |
3018 __ jmp(ecx); // Return to IC Miss stub, continuation still on stack. | 3018 __ jmp(ecx); // Return to IC Miss stub, continuation still on stack. |
3019 } | 3019 } |
3020 | 3020 |
3021 | 3021 |
3022 void LoadICTrampolineStub::Generate(MacroAssembler* masm) { | |
3023 __ EmitLoadTypeFeedbackVector(LoadWithVectorDescriptor::VectorRegister()); | |
3024 LoadICStub stub(isolate()); | |
3025 stub.GenerateForTrampoline(masm); | |
3026 } | |
3027 | |
3028 | |
3029 void KeyedLoadICTrampolineStub::Generate(MacroAssembler* masm) { | 3022 void KeyedLoadICTrampolineStub::Generate(MacroAssembler* masm) { |
3030 __ EmitLoadTypeFeedbackVector(LoadWithVectorDescriptor::VectorRegister()); | 3023 __ EmitLoadTypeFeedbackVector(LoadWithVectorDescriptor::VectorRegister()); |
3031 KeyedLoadICStub stub(isolate()); | 3024 KeyedLoadICStub stub(isolate()); |
3032 stub.GenerateForTrampoline(masm); | 3025 stub.GenerateForTrampoline(masm); |
3033 } | 3026 } |
3034 | 3027 |
3035 | 3028 |
3036 static void HandleArrayCases(MacroAssembler* masm, Register receiver, | 3029 static void HandleArrayCases(MacroAssembler* masm, Register receiver, |
3037 Register key, Register vector, Register slot, | 3030 Register key, Register vector, Register slot, |
3038 Register feedback, bool is_polymorphic, | 3031 Register feedback, bool is_polymorphic, |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3138 __ bind(&compare_smi_map); | 3131 __ bind(&compare_smi_map); |
3139 __ CompareRoot(ic_map, Heap::kHeapNumberMapRootIndex); | 3132 __ CompareRoot(ic_map, Heap::kHeapNumberMapRootIndex); |
3140 __ j(not_equal, miss); | 3133 __ j(not_equal, miss); |
3141 __ mov(handler, FieldOperand(vector, slot, times_half_pointer_size, | 3134 __ mov(handler, FieldOperand(vector, slot, times_half_pointer_size, |
3142 FixedArray::kHeaderSize + kPointerSize)); | 3135 FixedArray::kHeaderSize + kPointerSize)); |
3143 __ lea(handler, FieldOperand(handler, Code::kHeaderSize)); | 3136 __ lea(handler, FieldOperand(handler, Code::kHeaderSize)); |
3144 __ jmp(handler); | 3137 __ jmp(handler); |
3145 } | 3138 } |
3146 | 3139 |
3147 | 3140 |
3148 void LoadICStub::Generate(MacroAssembler* masm) { GenerateImpl(masm, false); } | |
3149 | |
3150 | |
3151 void LoadICStub::GenerateForTrampoline(MacroAssembler* masm) { | |
3152 GenerateImpl(masm, true); | |
3153 } | |
3154 | |
3155 | |
3156 void LoadICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) { | |
3157 Register receiver = LoadWithVectorDescriptor::ReceiverRegister(); // edx | |
3158 Register name = LoadWithVectorDescriptor::NameRegister(); // ecx | |
3159 Register vector = LoadWithVectorDescriptor::VectorRegister(); // ebx | |
3160 Register slot = LoadWithVectorDescriptor::SlotRegister(); // eax | |
3161 Register scratch = edi; | |
3162 __ mov(scratch, FieldOperand(vector, slot, times_half_pointer_size, | |
3163 FixedArray::kHeaderSize)); | |
3164 | |
3165 // Is it a weak cell? | |
3166 Label try_array; | |
3167 Label not_array, smi_key, key_okay, miss; | |
3168 __ CompareRoot(FieldOperand(scratch, 0), Heap::kWeakCellMapRootIndex); | |
3169 __ j(not_equal, &try_array); | |
3170 HandleMonomorphicCase(masm, receiver, name, vector, slot, scratch, &miss); | |
3171 | |
3172 // Is it a fixed array? | |
3173 __ bind(&try_array); | |
3174 __ CompareRoot(FieldOperand(scratch, 0), Heap::kFixedArrayMapRootIndex); | |
3175 __ j(not_equal, ¬_array); | |
3176 HandleArrayCases(masm, receiver, name, vector, slot, scratch, true, &miss); | |
3177 | |
3178 __ bind(¬_array); | |
3179 __ CompareRoot(scratch, Heap::kmegamorphic_symbolRootIndex); | |
3180 __ j(not_equal, &miss); | |
3181 __ push(slot); | |
3182 __ push(vector); | |
3183 masm->isolate()->load_stub_cache()->GenerateProbe(masm, receiver, name, | |
3184 vector, scratch); | |
3185 __ pop(vector); | |
3186 __ pop(slot); | |
3187 | |
3188 __ bind(&miss); | |
3189 LoadIC::GenerateMiss(masm); | |
3190 } | |
3191 | |
3192 | |
3193 void KeyedLoadICStub::Generate(MacroAssembler* masm) { | 3141 void KeyedLoadICStub::Generate(MacroAssembler* masm) { |
3194 GenerateImpl(masm, false); | 3142 GenerateImpl(masm, false); |
3195 } | 3143 } |
3196 | 3144 |
3197 | 3145 |
3198 void KeyedLoadICStub::GenerateForTrampoline(MacroAssembler* masm) { | 3146 void KeyedLoadICStub::GenerateForTrampoline(MacroAssembler* masm) { |
3199 GenerateImpl(masm, true); | 3147 GenerateImpl(masm, true); |
3200 } | 3148 } |
3201 | 3149 |
3202 | 3150 |
(...skipping 2000 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5203 kStackUnwindSpace, nullptr, return_value_operand, | 5151 kStackUnwindSpace, nullptr, return_value_operand, |
5204 NULL); | 5152 NULL); |
5205 } | 5153 } |
5206 | 5154 |
5207 #undef __ | 5155 #undef __ |
5208 | 5156 |
5209 } // namespace internal | 5157 } // namespace internal |
5210 } // namespace v8 | 5158 } // namespace v8 |
5211 | 5159 |
5212 #endif // V8_TARGET_ARCH_IA32 | 5160 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |