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

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

Issue 1145063003: Do not emit debug check in optimized IC stubs (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: a Created 5 years, 6 months 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
« no previous file with comments | « runtime/vm/stub_code_arm.cc ('k') | runtime/vm/stub_code_ia32.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
OLDNEW
« no previous file with comments | « runtime/vm/stub_code_arm.cc ('k') | runtime/vm/stub_code_ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698