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 592 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
603 __ cmp(Operand(ecx), Immediate(1 << Map::kHasIndexedInterceptor)); | 603 __ cmp(Operand(ecx), Immediate(1 << Map::kHasIndexedInterceptor)); |
604 __ j(not_zero, &slow, not_taken); | 604 __ j(not_zero, &slow, not_taken); |
605 | 605 |
606 // Everything is fine, call runtime. | 606 // Everything is fine, call runtime. |
607 __ pop(ecx); | 607 __ pop(ecx); |
608 __ push(edx); // receiver | 608 __ push(edx); // receiver |
609 __ push(eax); // key | 609 __ push(eax); // key |
610 __ push(ecx); // return address | 610 __ push(ecx); // return address |
611 | 611 |
612 // Perform tail call to the entry. | 612 // Perform tail call to the entry. |
613 __ TailCallRuntime(ExternalReference( | 613 ExternalReference ref = ExternalReference( |
614 IC_Utility(kKeyedLoadPropertyWithInterceptor)), 2, 1); | 614 IC_Utility(kKeyedLoadPropertyWithInterceptor)); |
| 615 __ TailCallExternalReference(ref, 2, 1); |
615 | 616 |
616 __ bind(&slow); | 617 __ bind(&slow); |
617 GenerateMiss(masm); | 618 GenerateMiss(masm); |
618 } | 619 } |
619 | 620 |
620 | 621 |
621 void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm) { | 622 void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm) { |
622 // ----------- S t a t e ------------- | 623 // ----------- S t a t e ------------- |
623 // -- eax : value | 624 // -- eax : value |
624 // -- esp[0] : return address | 625 // -- esp[0] : return address |
(...skipping 630 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1255 // -- ecx : name | 1256 // -- ecx : name |
1256 // -- esp[0] : return address | 1257 // -- esp[0] : return address |
1257 // ----------------------------------- | 1258 // ----------------------------------- |
1258 | 1259 |
1259 __ pop(ebx); | 1260 __ pop(ebx); |
1260 __ push(eax); // receiver | 1261 __ push(eax); // receiver |
1261 __ push(ecx); // name | 1262 __ push(ecx); // name |
1262 __ push(ebx); // return address | 1263 __ push(ebx); // return address |
1263 | 1264 |
1264 // Perform tail call to the entry. | 1265 // Perform tail call to the entry. |
1265 __ TailCallRuntime(ExternalReference(IC_Utility(kLoadIC_Miss)), 2, 1); | 1266 ExternalReference ref = ExternalReference(IC_Utility(kLoadIC_Miss)); |
| 1267 __ TailCallExternalReference(ref, 2, 1); |
1266 } | 1268 } |
1267 | 1269 |
1268 | 1270 |
1269 // One byte opcode for test eax,0xXXXXXXXX. | 1271 // One byte opcode for test eax,0xXXXXXXXX. |
1270 static const byte kTestEaxByte = 0xA9; | 1272 static const byte kTestEaxByte = 0xA9; |
1271 | 1273 |
1272 | 1274 |
1273 void LoadIC::ClearInlinedVersion(Address address) { | 1275 void LoadIC::ClearInlinedVersion(Address address) { |
1274 // Reset the map check of the inlined inobject property load (if | 1276 // Reset the map check of the inlined inobject property load (if |
1275 // present) to guarantee failure by holding an invalid map (the null | 1277 // present) to guarantee failure by holding an invalid map (the null |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1370 // -- edx : receiver | 1372 // -- edx : receiver |
1371 // -- esp[0] : return address | 1373 // -- esp[0] : return address |
1372 // ----------------------------------- | 1374 // ----------------------------------- |
1373 | 1375 |
1374 __ pop(ebx); | 1376 __ pop(ebx); |
1375 __ push(edx); // receiver | 1377 __ push(edx); // receiver |
1376 __ push(eax); // name | 1378 __ push(eax); // name |
1377 __ push(ebx); // return address | 1379 __ push(ebx); // return address |
1378 | 1380 |
1379 // Perform tail call to the entry. | 1381 // Perform tail call to the entry. |
1380 __ TailCallRuntime(ExternalReference(IC_Utility(kKeyedLoadIC_Miss)), 2, 1); | 1382 ExternalReference ref = ExternalReference(IC_Utility(kKeyedLoadIC_Miss)); |
| 1383 __ TailCallExternalReference(ref, 2, 1); |
1381 } | 1384 } |
1382 | 1385 |
1383 | 1386 |
1384 void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { | 1387 void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { |
1385 // ----------- S t a t e ------------- | 1388 // ----------- S t a t e ------------- |
1386 // -- eax : key | 1389 // -- eax : key |
1387 // -- edx : receiver | 1390 // -- edx : receiver |
1388 // -- esp[0] : return address | 1391 // -- esp[0] : return address |
1389 // ----------------------------------- | 1392 // ----------------------------------- |
1390 | 1393 |
1391 __ pop(ebx); | 1394 __ pop(ebx); |
1392 __ push(edx); // receiver | 1395 __ push(edx); // receiver |
1393 __ push(eax); // name | 1396 __ push(eax); // name |
1394 __ push(ebx); // return address | 1397 __ push(ebx); // return address |
1395 | 1398 |
1396 // Perform tail call to the entry. | 1399 // Perform tail call to the entry. |
1397 __ TailCallRuntime(ExternalReference(Runtime::kKeyedGetProperty), 2, 1); | 1400 __ TailCallRuntime(Runtime::kKeyedGetProperty, 2, 1); |
1398 } | 1401 } |
1399 | 1402 |
1400 | 1403 |
1401 void StoreIC::GenerateMegamorphic(MacroAssembler* masm) { | 1404 void StoreIC::GenerateMegamorphic(MacroAssembler* masm) { |
1402 // ----------- S t a t e ------------- | 1405 // ----------- S t a t e ------------- |
1403 // -- eax : value | 1406 // -- eax : value |
1404 // -- ecx : name | 1407 // -- ecx : name |
1405 // -- edx : receiver | 1408 // -- edx : receiver |
1406 // -- esp[0] : return address | 1409 // -- esp[0] : return address |
1407 // ----------------------------------- | 1410 // ----------------------------------- |
(...skipping 16 matching lines...) Expand all Loading... |
1424 // -- esp[0] : return address | 1427 // -- esp[0] : return address |
1425 // ----------------------------------- | 1428 // ----------------------------------- |
1426 | 1429 |
1427 __ pop(ebx); | 1430 __ pop(ebx); |
1428 __ push(edx); | 1431 __ push(edx); |
1429 __ push(ecx); | 1432 __ push(ecx); |
1430 __ push(eax); | 1433 __ push(eax); |
1431 __ push(ebx); | 1434 __ push(ebx); |
1432 | 1435 |
1433 // Perform tail call to the entry. | 1436 // Perform tail call to the entry. |
1434 __ TailCallRuntime(ExternalReference(IC_Utility(kStoreIC_Miss)), 3, 1); | 1437 ExternalReference ref = ExternalReference(IC_Utility(kStoreIC_Miss)); |
| 1438 __ TailCallExternalReference(ref, 3, 1); |
1435 } | 1439 } |
1436 | 1440 |
1437 | 1441 |
1438 void StoreIC::GenerateArrayLength(MacroAssembler* masm) { | 1442 void StoreIC::GenerateArrayLength(MacroAssembler* masm) { |
1439 // ----------- S t a t e ------------- | 1443 // ----------- S t a t e ------------- |
1440 // -- eax : value | 1444 // -- eax : value |
1441 // -- ecx : name | 1445 // -- ecx : name |
1442 // -- edx : receiver | 1446 // -- edx : receiver |
1443 // -- esp[0] : return address | 1447 // -- esp[0] : return address |
1444 // ----------------------------------- | 1448 // ----------------------------------- |
(...skipping 26 matching lines...) Expand all Loading... |
1471 // Check that value is a smi. | 1475 // Check that value is a smi. |
1472 __ test(value, Immediate(kSmiTagMask)); | 1476 __ test(value, Immediate(kSmiTagMask)); |
1473 __ j(not_zero, &miss, not_taken); | 1477 __ j(not_zero, &miss, not_taken); |
1474 | 1478 |
1475 // Prepare tail call to StoreIC_ArrayLength. | 1479 // Prepare tail call to StoreIC_ArrayLength. |
1476 __ pop(scratch); | 1480 __ pop(scratch); |
1477 __ push(receiver); | 1481 __ push(receiver); |
1478 __ push(value); | 1482 __ push(value); |
1479 __ push(scratch); // return address | 1483 __ push(scratch); // return address |
1480 | 1484 |
1481 __ TailCallRuntime(ExternalReference(IC_Utility(kStoreIC_ArrayLength)), 2, 1); | 1485 ExternalReference ref = ExternalReference(IC_Utility(kStoreIC_ArrayLength)); |
| 1486 __ TailCallExternalReference(ref, 2, 1); |
1482 | 1487 |
1483 __ bind(&miss); | 1488 __ bind(&miss); |
1484 | 1489 |
1485 GenerateMiss(masm); | 1490 GenerateMiss(masm); |
1486 } | 1491 } |
1487 | 1492 |
1488 | 1493 |
1489 // Defined in ic.cc. | 1494 // Defined in ic.cc. |
1490 Object* KeyedStoreIC_Miss(Arguments args); | 1495 Object* KeyedStoreIC_Miss(Arguments args); |
1491 | 1496 |
1492 void KeyedStoreIC::GenerateRuntimeSetProperty(MacroAssembler* masm) { | 1497 void KeyedStoreIC::GenerateRuntimeSetProperty(MacroAssembler* masm) { |
1493 // ----------- S t a t e ------------- | 1498 // ----------- S t a t e ------------- |
1494 // -- eax : value | 1499 // -- eax : value |
1495 // -- esp[0] : return address | 1500 // -- esp[0] : return address |
1496 // -- esp[4] : key | 1501 // -- esp[4] : key |
1497 // -- esp[8] : receiver | 1502 // -- esp[8] : receiver |
1498 // ----------------------------------- | 1503 // ----------------------------------- |
1499 | 1504 |
1500 __ pop(ecx); | 1505 __ pop(ecx); |
1501 __ push(Operand(esp, 1 * kPointerSize)); | 1506 __ push(Operand(esp, 1 * kPointerSize)); |
1502 __ push(Operand(esp, 1 * kPointerSize)); | 1507 __ push(Operand(esp, 1 * kPointerSize)); |
1503 __ push(eax); | 1508 __ push(eax); |
1504 __ push(ecx); | 1509 __ push(ecx); |
1505 | 1510 |
1506 // Do tail-call to runtime routine. | 1511 // Do tail-call to runtime routine. |
1507 __ TailCallRuntime(ExternalReference(Runtime::kSetProperty), 3, 1); | 1512 __ TailCallRuntime(Runtime::kSetProperty, 3, 1); |
1508 } | 1513 } |
1509 | 1514 |
1510 | 1515 |
1511 void KeyedStoreIC::GenerateMiss(MacroAssembler* masm) { | 1516 void KeyedStoreIC::GenerateMiss(MacroAssembler* masm) { |
1512 // ----------- S t a t e ------------- | 1517 // ----------- S t a t e ------------- |
1513 // -- eax : value | 1518 // -- eax : value |
1514 // -- esp[0] : return address | 1519 // -- esp[0] : return address |
1515 // -- esp[4] : key | 1520 // -- esp[4] : key |
1516 // -- esp[8] : receiver | 1521 // -- esp[8] : receiver |
1517 // ----------------------------------- | 1522 // ----------------------------------- |
1518 | 1523 |
1519 __ pop(ecx); | 1524 __ pop(ecx); |
1520 __ push(Operand(esp, 1 * kPointerSize)); | 1525 __ push(Operand(esp, 1 * kPointerSize)); |
1521 __ push(Operand(esp, 1 * kPointerSize)); | 1526 __ push(Operand(esp, 1 * kPointerSize)); |
1522 __ push(eax); | 1527 __ push(eax); |
1523 __ push(ecx); | 1528 __ push(ecx); |
1524 | 1529 |
1525 // Do tail-call to runtime routine. | 1530 // Do tail-call to runtime routine. |
1526 __ TailCallRuntime(ExternalReference(IC_Utility(kKeyedStoreIC_Miss)), 3, 1); | 1531 ExternalReference ref = ExternalReference(IC_Utility(kKeyedStoreIC_Miss)); |
| 1532 __ TailCallExternalReference(ref, 3, 1); |
1527 } | 1533 } |
1528 | 1534 |
1529 #undef __ | 1535 #undef __ |
1530 | 1536 |
1531 | 1537 |
1532 } } // namespace v8::internal | 1538 } } // namespace v8::internal |
OLD | NEW |