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

Side by Side Diff: runtime/vm/stub_code_ia32.cc

Issue 735543003: Range feedback for binary integer operations. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: ready for review Created 6 years 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
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/globals.h" 5 #include "vm/globals.h"
6 #if defined(TARGET_ARCH_IA32) 6 #if defined(TARGET_ARCH_IA32)
7 7
8 #include "vm/assembler.h" 8 #include "vm/assembler.h"
9 #include "vm/compiler.h" 9 #include "vm/compiler.h"
10 #include "vm/dart_entry.h" 10 #include "vm/dart_entry.h"
(...skipping 1190 matching lines...) Expand 10 before | Expand all | Expand 10 after
1201 case Token::kADD: { 1201 case Token::kADD: {
1202 __ addl(EAX, EDI); 1202 __ addl(EAX, EDI);
1203 __ j(OVERFLOW, not_smi_or_overflow, Assembler::kNearJump); 1203 __ j(OVERFLOW, not_smi_or_overflow, Assembler::kNearJump);
1204 break; 1204 break;
1205 } 1205 }
1206 case Token::kSUB: { 1206 case Token::kSUB: {
1207 __ subl(EAX, EDI); 1207 __ subl(EAX, EDI);
1208 __ j(OVERFLOW, not_smi_or_overflow, Assembler::kNearJump); 1208 __ j(OVERFLOW, not_smi_or_overflow, Assembler::kNearJump);
1209 break; 1209 break;
1210 } 1210 }
1211 case Token::kMUL: {
1212 __ SmiUntag(EAX);
1213 __ imull(EAX, EDI);
1214 __ j(OVERFLOW, not_smi_or_overflow, Assembler::kNearJump);
1215 break;
1216 }
1211 case Token::kEQ: { 1217 case Token::kEQ: {
1212 Label done, is_true; 1218 Label done, is_true;
1213 __ cmpl(EAX, EDI); 1219 __ cmpl(EAX, EDI);
1214 __ j(EQUAL, &is_true, Assembler::kNearJump); 1220 __ j(EQUAL, &is_true, Assembler::kNearJump);
1215 __ LoadObject(EAX, Bool::False()); 1221 __ LoadObject(EAX, Bool::False());
1216 __ jmp(&done, Assembler::kNearJump); 1222 __ jmp(&done, Assembler::kNearJump);
1217 __ Bind(&is_true); 1223 __ Bind(&is_true);
1218 __ LoadObject(EAX, Bool::True()); 1224 __ LoadObject(EAX, Bool::True());
1219 __ Bind(&done); 1225 __ Bind(&done);
1220 break; 1226 break;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1258 // - If receiver is null -> jump to IC miss. 1264 // - If receiver is null -> jump to IC miss.
1259 // - If receiver is Smi -> load Smi class. 1265 // - If receiver is Smi -> load Smi class.
1260 // - If receiver is not-Smi -> load receiver's class. 1266 // - If receiver is not-Smi -> load receiver's class.
1261 // - Check if 'num_args' (including receiver) match any IC data group. 1267 // - Check if 'num_args' (including receiver) match any IC data group.
1262 // - Match found -> jump to target. 1268 // - Match found -> jump to target.
1263 // - Match not found -> jump to IC miss. 1269 // - Match not found -> jump to IC miss.
1264 void StubCode::GenerateNArgsCheckInlineCacheStub( 1270 void StubCode::GenerateNArgsCheckInlineCacheStub(
1265 Assembler* assembler, 1271 Assembler* assembler,
1266 intptr_t num_args, 1272 intptr_t num_args,
1267 const RuntimeEntry& handle_ic_miss, 1273 const RuntimeEntry& handle_ic_miss,
1268 Token::Kind kind) { 1274 Token::Kind kind,
1275 RangeCollectionMode range_collection_mode) {
1269 ASSERT(num_args > 0); 1276 ASSERT(num_args > 0);
1270 #if defined(DEBUG) 1277 #if defined(DEBUG)
1271 { Label ok; 1278 { Label ok;
1272 // Check that the IC data array has NumArgsTested() == num_args. 1279 // Check that the IC data array has NumArgsTested() == num_args.
1273 // 'NumArgsTested' is stored in the least significant bits of 'state_bits'. 1280 // 'NumArgsTested' is stored in the least significant bits of 'state_bits'.
1274 __ movl(EBX, FieldAddress(ECX, ICData::state_bits_offset())); 1281 __ movl(EBX, FieldAddress(ECX, ICData::state_bits_offset()));
1275 ASSERT(ICData::NumArgsTestedShift() == 0); // No shift needed. 1282 ASSERT(ICData::NumArgsTestedShift() == 0); // No shift needed.
1276 __ andl(EBX, Immediate(ICData::NumArgsTestedMask())); 1283 __ andl(EBX, Immediate(ICData::NumArgsTestedMask()));
1277 __ cmpl(EBX, Immediate(num_args)); 1284 __ cmpl(EBX, Immediate(num_args));
1278 __ j(EQUAL, &ok, Assembler::kNearJump); 1285 __ j(EQUAL, &ok, Assembler::kNearJump);
1286 __ int3();
Florian Schneider 2014/12/12 12:12:40 Redundant int3?
Vyacheslav Egorov (Google) 2014/12/12 14:49:14 Done.
1279 __ Stop("Incorrect stub for IC data"); 1287 __ Stop("Incorrect stub for IC data");
1280 __ Bind(&ok); 1288 __ Bind(&ok);
1281 } 1289 }
1282 #endif // DEBUG 1290 #endif // DEBUG
1283 1291
1284 // Check single stepping. 1292 // Check single stepping.
1285 Label stepping, done_stepping; 1293 Label stepping, done_stepping;
1286 uword single_step_address = reinterpret_cast<uword>(Isolate::Current()) + 1294 uword single_step_address = reinterpret_cast<uword>(Isolate::Current()) +
1287 Isolate::single_step_offset(); 1295 Isolate::single_step_offset();
1288 __ cmpb(Address::Absolute(single_step_address), Immediate(0)); 1296 __ cmpb(Address::Absolute(single_step_address), Immediate(0));
1289 __ j(NOT_EQUAL, &stepping); 1297 __ j(NOT_EQUAL, &stepping);
1290 __ Bind(&done_stepping); 1298 __ Bind(&done_stepping);
1291 1299
1300 Label not_smi_or_overflow;
1301 if (range_collection_mode == kCollectRanges) {
1302 ASSERT((num_args == 1) || (num_args == 2));
1303 if (num_args == 2) {
1304 __ movl(EAX, Address(ESP, + 2 * kWordSize));
1305 __ UpdateRangeFeedback(EAX, 0, ECX, EBX, EDI, ESI, &not_smi_or_overflow);
1306 }
1307
1308 __ movl(EAX, Address(ESP, + 1 * kWordSize));
1309 __ UpdateRangeFeedback(EAX, (num_args - 1), ECX, EBX, EDI, ESI,
1310 &not_smi_or_overflow);
1311 }
1292 if (kind != Token::kILLEGAL) { 1312 if (kind != Token::kILLEGAL) {
1293 Label not_smi_or_overflow;
1294 EmitFastSmiOp(assembler, kind, num_args, &not_smi_or_overflow); 1313 EmitFastSmiOp(assembler, kind, num_args, &not_smi_or_overflow);
1295 __ Bind(&not_smi_or_overflow);
1296 } 1314 }
1315 __ Bind(&not_smi_or_overflow);
1297 1316
1298 // ECX: IC data object (preserved). 1317 // ECX: IC data object (preserved).
1299 // Load arguments descriptor into EDX. 1318 // Load arguments descriptor into EDX.
1300 __ movl(EDX, FieldAddress(ECX, ICData::arguments_descriptor_offset())); 1319 __ movl(EDX, FieldAddress(ECX, ICData::arguments_descriptor_offset()));
1301 // Loop that checks if there is an IC data match. 1320 // Loop that checks if there is an IC data match.
1302 Label loop, update, test, found; 1321 Label loop, update, test, found;
1303 // ECX: IC data object (preserved). 1322 // ECX: IC data object (preserved).
1304 __ movl(EBX, FieldAddress(ECX, ICData::ic_data_offset())); 1323 __ movl(EBX, FieldAddress(ECX, ICData::ic_data_offset()));
1305 // EBX: ic_data_array with check entries: classes and target functions. 1324 // EBX: ic_data_array with check entries: classes and target functions.
1306 __ leal(EBX, FieldAddress(EBX, Array::data_offset())); 1325 __ leal(EBX, FieldAddress(EBX, Array::data_offset()));
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
1393 __ addl(EAX, Immediate(Smi::RawValue(1))); 1412 __ addl(EAX, Immediate(Smi::RawValue(1)));
1394 __ movl(EDI, Immediate(Smi::RawValue(Smi::kMaxValue))); 1413 __ movl(EDI, Immediate(Smi::RawValue(Smi::kMaxValue)));
1395 __ cmovno(EDI, EAX); 1414 __ cmovno(EDI, EAX);
1396 __ StoreIntoSmiField(Address(EBX, count_offset), EDI); 1415 __ StoreIntoSmiField(Address(EBX, count_offset), EDI);
1397 1416
1398 __ movl(EAX, Address(EBX, target_offset)); 1417 __ movl(EAX, Address(EBX, target_offset));
1399 __ Bind(&call_target_function); 1418 __ Bind(&call_target_function);
1400 // EAX: Target function. 1419 // EAX: Target function.
1401 __ movl(EBX, FieldAddress(EAX, Function::instructions_offset())); 1420 __ movl(EBX, FieldAddress(EAX, Function::instructions_offset()));
1402 __ addl(EBX, Immediate(Instructions::HeaderSize() - kHeapObjectTag)); 1421 __ addl(EBX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
1403 __ jmp(EBX); 1422 if (range_collection_mode == kCollectRanges) {
1404 __ int3(); 1423 __ movl(EDI, Address(ESP, + 1 * kWordSize));
1424 if (num_args == 2) {
1425 __ movl(ESI, Address(ESP, + 2 * kWordSize));
1426 }
1427 __ EnterStubFrame();
1428 __ pushl(ECX);
1429 if (num_args == 2) {
1430 __ pushl(ESI);
1431 }
1432 __ pushl(EDI);
1433 __ call(EBX);
1434
1435 __ movl(ECX, Address(EBP, kFirstLocalSlotFromFp * kWordSize));
1436 Label done;
1437 __ UpdateRangeFeedback(EAX, 2, ECX, EBX, EDI, ESI, &done);
1438 __ Bind(&done);
1439 __ LeaveFrame();
1440 __ ret();
1441 } else {
1442 __ jmp(EBX);
1443 __ int3();
Florian Schneider 2014/12/12 12:12:40 Redundant int3.
Vyacheslav Egorov (Google) 2014/12/12 14:49:14 Done.
1444 }
1405 1445
1406 __ Bind(&stepping); 1446 __ Bind(&stepping);
1407 __ EnterStubFrame(); 1447 __ EnterStubFrame();
1408 __ pushl(ECX); 1448 __ pushl(ECX);
1409 __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0); 1449 __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
1410 __ popl(ECX); 1450 __ popl(ECX);
1411 __ LeaveFrame(); 1451 __ LeaveFrame();
1412 __ jmp(&done_stepping); 1452 __ jmp(&done_stepping);
1413 } 1453 }
1414 1454
1415 1455
1416 // Use inline cache data array to invoke the target or continue in inline 1456 // Use inline cache data array to invoke the target or continue in inline
1417 // cache miss handler. Stub for 1-argument check (receiver class). 1457 // cache miss handler. Stub for 1-argument check (receiver class).
1418 // ECX: Inline cache data object. 1458 // ECX: Inline cache data object.
1419 // TOS(0): Return address. 1459 // TOS(0): Return address.
1420 // Inline cache data object structure: 1460 // Inline cache data object structure:
1421 // 0: function-name 1461 // 0: function-name
1422 // 1: N, number of arguments checked. 1462 // 1: N, number of arguments checked.
1423 // 2 .. (length - 1): group of checks, each check containing: 1463 // 2 .. (length - 1): group of checks, each check containing:
1424 // - N classes. 1464 // - N classes.
1425 // - 1 target function. 1465 // - 1 target function.
1426 void StubCode::GenerateOneArgCheckInlineCacheStub(Assembler* assembler) { 1466 void StubCode::GenerateOneArgCheckInlineCacheStub(Assembler* assembler) {
1427 GenerateUsageCounterIncrement(assembler, EBX); 1467 GenerateUsageCounterIncrement(assembler, EBX);
1428 GenerateNArgsCheckInlineCacheStub(assembler, 1, 1468 GenerateNArgsCheckInlineCacheStub(assembler, 1,
1429 kInlineCacheMissHandlerOneArgRuntimeEntry, Token::kILLEGAL); 1469 kInlineCacheMissHandlerOneArgRuntimeEntry,
1470 Token::kILLEGAL,
1471 kIgnoreRanges);
1430 } 1472 }
1431 1473
1432 1474
1433 void StubCode::GenerateTwoArgsCheckInlineCacheStub(Assembler* assembler) { 1475 void StubCode::GenerateTwoArgsCheckInlineCacheStub(Assembler* assembler) {
1434 GenerateUsageCounterIncrement(assembler, EBX); 1476 GenerateUsageCounterIncrement(assembler, EBX);
1435 GenerateNArgsCheckInlineCacheStub(assembler, 2, 1477 GenerateNArgsCheckInlineCacheStub(assembler, 2,
1436 kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL); 1478 kInlineCacheMissHandlerTwoArgsRuntimeEntry,
1479 Token::kILLEGAL,
1480 kIgnoreRanges);
1437 } 1481 }
1438 1482
1439 1483
1440 void StubCode::GenerateThreeArgsCheckInlineCacheStub(Assembler* assembler) { 1484 void StubCode::GenerateThreeArgsCheckInlineCacheStub(Assembler* assembler) {
1441 GenerateUsageCounterIncrement(assembler, EBX); 1485 GenerateUsageCounterIncrement(assembler, EBX);
1442 GenerateNArgsCheckInlineCacheStub(assembler, 3, 1486 GenerateNArgsCheckInlineCacheStub(assembler, 3,
1443 kInlineCacheMissHandlerThreeArgsRuntimeEntry, Token::kILLEGAL); 1487 kInlineCacheMissHandlerThreeArgsRuntimeEntry,
1488 Token::kILLEGAL,
1489 kIgnoreRanges);
1444 } 1490 }
1445 1491
1446 1492
1447 void StubCode::GenerateSmiAddInlineCacheStub(Assembler* assembler) { 1493 void StubCode::GenerateSmiAddInlineCacheStub(Assembler* assembler) {
1448 GenerateUsageCounterIncrement(assembler, EBX); 1494 GenerateUsageCounterIncrement(assembler, EBX);
1449 GenerateNArgsCheckInlineCacheStub(assembler, 2, 1495 GenerateNArgsCheckInlineCacheStub(assembler, 2,
1450 kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kADD); 1496 kInlineCacheMissHandlerTwoArgsRuntimeEntry,
1497 Token::kADD,
1498 kCollectRanges);
1451 } 1499 }
1452 1500
1453 1501
1454 void StubCode::GenerateSmiSubInlineCacheStub(Assembler* assembler) { 1502 void StubCode::GenerateSmiSubInlineCacheStub(Assembler* assembler) {
1455 GenerateUsageCounterIncrement(assembler, EBX); 1503 GenerateUsageCounterIncrement(assembler, EBX);
1456 GenerateNArgsCheckInlineCacheStub(assembler, 2, 1504 GenerateNArgsCheckInlineCacheStub(assembler, 2,
1457 kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kSUB); 1505 kInlineCacheMissHandlerTwoArgsRuntimeEntry,
1506 Token::kSUB,
1507 kCollectRanges);
1458 } 1508 }
1459 1509
1460 1510
1461 void StubCode::GenerateSmiEqualInlineCacheStub(Assembler* assembler) { 1511 void StubCode::GenerateSmiEqualInlineCacheStub(Assembler* assembler) {
1462 GenerateUsageCounterIncrement(assembler, EBX); 1512 GenerateUsageCounterIncrement(assembler, EBX);
1463 GenerateNArgsCheckInlineCacheStub(assembler, 2, 1513 GenerateNArgsCheckInlineCacheStub(assembler, 2,
1464 kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kEQ); 1514 kInlineCacheMissHandlerTwoArgsRuntimeEntry,
1515 Token::kEQ,
1516 kIgnoreRanges);
1465 } 1517 }
1466 1518
1467 1519
1520 void StubCode::GenerateUnaryRangeCollectingInlineCacheStub(
1521 Assembler* assembler) {
1522 GenerateUsageCounterIncrement(assembler, EBX);
1523 GenerateNArgsCheckInlineCacheStub(assembler, 1,
1524 kInlineCacheMissHandlerOneArgRuntimeEntry,
1525 Token::kILLEGAL,
1526 kCollectRanges);
1527 }
1528
1529
1530 void StubCode::GenerateBinaryRangeCollectingInlineCacheStub(
1531 Assembler* assembler) {
1532 GenerateUsageCounterIncrement(assembler, EBX);
1533 GenerateNArgsCheckInlineCacheStub(assembler, 2,
1534 kInlineCacheMissHandlerTwoArgsRuntimeEntry,
1535 Token::kILLEGAL,
1536 kCollectRanges);
1537 }
1538
1539
1468 // Use inline cache data array to invoke the target or continue in inline 1540 // Use inline cache data array to invoke the target or continue in inline
1469 // cache miss handler. Stub for 1-argument check (receiver class). 1541 // cache miss handler. Stub for 1-argument check (receiver class).
1470 // EDI: function which counter needs to be incremented. 1542 // EDI: function which counter needs to be incremented.
1471 // ECX: Inline cache data object. 1543 // ECX: Inline cache data object.
1472 // TOS(0): Return address. 1544 // TOS(0): Return address.
1473 // Inline cache data object structure: 1545 // Inline cache data object structure:
1474 // 0: function-name 1546 // 0: function-name
1475 // 1: N, number of arguments checked. 1547 // 1: N, number of arguments checked.
1476 // 2 .. (length - 1): group of checks, each check containing: 1548 // 2 .. (length - 1): group of checks, each check containing:
1477 // - N classes. 1549 // - N classes.
1478 // - 1 target function. 1550 // - 1 target function.
1479 void StubCode::GenerateOneArgOptimizedCheckInlineCacheStub( 1551 void StubCode::GenerateOneArgOptimizedCheckInlineCacheStub(
1480 Assembler* assembler) { 1552 Assembler* assembler) {
1481 GenerateOptimizedUsageCounterIncrement(assembler); 1553 GenerateOptimizedUsageCounterIncrement(assembler);
1482 GenerateNArgsCheckInlineCacheStub(assembler, 1, 1554 GenerateNArgsCheckInlineCacheStub(assembler, 1,
1483 kInlineCacheMissHandlerOneArgRuntimeEntry, Token::kILLEGAL); 1555 kInlineCacheMissHandlerOneArgRuntimeEntry,
1556 Token::kILLEGAL,
1557 kIgnoreRanges);
1484 } 1558 }
1485 1559
1486 1560
1487 void StubCode::GenerateTwoArgsOptimizedCheckInlineCacheStub( 1561 void StubCode::GenerateTwoArgsOptimizedCheckInlineCacheStub(
1488 Assembler* assembler) { 1562 Assembler* assembler) {
1489 GenerateOptimizedUsageCounterIncrement(assembler); 1563 GenerateOptimizedUsageCounterIncrement(assembler);
1490 GenerateNArgsCheckInlineCacheStub(assembler, 2, 1564 GenerateNArgsCheckInlineCacheStub(assembler, 2,
1491 kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL); 1565 kInlineCacheMissHandlerTwoArgsRuntimeEntry,
1566 Token::kILLEGAL,
1567 kIgnoreRanges);
1492 } 1568 }
1493 1569
1494 1570
1495 void StubCode::GenerateThreeArgsOptimizedCheckInlineCacheStub( 1571 void StubCode::GenerateThreeArgsOptimizedCheckInlineCacheStub(
1496 Assembler* assembler) { 1572 Assembler* assembler) {
1497 GenerateOptimizedUsageCounterIncrement(assembler); 1573 GenerateOptimizedUsageCounterIncrement(assembler);
1498 GenerateNArgsCheckInlineCacheStub(assembler, 3, 1574 GenerateNArgsCheckInlineCacheStub(assembler, 3,
1499 kInlineCacheMissHandlerThreeArgsRuntimeEntry, Token::kILLEGAL); 1575 kInlineCacheMissHandlerThreeArgsRuntimeEntry,
1576 Token::kILLEGAL,
1577 kIgnoreRanges);
1500 } 1578 }
1501 1579
1502 1580
1503 // Intermediary stub between a static call and its target. ICData contains 1581 // Intermediary stub between a static call and its target. ICData contains
1504 // the target function and the call count. 1582 // the target function and the call count.
1505 // ECX: ICData 1583 // ECX: ICData
1506 void StubCode::GenerateZeroArgsUnoptimizedStaticCallStub(Assembler* assembler) { 1584 void StubCode::GenerateZeroArgsUnoptimizedStaticCallStub(Assembler* assembler) {
1507 GenerateUsageCounterIncrement(assembler, EBX); 1585 GenerateUsageCounterIncrement(assembler, EBX);
1508 1586
1509 #if defined(DEBUG) 1587 #if defined(DEBUG)
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1559 __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0); 1637 __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
1560 __ popl(ECX); 1638 __ popl(ECX);
1561 __ LeaveFrame(); 1639 __ LeaveFrame();
1562 __ jmp(&done_stepping, Assembler::kNearJump); 1640 __ jmp(&done_stepping, Assembler::kNearJump);
1563 } 1641 }
1564 1642
1565 1643
1566 void StubCode::GenerateOneArgUnoptimizedStaticCallStub(Assembler* assembler) { 1644 void StubCode::GenerateOneArgUnoptimizedStaticCallStub(Assembler* assembler) {
1567 GenerateUsageCounterIncrement(assembler, EBX); 1645 GenerateUsageCounterIncrement(assembler, EBX);
1568 GenerateNArgsCheckInlineCacheStub( 1646 GenerateNArgsCheckInlineCacheStub(
1569 assembler, 1, kStaticCallMissHandlerOneArgRuntimeEntry, Token::kILLEGAL); 1647 assembler, 1, kStaticCallMissHandlerOneArgRuntimeEntry,
1648 Token::kILLEGAL,
1649 kIgnoreRanges);
1570 } 1650 }
1571 1651
1572 1652
1573 void StubCode::GenerateTwoArgsUnoptimizedStaticCallStub(Assembler* assembler) { 1653 void StubCode::GenerateTwoArgsUnoptimizedStaticCallStub(Assembler* assembler) {
1574 GenerateUsageCounterIncrement(assembler, EBX); 1654 GenerateUsageCounterIncrement(assembler, EBX);
1575 GenerateNArgsCheckInlineCacheStub(assembler, 2, 1655 GenerateNArgsCheckInlineCacheStub(assembler, 2,
1576 kStaticCallMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL); 1656 kStaticCallMissHandlerTwoArgsRuntimeEntry,
1657 Token::kILLEGAL,
1658 kIgnoreRanges);
1577 } 1659 }
1578 1660
1579 1661
1580 // Stub for compiling a function and jumping to the compiled code. 1662 // Stub for compiling a function and jumping to the compiled code.
1581 // ECX: IC-Data (for methods). 1663 // ECX: IC-Data (for methods).
1582 // EDX: Arguments descriptor. 1664 // EDX: Arguments descriptor.
1583 // EAX: Function. 1665 // EAX: Function.
1584 void StubCode::GenerateLazyCompileStub(Assembler* assembler) { 1666 void StubCode::GenerateLazyCompileStub(Assembler* assembler) {
1585 __ EnterStubFrame(); 1667 __ EnterStubFrame();
1586 __ pushl(EDX); // Preserve arguments descriptor array. 1668 __ pushl(EDX); // Preserve arguments descriptor array.
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after
1952 const Register temp = ECX; 2034 const Register temp = ECX;
1953 __ movl(left, Address(ESP, 2 * kWordSize)); 2035 __ movl(left, Address(ESP, 2 * kWordSize));
1954 __ movl(right, Address(ESP, 1 * kWordSize)); 2036 __ movl(right, Address(ESP, 1 * kWordSize));
1955 GenerateIdenticalWithNumberCheckStub(assembler, left, right, temp); 2037 GenerateIdenticalWithNumberCheckStub(assembler, left, right, temp);
1956 __ ret(); 2038 __ ret();
1957 } 2039 }
1958 2040
1959 } // namespace dart 2041 } // namespace dart
1960 2042
1961 #endif // defined TARGET_ARCH_IA32 2043 #endif // defined TARGET_ARCH_IA32
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698