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

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

Issue 496483002: Moves SingleStepHandler runtime calls (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 4 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 | Annotate | Revision Log
« 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 1538 matching lines...) Expand 10 before | Expand all | Expand 10 after
1549 ASSERT(ICData::NumArgsTestedShift() == 0); // No shift needed. 1549 ASSERT(ICData::NumArgsTestedShift() == 0); // No shift needed.
1550 __ andi(R6, R6, ICData::NumArgsTestedMask()); 1550 __ andi(R6, R6, ICData::NumArgsTestedMask());
1551 __ CompareImmediate(R6, 0, kNoPP); 1551 __ CompareImmediate(R6, 0, kNoPP);
1552 __ b(&ok, EQ); 1552 __ b(&ok, EQ);
1553 __ Stop("Incorrect IC data for unoptimized static call"); 1553 __ Stop("Incorrect IC data for unoptimized static call");
1554 __ Bind(&ok); 1554 __ Bind(&ok);
1555 } 1555 }
1556 #endif // DEBUG 1556 #endif // DEBUG
1557 1557
1558 // Check single stepping. 1558 // Check single stepping.
1559 Label not_stepping; 1559 Label stepping, done_stepping;
1560 __ LoadFieldFromOffset(R6, CTX, Context::isolate_offset(), kNoPP); 1560 __ LoadFieldFromOffset(R6, CTX, Context::isolate_offset(), kNoPP);
1561 __ LoadFromOffset( 1561 __ LoadFromOffset(
1562 R6, R6, Isolate::single_step_offset(), kNoPP, kUnsignedByte); 1562 R6, R6, Isolate::single_step_offset(), kNoPP, kUnsignedByte);
1563 __ CompareImmediate(R6, 0, kNoPP); 1563 __ CompareImmediate(R6, 0, kNoPP);
1564 __ b(&not_stepping, EQ); 1564 __ b(&stepping, NE);
1565 __ EnterStubFrame(); 1565 __ Bind(&done_stepping);
1566 __ Push(R5); // Preserve IC data.
1567 __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
1568 __ Pop(R5);
1569 __ LeaveStubFrame();
1570 __ Bind(&not_stepping);
1571 1566
1572 // R5: IC data object (preserved). 1567 // R5: IC data object (preserved).
1573 __ LoadFieldFromOffset(R6, R5, ICData::ic_data_offset(), kNoPP); 1568 __ LoadFieldFromOffset(R6, R5, ICData::ic_data_offset(), kNoPP);
1574 // R6: ic_data_array with entries: target functions and count. 1569 // R6: ic_data_array with entries: target functions and count.
1575 __ AddImmediate(R6, R6, Array::data_offset() - kHeapObjectTag, kNoPP); 1570 __ AddImmediate(R6, R6, Array::data_offset() - kHeapObjectTag, kNoPP);
1576 // R6: points directly to the first ic data array element. 1571 // R6: points directly to the first ic data array element.
1577 const intptr_t target_offset = ICData::TargetIndexFor(0) * kWordSize; 1572 const intptr_t target_offset = ICData::TargetIndexFor(0) * kWordSize;
1578 const intptr_t count_offset = ICData::CountIndexFor(0) * kWordSize; 1573 const intptr_t count_offset = ICData::CountIndexFor(0) * kWordSize;
1579 1574
1580 // Increment count for this call. 1575 // Increment count for this call.
1581 Label increment_done;
1582 __ LoadFromOffset(R1, R6, count_offset, kNoPP); 1576 __ LoadFromOffset(R1, R6, count_offset, kNoPP);
1583 __ adds(R1, R1, Operand(Smi::RawValue(1))); 1577 __ adds(R1, R1, Operand(Smi::RawValue(1)));
1578 __ LoadImmediate(R2, Smi::RawValue(Smi::kMaxValue), kNoPP);
1579 __ csel(R1, R2, R1, VS); // Overflow.
1584 __ StoreToOffset(R1, R6, count_offset, kNoPP); 1580 __ StoreToOffset(R1, R6, count_offset, kNoPP);
1585 __ b(&increment_done, VC); // No overflow.
1586 __ LoadImmediate(R1, Smi::RawValue(Smi::kMaxValue), kNoPP);
1587 __ StoreToOffset(R1, R6, count_offset, kNoPP);
1588 __ Bind(&increment_done);
1589 1581
1590 // Load arguments descriptor into R4. 1582 // Load arguments descriptor into R4.
1591 __ LoadFieldFromOffset(R4, R5, ICData::arguments_descriptor_offset(), kNoPP); 1583 __ LoadFieldFromOffset(R4, R5, ICData::arguments_descriptor_offset(), kNoPP);
1592 1584
1593 // Get function and call it, if possible. 1585 // Get function and call it, if possible.
1594 __ LoadFromOffset(R0, R6, target_offset, kNoPP); 1586 __ LoadFromOffset(R0, R6, target_offset, kNoPP);
1595 __ LoadFieldFromOffset(R2, R0, Function::instructions_offset(), kNoPP); 1587 __ LoadFieldFromOffset(R2, R0, Function::instructions_offset(), kNoPP);
1596 1588
1597 // R0: function. 1589 // R0: function.
1598 // R2: target instructons. 1590 // R2: target instructons.
1599 __ AddImmediate( 1591 __ AddImmediate(
1600 R2, R2, Instructions::HeaderSize() - kHeapObjectTag, kNoPP); 1592 R2, R2, Instructions::HeaderSize() - kHeapObjectTag, kNoPP);
1601 __ br(R2); 1593 __ br(R2);
1594
1595 __ Bind(&stepping);
1596 __ EnterStubFrame();
1597 __ Push(R5); // Preserve IC data.
1598 __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
1599 __ Pop(R5);
1600 __ LeaveStubFrame();
1601 __ b(&done_stepping);
1602 } 1602 }
1603 1603
1604 1604
1605 void StubCode::GenerateTwoArgsUnoptimizedStaticCallStub(Assembler* assembler) { 1605 void StubCode::GenerateTwoArgsUnoptimizedStaticCallStub(Assembler* assembler) {
1606 GenerateUsageCounterIncrement(assembler, R6); 1606 GenerateUsageCounterIncrement(assembler, R6);
1607 GenerateNArgsCheckInlineCacheStub( 1607 GenerateNArgsCheckInlineCacheStub(
1608 assembler, 2, kStaticCallMissHandlerTwoArgsRuntimeEntry); 1608 assembler, 2, kStaticCallMissHandlerTwoArgsRuntimeEntry);
1609 } 1609 }
1610 1610
1611 1611
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
1668 __ CallRuntime(kBreakpointRuntimeHandlerRuntimeEntry, 0); 1668 __ CallRuntime(kBreakpointRuntimeHandlerRuntimeEntry, 0);
1669 __ Pop(R0); 1669 __ Pop(R0);
1670 __ LeaveStubFrame(); 1670 __ LeaveStubFrame();
1671 __ br(R0); 1671 __ br(R0);
1672 } 1672 }
1673 1673
1674 // Called only from unoptimized code. All relevant registers have been saved. 1674 // Called only from unoptimized code. All relevant registers have been saved.
1675 void StubCode::GenerateDebugStepCheckStub( 1675 void StubCode::GenerateDebugStepCheckStub(
1676 Assembler* assembler) { 1676 Assembler* assembler) {
1677 // Check single stepping. 1677 // Check single stepping.
1678 Label not_stepping; 1678 Label stepping, done_stepping;
1679 __ LoadFieldFromOffset(R1, CTX, Context::isolate_offset(), kNoPP); 1679 __ LoadFieldFromOffset(R1, CTX, Context::isolate_offset(), kNoPP);
1680 __ LoadFromOffset( 1680 __ LoadFromOffset(
1681 R1, R1, Isolate::single_step_offset(), kNoPP, kUnsignedByte); 1681 R1, R1, Isolate::single_step_offset(), kNoPP, kUnsignedByte);
1682 __ CompareImmediate(R1, 0, kNoPP); 1682 __ CompareImmediate(R1, 0, kNoPP);
1683 __ b(&not_stepping, EQ); 1683 __ b(&stepping, NE);
1684 __ Bind(&done_stepping);
1685
1686 __ ret();
1687
1688 __ Bind(&stepping);
1684 __ EnterStubFrame(); 1689 __ EnterStubFrame();
1685 __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0); 1690 __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
1686 __ LeaveStubFrame(); 1691 __ LeaveStubFrame();
1687 __ Bind(&not_stepping); 1692 __ b(&done_stepping);
1688
1689 __ ret();
1690 } 1693 }
1691 1694
1692 1695
1693 // Used to check class and type arguments. Arguments passed in registers: 1696 // Used to check class and type arguments. Arguments passed in registers:
1694 // LR: return address. 1697 // LR: return address.
1695 // R0: instance (must be preserved). 1698 // R0: instance (must be preserved).
1696 // R1: instantiator type arguments or NULL. 1699 // R1: instantiator type arguments or NULL.
1697 // R2: cache array. 1700 // R2: cache array.
1698 // Result in R1: null -> not found, otherwise result (true or false). 1701 // Result in R1: null -> not found, otherwise result (true or false).
1699 static void GenerateSubtypeNTestCacheStub(Assembler* assembler, int n) { 1702 static void GenerateSubtypeNTestCacheStub(Assembler* assembler, int n) {
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
1917 1920
1918 1921
1919 // Called only from unoptimized code. All relevant registers have been saved. 1922 // Called only from unoptimized code. All relevant registers have been saved.
1920 // LR: return address. 1923 // LR: return address.
1921 // SP + 4: left operand. 1924 // SP + 4: left operand.
1922 // SP + 0: right operand. 1925 // SP + 0: right operand.
1923 // Return Zero condition flag set if equal. 1926 // Return Zero condition flag set if equal.
1924 void StubCode::GenerateUnoptimizedIdenticalWithNumberCheckStub( 1927 void StubCode::GenerateUnoptimizedIdenticalWithNumberCheckStub(
1925 Assembler* assembler) { 1928 Assembler* assembler) {
1926 // Check single stepping. 1929 // Check single stepping.
1927 Label not_stepping; 1930 Label stepping, done_stepping;
1928 __ LoadFieldFromOffset(R1, CTX, Context::isolate_offset(), kNoPP); 1931 __ LoadFieldFromOffset(R1, CTX, Context::isolate_offset(), kNoPP);
1929 __ LoadFromOffset( 1932 __ LoadFromOffset(
1930 R1, R1, Isolate::single_step_offset(), kNoPP, kUnsignedByte); 1933 R1, R1, Isolate::single_step_offset(), kNoPP, kUnsignedByte);
1931 __ CompareImmediate(R1, 0, kNoPP); 1934 __ CompareImmediate(R1, 0, kNoPP);
1932 __ b(&not_stepping, EQ); 1935 __ b(&stepping, NE);
1933 __ EnterStubFrame(); 1936 __ Bind(&done_stepping);
1934 __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
1935 __ LeaveStubFrame();
1936 __ Bind(&not_stepping);
1937 1937
1938 const Register left = R1; 1938 const Register left = R1;
1939 const Register right = R0; 1939 const Register right = R0;
1940 __ LoadFromOffset(left, SP, 1 * kWordSize, kNoPP); 1940 __ LoadFromOffset(left, SP, 1 * kWordSize, kNoPP);
1941 __ LoadFromOffset(right, SP, 0 * kWordSize, kNoPP); 1941 __ LoadFromOffset(right, SP, 0 * kWordSize, kNoPP);
1942 GenerateIdenticalWithNumberCheckStub(assembler, left, right); 1942 GenerateIdenticalWithNumberCheckStub(assembler, left, right);
1943 __ ret(); 1943 __ ret();
1944
1945 __ Bind(&stepping);
1946 __ EnterStubFrame();
1947 __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
1948 __ LeaveStubFrame();
1949 __ b(&done_stepping);
1944 } 1950 }
1945 1951
1946 1952
1947 // Called from optimized code only. 1953 // Called from optimized code only.
1948 // LR: return address. 1954 // LR: return address.
1949 // SP + 4: left operand. 1955 // SP + 4: left operand.
1950 // SP + 0: right operand. 1956 // SP + 0: right operand.
1951 // Return Zero condition flag set if equal. 1957 // Return Zero condition flag set if equal.
1952 void StubCode::GenerateOptimizedIdenticalWithNumberCheckStub( 1958 void StubCode::GenerateOptimizedIdenticalWithNumberCheckStub(
1953 Assembler* assembler) { 1959 Assembler* assembler) {
1954 const Register temp = R2; 1960 const Register temp = R2;
1955 const Register left = R1; 1961 const Register left = R1;
1956 const Register right = R0; 1962 const Register right = R0;
1957 __ LoadFromOffset(left, SP, 1 * kWordSize, kNoPP); 1963 __ LoadFromOffset(left, SP, 1 * kWordSize, kNoPP);
1958 __ LoadFromOffset(right, SP, 0 * kWordSize, kNoPP); 1964 __ LoadFromOffset(right, SP, 0 * kWordSize, kNoPP);
1959 GenerateIdenticalWithNumberCheckStub(assembler, left, right, temp); 1965 GenerateIdenticalWithNumberCheckStub(assembler, left, right, temp);
1960 __ ret(); 1966 __ ret();
1961 } 1967 }
1962 1968
1963 } // namespace dart 1969 } // namespace dart
1964 1970
1965 #endif // defined TARGET_ARCH_ARM64 1971 #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