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/codegen.h" | 7 #include "src/codegen.h" |
8 #include "src/ic/ic.h" | 8 #include "src/ic/ic.h" |
9 #include "src/ic/ic-compiler.h" | 9 #include "src/ic/ic-compiler.h" |
10 #include "src/ic/stub-cache.h" | 10 #include "src/ic/stub-cache.h" |
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
283 GenerateKeyedLoadReceiverCheck(masm, receiver, eax, | 283 GenerateKeyedLoadReceiverCheck(masm, receiver, eax, |
284 Map::kHasIndexedInterceptor, &slow); | 284 Map::kHasIndexedInterceptor, &slow); |
285 | 285 |
286 // Check the receiver's map to see if it has fast elements. | 286 // Check the receiver's map to see if it has fast elements. |
287 __ CheckFastElements(eax, &check_number_dictionary); | 287 __ CheckFastElements(eax, &check_number_dictionary); |
288 | 288 |
289 GenerateFastArrayLoad(masm, receiver, key, eax, ebx, eax, &slow, | 289 GenerateFastArrayLoad(masm, receiver, key, eax, ebx, eax, &slow, |
290 language_mode); | 290 language_mode); |
291 Isolate* isolate = masm->isolate(); | 291 Isolate* isolate = masm->isolate(); |
292 Counters* counters = isolate->counters(); | 292 Counters* counters = isolate->counters(); |
293 __ IncrementCounter(counters->keyed_load_generic_smi(), 1); | 293 __ IncrementCounter(counters->ic_keyed_load_generic_smi(), 1); |
294 __ ret(0); | 294 __ ret(0); |
295 | 295 |
296 __ bind(&check_number_dictionary); | 296 __ bind(&check_number_dictionary); |
297 __ mov(ebx, key); | 297 __ mov(ebx, key); |
298 __ SmiUntag(ebx); | 298 __ SmiUntag(ebx); |
299 __ mov(eax, FieldOperand(receiver, JSObject::kElementsOffset)); | 299 __ mov(eax, FieldOperand(receiver, JSObject::kElementsOffset)); |
300 | 300 |
301 // Check whether the elements is a number dictionary. | 301 // Check whether the elements is a number dictionary. |
302 // ebx: untagged index | 302 // ebx: untagged index |
303 // eax: elements | 303 // eax: elements |
304 __ CheckMap(eax, isolate->factory()->hash_table_map(), &slow, | 304 __ CheckMap(eax, isolate->factory()->hash_table_map(), &slow, |
305 DONT_DO_SMI_CHECK); | 305 DONT_DO_SMI_CHECK); |
306 Label slow_pop_receiver; | 306 Label slow_pop_receiver; |
307 // Push receiver on the stack to free up a register for the dictionary | 307 // Push receiver on the stack to free up a register for the dictionary |
308 // probing. | 308 // probing. |
309 __ push(receiver); | 309 __ push(receiver); |
310 __ LoadFromNumberDictionary(&slow_pop_receiver, eax, key, ebx, edx, edi, eax); | 310 __ LoadFromNumberDictionary(&slow_pop_receiver, eax, key, ebx, edx, edi, eax); |
311 // Pop receiver before returning. | 311 // Pop receiver before returning. |
312 __ pop(receiver); | 312 __ pop(receiver); |
313 __ ret(0); | 313 __ ret(0); |
314 | 314 |
315 __ bind(&slow_pop_receiver); | 315 __ bind(&slow_pop_receiver); |
316 // Pop the receiver from the stack and jump to runtime. | 316 // Pop the receiver from the stack and jump to runtime. |
317 __ pop(receiver); | 317 __ pop(receiver); |
318 | 318 |
319 __ bind(&slow); | 319 __ bind(&slow); |
320 // Slow case: jump to runtime. | 320 // Slow case: jump to runtime. |
321 __ IncrementCounter(counters->keyed_load_generic_slow(), 1); | 321 __ IncrementCounter(counters->ic_keyed_load_generic_slow(), 1); |
322 GenerateRuntimeGetProperty(masm, language_mode); | 322 GenerateRuntimeGetProperty(masm, language_mode); |
323 | 323 |
324 __ bind(&check_name); | 324 __ bind(&check_name); |
325 GenerateKeyNameCheck(masm, key, eax, ebx, &index_name, &slow); | 325 GenerateKeyNameCheck(masm, key, eax, ebx, &index_name, &slow); |
326 | 326 |
327 GenerateKeyedLoadReceiverCheck(masm, receiver, eax, Map::kHasNamedInterceptor, | 327 GenerateKeyedLoadReceiverCheck(masm, receiver, eax, Map::kHasNamedInterceptor, |
328 &slow); | 328 &slow); |
329 | 329 |
330 // If the receiver is a fast-case object, check the stub cache. Otherwise | 330 // If the receiver is a fast-case object, check the stub cache. Otherwise |
331 // probe the dictionary. | 331 // probe the dictionary. |
(...skipping 24 matching lines...) Expand all Loading... |
356 | 356 |
357 // Do a quick inline probe of the receiver's dictionary, if it | 357 // Do a quick inline probe of the receiver's dictionary, if it |
358 // exists. | 358 // exists. |
359 __ bind(&probe_dictionary); | 359 __ bind(&probe_dictionary); |
360 | 360 |
361 __ mov(eax, FieldOperand(receiver, JSObject::kMapOffset)); | 361 __ mov(eax, FieldOperand(receiver, JSObject::kMapOffset)); |
362 __ movzx_b(eax, FieldOperand(eax, Map::kInstanceTypeOffset)); | 362 __ movzx_b(eax, FieldOperand(eax, Map::kInstanceTypeOffset)); |
363 GenerateGlobalInstanceTypeCheck(masm, eax, &slow); | 363 GenerateGlobalInstanceTypeCheck(masm, eax, &slow); |
364 | 364 |
365 GenerateDictionaryLoad(masm, &slow, ebx, key, eax, edi, eax); | 365 GenerateDictionaryLoad(masm, &slow, ebx, key, eax, edi, eax); |
366 __ IncrementCounter(counters->keyed_load_generic_symbol(), 1); | 366 __ IncrementCounter(counters->ic_keyed_load_generic_symbol(), 1); |
367 __ ret(0); | 367 __ ret(0); |
368 | 368 |
369 __ bind(&index_name); | 369 __ bind(&index_name); |
370 __ IndexFromHash(ebx, key); | 370 __ IndexFromHash(ebx, key); |
371 // Now jump to the place where smi keys are handled. | 371 // Now jump to the place where smi keys are handled. |
372 __ jmp(&index_smi); | 372 __ jmp(&index_smi); |
373 } | 373 } |
374 | 374 |
375 | 375 |
376 static void KeyedStoreGenerateMegamorphicHelper( | 376 static void KeyedStoreGenerateMegamorphicHelper( |
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
661 __ push(receiver); | 661 __ push(receiver); |
662 __ push(name); | 662 __ push(name); |
663 __ push(slot); | 663 __ push(slot); |
664 __ push(vector); | 664 __ push(vector); |
665 __ push(edi); | 665 __ push(edi); |
666 } | 666 } |
667 | 667 |
668 | 668 |
669 void LoadIC::GenerateMiss(MacroAssembler* masm) { | 669 void LoadIC::GenerateMiss(MacroAssembler* masm) { |
670 // Return address is on the stack. | 670 // Return address is on the stack. |
671 __ IncrementCounter(masm->isolate()->counters()->load_miss(), 1); | 671 __ IncrementCounter(masm->isolate()->counters()->ic_load_miss(), 1); |
672 LoadIC_PushArgs(masm); | 672 LoadIC_PushArgs(masm); |
673 | 673 |
674 // Perform tail call to the entry. | 674 // Perform tail call to the entry. |
675 __ TailCallRuntime(Runtime::kLoadIC_Miss); | 675 __ TailCallRuntime(Runtime::kLoadIC_Miss); |
676 } | 676 } |
677 | 677 |
678 | 678 |
679 void LoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm, | 679 void LoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm, |
680 LanguageMode language_mode) { | 680 LanguageMode language_mode) { |
681 // Return address is on the stack. | 681 // Return address is on the stack. |
682 Register receiver = LoadDescriptor::ReceiverRegister(); | 682 Register receiver = LoadDescriptor::ReceiverRegister(); |
683 Register name = LoadDescriptor::NameRegister(); | 683 Register name = LoadDescriptor::NameRegister(); |
684 DCHECK(!ebx.is(receiver) && !ebx.is(name)); | 684 DCHECK(!ebx.is(receiver) && !ebx.is(name)); |
685 | 685 |
686 __ pop(ebx); | 686 __ pop(ebx); |
687 __ push(receiver); | 687 __ push(receiver); |
688 __ push(name); | 688 __ push(name); |
689 __ push(ebx); | 689 __ push(ebx); |
690 | 690 |
691 // Do tail-call to runtime routine. | 691 // Do tail-call to runtime routine. |
692 __ TailCallRuntime(is_strong(language_mode) ? Runtime::kGetPropertyStrong | 692 __ TailCallRuntime(is_strong(language_mode) ? Runtime::kGetPropertyStrong |
693 : Runtime::kGetProperty); | 693 : Runtime::kGetProperty); |
694 } | 694 } |
695 | 695 |
696 | 696 |
697 void KeyedLoadIC::GenerateMiss(MacroAssembler* masm) { | 697 void KeyedLoadIC::GenerateMiss(MacroAssembler* masm) { |
698 // Return address is on the stack. | 698 // Return address is on the stack. |
699 __ IncrementCounter(masm->isolate()->counters()->keyed_load_miss(), 1); | 699 __ IncrementCounter(masm->isolate()->counters()->ic_keyed_load_miss(), 1); |
700 | 700 |
701 LoadIC_PushArgs(masm); | 701 LoadIC_PushArgs(masm); |
702 | 702 |
703 // Perform tail call to the entry. | 703 // Perform tail call to the entry. |
704 __ TailCallRuntime(Runtime::kKeyedLoadIC_Miss); | 704 __ TailCallRuntime(Runtime::kKeyedLoadIC_Miss); |
705 } | 705 } |
706 | 706 |
707 | 707 |
708 void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm, | 708 void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm, |
709 LanguageMode language_mode) { | 709 LanguageMode language_mode) { |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
770 __ push(receiver); | 770 __ push(receiver); |
771 __ push(vector); | 771 __ push(vector); |
772 __ push(slot); | 772 __ push(slot); |
773 | 773 |
774 Register dictionary = ebx; | 774 Register dictionary = ebx; |
775 __ mov(dictionary, FieldOperand(receiver, JSObject::kPropertiesOffset)); | 775 __ mov(dictionary, FieldOperand(receiver, JSObject::kPropertiesOffset)); |
776 GenerateDictionaryStore(masm, &restore_miss, dictionary, name, value, | 776 GenerateDictionaryStore(masm, &restore_miss, dictionary, name, value, |
777 receiver, edi); | 777 receiver, edi); |
778 __ Drop(3); | 778 __ Drop(3); |
779 Counters* counters = masm->isolate()->counters(); | 779 Counters* counters = masm->isolate()->counters(); |
780 __ IncrementCounter(counters->store_normal_hit(), 1); | 780 __ IncrementCounter(counters->ic_store_normal_hit(), 1); |
781 __ ret(0); | 781 __ ret(0); |
782 | 782 |
783 __ bind(&restore_miss); | 783 __ bind(&restore_miss); |
784 __ pop(slot); | 784 __ pop(slot); |
785 __ pop(vector); | 785 __ pop(vector); |
786 __ pop(receiver); | 786 __ pop(receiver); |
787 __ IncrementCounter(counters->store_normal_miss(), 1); | 787 __ IncrementCounter(counters->ic_store_normal_miss(), 1); |
788 GenerateMiss(masm); | 788 GenerateMiss(masm); |
789 } | 789 } |
790 | 790 |
791 | 791 |
792 void KeyedStoreIC::GenerateMiss(MacroAssembler* masm) { | 792 void KeyedStoreIC::GenerateMiss(MacroAssembler* masm) { |
793 // Return address is on the stack. | 793 // Return address is on the stack. |
794 StoreIC_PushArgs(masm); | 794 StoreIC_PushArgs(masm); |
795 | 795 |
796 // Do tail-call to runtime routine. | 796 // Do tail-call to runtime routine. |
797 __ TailCallRuntime(Runtime::kKeyedStoreIC_Miss); | 797 __ TailCallRuntime(Runtime::kKeyedStoreIC_Miss); |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
866 Condition cc = | 866 Condition cc = |
867 (check == ENABLE_INLINED_SMI_CHECK) | 867 (check == ENABLE_INLINED_SMI_CHECK) |
868 ? (*jmp_address == Assembler::kJncShortOpcode ? not_zero : zero) | 868 ? (*jmp_address == Assembler::kJncShortOpcode ? not_zero : zero) |
869 : (*jmp_address == Assembler::kJnzShortOpcode ? not_carry : carry); | 869 : (*jmp_address == Assembler::kJnzShortOpcode ? not_carry : carry); |
870 *jmp_address = static_cast<byte>(Assembler::kJccShortPrefix | cc); | 870 *jmp_address = static_cast<byte>(Assembler::kJccShortPrefix | cc); |
871 } | 871 } |
872 } // namespace internal | 872 } // namespace internal |
873 } // namespace v8 | 873 } // namespace v8 |
874 | 874 |
875 #endif // V8_TARGET_ARCH_IA32 | 875 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |