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 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #if V8_TARGET_ARCH_X87 | 7 #if V8_TARGET_ARCH_X87 |
8 | 8 |
9 #include "src/codegen.h" | 9 #include "src/codegen.h" |
10 #include "src/ic/ic.h" | 10 #include "src/ic/ic.h" |
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
305 return FieldOperand(backing_store, key, times_half_pointer_size, | 305 return FieldOperand(backing_store, key, times_half_pointer_size, |
306 FixedArray::kHeaderSize); | 306 FixedArray::kHeaderSize); |
307 } | 307 } |
308 | 308 |
309 | 309 |
310 void KeyedLoadIC::GenerateGeneric(MacroAssembler* masm) { | 310 void KeyedLoadIC::GenerateGeneric(MacroAssembler* masm) { |
311 // The return address is on the stack. | 311 // The return address is on the stack. |
312 Label slow, check_name, index_smi, index_name, property_array_property; | 312 Label slow, check_name, index_smi, index_name, property_array_property; |
313 Label probe_dictionary, check_number_dictionary; | 313 Label probe_dictionary, check_number_dictionary; |
314 | 314 |
315 Register receiver = ReceiverRegister(); | 315 Register receiver = LoadConvention::ReceiverRegister(); |
316 Register key = NameRegister(); | 316 Register key = LoadConvention::NameRegister(); |
317 DCHECK(receiver.is(edx)); | 317 DCHECK(receiver.is(edx)); |
318 DCHECK(key.is(ecx)); | 318 DCHECK(key.is(ecx)); |
319 | 319 |
320 // Check that the key is a smi. | 320 // Check that the key is a smi. |
321 __ JumpIfNotSmi(key, &check_name); | 321 __ JumpIfNotSmi(key, &check_name); |
322 __ bind(&index_smi); | 322 __ bind(&index_smi); |
323 // Now the key is known to be a smi. This place is also jumped to from | 323 // Now the key is known to be a smi. This place is also jumped to from |
324 // where a numeric string is converted to a smi. | 324 // where a numeric string is converted to a smi. |
325 | 325 |
326 GenerateKeyedLoadReceiverCheck(masm, receiver, eax, | 326 GenerateKeyedLoadReceiverCheck(masm, receiver, eax, |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
475 __ IndexFromHash(ebx, key); | 475 __ IndexFromHash(ebx, key); |
476 // Now jump to the place where smi keys are handled. | 476 // Now jump to the place where smi keys are handled. |
477 __ jmp(&index_smi); | 477 __ jmp(&index_smi); |
478 } | 478 } |
479 | 479 |
480 | 480 |
481 void KeyedLoadIC::GenerateString(MacroAssembler* masm) { | 481 void KeyedLoadIC::GenerateString(MacroAssembler* masm) { |
482 // Return address is on the stack. | 482 // Return address is on the stack. |
483 Label miss; | 483 Label miss; |
484 | 484 |
485 Register receiver = ReceiverRegister(); | 485 Register receiver = LoadConvention::ReceiverRegister(); |
486 Register index = NameRegister(); | 486 Register index = LoadConvention::NameRegister(); |
487 Register scratch = ebx; | 487 Register scratch = ebx; |
488 DCHECK(!scratch.is(receiver) && !scratch.is(index)); | 488 DCHECK(!scratch.is(receiver) && !scratch.is(index)); |
489 Register result = eax; | 489 Register result = eax; |
490 DCHECK(!result.is(scratch)); | 490 DCHECK(!result.is(scratch)); |
491 | 491 |
492 StringCharAtGenerator char_at_generator(receiver, index, scratch, result, | 492 StringCharAtGenerator char_at_generator(receiver, index, scratch, result, |
493 &miss, // When not a string. | 493 &miss, // When not a string. |
494 &miss, // When not a number. | 494 &miss, // When not a number. |
495 &miss, // When index out of range. | 495 &miss, // When index out of range. |
496 STRING_INDEX_IS_ARRAY_INDEX); | 496 STRING_INDEX_IS_ARRAY_INDEX); |
497 char_at_generator.GenerateFast(masm); | 497 char_at_generator.GenerateFast(masm); |
498 __ ret(0); | 498 __ ret(0); |
499 | 499 |
500 StubRuntimeCallHelper call_helper; | 500 StubRuntimeCallHelper call_helper; |
501 char_at_generator.GenerateSlow(masm, call_helper); | 501 char_at_generator.GenerateSlow(masm, call_helper); |
502 | 502 |
503 __ bind(&miss); | 503 __ bind(&miss); |
504 GenerateMiss(masm); | 504 GenerateMiss(masm); |
505 } | 505 } |
506 | 506 |
507 | 507 |
508 void KeyedLoadIC::GenerateIndexedInterceptor(MacroAssembler* masm) { | 508 void KeyedLoadIC::GenerateIndexedInterceptor(MacroAssembler* masm) { |
509 // Return address is on the stack. | 509 // Return address is on the stack. |
510 Label slow; | 510 Label slow; |
511 | 511 |
512 Register receiver = ReceiverRegister(); | 512 Register receiver = LoadConvention::ReceiverRegister(); |
513 Register key = NameRegister(); | 513 Register key = LoadConvention::NameRegister(); |
514 Register scratch = eax; | 514 Register scratch = eax; |
515 DCHECK(!scratch.is(receiver) && !scratch.is(key)); | 515 DCHECK(!scratch.is(receiver) && !scratch.is(key)); |
516 | 516 |
517 // Check that the receiver isn't a smi. | 517 // Check that the receiver isn't a smi. |
518 __ JumpIfSmi(receiver, &slow); | 518 __ JumpIfSmi(receiver, &slow); |
519 | 519 |
520 // Check that the key is an array index, that is Uint32. | 520 // Check that the key is an array index, that is Uint32. |
521 __ test(key, Immediate(kSmiTagMask | kSmiSignMask)); | 521 __ test(key, Immediate(kSmiTagMask | kSmiSignMask)); |
522 __ j(not_zero, &slow); | 522 __ j(not_zero, &slow); |
523 | 523 |
(...skipping 18 matching lines...) Expand all Loading... |
542 IC_Utility(kLoadElementWithInterceptor), masm->isolate()); | 542 IC_Utility(kLoadElementWithInterceptor), masm->isolate()); |
543 __ TailCallExternalReference(ref, 2, 1); | 543 __ TailCallExternalReference(ref, 2, 1); |
544 | 544 |
545 __ bind(&slow); | 545 __ bind(&slow); |
546 GenerateMiss(masm); | 546 GenerateMiss(masm); |
547 } | 547 } |
548 | 548 |
549 | 549 |
550 void KeyedLoadIC::GenerateSloppyArguments(MacroAssembler* masm) { | 550 void KeyedLoadIC::GenerateSloppyArguments(MacroAssembler* masm) { |
551 // The return address is on the stack. | 551 // The return address is on the stack. |
552 Register receiver = ReceiverRegister(); | 552 Register receiver = LoadConvention::ReceiverRegister(); |
553 Register key = NameRegister(); | 553 Register key = LoadConvention::NameRegister(); |
554 DCHECK(receiver.is(edx)); | 554 DCHECK(receiver.is(edx)); |
555 DCHECK(key.is(ecx)); | 555 DCHECK(key.is(ecx)); |
556 | 556 |
557 Label slow, notin; | 557 Label slow, notin; |
558 Factory* factory = masm->isolate()->factory(); | 558 Factory* factory = masm->isolate()->factory(); |
559 Operand mapped_location = GenerateMappedArgumentsLookup( | 559 Operand mapped_location = GenerateMappedArgumentsLookup( |
560 masm, receiver, key, ebx, eax, ¬in, &slow); | 560 masm, receiver, key, ebx, eax, ¬in, &slow); |
561 __ mov(eax, mapped_location); | 561 __ mov(eax, mapped_location); |
562 __ Ret(); | 562 __ Ret(); |
563 __ bind(¬in); | 563 __ bind(¬in); |
564 // The unmapped lookup expects that the parameter map is in ebx. | 564 // The unmapped lookup expects that the parameter map is in ebx. |
565 Operand unmapped_location = | 565 Operand unmapped_location = |
566 GenerateUnmappedArgumentsLookup(masm, key, ebx, eax, &slow); | 566 GenerateUnmappedArgumentsLookup(masm, key, ebx, eax, &slow); |
567 __ cmp(unmapped_location, factory->the_hole_value()); | 567 __ cmp(unmapped_location, factory->the_hole_value()); |
568 __ j(equal, &slow); | 568 __ j(equal, &slow); |
569 __ mov(eax, unmapped_location); | 569 __ mov(eax, unmapped_location); |
570 __ Ret(); | 570 __ Ret(); |
571 __ bind(&slow); | 571 __ bind(&slow); |
572 GenerateMiss(masm); | 572 GenerateMiss(masm); |
573 } | 573 } |
574 | 574 |
575 | 575 |
576 void KeyedStoreIC::GenerateSloppyArguments(MacroAssembler* masm) { | 576 void KeyedStoreIC::GenerateSloppyArguments(MacroAssembler* masm) { |
577 // Return address is on the stack. | 577 // Return address is on the stack. |
578 Label slow, notin; | 578 Label slow, notin; |
579 Register receiver = ReceiverRegister(); | 579 Register receiver = StoreConvention::ReceiverRegister(); |
580 Register name = NameRegister(); | 580 Register name = StoreConvention::NameRegister(); |
581 Register value = ValueRegister(); | 581 Register value = StoreConvention::ValueRegister(); |
582 DCHECK(receiver.is(edx)); | 582 DCHECK(receiver.is(edx)); |
583 DCHECK(name.is(ecx)); | 583 DCHECK(name.is(ecx)); |
584 DCHECK(value.is(eax)); | 584 DCHECK(value.is(eax)); |
585 | 585 |
586 Operand mapped_location = GenerateMappedArgumentsLookup( | 586 Operand mapped_location = GenerateMappedArgumentsLookup( |
587 masm, receiver, name, ebx, edi, ¬in, &slow); | 587 masm, receiver, name, ebx, edi, ¬in, &slow); |
588 __ mov(mapped_location, value); | 588 __ mov(mapped_location, value); |
589 __ lea(ecx, mapped_location); | 589 __ lea(ecx, mapped_location); |
590 __ mov(edx, value); | 590 __ mov(edx, value); |
591 __ RecordWrite(ebx, ecx, edx); | 591 __ RecordWrite(ebx, ecx, edx); |
(...skipping 11 matching lines...) Expand all Loading... |
603 GenerateMiss(masm); | 603 GenerateMiss(masm); |
604 } | 604 } |
605 | 605 |
606 | 606 |
607 static void KeyedStoreGenerateGenericHelper( | 607 static void KeyedStoreGenerateGenericHelper( |
608 MacroAssembler* masm, Label* fast_object, Label* fast_double, Label* slow, | 608 MacroAssembler* masm, Label* fast_object, Label* fast_double, Label* slow, |
609 KeyedStoreCheckMap check_map, KeyedStoreIncrementLength increment_length) { | 609 KeyedStoreCheckMap check_map, KeyedStoreIncrementLength increment_length) { |
610 Label transition_smi_elements; | 610 Label transition_smi_elements; |
611 Label finish_object_store, non_double_value, transition_double_elements; | 611 Label finish_object_store, non_double_value, transition_double_elements; |
612 Label fast_double_without_map_check; | 612 Label fast_double_without_map_check; |
613 Register receiver = KeyedStoreIC::ReceiverRegister(); | 613 Register receiver = StoreConvention::ReceiverRegister(); |
614 Register key = KeyedStoreIC::NameRegister(); | 614 Register key = StoreConvention::NameRegister(); |
615 Register value = KeyedStoreIC::ValueRegister(); | 615 Register value = StoreConvention::ValueRegister(); |
616 DCHECK(receiver.is(edx)); | 616 DCHECK(receiver.is(edx)); |
617 DCHECK(key.is(ecx)); | 617 DCHECK(key.is(ecx)); |
618 DCHECK(value.is(eax)); | 618 DCHECK(value.is(eax)); |
619 // key is a smi. | 619 // key is a smi. |
620 // ebx: FixedArray receiver->elements | 620 // ebx: FixedArray receiver->elements |
621 // edi: receiver map | 621 // edi: receiver map |
622 // Fast case: Do the store, could either Object or double. | 622 // Fast case: Do the store, could either Object or double. |
623 __ bind(fast_object); | 623 __ bind(fast_object); |
624 if (check_map == kCheckMap) { | 624 if (check_map == kCheckMap) { |
625 __ mov(edi, FieldOperand(ebx, HeapObject::kMapOffset)); | 625 __ mov(edi, FieldOperand(ebx, HeapObject::kMapOffset)); |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
740 __ jmp(&finish_object_store); | 740 __ jmp(&finish_object_store); |
741 } | 741 } |
742 | 742 |
743 | 743 |
744 void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm, | 744 void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm, |
745 StrictMode strict_mode) { | 745 StrictMode strict_mode) { |
746 // Return address is on the stack. | 746 // Return address is on the stack. |
747 Label slow, fast_object, fast_object_grow; | 747 Label slow, fast_object, fast_object_grow; |
748 Label fast_double, fast_double_grow; | 748 Label fast_double, fast_double_grow; |
749 Label array, extra, check_if_double_array; | 749 Label array, extra, check_if_double_array; |
750 Register receiver = ReceiverRegister(); | 750 Register receiver = StoreConvention::ReceiverRegister(); |
751 Register key = NameRegister(); | 751 Register key = StoreConvention::NameRegister(); |
752 DCHECK(receiver.is(edx)); | 752 DCHECK(receiver.is(edx)); |
753 DCHECK(key.is(ecx)); | 753 DCHECK(key.is(ecx)); |
754 | 754 |
755 // Check that the object isn't a smi. | 755 // Check that the object isn't a smi. |
756 __ JumpIfSmi(receiver, &slow); | 756 __ JumpIfSmi(receiver, &slow); |
757 // Get the map from the receiver. | 757 // Get the map from the receiver. |
758 __ mov(edi, FieldOperand(receiver, HeapObject::kMapOffset)); | 758 __ mov(edi, FieldOperand(receiver, HeapObject::kMapOffset)); |
759 // Check that the receiver does not require access checks and is not observed. | 759 // Check that the receiver does not require access checks and is not observed. |
760 // The generic stub does not perform map checks or handle observed objects. | 760 // The generic stub does not perform map checks or handle observed objects. |
761 __ test_b(FieldOperand(edi, Map::kBitFieldOffset), | 761 __ test_b(FieldOperand(edi, Map::kBitFieldOffset), |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
820 | 820 |
821 KeyedStoreGenerateGenericHelper(masm, &fast_object, &fast_double, &slow, | 821 KeyedStoreGenerateGenericHelper(masm, &fast_object, &fast_double, &slow, |
822 kCheckMap, kDontIncrementLength); | 822 kCheckMap, kDontIncrementLength); |
823 KeyedStoreGenerateGenericHelper(masm, &fast_object_grow, &fast_double_grow, | 823 KeyedStoreGenerateGenericHelper(masm, &fast_object_grow, &fast_double_grow, |
824 &slow, kDontCheckMap, kIncrementLength); | 824 &slow, kDontCheckMap, kIncrementLength); |
825 } | 825 } |
826 | 826 |
827 | 827 |
828 void LoadIC::GenerateMegamorphic(MacroAssembler* masm) { | 828 void LoadIC::GenerateMegamorphic(MacroAssembler* masm) { |
829 // The return address is on the stack. | 829 // The return address is on the stack. |
830 Register receiver = ReceiverRegister(); | 830 Register receiver = LoadConvention::ReceiverRegister(); |
831 Register name = NameRegister(); | 831 Register name = LoadConvention::NameRegister(); |
832 DCHECK(receiver.is(edx)); | 832 DCHECK(receiver.is(edx)); |
833 DCHECK(name.is(ecx)); | 833 DCHECK(name.is(ecx)); |
834 | 834 |
835 // Probe the stub cache. | 835 // Probe the stub cache. |
836 Code::Flags flags = Code::RemoveTypeAndHolderFromFlags( | 836 Code::Flags flags = Code::RemoveTypeAndHolderFromFlags( |
837 Code::ComputeHandlerFlags(Code::LOAD_IC)); | 837 Code::ComputeHandlerFlags(Code::LOAD_IC)); |
838 masm->isolate()->stub_cache()->GenerateProbe(masm, flags, receiver, name, ebx, | 838 masm->isolate()->stub_cache()->GenerateProbe(masm, flags, receiver, name, ebx, |
839 eax); | 839 eax); |
840 | 840 |
841 // Cache miss: Jump to runtime. | 841 // Cache miss: Jump to runtime. |
842 GenerateMiss(masm); | 842 GenerateMiss(masm); |
843 } | 843 } |
844 | 844 |
845 | 845 |
846 void LoadIC::GenerateNormal(MacroAssembler* masm) { | 846 void LoadIC::GenerateNormal(MacroAssembler* masm) { |
847 Register dictionary = eax; | 847 Register dictionary = eax; |
848 DCHECK(!dictionary.is(ReceiverRegister())); | 848 DCHECK(!dictionary.is(LoadConvention::ReceiverRegister())); |
849 DCHECK(!dictionary.is(NameRegister())); | 849 DCHECK(!dictionary.is(LoadConvention::NameRegister())); |
850 | 850 |
851 Label slow; | 851 Label slow; |
852 | 852 |
853 __ mov(dictionary, | 853 __ mov(dictionary, FieldOperand(LoadConvention::ReceiverRegister(), |
854 FieldOperand(ReceiverRegister(), JSObject::kPropertiesOffset)); | 854 JSObject::kPropertiesOffset)); |
855 GenerateDictionaryLoad(masm, &slow, dictionary, NameRegister(), edi, ebx, | 855 GenerateDictionaryLoad(masm, &slow, dictionary, |
856 eax); | 856 LoadConvention::NameRegister(), edi, ebx, eax); |
857 __ ret(0); | 857 __ ret(0); |
858 | 858 |
859 // Dictionary load failed, go slow (but don't miss). | 859 // Dictionary load failed, go slow (but don't miss). |
860 __ bind(&slow); | 860 __ bind(&slow); |
861 GenerateRuntimeGetProperty(masm); | 861 GenerateRuntimeGetProperty(masm); |
862 } | 862 } |
863 | 863 |
864 | 864 |
865 static void LoadIC_PushArgs(MacroAssembler* masm) { | 865 static void LoadIC_PushArgs(MacroAssembler* masm) { |
866 Register receiver = LoadIC::ReceiverRegister(); | 866 Register receiver = LoadConvention::ReceiverRegister(); |
867 Register name = LoadIC::NameRegister(); | 867 Register name = LoadConvention::NameRegister(); |
868 DCHECK(!ebx.is(receiver) && !ebx.is(name)); | 868 DCHECK(!ebx.is(receiver) && !ebx.is(name)); |
869 | 869 |
870 __ pop(ebx); | 870 __ pop(ebx); |
871 __ push(receiver); | 871 __ push(receiver); |
872 __ push(name); | 872 __ push(name); |
873 __ push(ebx); | 873 __ push(ebx); |
874 } | 874 } |
875 | 875 |
876 | 876 |
877 void LoadIC::GenerateMiss(MacroAssembler* masm) { | 877 void LoadIC::GenerateMiss(MacroAssembler* masm) { |
(...skipping 24 matching lines...) Expand all Loading... |
902 | 902 |
903 LoadIC_PushArgs(masm); | 903 LoadIC_PushArgs(masm); |
904 | 904 |
905 // Perform tail call to the entry. | 905 // Perform tail call to the entry. |
906 ExternalReference ref = | 906 ExternalReference ref = |
907 ExternalReference(IC_Utility(kKeyedLoadIC_Miss), masm->isolate()); | 907 ExternalReference(IC_Utility(kKeyedLoadIC_Miss), masm->isolate()); |
908 __ TailCallExternalReference(ref, 2, 1); | 908 __ TailCallExternalReference(ref, 2, 1); |
909 } | 909 } |
910 | 910 |
911 | 911 |
912 // IC register specifications | |
913 const Register LoadIC::ReceiverRegister() { return edx; } | |
914 const Register LoadIC::NameRegister() { return ecx; } | |
915 | |
916 | |
917 const Register LoadIC::SlotRegister() { | |
918 DCHECK(FLAG_vector_ics); | |
919 return eax; | |
920 } | |
921 | |
922 | |
923 const Register LoadIC::VectorRegister() { | |
924 DCHECK(FLAG_vector_ics); | |
925 return ebx; | |
926 } | |
927 | |
928 | |
929 const Register StoreIC::ReceiverRegister() { return edx; } | |
930 const Register StoreIC::NameRegister() { return ecx; } | |
931 const Register StoreIC::ValueRegister() { return eax; } | |
932 | |
933 | |
934 const Register KeyedStoreIC::MapRegister() { return ebx; } | |
935 | |
936 | |
937 void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { | 912 void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { |
938 // Return address is on the stack. | 913 // Return address is on the stack. |
939 LoadIC_PushArgs(masm); | 914 LoadIC_PushArgs(masm); |
940 | 915 |
941 // Perform tail call to the entry. | 916 // Perform tail call to the entry. |
942 __ TailCallRuntime(Runtime::kKeyedGetProperty, 2, 1); | 917 __ TailCallRuntime(Runtime::kKeyedGetProperty, 2, 1); |
943 } | 918 } |
944 | 919 |
945 | 920 |
946 void StoreIC::GenerateMegamorphic(MacroAssembler* masm) { | 921 void StoreIC::GenerateMegamorphic(MacroAssembler* masm) { |
947 // Return address is on the stack. | 922 // Return address is on the stack. |
948 Code::Flags flags = Code::RemoveTypeAndHolderFromFlags( | 923 Code::Flags flags = Code::RemoveTypeAndHolderFromFlags( |
949 Code::ComputeHandlerFlags(Code::STORE_IC)); | 924 Code::ComputeHandlerFlags(Code::STORE_IC)); |
950 masm->isolate()->stub_cache()->GenerateProbe(masm, flags, ReceiverRegister(), | 925 masm->isolate()->stub_cache()->GenerateProbe( |
951 NameRegister(), ebx, no_reg); | 926 masm, flags, StoreConvention::ReceiverRegister(), |
| 927 StoreConvention::NameRegister(), ebx, no_reg); |
952 | 928 |
953 // Cache miss: Jump to runtime. | 929 // Cache miss: Jump to runtime. |
954 GenerateMiss(masm); | 930 GenerateMiss(masm); |
955 } | 931 } |
956 | 932 |
957 | 933 |
958 static void StoreIC_PushArgs(MacroAssembler* masm) { | 934 static void StoreIC_PushArgs(MacroAssembler* masm) { |
959 Register receiver = StoreIC::ReceiverRegister(); | 935 Register receiver = StoreConvention::ReceiverRegister(); |
960 Register name = StoreIC::NameRegister(); | 936 Register name = StoreConvention::NameRegister(); |
961 Register value = StoreIC::ValueRegister(); | 937 Register value = StoreConvention::ValueRegister(); |
962 | 938 |
963 DCHECK(!ebx.is(receiver) && !ebx.is(name) && !ebx.is(value)); | 939 DCHECK(!ebx.is(receiver) && !ebx.is(name) && !ebx.is(value)); |
964 | 940 |
965 __ pop(ebx); | 941 __ pop(ebx); |
966 __ push(receiver); | 942 __ push(receiver); |
967 __ push(name); | 943 __ push(name); |
968 __ push(value); | 944 __ push(value); |
969 __ push(ebx); | 945 __ push(ebx); |
970 } | 946 } |
971 | 947 |
972 | 948 |
973 void StoreIC::GenerateMiss(MacroAssembler* masm) { | 949 void StoreIC::GenerateMiss(MacroAssembler* masm) { |
974 // Return address is on the stack. | 950 // Return address is on the stack. |
975 StoreIC_PushArgs(masm); | 951 StoreIC_PushArgs(masm); |
976 | 952 |
977 // Perform tail call to the entry. | 953 // Perform tail call to the entry. |
978 ExternalReference ref = | 954 ExternalReference ref = |
979 ExternalReference(IC_Utility(kStoreIC_Miss), masm->isolate()); | 955 ExternalReference(IC_Utility(kStoreIC_Miss), masm->isolate()); |
980 __ TailCallExternalReference(ref, 3, 1); | 956 __ TailCallExternalReference(ref, 3, 1); |
981 } | 957 } |
982 | 958 |
983 | 959 |
984 void StoreIC::GenerateNormal(MacroAssembler* masm) { | 960 void StoreIC::GenerateNormal(MacroAssembler* masm) { |
985 Label restore_miss; | 961 Label restore_miss; |
986 Register receiver = ReceiverRegister(); | 962 Register receiver = StoreConvention::ReceiverRegister(); |
987 Register name = NameRegister(); | 963 Register name = StoreConvention::NameRegister(); |
988 Register value = ValueRegister(); | 964 Register value = StoreConvention::ValueRegister(); |
989 Register dictionary = ebx; | 965 Register dictionary = ebx; |
990 | 966 |
991 __ mov(dictionary, FieldOperand(receiver, JSObject::kPropertiesOffset)); | 967 __ mov(dictionary, FieldOperand(receiver, JSObject::kPropertiesOffset)); |
992 | 968 |
993 // A lot of registers are needed for storing to slow case | 969 // A lot of registers are needed for storing to slow case |
994 // objects. Push and restore receiver but rely on | 970 // objects. Push and restore receiver but rely on |
995 // GenerateDictionaryStore preserving the value and name. | 971 // GenerateDictionaryStore preserving the value and name. |
996 __ push(receiver); | 972 __ push(receiver); |
997 GenerateDictionaryStore(masm, &restore_miss, dictionary, name, value, | 973 GenerateDictionaryStore(masm, &restore_miss, dictionary, name, value, |
998 receiver, edi); | 974 receiver, edi); |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1086 Condition cc = | 1062 Condition cc = |
1087 (check == ENABLE_INLINED_SMI_CHECK) | 1063 (check == ENABLE_INLINED_SMI_CHECK) |
1088 ? (*jmp_address == Assembler::kJncShortOpcode ? not_zero : zero) | 1064 ? (*jmp_address == Assembler::kJncShortOpcode ? not_zero : zero) |
1089 : (*jmp_address == Assembler::kJnzShortOpcode ? not_carry : carry); | 1065 : (*jmp_address == Assembler::kJnzShortOpcode ? not_carry : carry); |
1090 *jmp_address = static_cast<byte>(Assembler::kJccShortPrefix | cc); | 1066 *jmp_address = static_cast<byte>(Assembler::kJccShortPrefix | cc); |
1091 } | 1067 } |
1092 } | 1068 } |
1093 } // namespace v8::internal | 1069 } // namespace v8::internal |
1094 | 1070 |
1095 #endif // V8_TARGET_ARCH_X87 | 1071 #endif // V8_TARGET_ARCH_X87 |
OLD | NEW |