OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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, ¬_smi_or_overflow); | |
1306 } | |
1307 | |
1308 __ movl(EAX, Address(ESP, + 1 * kWordSize)); | |
1309 __ UpdateRangeFeedback(EAX, (num_args - 1), ECX, EBX, EDI, ESI, | |
1310 ¬_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, ¬_smi_or_overflow); | 1313 EmitFastSmiOp(assembler, kind, num_args, ¬_smi_or_overflow); |
1295 __ Bind(¬_smi_or_overflow); | |
1296 } | 1314 } |
1315 __ Bind(¬_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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |