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

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

Issue 381633002: Use a register spec for StoreIC and KeyedStoreIC. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Code comments. Created 6 years, 5 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/arm64/full-codegen-arm64.cc ('k') | src/arm64/lithium-arm64.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 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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_ARM64 7 #if V8_TARGET_ARCH_ARM64
8 8
9 #include "src/arm64/assembler-arm64.h" 9 #include "src/arm64/assembler-arm64.h"
10 #include "src/code-stubs.h" 10 #include "src/code-stubs.h"
(...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after
495 __ JumpIfRoot(result, Heap::kTheHoleValueRootIndex, &miss); 495 __ JumpIfRoot(result, Heap::kTheHoleValueRootIndex, &miss);
496 __ Ret(); 496 __ Ret();
497 497
498 __ Bind(&miss); 498 __ Bind(&miss);
499 GenerateMiss(masm); 499 GenerateMiss(masm);
500 } 500 }
501 501
502 502
503 void KeyedStoreIC::GenerateSloppyArguments(MacroAssembler* masm) { 503 void KeyedStoreIC::GenerateSloppyArguments(MacroAssembler* masm) {
504 ASM_LOCATION("KeyedStoreIC::GenerateSloppyArguments"); 504 ASM_LOCATION("KeyedStoreIC::GenerateSloppyArguments");
505 // ---------- S t a t e --------------
506 // -- lr : return address
507 // -- x0 : value
508 // -- x1 : key
509 // -- x2 : receiver
510 // -----------------------------------
511 Label slow, notin; 505 Label slow, notin;
506 Register value = ValueRegister();
507 Register key = NameRegister();
508 Register receiver = ReceiverRegister();
509 ASSERT(receiver.is(x2));
510 ASSERT(key.is(x1));
511 ASSERT(value.is(x0));
512 512
513 Register value = x0;
514 Register key = x1;
515 Register receiver = x2;
516 Register map = x3; 513 Register map = x3;
517 514
518 // These registers are used by GenerateMappedArgumentsLookup to build a 515 // These registers are used by GenerateMappedArgumentsLookup to build a
519 // MemOperand. They are live for as long as the MemOperand is live. 516 // MemOperand. They are live for as long as the MemOperand is live.
520 Register mapped1 = x4; 517 Register mapped1 = x4;
521 Register mapped2 = x5; 518 Register mapped2 = x5;
522 519
523 MemOperand mapped = 520 MemOperand mapped =
524 GenerateMappedArgumentsLookup(masm, receiver, key, map, 521 GenerateMappedArgumentsLookup(masm, receiver, key, map,
525 mapped1, mapped2, 522 mapped1, mapped2,
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
565 562
566 __ TailCallExternalReference(ref, 2, 1); 563 __ TailCallExternalReference(ref, 2, 1);
567 } 564 }
568 565
569 566
570 // IC register specifications 567 // IC register specifications
571 const Register LoadIC::ReceiverRegister() { return x1; } 568 const Register LoadIC::ReceiverRegister() { return x1; }
572 const Register LoadIC::NameRegister() { return x2; } 569 const Register LoadIC::NameRegister() { return x2; }
573 570
574 571
572 const Register StoreIC::ReceiverRegister() { return x1; }
573 const Register StoreIC::NameRegister() { return x2; }
574 const Register StoreIC::ValueRegister() { return x0; }
575
576
577 const Register KeyedStoreIC::ReceiverRegister() { return x2; }
578 const Register KeyedStoreIC::NameRegister() { return x1; }
579 const Register KeyedStoreIC::ValueRegister() { return x0; }
580
581
575 void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { 582 void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) {
576 // The return address is in lr. 583 // The return address is in lr.
577 __ Push(ReceiverRegister(), NameRegister()); 584 __ Push(ReceiverRegister(), NameRegister());
578 __ TailCallRuntime(Runtime::kKeyedGetProperty, 2, 1); 585 __ TailCallRuntime(Runtime::kKeyedGetProperty, 2, 1);
579 } 586 }
580 587
581 588
582 static void GenerateKeyedLoadWithSmiKey(MacroAssembler* masm, 589 static void GenerateKeyedLoadWithSmiKey(MacroAssembler* masm,
583 Register key, 590 Register key,
584 Register receiver, 591 Register receiver,
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after
840 2, 847 2,
841 1); 848 1);
842 849
843 __ Bind(&slow); 850 __ Bind(&slow);
844 GenerateMiss(masm); 851 GenerateMiss(masm);
845 } 852 }
846 853
847 854
848 void KeyedStoreIC::GenerateMiss(MacroAssembler* masm) { 855 void KeyedStoreIC::GenerateMiss(MacroAssembler* masm) {
849 ASM_LOCATION("KeyedStoreIC::GenerateMiss"); 856 ASM_LOCATION("KeyedStoreIC::GenerateMiss");
850 // ---------- S t a t e --------------
851 // -- x0 : value
852 // -- x1 : key
853 // -- x2 : receiver
854 // -- lr : return address
855 // -----------------------------------
856 857
857 // Push receiver, key and value for runtime call. 858 // Push receiver, key and value for runtime call.
858 __ Push(x2, x1, x0); 859 __ Push(ReceiverRegister(), NameRegister(), ValueRegister());
859 860
860 ExternalReference ref = 861 ExternalReference ref =
861 ExternalReference(IC_Utility(kKeyedStoreIC_Miss), masm->isolate()); 862 ExternalReference(IC_Utility(kKeyedStoreIC_Miss), masm->isolate());
862 __ TailCallExternalReference(ref, 3, 1); 863 __ TailCallExternalReference(ref, 3, 1);
863 } 864 }
864 865
865 866
866 void KeyedStoreIC::GenerateSlow(MacroAssembler* masm) { 867 void KeyedStoreIC::GenerateSlow(MacroAssembler* masm) {
867 ASM_LOCATION("KeyedStoreIC::GenerateSlow"); 868 ASM_LOCATION("KeyedStoreIC::GenerateSlow");
868 // ---------- S t a t e --------------
869 // -- lr : return address
870 // -- x0 : value
871 // -- x1 : key
872 // -- x2 : receiver
873 // -----------------------------------
874 869
875 // Push receiver, key and value for runtime call. 870 // Push receiver, key and value for runtime call.
876 __ Push(x2, x1, x0); 871 __ Push(ReceiverRegister(), NameRegister(), ValueRegister());
877 872
878 // The slow case calls into the runtime to complete the store without causing 873 // The slow case calls into the runtime to complete the store without causing
879 // an IC miss that would otherwise cause a transition to the generic stub. 874 // an IC miss that would otherwise cause a transition to the generic stub.
880 ExternalReference ref = 875 ExternalReference ref =
881 ExternalReference(IC_Utility(kKeyedStoreIC_Slow), masm->isolate()); 876 ExternalReference(IC_Utility(kKeyedStoreIC_Slow), masm->isolate());
882 __ TailCallExternalReference(ref, 3, 1); 877 __ TailCallExternalReference(ref, 3, 1);
883 } 878 }
884 879
885 880
886 void KeyedStoreIC::GenerateRuntimeSetProperty(MacroAssembler* masm, 881 void KeyedStoreIC::GenerateRuntimeSetProperty(MacroAssembler* masm,
887 StrictMode strict_mode) { 882 StrictMode strict_mode) {
888 ASM_LOCATION("KeyedStoreIC::GenerateRuntimeSetProperty"); 883 ASM_LOCATION("KeyedStoreIC::GenerateRuntimeSetProperty");
889 // ---------- S t a t e --------------
890 // -- x0 : value
891 // -- x1 : key
892 // -- x2 : receiver
893 // -- lr : return address
894 // -----------------------------------
895 884
896 // Push receiver, key and value for runtime call. 885 // Push receiver, key and value for runtime call.
897 __ Push(x2, x1, x0); 886 __ Push(ReceiverRegister(), NameRegister(), ValueRegister());
898 887
899 // Push strict_mode for runtime call. 888 // Push strict_mode for runtime call.
900 __ Mov(x10, Smi::FromInt(strict_mode)); 889 __ Mov(x10, Smi::FromInt(strict_mode));
901 __ Push(x10); 890 __ Push(x10);
902 891
903 __ TailCallRuntime(Runtime::kSetProperty, 4, 1); 892 __ TailCallRuntime(Runtime::kSetProperty, 4, 1);
904 } 893 }
905 894
906 895
907 static void KeyedStoreGenerateGenericHelper( 896 static void KeyedStoreGenerateGenericHelper(
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
1060 mode = AllocationSite::GetMode(FAST_DOUBLE_ELEMENTS, FAST_ELEMENTS); 1049 mode = AllocationSite::GetMode(FAST_DOUBLE_ELEMENTS, FAST_ELEMENTS);
1061 ElementsTransitionGenerator::GenerateDoubleToObject(masm, mode, slow); 1050 ElementsTransitionGenerator::GenerateDoubleToObject(masm, mode, slow);
1062 __ Ldr(elements, FieldMemOperand(receiver, JSObject::kElementsOffset)); 1051 __ Ldr(elements, FieldMemOperand(receiver, JSObject::kElementsOffset));
1063 __ B(&finish_store); 1052 __ B(&finish_store);
1064 } 1053 }
1065 1054
1066 1055
1067 void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm, 1056 void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm,
1068 StrictMode strict_mode) { 1057 StrictMode strict_mode) {
1069 ASM_LOCATION("KeyedStoreIC::GenerateGeneric"); 1058 ASM_LOCATION("KeyedStoreIC::GenerateGeneric");
1070 // ---------- S t a t e --------------
1071 // -- x0 : value
1072 // -- x1 : key
1073 // -- x2 : receiver
1074 // -- lr : return address
1075 // -----------------------------------
1076 Label slow; 1059 Label slow;
1077 Label array; 1060 Label array;
1078 Label fast_object; 1061 Label fast_object;
1079 Label extra; 1062 Label extra;
1080 Label fast_object_grow; 1063 Label fast_object_grow;
1081 Label fast_double_grow; 1064 Label fast_double_grow;
1082 Label fast_double; 1065 Label fast_double;
1083 1066
1084 Register value = x0; 1067 Register value = ValueRegister();
1085 Register key = x1; 1068 Register key = NameRegister();
1086 Register receiver = x2; 1069 Register receiver = ReceiverRegister();
1070 ASSERT(receiver.is(x2));
1071 ASSERT(key.is(x1));
1072 ASSERT(value.is(x0));
1073
1087 Register receiver_map = x3; 1074 Register receiver_map = x3;
1088 Register elements = x4; 1075 Register elements = x4;
1089 Register elements_map = x5; 1076 Register elements_map = x5;
1090 1077
1091 __ JumpIfNotSmi(key, &slow); 1078 __ JumpIfNotSmi(key, &slow);
1092 __ JumpIfSmi(receiver, &slow); 1079 __ JumpIfSmi(receiver, &slow);
1093 __ Ldr(receiver_map, FieldMemOperand(receiver, HeapObject::kMapOffset)); 1080 __ Ldr(receiver_map, FieldMemOperand(receiver, HeapObject::kMapOffset));
1094 1081
1095 // Check that the receiver does not require access checks and is not observed. 1082 // Check that the receiver does not require access checks and is not observed.
1096 // The generic stub does not perform map checks or handle observed objects. 1083 // The generic stub does not perform map checks or handle observed objects.
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
1161 value, key, receiver, receiver_map, 1148 value, key, receiver, receiver_map,
1162 elements_map, elements); 1149 elements_map, elements);
1163 KeyedStoreGenerateGenericHelper(masm, &fast_object_grow, &fast_double_grow, 1150 KeyedStoreGenerateGenericHelper(masm, &fast_object_grow, &fast_double_grow,
1164 &slow, kDontCheckMap, kIncrementLength, 1151 &slow, kDontCheckMap, kIncrementLength,
1165 value, key, receiver, receiver_map, 1152 value, key, receiver, receiver_map,
1166 elements_map, elements); 1153 elements_map, elements);
1167 } 1154 }
1168 1155
1169 1156
1170 void StoreIC::GenerateMegamorphic(MacroAssembler* masm) { 1157 void StoreIC::GenerateMegamorphic(MacroAssembler* masm) {
1171 // ----------- S t a t e ------------- 1158 Register receiver = ReceiverRegister();
1172 // -- x0 : value 1159 Register name = NameRegister();
1173 // -- x1 : receiver 1160 ASSERT(!AreAliased(receiver, name, ValueRegister(), x3, x4, x5, x6));
1174 // -- x2 : name
1175 // -- lr : return address
1176 // -----------------------------------
1177 1161
1178 // Probe the stub cache. 1162 // Probe the stub cache.
1179 Code::Flags flags = Code::ComputeHandlerFlags(Code::STORE_IC); 1163 Code::Flags flags = Code::ComputeHandlerFlags(Code::STORE_IC);
1180 masm->isolate()->stub_cache()->GenerateProbe( 1164 masm->isolate()->stub_cache()->GenerateProbe(
1181 masm, flags, x1, x2, x3, x4, x5, x6); 1165 masm, flags, receiver, name, x3, x4, x5, x6);
1182 1166
1183 // Cache miss: Jump to runtime. 1167 // Cache miss: Jump to runtime.
1184 GenerateMiss(masm); 1168 GenerateMiss(masm);
1185 } 1169 }
1186 1170
1187 1171
1188 void StoreIC::GenerateMiss(MacroAssembler* masm) { 1172 void StoreIC::GenerateMiss(MacroAssembler* masm) {
1189 // ----------- S t a t e ------------- 1173 __ Push(ReceiverRegister(), NameRegister(), ValueRegister());
1190 // -- x0 : value
1191 // -- x1 : receiver
1192 // -- x2 : name
1193 // -- lr : return address
1194 // -----------------------------------
1195
1196 __ Push(x1, x2, x0);
1197 1174
1198 // Tail call to the entry. 1175 // Tail call to the entry.
1199 ExternalReference ref = 1176 ExternalReference ref =
1200 ExternalReference(IC_Utility(kStoreIC_Miss), masm->isolate()); 1177 ExternalReference(IC_Utility(kStoreIC_Miss), masm->isolate());
1201 __ TailCallExternalReference(ref, 3, 1); 1178 __ TailCallExternalReference(ref, 3, 1);
1202 } 1179 }
1203 1180
1204 1181
1205 void StoreIC::GenerateNormal(MacroAssembler* masm) { 1182 void StoreIC::GenerateNormal(MacroAssembler* masm) {
1206 // ----------- S t a t e -------------
1207 // -- x0 : value
1208 // -- x1 : receiver
1209 // -- x2 : name
1210 // -- lr : return address
1211 // -----------------------------------
1212 Label miss; 1183 Label miss;
1213 Register value = x0; 1184 Register value = ValueRegister();
1214 Register receiver = x1; 1185 Register receiver = ReceiverRegister();
1215 Register name = x2; 1186 Register name = NameRegister();
1216 Register dictionary = x3; 1187 Register dictionary = x3;
1188 ASSERT(!AreAliased(value, receiver, name, x3, x4, x5));
1217 1189
1218 GenerateNameDictionaryReceiverCheck( 1190 GenerateNameDictionaryReceiverCheck(
1219 masm, receiver, dictionary, x4, x5, &miss); 1191 masm, receiver, dictionary, x4, x5, &miss);
1220 1192
1221 GenerateDictionaryStore(masm, &miss, dictionary, name, value, x4, x5); 1193 GenerateDictionaryStore(masm, &miss, dictionary, name, value, x4, x5);
1222 Counters* counters = masm->isolate()->counters(); 1194 Counters* counters = masm->isolate()->counters();
1223 __ IncrementCounter(counters->store_normal_hit(), 1, x4, x5); 1195 __ IncrementCounter(counters->store_normal_hit(), 1, x4, x5);
1224 __ Ret(); 1196 __ Ret();
1225 1197
1226 // Cache miss: Jump to runtime. 1198 // Cache miss: Jump to runtime.
1227 __ Bind(&miss); 1199 __ Bind(&miss);
1228 __ IncrementCounter(counters->store_normal_miss(), 1, x4, x5); 1200 __ IncrementCounter(counters->store_normal_miss(), 1, x4, x5);
1229 GenerateMiss(masm); 1201 GenerateMiss(masm);
1230 } 1202 }
1231 1203
1232 1204
1233 void StoreIC::GenerateRuntimeSetProperty(MacroAssembler* masm, 1205 void StoreIC::GenerateRuntimeSetProperty(MacroAssembler* masm,
1234 StrictMode strict_mode) { 1206 StrictMode strict_mode) {
1235 ASM_LOCATION("StoreIC::GenerateRuntimeSetProperty"); 1207 ASM_LOCATION("StoreIC::GenerateRuntimeSetProperty");
1236 // ----------- S t a t e -------------
1237 // -- x0 : value
1238 // -- x1 : receiver
1239 // -- x2 : name
1240 // -- lr : return address
1241 // -----------------------------------
1242 1208
1243 __ Push(x1, x2, x0); 1209 __ Push(ReceiverRegister(), NameRegister(), ValueRegister());
1244 1210
1245 __ Mov(x10, Smi::FromInt(strict_mode)); 1211 __ Mov(x10, Smi::FromInt(strict_mode));
1246 __ Push(x10); 1212 __ Push(x10);
1247 1213
1248 // Do tail-call to runtime routine. 1214 // Do tail-call to runtime routine.
1249 __ TailCallRuntime(Runtime::kSetProperty, 4, 1); 1215 __ TailCallRuntime(Runtime::kSetProperty, 4, 1);
1250 } 1216 }
1251 1217
1252 1218
1253 void StoreIC::GenerateSlow(MacroAssembler* masm) { 1219 void StoreIC::GenerateSlow(MacroAssembler* masm) {
1254 // ---------- S t a t e -------------- 1220 // ---------- S t a t e --------------
1255 // -- x0 : value 1221 // -- x0 : value
1256 // -- x1 : receiver 1222 // -- x1 : receiver
1257 // -- x2 : name 1223 // -- x2 : name
1258 // -- lr : return address 1224 // -- lr : return address
1259 // ----------------------------------- 1225 // -----------------------------------
1260 1226
1261 // Push receiver, name and value for runtime call. 1227 // Push receiver, name and value for runtime call.
1262 __ Push(x1, x2, x0); 1228 __ Push(ReceiverRegister(), NameRegister(), ValueRegister());
1263 1229
1264 // The slow case calls into the runtime to complete the store without causing 1230 // The slow case calls into the runtime to complete the store without causing
1265 // an IC miss that would otherwise cause a transition to the generic stub. 1231 // an IC miss that would otherwise cause a transition to the generic stub.
1266 ExternalReference ref = 1232 ExternalReference ref =
1267 ExternalReference(IC_Utility(kStoreIC_Slow), masm->isolate()); 1233 ExternalReference(IC_Utility(kStoreIC_Slow), masm->isolate());
1268 __ TailCallExternalReference(ref, 3, 1); 1234 __ TailCallExternalReference(ref, 3, 1);
1269 } 1235 }
1270 1236
1271 1237
1272 Condition CompareIC::ComputeCondition(Token::Value op) { 1238 Condition CompareIC::ComputeCondition(Token::Value op) {
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
1354 ASSERT(to_patch->Mask(TestBranchMask) == TBNZ); 1320 ASSERT(to_patch->Mask(TestBranchMask) == TBNZ);
1355 // This is JumpIfSmi(smi_reg, branch_imm). 1321 // This is JumpIfSmi(smi_reg, branch_imm).
1356 patcher.tbz(smi_reg, 0, branch_imm); 1322 patcher.tbz(smi_reg, 0, branch_imm);
1357 } 1323 }
1358 } 1324 }
1359 1325
1360 1326
1361 } } // namespace v8::internal 1327 } } // namespace v8::internal
1362 1328
1363 #endif // V8_TARGET_ARCH_ARM64 1329 #endif // V8_TARGET_ARCH_ARM64
OLDNEW
« no previous file with comments | « src/arm64/full-codegen-arm64.cc ('k') | src/arm64/lithium-arm64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698