| OLD | NEW |
| 1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 1028 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1039 | 1039 |
| 1040 // Slow case: call runtime. | 1040 // Slow case: call runtime. |
| 1041 __ bind(&slow); | 1041 __ bind(&slow); |
| 1042 GenerateRuntimeSetProperty(masm); | 1042 GenerateRuntimeSetProperty(masm); |
| 1043 } | 1043 } |
| 1044 | 1044 |
| 1045 | 1045 |
| 1046 // Defined in ic.cc. | 1046 // Defined in ic.cc. |
| 1047 Object* CallIC_Miss(Arguments args); | 1047 Object* CallIC_Miss(Arguments args); |
| 1048 | 1048 |
| 1049 void CallIC::GenerateMegamorphic(MacroAssembler* masm, int argc) { | 1049 // The generated code does not accept smi keys. |
| 1050 // The generated code falls through if both probes miss. |
| 1051 static void GenerateMonomorphicCacheProbe(MacroAssembler* masm, |
| 1052 int argc, |
| 1053 Code::Kind kind, |
| 1054 Label* miss) { |
| 1050 // ----------- S t a t e ------------- | 1055 // ----------- S t a t e ------------- |
| 1051 // -- ecx : name | 1056 // -- ecx : name |
| 1052 // -- esp[0] : return address | 1057 // -- edx : receiver |
| 1053 // -- esp[(argc - n) * 4] : arg[n] (zero-based) | |
| 1054 // -- ... | |
| 1055 // -- esp[(argc + 1) * 4] : receiver | |
| 1056 // ----------------------------------- | 1058 // ----------------------------------- |
| 1057 Label number, non_number, non_string, boolean, probe, miss; | 1059 Label number, non_number, non_string, boolean, probe; |
| 1058 | |
| 1059 // Get the receiver of the function from the stack; 1 ~ return address. | |
| 1060 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); | |
| 1061 | 1060 |
| 1062 // Probe the stub cache. | 1061 // Probe the stub cache. |
| 1063 Code::Flags flags = | 1062 Code::Flags flags = |
| 1064 Code::ComputeFlags(Code::CALL_IC, NOT_IN_LOOP, MONOMORPHIC, NORMAL, argc); | 1063 Code::ComputeFlags(kind, NOT_IN_LOOP, MONOMORPHIC, NORMAL, argc); |
| 1065 StubCache::GenerateProbe(masm, flags, edx, ecx, ebx, eax); | 1064 StubCache::GenerateProbe(masm, flags, edx, ecx, ebx, eax); |
| 1066 | 1065 |
| 1067 // If the stub cache probing failed, the receiver might be a value. | 1066 // If the stub cache probing failed, the receiver might be a value. |
| 1068 // For value objects, we use the map of the prototype objects for | 1067 // For value objects, we use the map of the prototype objects for |
| 1069 // the corresponding JSValue for the cache and that is what we need | 1068 // the corresponding JSValue for the cache and that is what we need |
| 1070 // to probe. | 1069 // to probe. |
| 1071 // | 1070 // |
| 1072 // Check for number. | 1071 // Check for number. |
| 1073 __ test(edx, Immediate(kSmiTagMask)); | 1072 __ test(edx, Immediate(kSmiTagMask)); |
| 1074 __ j(zero, &number, not_taken); | 1073 __ j(zero, &number, not_taken); |
| 1075 __ CmpObjectType(edx, HEAP_NUMBER_TYPE, ebx); | 1074 __ CmpObjectType(edx, HEAP_NUMBER_TYPE, ebx); |
| 1076 __ j(not_equal, &non_number, taken); | 1075 __ j(not_equal, &non_number, taken); |
| 1077 __ bind(&number); | 1076 __ bind(&number); |
| 1078 StubCompiler::GenerateLoadGlobalFunctionPrototype( | 1077 StubCompiler::GenerateLoadGlobalFunctionPrototype( |
| 1079 masm, Context::NUMBER_FUNCTION_INDEX, edx); | 1078 masm, Context::NUMBER_FUNCTION_INDEX, edx); |
| 1080 __ jmp(&probe); | 1079 __ jmp(&probe); |
| 1081 | 1080 |
| 1082 // Check for string. | 1081 // Check for string. |
| 1083 __ bind(&non_number); | 1082 __ bind(&non_number); |
| 1084 __ cmp(ebx, FIRST_NONSTRING_TYPE); | 1083 __ CmpInstanceType(ebx, FIRST_NONSTRING_TYPE); |
| 1085 __ j(above_equal, &non_string, taken); | 1084 __ j(above_equal, &non_string, taken); |
| 1086 StubCompiler::GenerateLoadGlobalFunctionPrototype( | 1085 StubCompiler::GenerateLoadGlobalFunctionPrototype( |
| 1087 masm, Context::STRING_FUNCTION_INDEX, edx); | 1086 masm, Context::STRING_FUNCTION_INDEX, edx); |
| 1088 __ jmp(&probe); | 1087 __ jmp(&probe); |
| 1089 | 1088 |
| 1090 // Check for boolean. | 1089 // Check for boolean. |
| 1091 __ bind(&non_string); | 1090 __ bind(&non_string); |
| 1092 __ cmp(edx, Factory::true_value()); | 1091 __ cmp(edx, Factory::true_value()); |
| 1093 __ j(equal, &boolean, not_taken); | 1092 __ j(equal, &boolean, not_taken); |
| 1094 __ cmp(edx, Factory::false_value()); | 1093 __ cmp(edx, Factory::false_value()); |
| 1095 __ j(not_equal, &miss, taken); | 1094 __ j(not_equal, miss, taken); |
| 1096 __ bind(&boolean); | 1095 __ bind(&boolean); |
| 1097 StubCompiler::GenerateLoadGlobalFunctionPrototype( | 1096 StubCompiler::GenerateLoadGlobalFunctionPrototype( |
| 1098 masm, Context::BOOLEAN_FUNCTION_INDEX, edx); | 1097 masm, Context::BOOLEAN_FUNCTION_INDEX, edx); |
| 1099 | 1098 |
| 1100 // Probe the stub cache for the value object. | 1099 // Probe the stub cache for the value object. |
| 1101 __ bind(&probe); | 1100 __ bind(&probe); |
| 1102 StubCache::GenerateProbe(masm, flags, edx, ecx, ebx, no_reg); | 1101 StubCache::GenerateProbe(masm, flags, edx, ecx, ebx, no_reg); |
| 1103 | |
| 1104 // Cache miss: Jump to runtime. | |
| 1105 __ bind(&miss); | |
| 1106 GenerateMiss(masm, argc); | |
| 1107 } | 1102 } |
| 1108 | 1103 |
| 1109 | 1104 |
| 1110 static void GenerateNormalHelper(MacroAssembler* masm, | 1105 static void GenerateNormalHelper(MacroAssembler* masm, |
| 1111 int argc, | 1106 int argc, |
| 1112 bool is_global_object, | 1107 bool is_global_object, |
| 1113 Label* miss) { | 1108 Label* miss) { |
| 1114 // ----------- S t a t e ------------- | 1109 // ----------- S t a t e ------------- |
| 1115 // -- ecx : name | 1110 // -- ecx : name |
| 1116 // -- edx : receiver | 1111 // -- edx : receiver |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1136 if (is_global_object) { | 1131 if (is_global_object) { |
| 1137 __ mov(edx, FieldOperand(edx, GlobalObject::kGlobalReceiverOffset)); | 1132 __ mov(edx, FieldOperand(edx, GlobalObject::kGlobalReceiverOffset)); |
| 1138 __ mov(Operand(esp, (argc + 1) * kPointerSize), edx); | 1133 __ mov(Operand(esp, (argc + 1) * kPointerSize), edx); |
| 1139 } | 1134 } |
| 1140 | 1135 |
| 1141 // Invoke the function. | 1136 // Invoke the function. |
| 1142 ParameterCount actual(argc); | 1137 ParameterCount actual(argc); |
| 1143 __ InvokeFunction(edi, actual, JUMP_FUNCTION); | 1138 __ InvokeFunction(edi, actual, JUMP_FUNCTION); |
| 1144 } | 1139 } |
| 1145 | 1140 |
| 1146 | 1141 // The generated code never falls through. |
| 1147 void CallIC::GenerateNormal(MacroAssembler* masm, int argc) { | 1142 static void GenerateCallNormal(MacroAssembler* masm, int argc, Label* miss) { |
| 1148 // ----------- S t a t e ------------- | 1143 // ----------- S t a t e ------------- |
| 1149 // -- ecx : name | 1144 // -- ecx : name |
| 1150 // -- esp[0] : return address | 1145 // -- esp[0] : return address |
| 1151 // -- esp[(argc - n) * 4] : arg[n] (zero-based) | 1146 // -- esp[(argc - n) * 4] : arg[n] (zero-based) |
| 1152 // -- ... | 1147 // -- ... |
| 1153 // -- esp[(argc + 1) * 4] : receiver | 1148 // -- esp[(argc + 1) * 4] : receiver |
| 1154 // ----------------------------------- | 1149 // ----------------------------------- |
| 1155 Label miss, global_object, non_global_object; | 1150 Label global_object, non_global_object; |
| 1156 | 1151 |
| 1157 // Get the receiver of the function from the stack; 1 ~ return address. | 1152 // Get the receiver of the function from the stack; 1 ~ return address. |
| 1158 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); | 1153 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); |
| 1159 | 1154 |
| 1160 // Check that the receiver isn't a smi. | 1155 // Check that the receiver isn't a smi. |
| 1161 __ test(edx, Immediate(kSmiTagMask)); | 1156 __ test(edx, Immediate(kSmiTagMask)); |
| 1162 __ j(zero, &miss, not_taken); | 1157 __ j(zero, miss, not_taken); |
| 1163 | 1158 |
| 1164 // Check that the receiver is a valid JS object. | 1159 // Check that the receiver is a valid JS object. |
| 1165 __ mov(ebx, FieldOperand(edx, HeapObject::kMapOffset)); | 1160 __ mov(ebx, FieldOperand(edx, HeapObject::kMapOffset)); |
| 1166 __ movzx_b(eax, FieldOperand(ebx, Map::kInstanceTypeOffset)); | 1161 __ movzx_b(eax, FieldOperand(ebx, Map::kInstanceTypeOffset)); |
| 1167 __ cmp(eax, FIRST_JS_OBJECT_TYPE); | 1162 __ cmp(eax, FIRST_JS_OBJECT_TYPE); |
| 1168 __ j(below, &miss, not_taken); | 1163 __ j(below, miss, not_taken); |
| 1169 | 1164 |
| 1170 // If this assert fails, we have to check upper bound too. | 1165 // If this assert fails, we have to check upper bound too. |
| 1171 ASSERT(LAST_TYPE == JS_FUNCTION_TYPE); | 1166 ASSERT(LAST_TYPE == JS_FUNCTION_TYPE); |
| 1172 | 1167 |
| 1173 // Check for access to global object. | 1168 // Check for access to global object. |
| 1174 __ cmp(eax, JS_GLOBAL_OBJECT_TYPE); | 1169 __ cmp(eax, JS_GLOBAL_OBJECT_TYPE); |
| 1175 __ j(equal, &global_object); | 1170 __ j(equal, &global_object); |
| 1176 __ cmp(eax, JS_BUILTINS_OBJECT_TYPE); | 1171 __ cmp(eax, JS_BUILTINS_OBJECT_TYPE); |
| 1177 __ j(not_equal, &non_global_object); | 1172 __ j(not_equal, &non_global_object); |
| 1178 | 1173 |
| 1179 // Accessing global object: Load and invoke. | 1174 // Accessing global object: Load and invoke. |
| 1180 __ bind(&global_object); | 1175 __ bind(&global_object); |
| 1181 // Check that the global object does not require access checks. | 1176 // Check that the global object does not require access checks. |
| 1182 __ movzx_b(ebx, FieldOperand(ebx, Map::kBitFieldOffset)); | 1177 __ movzx_b(ebx, FieldOperand(ebx, Map::kBitFieldOffset)); |
| 1183 __ test(ebx, Immediate(1 << Map::kIsAccessCheckNeeded)); | 1178 __ test(ebx, Immediate(1 << Map::kIsAccessCheckNeeded)); |
| 1184 __ j(not_equal, &miss, not_taken); | 1179 __ j(not_equal, miss, not_taken); |
| 1185 GenerateNormalHelper(masm, argc, true, &miss); | 1180 GenerateNormalHelper(masm, argc, true, miss); |
| 1186 | 1181 |
| 1187 // Accessing non-global object: Check for access to global proxy. | 1182 // Accessing non-global object: Check for access to global proxy. |
| 1188 Label global_proxy, invoke; | 1183 Label global_proxy, invoke; |
| 1189 __ bind(&non_global_object); | 1184 __ bind(&non_global_object); |
| 1190 __ cmp(eax, JS_GLOBAL_PROXY_TYPE); | 1185 __ cmp(eax, JS_GLOBAL_PROXY_TYPE); |
| 1191 __ j(equal, &global_proxy, not_taken); | 1186 __ j(equal, &global_proxy, not_taken); |
| 1192 // Check that the non-global, non-global-proxy object does not | 1187 // Check that the non-global, non-global-proxy object does not |
| 1193 // require access checks. | 1188 // require access checks. |
| 1194 __ movzx_b(ebx, FieldOperand(ebx, Map::kBitFieldOffset)); | 1189 __ movzx_b(ebx, FieldOperand(ebx, Map::kBitFieldOffset)); |
| 1195 __ test(ebx, Immediate(1 << Map::kIsAccessCheckNeeded)); | 1190 __ test(ebx, Immediate(1 << Map::kIsAccessCheckNeeded)); |
| 1196 __ j(not_equal, &miss, not_taken); | 1191 __ j(not_equal, miss, not_taken); |
| 1197 __ bind(&invoke); | 1192 __ bind(&invoke); |
| 1198 GenerateNormalHelper(masm, argc, false, &miss); | 1193 GenerateNormalHelper(masm, argc, false, miss); |
| 1199 | 1194 |
| 1200 // Global object proxy access: Check access rights. | 1195 // Global object proxy access: Check access rights. |
| 1201 __ bind(&global_proxy); | 1196 __ bind(&global_proxy); |
| 1202 __ CheckAccessGlobalProxy(edx, eax, &miss); | 1197 __ CheckAccessGlobalProxy(edx, eax, miss); |
| 1203 __ jmp(&invoke); | 1198 __ jmp(&invoke); |
| 1204 | |
| 1205 // Cache miss: Jump to runtime. | |
| 1206 __ bind(&miss); | |
| 1207 GenerateMiss(masm, argc); | |
| 1208 } | 1199 } |
| 1209 | 1200 |
| 1210 | 1201 |
| 1211 void CallIC::GenerateMiss(MacroAssembler* masm, int argc) { | 1202 static void GenerateCallMiss(MacroAssembler* masm, int argc, IC::UtilityId id) { |
| 1212 // ----------- S t a t e ------------- | 1203 // ----------- S t a t e ------------- |
| 1213 // -- ecx : name | 1204 // -- ecx : name |
| 1214 // -- esp[0] : return address | 1205 // -- esp[0] : return address |
| 1215 // -- esp[(argc - n) * 4] : arg[n] (zero-based) | 1206 // -- esp[(argc - n) * 4] : arg[n] (zero-based) |
| 1216 // -- ... | 1207 // -- ... |
| 1217 // -- esp[(argc + 1) * 4] : receiver | 1208 // -- esp[(argc + 1) * 4] : receiver |
| 1218 // ----------------------------------- | 1209 // ----------------------------------- |
| 1219 | 1210 |
| 1220 // Get the receiver of the function from the stack; 1 ~ return address. | 1211 // Get the receiver of the function from the stack; 1 ~ return address. |
| 1221 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); | 1212 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); |
| 1222 | 1213 |
| 1223 // Enter an internal frame. | 1214 // Enter an internal frame. |
| 1224 __ EnterInternalFrame(); | 1215 __ EnterInternalFrame(); |
| 1225 | 1216 |
| 1226 // Push the receiver and the name of the function. | 1217 // Push the receiver and the name of the function. |
| 1227 __ push(edx); | 1218 __ push(edx); |
| 1228 __ push(ecx); | 1219 __ push(ecx); |
| 1229 | 1220 |
| 1230 // Call the entry. | 1221 // Call the entry. |
| 1231 CEntryStub stub(1); | 1222 CEntryStub stub(1); |
| 1232 __ mov(eax, Immediate(2)); | 1223 __ mov(eax, Immediate(2)); |
| 1233 __ mov(ebx, Immediate(ExternalReference(IC_Utility(kCallIC_Miss)))); | 1224 __ mov(ebx, Immediate(ExternalReference(IC_Utility(id)))); |
| 1234 __ CallStub(&stub); | 1225 __ CallStub(&stub); |
| 1235 | 1226 |
| 1236 // Move result to edi and exit the internal frame. | 1227 // Move result to edi and exit the internal frame. |
| 1237 __ mov(edi, eax); | 1228 __ mov(edi, eax); |
| 1238 __ LeaveInternalFrame(); | 1229 __ LeaveInternalFrame(); |
| 1239 | 1230 |
| 1240 // Check if the receiver is a global object of some sort. | 1231 // Check if the receiver is a global object of some sort. |
| 1241 Label invoke, global; | 1232 Label invoke, global; |
| 1242 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); // receiver | 1233 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); // receiver |
| 1243 __ test(edx, Immediate(kSmiTagMask)); | 1234 __ test(edx, Immediate(kSmiTagMask)); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1254 __ mov(edx, FieldOperand(edx, GlobalObject::kGlobalReceiverOffset)); | 1245 __ mov(edx, FieldOperand(edx, GlobalObject::kGlobalReceiverOffset)); |
| 1255 __ mov(Operand(esp, (argc + 1) * kPointerSize), edx); | 1246 __ mov(Operand(esp, (argc + 1) * kPointerSize), edx); |
| 1256 | 1247 |
| 1257 // Invoke the function. | 1248 // Invoke the function. |
| 1258 ParameterCount actual(argc); | 1249 ParameterCount actual(argc); |
| 1259 __ bind(&invoke); | 1250 __ bind(&invoke); |
| 1260 __ InvokeFunction(edi, actual, JUMP_FUNCTION); | 1251 __ InvokeFunction(edi, actual, JUMP_FUNCTION); |
| 1261 } | 1252 } |
| 1262 | 1253 |
| 1263 | 1254 |
| 1255 void CallIC::GenerateMegamorphic(MacroAssembler* masm, int argc) { |
| 1256 // ----------- S t a t e ------------- |
| 1257 // -- ecx : name |
| 1258 // -- esp[0] : return address |
| 1259 // -- esp[(argc - n) * 4] : arg[n] (zero-based) |
| 1260 // -- ... |
| 1261 // -- esp[(argc + 1) * 4] : receiver |
| 1262 // ----------------------------------- |
| 1263 |
| 1264 Label miss; |
| 1265 // Get the receiver of the function from the stack; 1 ~ return address. |
| 1266 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); |
| 1267 GenerateMonomorphicCacheProbe(masm, argc, Code::CALL_IC, &miss); |
| 1268 __ bind(&miss); |
| 1269 GenerateMiss(masm, argc); |
| 1270 } |
| 1271 |
| 1272 |
| 1273 void CallIC::GenerateNormal(MacroAssembler* masm, int argc) { |
| 1274 Label miss; |
| 1275 GenerateCallNormal(masm, argc, &miss); |
| 1276 __ bind(&miss); |
| 1277 GenerateMiss(masm, argc); |
| 1278 } |
| 1279 |
| 1280 |
| 1281 void CallIC::GenerateMiss(MacroAssembler* masm, int argc) { |
| 1282 GenerateCallMiss(masm, argc, IC::kCallIC_Miss); |
| 1283 } |
| 1284 |
| 1285 |
| 1286 void KeyedCallIC::GenerateMegamorphic(MacroAssembler* masm, int argc) { |
| 1287 // ----------- S t a t e ------------- |
| 1288 // -- ecx : name |
| 1289 // -- esp[0] : return address |
| 1290 // -- esp[(argc - n) * 4] : arg[n] (zero-based) |
| 1291 // -- ... |
| 1292 // -- esp[(argc + 1) * 4] : receiver |
| 1293 // ----------------------------------- |
| 1294 |
| 1295 // Get the receiver of the function from the stack; 1 ~ return address. |
| 1296 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); |
| 1297 |
| 1298 Label miss, skip_probe; |
| 1299 |
| 1300 // Do not probe monomorphic cache if a key is a smi. |
| 1301 __ test(ecx, Immediate(kSmiTagMask)); |
| 1302 __ j(equal, &skip_probe, taken); |
| 1303 |
| 1304 GenerateMonomorphicCacheProbe(masm, argc, Code::KEYED_CALL_IC, &skip_probe); |
| 1305 |
| 1306 __ bind(&skip_probe); |
| 1307 |
| 1308 __ mov(eax, ecx); |
| 1309 __ EnterInternalFrame(); |
| 1310 __ push(ecx); |
| 1311 __ call(Handle<Code>(Builtins::builtin(Builtins::KeyedLoadIC_Generic)), |
| 1312 RelocInfo::CODE_TARGET); |
| 1313 __ pop(ecx); |
| 1314 __ LeaveInternalFrame(); |
| 1315 __ mov(edi, eax); |
| 1316 |
| 1317 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); |
| 1318 |
| 1319 // Check that the receiver isn't a smi. |
| 1320 __ test(edx, Immediate(kSmiTagMask)); |
| 1321 __ j(zero, &miss, not_taken); |
| 1322 |
| 1323 // Check that the receiver is a valid JS object. |
| 1324 __ CmpObjectType(edx, FIRST_JS_OBJECT_TYPE, eax); |
| 1325 __ j(below, &miss, not_taken); |
| 1326 |
| 1327 // Check that the value is a JavaScript function. |
| 1328 __ test(edi, Immediate(kSmiTagMask)); |
| 1329 __ j(zero, &miss, not_taken); |
| 1330 __ CmpObjectType(edi, JS_FUNCTION_TYPE, eax); |
| 1331 __ j(not_equal, &miss, not_taken); |
| 1332 |
| 1333 // Invoke the function. |
| 1334 ParameterCount actual(argc); |
| 1335 __ InvokeFunction(edi, actual, JUMP_FUNCTION); |
| 1336 |
| 1337 __ bind(&miss); |
| 1338 GenerateMiss(masm, argc); |
| 1339 } |
| 1340 |
| 1341 |
| 1342 void KeyedCallIC::GenerateNormal(MacroAssembler* masm, int argc) { |
| 1343 Label miss; |
| 1344 GenerateCallNormal(masm, argc, &miss); |
| 1345 __ bind(&miss); |
| 1346 GenerateMiss(masm, argc); |
| 1347 } |
| 1348 |
| 1349 |
| 1350 void KeyedCallIC::GenerateMiss(MacroAssembler* masm, int argc) { |
| 1351 GenerateCallMiss(masm, argc, IC::kKeyedCallIC_Miss); |
| 1352 } |
| 1353 |
| 1354 |
| 1264 // Defined in ic.cc. | 1355 // Defined in ic.cc. |
| 1265 Object* LoadIC_Miss(Arguments args); | 1356 Object* LoadIC_Miss(Arguments args); |
| 1266 | 1357 |
| 1267 void LoadIC::GenerateMegamorphic(MacroAssembler* masm) { | 1358 void LoadIC::GenerateMegamorphic(MacroAssembler* masm) { |
| 1268 // ----------- S t a t e ------------- | 1359 // ----------- S t a t e ------------- |
| 1269 // -- eax : receiver | 1360 // -- eax : receiver |
| 1270 // -- ecx : name | 1361 // -- ecx : name |
| 1271 // -- esp[0] : return address | 1362 // -- esp[0] : return address |
| 1272 // ----------------------------------- | 1363 // ----------------------------------- |
| 1273 | 1364 |
| (...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1617 ExternalReference ref = ExternalReference(IC_Utility(kKeyedStoreIC_Miss)); | 1708 ExternalReference ref = ExternalReference(IC_Utility(kKeyedStoreIC_Miss)); |
| 1618 __ TailCallExternalReference(ref, 3, 1); | 1709 __ TailCallExternalReference(ref, 3, 1); |
| 1619 } | 1710 } |
| 1620 | 1711 |
| 1621 #undef __ | 1712 #undef __ |
| 1622 | 1713 |
| 1623 | 1714 |
| 1624 } } // namespace v8::internal | 1715 } } // namespace v8::internal |
| 1625 | 1716 |
| 1626 #endif // V8_TARGET_ARCH_IA32 | 1717 #endif // V8_TARGET_ARCH_IA32 |
| OLD | NEW |