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

Side by Side Diff: src/arm/ic-arm.cc

Issue 1937003: Pass key in register for keyed load IC... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 10 years, 7 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 | Annotate | Revision Log
« no previous file with comments | « src/arm/full-codegen-arm.cc ('k') | src/arm/stub-cache-arm.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. 1 // Copyright 2006-2008 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 664 matching lines...) Expand 10 before | Expand all | Expand 10 after
675 return true; 675 return true;
676 } 676 }
677 677
678 678
679 Object* KeyedLoadIC_Miss(Arguments args); 679 Object* KeyedLoadIC_Miss(Arguments args);
680 680
681 681
682 void KeyedLoadIC::GenerateMiss(MacroAssembler* masm) { 682 void KeyedLoadIC::GenerateMiss(MacroAssembler* masm) {
683 // ---------- S t a t e -------------- 683 // ---------- S t a t e --------------
684 // -- lr : return address 684 // -- lr : return address
685 // -- r0 : key
685 // -- sp[0] : key 686 // -- sp[0] : key
686 // -- sp[4] : receiver 687 // -- sp[4] : receiver
687 // ----------------------------------- 688 // -----------------------------------
688 689
689 __ ldm(ia, sp, r2.bit() | r3.bit()); 690 __ ldr(r1, MemOperand(sp, kPointerSize));
690 __ Push(r3, r2); 691 __ Push(r1, r0);
691 692
692 ExternalReference ref = ExternalReference(IC_Utility(kKeyedLoadIC_Miss)); 693 ExternalReference ref = ExternalReference(IC_Utility(kKeyedLoadIC_Miss));
693 __ TailCallExternalReference(ref, 2, 1); 694 __ TailCallExternalReference(ref, 2, 1);
694 } 695 }
695 696
696 697
697 void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { 698 void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) {
698 // ---------- S t a t e -------------- 699 // ---------- S t a t e --------------
699 // -- lr : return address 700 // -- lr : return address
701 // -- r0 : key
700 // -- sp[0] : key 702 // -- sp[0] : key
701 // -- sp[4] : receiver 703 // -- sp[4] : receiver
702 // ----------------------------------- 704 // -----------------------------------
703 705
704 __ ldm(ia, sp, r2.bit() | r3.bit()); 706 __ ldr(r1, MemOperand(sp, kPointerSize));
705 __ Push(r3, r2); 707 __ Push(r1, r0);
706 708
707 __ TailCallRuntime(Runtime::kGetProperty, 2, 1); 709 __ TailCallRuntime(Runtime::kGetProperty, 2, 1);
708 } 710 }
709 711
710 712
711 void KeyedLoadIC::GenerateGeneric(MacroAssembler* masm) { 713 void KeyedLoadIC::GenerateGeneric(MacroAssembler* masm) {
712 // ---------- S t a t e -------------- 714 // ---------- S t a t e --------------
713 // -- lr : return address 715 // -- lr : return address
716 // -- r0 : key
714 // -- sp[0] : key 717 // -- sp[0] : key
715 // -- sp[4] : receiver 718 // -- sp[4] : receiver
716 // ----------------------------------- 719 // -----------------------------------
717 Label slow, fast, check_pixel_array, check_number_dictionary; 720 Label slow, fast, check_pixel_array, check_number_dictionary;
718 721
719 // Get the key and receiver object from the stack. 722 // Get the object from the stack.
720 __ ldm(ia, sp, r0.bit() | r1.bit()); 723 __ ldr(r1, MemOperand(sp, kPointerSize));
721 724
722 // Check that the object isn't a smi. 725 // Check that the object isn't a smi.
723 __ BranchOnSmi(r1, &slow); 726 __ BranchOnSmi(r1, &slow);
724 // Get the map of the receiver. 727 // Get the map of the receiver.
725 __ ldr(r2, FieldMemOperand(r1, HeapObject::kMapOffset)); 728 __ ldr(r2, FieldMemOperand(r1, HeapObject::kMapOffset));
726 // Check bit field. 729 // Check bit field.
727 __ ldrb(r3, FieldMemOperand(r2, Map::kBitFieldOffset)); 730 __ ldrb(r3, FieldMemOperand(r2, Map::kBitFieldOffset));
728 __ tst(r3, Operand(kSlowCaseBitFieldMask)); 731 __ tst(r3, Operand(kSlowCaseBitFieldMask));
729 __ b(ne, &slow); 732 __ b(ne, &slow);
730 // Check that the object is some kind of JS object EXCEPT JS Value type. 733 // Check that the object is some kind of JS object EXCEPT JS Value type.
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
783 // r2: key 786 // r2: key
784 __ LoadRoot(ip, Heap::kHashTableMapRootIndex); 787 __ LoadRoot(ip, Heap::kHashTableMapRootIndex);
785 __ cmp(r3, ip); 788 __ cmp(r3, ip);
786 __ b(ne, &slow); 789 __ b(ne, &slow);
787 GenerateNumberDictionaryLoad(masm, &slow, r1, r2, r0, r3, r4); 790 GenerateNumberDictionaryLoad(masm, &slow, r1, r2, r0, r3, r4);
788 __ Ret(); 791 __ Ret();
789 792
790 // Slow case: Push extra copies of the arguments (2). 793 // Slow case: Push extra copies of the arguments (2).
791 __ bind(&slow); 794 __ bind(&slow);
792 __ IncrementCounter(&Counters::keyed_load_generic_slow, 1, r0, r1); 795 __ IncrementCounter(&Counters::keyed_load_generic_slow, 1, r0, r1);
796 __ ldr(r0, MemOperand(sp, 0));
793 GenerateRuntimeGetProperty(masm); 797 GenerateRuntimeGetProperty(masm);
794 } 798 }
795 799
796 800
797 void KeyedLoadIC::GenerateString(MacroAssembler* masm) { 801 void KeyedLoadIC::GenerateString(MacroAssembler* masm) {
798 // ---------- S t a t e -------------- 802 // ---------- S t a t e --------------
799 // -- lr : return address 803 // -- lr : return address
804 // -- r0 : key
800 // -- sp[0] : key 805 // -- sp[0] : key
801 // -- sp[4] : receiver 806 // -- sp[4] : receiver
802 // ----------------------------------- 807 // -----------------------------------
803 Label miss; 808 Label miss;
804 Label index_not_smi; 809 Label index_not_smi;
805 Label index_out_of_range; 810 Label index_out_of_range;
806 Label slow_char_code; 811 Label slow_char_code;
807 Label got_char_code; 812 Label got_char_code;
808 813
809 // Get the key and receiver object from the stack. 814 // Get the object from the stack.
810 __ ldm(ia, sp, r0.bit() | r1.bit()); 815 __ ldr(r1, MemOperand(sp, kPointerSize));
811 816
812 Register object = r1; 817 Register object = r1;
813 Register index = r0; 818 Register index = r0;
814 Register code = r2; 819 Register code = r2;
815 Register scratch = r3; 820 Register scratch = r3;
816 821
817 StringHelper::GenerateFastCharCodeAt(masm, 822 StringHelper::GenerateFastCharCodeAt(masm,
818 object, 823 object,
819 index, 824 index,
820 scratch, 825 scratch,
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
900 if (!(biased_exponent & 1)) { 905 if (!(biased_exponent & 1)) {
901 __ bic(hiword, hiword, Operand(1 << HeapNumber::kExponentShift)); 906 __ bic(hiword, hiword, Operand(1 << HeapNumber::kExponentShift));
902 } 907 }
903 } 908 }
904 909
905 910
906 void KeyedLoadIC::GenerateExternalArray(MacroAssembler* masm, 911 void KeyedLoadIC::GenerateExternalArray(MacroAssembler* masm,
907 ExternalArrayType array_type) { 912 ExternalArrayType array_type) {
908 // ---------- S t a t e -------------- 913 // ---------- S t a t e --------------
909 // -- lr : return address 914 // -- lr : return address
915 // -- r0 : key
910 // -- sp[0] : key 916 // -- sp[0] : key
911 // -- sp[4] : receiver 917 // -- sp[4] : receiver
912 // ----------------------------------- 918 // -----------------------------------
913 Label slow, failed_allocation; 919 Label slow, failed_allocation;
914 920
915 // Get the key and receiver object from the stack. 921 // Get the object from the stack.
916 __ ldm(ia, sp, r0.bit() | r1.bit()); 922 __ ldr(r1, MemOperand(sp, kPointerSize));
917 923
918 // r0: key 924 // r0: key
919 // r1: receiver object 925 // r1: receiver object
920 926
921 // Check that the object isn't a smi 927 // Check that the object isn't a smi
922 __ BranchOnSmi(r1, &slow); 928 __ BranchOnSmi(r1, &slow);
923 929
924 // Check that the key is a smi. 930 // Check that the key is a smi.
925 __ BranchOnNotSmi(r0, &slow); 931 __ BranchOnNotSmi(r0, &slow);
926 932
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
1136 } 1142 }
1137 1143
1138 } else { 1144 } else {
1139 __ mov(r0, Operand(r0, LSL, kSmiTagSize)); 1145 __ mov(r0, Operand(r0, LSL, kSmiTagSize));
1140 __ Ret(); 1146 __ Ret();
1141 } 1147 }
1142 1148
1143 // Slow case: Load name and receiver from stack and jump to runtime. 1149 // Slow case: Load name and receiver from stack and jump to runtime.
1144 __ bind(&slow); 1150 __ bind(&slow);
1145 __ IncrementCounter(&Counters::keyed_load_external_array_slow, 1, r0, r1); 1151 __ IncrementCounter(&Counters::keyed_load_external_array_slow, 1, r0, r1);
1152 __ ldr(r0, MemOperand(sp, 0));
1146 GenerateRuntimeGetProperty(masm); 1153 GenerateRuntimeGetProperty(masm);
1147 } 1154 }
1148 1155
1149 1156
1150 void KeyedLoadIC::GenerateIndexedInterceptor(MacroAssembler* masm) { 1157 void KeyedLoadIC::GenerateIndexedInterceptor(MacroAssembler* masm) {
1151 // ---------- S t a t e -------------- 1158 // ---------- S t a t e --------------
1152 // -- lr : return address 1159 // -- lr : return address
1160 // -- r0 : key
1153 // -- sp[0] : key 1161 // -- sp[0] : key
1154 // -- sp[4] : receiver 1162 // -- sp[4] : receiver
1155 // ----------------------------------- 1163 // -----------------------------------
1156 Label slow; 1164 Label slow;
1157 1165
1158 // Get the key and receiver object from the stack. 1166 // Get the object from the stack.
1159 __ ldm(ia, sp, r0.bit() | r1.bit()); 1167 __ ldr(r1, MemOperand(sp, kPointerSize));
1160 1168
1161 // Check that the receiver isn't a smi. 1169 // Check that the receiver isn't a smi.
1162 __ BranchOnSmi(r1, &slow); 1170 __ BranchOnSmi(r1, &slow);
1163 1171
1164 // Check that the key is a smi. 1172 // Check that the key is a smi.
1165 __ BranchOnNotSmi(r0, &slow); 1173 __ BranchOnNotSmi(r0, &slow);
1166 1174
1167 // Get the map of the receiver. 1175 // Get the map of the receiver.
1168 __ ldr(r2, FieldMemOperand(r1, HeapObject::kMapOffset)); 1176 __ ldr(r2, FieldMemOperand(r1, HeapObject::kMapOffset));
1169 1177
(...skipping 646 matching lines...) Expand 10 before | Expand all | Expand 10 after
1816 __ bind(&miss); 1824 __ bind(&miss);
1817 1825
1818 GenerateMiss(masm); 1826 GenerateMiss(masm);
1819 } 1827 }
1820 1828
1821 1829
1822 #undef __ 1830 #undef __
1823 1831
1824 1832
1825 } } // namespace v8::internal 1833 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/arm/full-codegen-arm.cc ('k') | src/arm/stub-cache-arm.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698