| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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_ARM64) | 6 #if defined(TARGET_ARCH_ARM64) |
| 7 | 7 |
| 8 #include "vm/assembler.h" | 8 #include "vm/assembler.h" |
| 9 #include "vm/code_generator.h" | 9 #include "vm/code_generator.h" |
| 10 #include "vm/compiler.h" | 10 #include "vm/compiler.h" |
| (...skipping 1362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1373 // - If receiver is Smi -> load Smi class. | 1373 // - If receiver is Smi -> load Smi class. |
| 1374 // - If receiver is not-Smi -> load receiver's class. | 1374 // - If receiver is not-Smi -> load receiver's class. |
| 1375 // - Check if 'num_args' (including receiver) match any IC data group. | 1375 // - Check if 'num_args' (including receiver) match any IC data group. |
| 1376 // - Match found -> jump to target. | 1376 // - Match found -> jump to target. |
| 1377 // - Match not found -> jump to IC miss. | 1377 // - Match not found -> jump to IC miss. |
| 1378 void StubCode::GenerateNArgsCheckInlineCacheStub( | 1378 void StubCode::GenerateNArgsCheckInlineCacheStub( |
| 1379 Assembler* assembler, | 1379 Assembler* assembler, |
| 1380 intptr_t num_args, | 1380 intptr_t num_args, |
| 1381 const RuntimeEntry& handle_ic_miss, | 1381 const RuntimeEntry& handle_ic_miss, |
| 1382 Token::Kind kind, | 1382 Token::Kind kind, |
| 1383 RangeCollectionMode range_collection_mode) { | 1383 RangeCollectionMode range_collection_mode, |
| 1384 bool optimized) { |
| 1384 ASSERT(num_args > 0); | 1385 ASSERT(num_args > 0); |
| 1385 #if defined(DEBUG) | 1386 #if defined(DEBUG) |
| 1386 { Label ok; | 1387 { Label ok; |
| 1387 // Check that the IC data array has NumArgsTested() == num_args. | 1388 // Check that the IC data array has NumArgsTested() == num_args. |
| 1388 // 'NumArgsTested' is stored in the least significant bits of 'state_bits'. | 1389 // 'NumArgsTested' is stored in the least significant bits of 'state_bits'. |
| 1389 __ LoadFromOffset(R6, R5, ICData::state_bits_offset() - kHeapObjectTag, | 1390 __ LoadFromOffset(R6, R5, ICData::state_bits_offset() - kHeapObjectTag, |
| 1390 kNoPP, kUnsignedWord); | 1391 kNoPP, kUnsignedWord); |
| 1391 ASSERT(ICData::NumArgsTestedShift() == 0); // No shift needed. | 1392 ASSERT(ICData::NumArgsTestedShift() == 0); // No shift needed. |
| 1392 __ andi(R6, R6, Immediate(ICData::NumArgsTestedMask())); | 1393 __ andi(R6, R6, Immediate(ICData::NumArgsTestedMask())); |
| 1393 __ CompareImmediate(R6, num_args, kNoPP); | 1394 __ CompareImmediate(R6, num_args, kNoPP); |
| 1394 __ b(&ok, EQ); | 1395 __ b(&ok, EQ); |
| 1395 __ Stop("Incorrect stub for IC data"); | 1396 __ Stop("Incorrect stub for IC data"); |
| 1396 __ Bind(&ok); | 1397 __ Bind(&ok); |
| 1397 } | 1398 } |
| 1398 #endif // DEBUG | 1399 #endif // DEBUG |
| 1399 | 1400 |
| 1400 Label stepping, done_stepping; | 1401 Label stepping, done_stepping; |
| 1401 if (FLAG_support_debugger) { | 1402 if (FLAG_support_debugger && !optimized) { |
| 1402 __ Comment("Check single stepping"); | 1403 __ Comment("Check single stepping"); |
| 1403 __ LoadIsolate(R6, kNoPP); | 1404 __ LoadIsolate(R6, kNoPP); |
| 1404 __ LoadFromOffset( | 1405 __ LoadFromOffset( |
| 1405 R6, R6, Isolate::single_step_offset(), kNoPP, kUnsignedByte); | 1406 R6, R6, Isolate::single_step_offset(), kNoPP, kUnsignedByte); |
| 1406 __ CompareRegisters(R6, ZR); | 1407 __ CompareRegisters(R6, ZR); |
| 1407 __ b(&stepping, NE); | 1408 __ b(&stepping, NE); |
| 1408 __ Bind(&done_stepping); | 1409 __ Bind(&done_stepping); |
| 1409 } | 1410 } |
| 1410 | 1411 |
| 1411 __ Comment("Range feedback collection"); | 1412 __ Comment("Range feedback collection"); |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1563 Label done; | 1564 Label done; |
| 1564 __ ldr(R5, Address(FP, kFirstLocalSlotFromFp * kWordSize)); | 1565 __ ldr(R5, Address(FP, kFirstLocalSlotFromFp * kWordSize)); |
| 1565 __ UpdateRangeFeedback(R0, 2, R5, R1, R4, &done); | 1566 __ UpdateRangeFeedback(R0, 2, R5, R1, R4, &done); |
| 1566 __ Bind(&done); | 1567 __ Bind(&done); |
| 1567 __ LeaveStubFrame(); | 1568 __ LeaveStubFrame(); |
| 1568 __ ret(); | 1569 __ ret(); |
| 1569 } else { | 1570 } else { |
| 1570 __ br(R2); | 1571 __ br(R2); |
| 1571 } | 1572 } |
| 1572 | 1573 |
| 1573 if (FLAG_support_debugger) { | 1574 if (FLAG_support_debugger && !optimized) { |
| 1574 __ Bind(&stepping); | 1575 __ Bind(&stepping); |
| 1575 __ EnterStubFrame(); | 1576 __ EnterStubFrame(); |
| 1576 __ Push(R5); // Preserve IC data. | 1577 __ Push(R5); // Preserve IC data. |
| 1577 __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0); | 1578 __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0); |
| 1578 __ Pop(R5); | 1579 __ Pop(R5); |
| 1579 __ LeaveStubFrame(); | 1580 __ LeaveStubFrame(); |
| 1580 __ b(&done_stepping); | 1581 __ b(&done_stepping); |
| 1581 } | 1582 } |
| 1582 } | 1583 } |
| 1583 | 1584 |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1650 Token::kILLEGAL, | 1651 Token::kILLEGAL, |
| 1651 kCollectRanges); | 1652 kCollectRanges); |
| 1652 } | 1653 } |
| 1653 | 1654 |
| 1654 | 1655 |
| 1655 void StubCode::GenerateOneArgOptimizedCheckInlineCacheStub( | 1656 void StubCode::GenerateOneArgOptimizedCheckInlineCacheStub( |
| 1656 Assembler* assembler) { | 1657 Assembler* assembler) { |
| 1657 GenerateOptimizedUsageCounterIncrement(assembler); | 1658 GenerateOptimizedUsageCounterIncrement(assembler); |
| 1658 GenerateNArgsCheckInlineCacheStub(assembler, 1, | 1659 GenerateNArgsCheckInlineCacheStub(assembler, 1, |
| 1659 kInlineCacheMissHandlerOneArgRuntimeEntry, Token::kILLEGAL, | 1660 kInlineCacheMissHandlerOneArgRuntimeEntry, Token::kILLEGAL, |
| 1660 kIgnoreRanges); | 1661 kIgnoreRanges, true /* optimized */); |
| 1661 } | 1662 } |
| 1662 | 1663 |
| 1663 | 1664 |
| 1664 void StubCode::GenerateTwoArgsOptimizedCheckInlineCacheStub( | 1665 void StubCode::GenerateTwoArgsOptimizedCheckInlineCacheStub( |
| 1665 Assembler* assembler) { | 1666 Assembler* assembler) { |
| 1666 GenerateOptimizedUsageCounterIncrement(assembler); | 1667 GenerateOptimizedUsageCounterIncrement(assembler); |
| 1667 GenerateNArgsCheckInlineCacheStub(assembler, 2, | 1668 GenerateNArgsCheckInlineCacheStub(assembler, 2, |
| 1668 kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL, | 1669 kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL, |
| 1669 kIgnoreRanges); | 1670 kIgnoreRanges, true /* optimized */); |
| 1670 } | 1671 } |
| 1671 | 1672 |
| 1672 | 1673 |
| 1673 void StubCode::GenerateZeroArgsUnoptimizedStaticCallStub(Assembler* assembler) { | 1674 void StubCode::GenerateZeroArgsUnoptimizedStaticCallStub(Assembler* assembler) { |
| 1674 GenerateUsageCounterIncrement(assembler, R6); | 1675 GenerateUsageCounterIncrement(assembler, R6); |
| 1675 #if defined(DEBUG) | 1676 #if defined(DEBUG) |
| 1676 { Label ok; | 1677 { Label ok; |
| 1677 // Check that the IC data array has NumArgsTested() == 0. | 1678 // Check that the IC data array has NumArgsTested() == 0. |
| 1678 // 'NumArgsTested' is stored in the least significant bits of 'state_bits'. | 1679 // 'NumArgsTested' is stored in the least significant bits of 'state_bits'. |
| 1679 __ LoadFromOffset(R6, R5, ICData::state_bits_offset() - kHeapObjectTag, | 1680 __ LoadFromOffset(R6, R5, ICData::state_bits_offset() - kHeapObjectTag, |
| (...skipping 472 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2152 // Result: | 2153 // Result: |
| 2153 // R1: entry point. | 2154 // R1: entry point. |
| 2154 void StubCode::GenerateMegamorphicLookupStub(Assembler* assembler) { | 2155 void StubCode::GenerateMegamorphicLookupStub(Assembler* assembler) { |
| 2155 EmitMegamorphicLookup(assembler, R0, R1, R1); | 2156 EmitMegamorphicLookup(assembler, R0, R1, R1); |
| 2156 __ ret(); | 2157 __ ret(); |
| 2157 } | 2158 } |
| 2158 | 2159 |
| 2159 } // namespace dart | 2160 } // namespace dart |
| 2160 | 2161 |
| 2161 #endif // defined TARGET_ARCH_ARM64 | 2162 #endif // defined TARGET_ARCH_ARM64 |
| OLD | NEW |