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

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

Issue 1722733002: In background compilation make a copy of Field in order to freeze its state (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: s Created 4 years, 10 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/lib/mirrors.cc ('k') | runtime/vm/assembler_arm64.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) 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" // NOLINT 5 #include "vm/globals.h" // NOLINT
6 #if defined(TARGET_ARCH_ARM) 6 #if defined(TARGET_ARCH_ARM)
7 7
8 #include "vm/assembler.h" 8 #include "vm/assembler.h"
9 #include "vm/cpu.h" 9 #include "vm/cpu.h"
10 #include "vm/longjump.h" 10 #include "vm/longjump.h"
(...skipping 1547 matching lines...) Expand 10 before | Expand all | Expand 10 after
1558 } 1558 }
1559 1559
1560 1560
1561 void Assembler::LoadIsolate(Register rd) { 1561 void Assembler::LoadIsolate(Register rd) {
1562 ldr(rd, Address(THR, Thread::isolate_offset())); 1562 ldr(rd, Address(THR, Thread::isolate_offset()));
1563 } 1563 }
1564 1564
1565 1565
1566 bool Assembler::CanLoadFromObjectPool(const Object& object) const { 1566 bool Assembler::CanLoadFromObjectPool(const Object& object) const {
1567 ASSERT(!object.IsICData() || ICData::Cast(object).IsOriginal()); 1567 ASSERT(!object.IsICData() || ICData::Cast(object).IsOriginal());
1568 ASSERT(!object.IsField() || Field::Cast(object).IsOriginal());
1568 ASSERT(!Thread::CanLoadFromThread(object)); 1569 ASSERT(!Thread::CanLoadFromThread(object));
1569 if (!constant_pool_allowed()) { 1570 if (!constant_pool_allowed()) {
1570 return false; 1571 return false;
1571 } 1572 }
1572 1573
1573 ASSERT(object.IsNotTemporaryScopedHandle()); 1574 ASSERT(object.IsNotTemporaryScopedHandle());
1574 ASSERT(object.IsOld()); 1575 ASSERT(object.IsOld());
1575 return true; 1576 return true;
1576 } 1577 }
1577 1578
1578 1579
1579 void Assembler::LoadObjectHelper(Register rd, 1580 void Assembler::LoadObjectHelper(Register rd,
1580 const Object& object, 1581 const Object& object,
1581 Condition cond, 1582 Condition cond,
1582 bool is_unique, 1583 bool is_unique,
1583 Register pp) { 1584 Register pp) {
1584 ASSERT(!object.IsICData() || ICData::Cast(object).IsOriginal()); 1585 ASSERT(!object.IsICData() || ICData::Cast(object).IsOriginal());
1586 ASSERT(!object.IsField() || Field::Cast(object).IsOriginal());
1585 // Load common VM constants from the thread. This works also in places where 1587 // Load common VM constants from the thread. This works also in places where
1586 // no constant pool is set up (e.g. intrinsic code). 1588 // no constant pool is set up (e.g. intrinsic code).
1587 if (Thread::CanLoadFromThread(object)) { 1589 if (Thread::CanLoadFromThread(object)) {
1588 // Load common VM constants from the thread. This works also in places where 1590 // Load common VM constants from the thread. This works also in places where
1589 // no constant pool is set up (e.g. intrinsic code). 1591 // no constant pool is set up (e.g. intrinsic code).
1590 ldr(rd, Address(THR, Thread::OffsetFromThread(object)), cond); 1592 ldr(rd, Address(THR, Thread::OffsetFromThread(object)), cond);
1591 } else if (object.IsSmi()) { 1593 } else if (object.IsSmi()) {
1592 // Relocation doesn't apply to Smis. 1594 // Relocation doesn't apply to Smis.
1593 LoadImmediate(rd, reinterpret_cast<int32_t>(object.raw()), cond); 1595 LoadImmediate(rd, reinterpret_cast<int32_t>(object.raw()), cond);
1594 } else if (CanLoadFromObjectPool(object)) { 1596 } else if (CanLoadFromObjectPool(object)) {
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1634 Patchability patchable, 1636 Patchability patchable,
1635 Condition cond) { 1637 Condition cond) {
1636 const int32_t offset = ObjectPool::element_offset( 1638 const int32_t offset = ObjectPool::element_offset(
1637 object_pool_wrapper_.FindNativeEntry(label, patchable)); 1639 object_pool_wrapper_.FindNativeEntry(label, patchable));
1638 LoadWordFromPoolOffset(rd, offset - kHeapObjectTag, PP, cond); 1640 LoadWordFromPoolOffset(rd, offset - kHeapObjectTag, PP, cond);
1639 } 1641 }
1640 1642
1641 1643
1642 void Assembler::PushObject(const Object& object) { 1644 void Assembler::PushObject(const Object& object) {
1643 ASSERT(!object.IsICData() || ICData::Cast(object).IsOriginal()); 1645 ASSERT(!object.IsICData() || ICData::Cast(object).IsOriginal());
1646 ASSERT(!object.IsField() || Field::Cast(object).IsOriginal());
1644 LoadObject(IP, object); 1647 LoadObject(IP, object);
1645 Push(IP); 1648 Push(IP);
1646 } 1649 }
1647 1650
1648 1651
1649 void Assembler::CompareObject(Register rn, const Object& object) { 1652 void Assembler::CompareObject(Register rn, const Object& object) {
1650 ASSERT(!object.IsICData() || ICData::Cast(object).IsOriginal()); 1653 ASSERT(!object.IsICData() || ICData::Cast(object).IsOriginal());
1654 ASSERT(!object.IsField() || Field::Cast(object).IsOriginal());
1651 ASSERT(rn != IP); 1655 ASSERT(rn != IP);
1652 if (object.IsSmi()) { 1656 if (object.IsSmi()) {
1653 CompareImmediate(rn, reinterpret_cast<int32_t>(object.raw())); 1657 CompareImmediate(rn, reinterpret_cast<int32_t>(object.raw()));
1654 } else { 1658 } else {
1655 LoadObject(IP, object); 1659 LoadObject(IP, object);
1656 cmp(rn, Operand(IP)); 1660 cmp(rn, Operand(IP));
1657 } 1661 }
1658 } 1662 }
1659 1663
1660 1664
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
1900 StoreIntoObjectNoBarrier(object, Address(IP), value, old_content); 1904 StoreIntoObjectNoBarrier(object, Address(IP), value, old_content);
1901 } 1905 }
1902 } 1906 }
1903 1907
1904 1908
1905 void Assembler::StoreIntoObjectNoBarrier(Register object, 1909 void Assembler::StoreIntoObjectNoBarrier(Register object,
1906 const Address& dest, 1910 const Address& dest,
1907 const Object& value, 1911 const Object& value,
1908 FieldContent old_content) { 1912 FieldContent old_content) {
1909 ASSERT(!value.IsICData() || ICData::Cast(value).IsOriginal()); 1913 ASSERT(!value.IsICData() || ICData::Cast(value).IsOriginal());
1914 ASSERT(!value.IsField() || Field::Cast(value).IsOriginal());
1910 ASSERT(value.IsSmi() || value.InVMHeap() || 1915 ASSERT(value.IsSmi() || value.InVMHeap() ||
1911 (value.IsOld() && value.IsNotTemporaryScopedHandle())); 1916 (value.IsOld() && value.IsNotTemporaryScopedHandle()));
1912 // No store buffer update. 1917 // No store buffer update.
1913 LoadObject(IP, value); 1918 LoadObject(IP, value);
1914 VerifiedWrite(object, dest, IP, old_content); 1919 VerifiedWrite(object, dest, IP, old_content);
1915 } 1920 }
1916 1921
1917 1922
1918 void Assembler::StoreIntoObjectNoBarrierOffset(Register object, 1923 void Assembler::StoreIntoObjectNoBarrierOffset(Register object,
1919 int32_t offset, 1924 int32_t offset,
1920 const Object& value, 1925 const Object& value,
1921 FieldContent old_content) { 1926 FieldContent old_content) {
1922 ASSERT(!value.IsICData() || ICData::Cast(value).IsOriginal()); 1927 ASSERT(!value.IsICData() || ICData::Cast(value).IsOriginal());
1928 ASSERT(!value.IsField() || Field::Cast(value).IsOriginal());
1923 int32_t ignored = 0; 1929 int32_t ignored = 0;
1924 if (Address::CanHoldStoreOffset(kWord, offset - kHeapObjectTag, &ignored)) { 1930 if (Address::CanHoldStoreOffset(kWord, offset - kHeapObjectTag, &ignored)) {
1925 StoreIntoObjectNoBarrier(object, FieldAddress(object, offset), value, 1931 StoreIntoObjectNoBarrier(object, FieldAddress(object, offset), value,
1926 old_content); 1932 old_content);
1927 } else { 1933 } else {
1928 Register base = object == R9 ? R8 : R9; 1934 Register base = object == R9 ? R8 : R9;
1929 Push(base); 1935 Push(base);
1930 AddImmediate(base, object, offset - kHeapObjectTag); 1936 AddImmediate(base, object, offset - kHeapObjectTag);
1931 StoreIntoObjectNoBarrier(object, Address(base), value, old_content); 1937 StoreIntoObjectNoBarrier(object, Address(base), value, old_content);
1932 Pop(base); 1938 Pop(base);
(...skipping 1746 matching lines...) Expand 10 before | Expand all | Expand 10 after
3679 3685
3680 3686
3681 const char* Assembler::FpuRegisterName(FpuRegister reg) { 3687 const char* Assembler::FpuRegisterName(FpuRegister reg) {
3682 ASSERT((0 <= reg) && (reg < kNumberOfFpuRegisters)); 3688 ASSERT((0 <= reg) && (reg < kNumberOfFpuRegisters));
3683 return fpu_reg_names[reg]; 3689 return fpu_reg_names[reg];
3684 } 3690 }
3685 3691
3686 } // namespace dart 3692 } // namespace dart
3687 3693
3688 #endif // defined TARGET_ARCH_ARM 3694 #endif // defined TARGET_ARCH_ARM
OLDNEW
« no previous file with comments | « runtime/lib/mirrors.cc ('k') | runtime/vm/assembler_arm64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698