OLD | NEW |
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 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
288 __ cmp(eax, FieldOperand(ecx, PixelArray::kLengthOffset)); | 288 __ cmp(eax, FieldOperand(ecx, PixelArray::kLengthOffset)); |
289 __ j(above_equal, &slow); | 289 __ j(above_equal, &slow); |
290 __ mov(ecx, FieldOperand(ecx, PixelArray::kExternalPointerOffset)); | 290 __ mov(ecx, FieldOperand(ecx, PixelArray::kExternalPointerOffset)); |
291 __ movzx_b(eax, Operand(ecx, eax, times_1, 0)); | 291 __ movzx_b(eax, Operand(ecx, eax, times_1, 0)); |
292 __ shl(eax, kSmiTagSize); | 292 __ shl(eax, kSmiTagSize); |
293 __ ret(0); | 293 __ ret(0); |
294 | 294 |
295 // Slow case: Load name and receiver from stack and jump to runtime. | 295 // Slow case: Load name and receiver from stack and jump to runtime. |
296 __ bind(&slow); | 296 __ bind(&slow); |
297 __ IncrementCounter(&Counters::keyed_load_generic_slow, 1); | 297 __ IncrementCounter(&Counters::keyed_load_generic_slow, 1); |
298 Generate(masm, ExternalReference(Runtime::kKeyedGetProperty)); | 298 GenerateRuntimeGetProperty(masm); |
299 | 299 |
300 __ bind(&check_string); | 300 __ bind(&check_string); |
301 // The key is not a smi. | 301 // The key is not a smi. |
302 // Is it a string? | 302 // Is it a string? |
303 __ CmpObjectType(eax, FIRST_NONSTRING_TYPE, edx); | 303 __ CmpObjectType(eax, FIRST_NONSTRING_TYPE, edx); |
304 __ j(above_equal, &slow); | 304 __ j(above_equal, &slow); |
305 // Is the string an array index, with cached numeric value? | 305 // Is the string an array index, with cached numeric value? |
306 __ mov(ebx, FieldOperand(eax, String::kHashFieldOffset)); | 306 __ mov(ebx, FieldOperand(eax, String::kHashFieldOffset)); |
307 __ test(ebx, Immediate(String::kIsArrayIndexMask)); | 307 __ test(ebx, Immediate(String::kIsArrayIndexMask)); |
308 __ j(not_zero, &index_string, not_taken); | 308 __ j(not_zero, &index_string, not_taken); |
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
579 // If we fail allocation of the HeapNumber, we still have a value on | 579 // If we fail allocation of the HeapNumber, we still have a value on |
580 // top of the FPU stack. Remove it. | 580 // top of the FPU stack. Remove it. |
581 __ bind(&failed_allocation); | 581 __ bind(&failed_allocation); |
582 __ ffree(); | 582 __ ffree(); |
583 __ fincstp(); | 583 __ fincstp(); |
584 // Fall through to slow case. | 584 // Fall through to slow case. |
585 | 585 |
586 // Slow case: Load name and receiver from stack and jump to runtime. | 586 // Slow case: Load name and receiver from stack and jump to runtime. |
587 __ bind(&slow); | 587 __ bind(&slow); |
588 __ IncrementCounter(&Counters::keyed_load_external_array_slow, 1); | 588 __ IncrementCounter(&Counters::keyed_load_external_array_slow, 1); |
589 Generate(masm, ExternalReference(Runtime::kKeyedGetProperty)); | 589 GenerateRuntimeGetProperty(masm); |
590 } | 590 } |
591 | 591 |
592 | 592 |
593 void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm) { | 593 void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm) { |
594 // ----------- S t a t e ------------- | 594 // ----------- S t a t e ------------- |
595 // -- eax : value | 595 // -- eax : value |
596 // -- esp[0] : return address | 596 // -- esp[0] : return address |
597 // -- esp[4] : key | 597 // -- esp[4] : key |
598 // -- esp[8] : receiver | 598 // -- esp[8] : receiver |
599 // ----------------------------------- | 599 // ----------------------------------- |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
638 __ mov(edx, Operand(ebx)); | 638 __ mov(edx, Operand(ebx)); |
639 __ sar(edx, kSmiTagSize); // untag the index and use it for the comparison | 639 __ sar(edx, kSmiTagSize); // untag the index and use it for the comparison |
640 __ cmp(edx, FieldOperand(ecx, Array::kLengthOffset)); | 640 __ cmp(edx, FieldOperand(ecx, Array::kLengthOffset)); |
641 // eax: value | 641 // eax: value |
642 // ecx: FixedArray | 642 // ecx: FixedArray |
643 // ebx: index (as a smi) | 643 // ebx: index (as a smi) |
644 __ j(below, &fast, taken); | 644 __ j(below, &fast, taken); |
645 | 645 |
646 // Slow case: call runtime. | 646 // Slow case: call runtime. |
647 __ bind(&slow); | 647 __ bind(&slow); |
648 Generate(masm, ExternalReference(Runtime::kSetProperty)); | 648 GenerateRuntimeSetProperty(masm); |
649 | 649 |
650 // Check whether the elements is a pixel array. | 650 // Check whether the elements is a pixel array. |
651 // eax: value | 651 // eax: value |
652 // ecx: elements array | 652 // ecx: elements array |
653 // ebx: index (as a smi) | 653 // ebx: index (as a smi) |
654 __ bind(&check_pixel_array); | 654 __ bind(&check_pixel_array); |
655 __ cmp(FieldOperand(ecx, HeapObject::kMapOffset), | 655 __ cmp(FieldOperand(ecx, HeapObject::kMapOffset), |
656 Immediate(Factory::pixel_array_map())); | 656 Immediate(Factory::pixel_array_map())); |
657 __ j(not_equal, &slow); | 657 __ j(not_equal, &slow); |
658 // Check that the value is a smi. If a conversion is needed call into the | 658 // Check that the value is a smi. If a conversion is needed call into the |
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
911 default: | 911 default: |
912 UNREACHABLE(); | 912 UNREACHABLE(); |
913 break; | 913 break; |
914 } | 914 } |
915 __ mov(eax, edx); // Return the original value. | 915 __ mov(eax, edx); // Return the original value. |
916 __ ret(0); | 916 __ ret(0); |
917 } | 917 } |
918 | 918 |
919 // Slow case: call runtime. | 919 // Slow case: call runtime. |
920 __ bind(&slow); | 920 __ bind(&slow); |
921 Generate(masm, ExternalReference(Runtime::kSetProperty)); | 921 GenerateRuntimeSetProperty(masm); |
922 } | 922 } |
923 | 923 |
924 | 924 |
925 // Defined in ic.cc. | 925 // Defined in ic.cc. |
926 Object* CallIC_Miss(Arguments args); | 926 Object* CallIC_Miss(Arguments args); |
927 | 927 |
928 void CallIC::GenerateMegamorphic(MacroAssembler* masm, int argc) { | 928 void CallIC::GenerateMegamorphic(MacroAssembler* masm, int argc) { |
929 // ----------- S t a t e ------------- | 929 // ----------- S t a t e ------------- |
930 // -- ecx : name | 930 // -- ecx : name |
931 // -- esp[0] : return address | 931 // -- esp[0] : return address |
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1157 | 1157 |
1158 __ mov(eax, Operand(esp, kPointerSize)); | 1158 __ mov(eax, Operand(esp, kPointerSize)); |
1159 | 1159 |
1160 // Probe the stub cache. | 1160 // Probe the stub cache. |
1161 Code::Flags flags = Code::ComputeFlags(Code::LOAD_IC, | 1161 Code::Flags flags = Code::ComputeFlags(Code::LOAD_IC, |
1162 NOT_IN_LOOP, | 1162 NOT_IN_LOOP, |
1163 MONOMORPHIC); | 1163 MONOMORPHIC); |
1164 StubCache::GenerateProbe(masm, flags, eax, ecx, ebx, edx); | 1164 StubCache::GenerateProbe(masm, flags, eax, ecx, ebx, edx); |
1165 | 1165 |
1166 // Cache miss: Jump to runtime. | 1166 // Cache miss: Jump to runtime. |
1167 Generate(masm, ExternalReference(IC_Utility(kLoadIC_Miss))); | 1167 GenerateMiss(masm); |
1168 } | 1168 } |
1169 | 1169 |
1170 | 1170 |
1171 void LoadIC::GenerateNormal(MacroAssembler* masm) { | 1171 void LoadIC::GenerateNormal(MacroAssembler* masm) { |
1172 // ----------- S t a t e ------------- | 1172 // ----------- S t a t e ------------- |
1173 // -- ecx : name | 1173 // -- ecx : name |
1174 // -- esp[0] : return address | 1174 // -- esp[0] : return address |
1175 // -- esp[4] : receiver | 1175 // -- esp[4] : receiver |
1176 // ----------------------------------- | 1176 // ----------------------------------- |
1177 Label miss, probe, global; | 1177 Label miss, probe, global; |
(...skipping 29 matching lines...) Expand all Loading... |
1207 __ ret(0); | 1207 __ ret(0); |
1208 | 1208 |
1209 // Global object access: Check access rights. | 1209 // Global object access: Check access rights. |
1210 __ bind(&global); | 1210 __ bind(&global); |
1211 __ CheckAccessGlobalProxy(eax, edx, &miss); | 1211 __ CheckAccessGlobalProxy(eax, edx, &miss); |
1212 __ jmp(&probe); | 1212 __ jmp(&probe); |
1213 | 1213 |
1214 // Cache miss: Restore receiver from stack and jump to runtime. | 1214 // Cache miss: Restore receiver from stack and jump to runtime. |
1215 __ bind(&miss); | 1215 __ bind(&miss); |
1216 __ mov(eax, Operand(esp, 1 * kPointerSize)); | 1216 __ mov(eax, Operand(esp, 1 * kPointerSize)); |
1217 Generate(masm, ExternalReference(IC_Utility(kLoadIC_Miss))); | 1217 GenerateMiss(masm); |
1218 } | 1218 } |
1219 | 1219 |
1220 | 1220 |
1221 void LoadIC::GenerateMiss(MacroAssembler* masm) { | 1221 void LoadIC::GenerateMiss(MacroAssembler* masm) { |
1222 // ----------- S t a t e ------------- | 1222 // ----------- S t a t e ------------- |
1223 // -- ecx : name | 1223 // -- ecx : name |
1224 // -- esp[0] : return address | 1224 // -- esp[0] : return address |
1225 // -- esp[4] : receiver | 1225 // -- esp[4] : receiver |
1226 // ----------------------------------- | 1226 // ----------------------------------- |
1227 | 1227 |
1228 Generate(masm, ExternalReference(IC_Utility(kLoadIC_Miss))); | |
1229 } | |
1230 | |
1231 | |
1232 void LoadIC::Generate(MacroAssembler* masm, const ExternalReference& f) { | |
1233 // ----------- S t a t e ------------- | |
1234 // -- ecx : name | |
1235 // -- esp[0] : return address | |
1236 // -- esp[4] : receiver | |
1237 // ----------------------------------- | |
1238 | |
1239 __ mov(eax, Operand(esp, kPointerSize)); | |
1240 __ pop(ebx); | 1228 __ pop(ebx); |
1241 __ push(eax); // receiver | 1229 __ push(Operand(esp, 0)); // receiver |
1242 __ push(ecx); // name | 1230 __ push(ecx); // name |
1243 __ push(ebx); // return address | 1231 __ push(ebx); // return address |
1244 | 1232 |
1245 // Perform tail call to the entry. | 1233 // Perform tail call to the entry. |
1246 __ TailCallRuntime(f, 2, 1); | 1234 __ TailCallRuntime(ExternalReference(IC_Utility(kLoadIC_Miss)), 2, 1); |
1247 } | 1235 } |
1248 | 1236 |
1249 | 1237 |
1250 // One byte opcode for test eax,0xXXXXXXXX. | 1238 // One byte opcode for test eax,0xXXXXXXXX. |
1251 static const byte kTestEaxByte = 0xA9; | 1239 static const byte kTestEaxByte = 0xA9; |
1252 | 1240 |
1253 | 1241 |
1254 void LoadIC::ClearInlinedVersion(Address address) { | 1242 void LoadIC::ClearInlinedVersion(Address address) { |
1255 // Reset the map check of the inlined inobject property load (if | 1243 // Reset the map check of the inlined inobject property load (if |
1256 // present) to guarantee failure by holding an invalid map (the null | 1244 // present) to guarantee failure by holding an invalid map (the null |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1345 Object* KeyedLoadIC_Miss(Arguments args); | 1333 Object* KeyedLoadIC_Miss(Arguments args); |
1346 | 1334 |
1347 | 1335 |
1348 void KeyedLoadIC::GenerateMiss(MacroAssembler* masm) { | 1336 void KeyedLoadIC::GenerateMiss(MacroAssembler* masm) { |
1349 // ----------- S t a t e ------------- | 1337 // ----------- S t a t e ------------- |
1350 // -- esp[0] : return address | 1338 // -- esp[0] : return address |
1351 // -- esp[4] : name | 1339 // -- esp[4] : name |
1352 // -- esp[8] : receiver | 1340 // -- esp[8] : receiver |
1353 // ----------------------------------- | 1341 // ----------------------------------- |
1354 | 1342 |
1355 Generate(masm, ExternalReference(IC_Utility(kKeyedLoadIC_Miss))); | 1343 __ pop(ebx); |
| 1344 __ push(Operand(esp, kPointerSize)); // receiver |
| 1345 __ push(Operand(esp, kPointerSize)); // name |
| 1346 __ push(ebx); // return address |
| 1347 |
| 1348 // Perform tail call to the entry. |
| 1349 __ TailCallRuntime(ExternalReference(IC_Utility(kKeyedLoadIC_Miss)), 2, 1); |
1356 } | 1350 } |
1357 | 1351 |
1358 | 1352 |
1359 void KeyedLoadIC::Generate(MacroAssembler* masm, const ExternalReference& f) { | 1353 void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { |
1360 // ----------- S t a t e ------------- | 1354 // ----------- S t a t e ------------- |
1361 // -- esp[0] : return address | 1355 // -- esp[0] : return address |
1362 // -- esp[4] : name | 1356 // -- esp[4] : name |
1363 // -- esp[8] : receiver | 1357 // -- esp[8] : receiver |
1364 // ----------------------------------- | 1358 // ----------------------------------- |
1365 | 1359 |
1366 __ mov(eax, Operand(esp, kPointerSize)); | |
1367 __ mov(ecx, Operand(esp, 2 * kPointerSize)); | |
1368 __ pop(ebx); | 1360 __ pop(ebx); |
1369 __ push(ecx); // receiver | 1361 __ push(Operand(esp, 1 * kPointerSize)); // receiver |
1370 __ push(eax); // name | 1362 __ push(Operand(esp, 1 * kPointerSize)); // name |
1371 __ push(ebx); // return address | 1363 __ push(ebx); // return address |
1372 | 1364 |
1373 // Perform tail call to the entry. | 1365 // Perform tail call to the entry. |
1374 __ TailCallRuntime(f, 2, 1); | 1366 __ TailCallRuntime(ExternalReference(Runtime::kKeyedGetProperty), 2, 1); |
1375 } | 1367 } |
1376 | 1368 |
1377 | 1369 |
1378 void StoreIC::GenerateMegamorphic(MacroAssembler* masm) { | 1370 void StoreIC::GenerateMegamorphic(MacroAssembler* masm) { |
1379 // ----------- S t a t e ------------- | 1371 // ----------- S t a t e ------------- |
1380 // -- eax : value | 1372 // -- eax : value |
1381 // -- ecx : name | 1373 // -- ecx : name |
1382 // -- edx : receiver | 1374 // -- edx : receiver |
1383 // -- esp[0] : return address | 1375 // -- esp[0] : return address |
1384 // ----------------------------------- | 1376 // ----------------------------------- |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1428 __ push(ebx); | 1420 __ push(ebx); |
1429 | 1421 |
1430 // Perform tail call to the entry. | 1422 // Perform tail call to the entry. |
1431 __ TailCallRuntime(ExternalReference(IC_Utility(kStoreIC_Miss)), 3, 1); | 1423 __ TailCallRuntime(ExternalReference(IC_Utility(kStoreIC_Miss)), 3, 1); |
1432 } | 1424 } |
1433 | 1425 |
1434 | 1426 |
1435 // Defined in ic.cc. | 1427 // Defined in ic.cc. |
1436 Object* KeyedStoreIC_Miss(Arguments args); | 1428 Object* KeyedStoreIC_Miss(Arguments args); |
1437 | 1429 |
1438 void KeyedStoreIC::Generate(MacroAssembler* masm, const ExternalReference& f) { | 1430 void KeyedStoreIC::GenerateRuntimeSetProperty(MacroAssembler* masm) { |
1439 // ----------- S t a t e ------------- | 1431 // ----------- S t a t e ------------- |
1440 // -- eax : value | 1432 // -- eax : value |
1441 // -- esp[0] : return address | 1433 // -- esp[0] : return address |
1442 // -- esp[4] : key | 1434 // -- esp[4] : key |
1443 // -- esp[8] : receiver | 1435 // -- esp[8] : receiver |
1444 // ----------------------------------- | 1436 // ----------------------------------- |
1445 | 1437 |
1446 __ pop(ecx); | 1438 __ pop(ecx); |
1447 __ push(Operand(esp, 1 * kPointerSize)); | 1439 __ push(Operand(esp, 1 * kPointerSize)); |
1448 __ push(Operand(esp, 1 * kPointerSize)); | 1440 __ push(Operand(esp, 1 * kPointerSize)); |
1449 __ push(eax); | 1441 __ push(eax); |
1450 __ push(ecx); | 1442 __ push(ecx); |
1451 | 1443 |
1452 // Do tail-call to runtime routine. | 1444 // Do tail-call to runtime routine. |
1453 __ TailCallRuntime(f, 3, 1); | 1445 __ TailCallRuntime(ExternalReference(Runtime::kSetProperty), 3, 1); |
| 1446 } |
| 1447 |
| 1448 |
| 1449 void KeyedStoreIC::GenerateMiss(MacroAssembler* masm) { |
| 1450 // ----------- S t a t e ------------- |
| 1451 // -- eax : value |
| 1452 // -- esp[0] : return address |
| 1453 // -- esp[4] : key |
| 1454 // -- esp[8] : receiver |
| 1455 // ----------------------------------- |
| 1456 |
| 1457 __ pop(ecx); |
| 1458 __ push(Operand(esp, 1 * kPointerSize)); |
| 1459 __ push(Operand(esp, 1 * kPointerSize)); |
| 1460 __ push(eax); |
| 1461 __ push(ecx); |
| 1462 |
| 1463 // Do tail-call to runtime routine. |
| 1464 __ TailCallRuntime(ExternalReference(IC_Utility(kKeyedStoreIC_Miss)), 3, 1); |
1454 } | 1465 } |
1455 | 1466 |
1456 | 1467 |
1457 void KeyedStoreIC::GenerateExtendStorage(MacroAssembler* masm) { | 1468 void KeyedStoreIC::GenerateExtendStorage(MacroAssembler* masm) { |
1458 // ----------- S t a t e ------------- | 1469 // ----------- S t a t e ------------- |
1459 // -- eax : value | 1470 // -- eax : value |
1460 // -- ecx : transition map | 1471 // -- ecx : transition map |
1461 // -- esp[0] : return address | 1472 // -- esp[0] : return address |
1462 // -- esp[4] : key | 1473 // -- esp[4] : key |
1463 // -- esp[8] : receiver | 1474 // -- esp[8] : receiver |
1464 // ----------------------------------- | 1475 // ----------------------------------- |
1465 | 1476 |
1466 __ pop(ebx); | 1477 __ pop(ebx); |
1467 __ push(Operand(esp, 1 * kPointerSize)); | 1478 __ push(Operand(esp, 1 * kPointerSize)); |
1468 __ push(ecx); | 1479 __ push(ecx); |
1469 __ push(eax); | 1480 __ push(eax); |
1470 __ push(ebx); | 1481 __ push(ebx); |
1471 | 1482 |
1472 // Do tail-call to runtime routine. | 1483 // Do tail-call to runtime routine. |
1473 __ TailCallRuntime( | 1484 __ TailCallRuntime( |
1474 ExternalReference(IC_Utility(kSharedStoreIC_ExtendStorage)), 3, 1); | 1485 ExternalReference(IC_Utility(kSharedStoreIC_ExtendStorage)), 3, 1); |
1475 } | 1486 } |
1476 | 1487 |
1477 #undef __ | 1488 #undef __ |
1478 | 1489 |
1479 | 1490 |
1480 } } // namespace v8::internal | 1491 } } // namespace v8::internal |
OLD | NEW |