| 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_ARM | 5 #if V8_TARGET_ARCH_ARM |
| 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 3214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3225 HandleArrayCases(masm, feedback, receiver_map, scratch1, r9, false, &miss); | 3225 HandleArrayCases(masm, feedback, receiver_map, scratch1, r9, false, &miss); |
| 3226 | 3226 |
| 3227 __ bind(&miss); | 3227 __ bind(&miss); |
| 3228 KeyedLoadIC::GenerateMiss(masm); | 3228 KeyedLoadIC::GenerateMiss(masm); |
| 3229 | 3229 |
| 3230 __ bind(&load_smi_map); | 3230 __ bind(&load_smi_map); |
| 3231 __ LoadRoot(receiver_map, Heap::kHeapNumberMapRootIndex); | 3231 __ LoadRoot(receiver_map, Heap::kHeapNumberMapRootIndex); |
| 3232 __ jmp(&compare_map); | 3232 __ jmp(&compare_map); |
| 3233 } | 3233 } |
| 3234 | 3234 |
| 3235 void StoreICTrampolineStub::Generate(MacroAssembler* masm) { | |
| 3236 __ EmitLoadTypeFeedbackVector(StoreWithVectorDescriptor::VectorRegister()); | |
| 3237 StoreICStub stub(isolate(), state()); | |
| 3238 stub.GenerateForTrampoline(masm); | |
| 3239 } | |
| 3240 | |
| 3241 void KeyedStoreICTrampolineStub::Generate(MacroAssembler* masm) { | 3235 void KeyedStoreICTrampolineStub::Generate(MacroAssembler* masm) { |
| 3242 __ EmitLoadTypeFeedbackVector(StoreWithVectorDescriptor::VectorRegister()); | 3236 __ EmitLoadTypeFeedbackVector(StoreWithVectorDescriptor::VectorRegister()); |
| 3243 KeyedStoreICStub stub(isolate(), state()); | 3237 KeyedStoreICStub stub(isolate(), state()); |
| 3244 stub.GenerateForTrampoline(masm); | 3238 stub.GenerateForTrampoline(masm); |
| 3245 } | 3239 } |
| 3246 | 3240 |
| 3247 void StoreICStub::Generate(MacroAssembler* masm) { GenerateImpl(masm, false); } | |
| 3248 | |
| 3249 void StoreICStub::GenerateForTrampoline(MacroAssembler* masm) { | |
| 3250 GenerateImpl(masm, true); | |
| 3251 } | |
| 3252 | |
| 3253 void StoreICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) { | |
| 3254 Register receiver = StoreWithVectorDescriptor::ReceiverRegister(); // r1 | |
| 3255 Register key = StoreWithVectorDescriptor::NameRegister(); // r2 | |
| 3256 Register vector = StoreWithVectorDescriptor::VectorRegister(); // r3 | |
| 3257 Register slot = StoreWithVectorDescriptor::SlotRegister(); // r4 | |
| 3258 DCHECK(StoreWithVectorDescriptor::ValueRegister().is(r0)); // r0 | |
| 3259 Register feedback = r5; | |
| 3260 Register receiver_map = r6; | |
| 3261 Register scratch1 = r9; | |
| 3262 | |
| 3263 __ add(feedback, vector, Operand::PointerOffsetFromSmiKey(slot)); | |
| 3264 __ ldr(feedback, FieldMemOperand(feedback, FixedArray::kHeaderSize)); | |
| 3265 | |
| 3266 // Try to quickly handle the monomorphic case without knowing for sure | |
| 3267 // if we have a weak cell in feedback. We do know it's safe to look | |
| 3268 // at WeakCell::kValueOffset. | |
| 3269 Label try_array, load_smi_map, compare_map; | |
| 3270 Label not_array, miss; | |
| 3271 HandleMonomorphicCase(masm, receiver, receiver_map, feedback, vector, slot, | |
| 3272 scratch1, &compare_map, &load_smi_map, &try_array); | |
| 3273 | |
| 3274 // Is it a fixed array? | |
| 3275 __ bind(&try_array); | |
| 3276 __ ldr(scratch1, FieldMemOperand(feedback, HeapObject::kMapOffset)); | |
| 3277 __ CompareRoot(scratch1, Heap::kFixedArrayMapRootIndex); | |
| 3278 __ b(ne, ¬_array); | |
| 3279 | |
| 3280 // We are using register r8, which is used for the embedded constant pool | |
| 3281 // when FLAG_enable_embedded_constant_pool is true. | |
| 3282 DCHECK(!FLAG_enable_embedded_constant_pool); | |
| 3283 Register scratch2 = r8; | |
| 3284 HandleArrayCases(masm, feedback, receiver_map, scratch1, scratch2, true, | |
| 3285 &miss); | |
| 3286 | |
| 3287 __ bind(¬_array); | |
| 3288 __ CompareRoot(feedback, Heap::kmegamorphic_symbolRootIndex); | |
| 3289 __ b(ne, &miss); | |
| 3290 masm->isolate()->store_stub_cache()->GenerateProbe( | |
| 3291 masm, receiver, key, feedback, receiver_map, scratch1, scratch2); | |
| 3292 | |
| 3293 __ bind(&miss); | |
| 3294 StoreIC::GenerateMiss(masm); | |
| 3295 | |
| 3296 __ bind(&load_smi_map); | |
| 3297 __ LoadRoot(receiver_map, Heap::kHeapNumberMapRootIndex); | |
| 3298 __ jmp(&compare_map); | |
| 3299 } | |
| 3300 | |
| 3301 void KeyedStoreICStub::Generate(MacroAssembler* masm) { | 3241 void KeyedStoreICStub::Generate(MacroAssembler* masm) { |
| 3302 GenerateImpl(masm, false); | 3242 GenerateImpl(masm, false); |
| 3303 } | 3243 } |
| 3304 | 3244 |
| 3305 void KeyedStoreICStub::GenerateForTrampoline(MacroAssembler* masm) { | 3245 void KeyedStoreICStub::GenerateForTrampoline(MacroAssembler* masm) { |
| 3306 GenerateImpl(masm, true); | 3246 GenerateImpl(masm, true); |
| 3307 } | 3247 } |
| 3308 | 3248 |
| 3309 | 3249 |
| 3310 static void HandlePolymorphicStoreCase(MacroAssembler* masm, Register feedback, | 3250 static void HandlePolymorphicStoreCase(MacroAssembler* masm, Register feedback, |
| (...skipping 1545 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4856 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, | 4796 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, |
| 4857 kStackUnwindSpace, NULL, return_value_operand, NULL); | 4797 kStackUnwindSpace, NULL, return_value_operand, NULL); |
| 4858 } | 4798 } |
| 4859 | 4799 |
| 4860 #undef __ | 4800 #undef __ |
| 4861 | 4801 |
| 4862 } // namespace internal | 4802 } // namespace internal |
| 4863 } // namespace v8 | 4803 } // namespace v8 |
| 4864 | 4804 |
| 4865 #endif // V8_TARGET_ARCH_ARM | 4805 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |