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

Side by Side Diff: runtime/vm/assembler_arm64.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/vm/assembler_arm.cc ('k') | runtime/vm/assembler_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" // NOLINT 5 #include "vm/globals.h" // NOLINT
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/cpu.h" 9 #include "vm/cpu.h"
10 #include "vm/longjump.h" 10 #include "vm/longjump.h"
(...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after
361 } 361 }
362 362
363 363
364 intptr_t Assembler::FindImmediate(int64_t imm) { 364 intptr_t Assembler::FindImmediate(int64_t imm) {
365 return object_pool_wrapper_.FindImmediate(imm); 365 return object_pool_wrapper_.FindImmediate(imm);
366 } 366 }
367 367
368 368
369 bool Assembler::CanLoadFromObjectPool(const Object& object) const { 369 bool Assembler::CanLoadFromObjectPool(const Object& object) const {
370 ASSERT(!object.IsICData() || ICData::Cast(object).IsOriginal()); 370 ASSERT(!object.IsICData() || ICData::Cast(object).IsOriginal());
371 ASSERT(!object.IsField() || Field::Cast(object).IsOriginal());
371 ASSERT(!Thread::CanLoadFromThread(object)); 372 ASSERT(!Thread::CanLoadFromThread(object));
372 if (!constant_pool_allowed()) { 373 if (!constant_pool_allowed()) {
373 return false; 374 return false;
374 } 375 }
375 376
376 // TODO(zra, kmillikin): Also load other large immediates from the object 377 // TODO(zra, kmillikin): Also load other large immediates from the object
377 // pool 378 // pool
378 if (object.IsSmi()) { 379 if (object.IsSmi()) {
379 // If the raw smi does not fit into a 32-bit signed int, then we'll keep 380 // If the raw smi does not fit into a 32-bit signed int, then we'll keep
380 // the raw value in the object pool. 381 // the raw value in the object pool.
(...skipping 15 matching lines...) Expand all
396 397
397 void Assembler::LoadIsolate(Register dst) { 398 void Assembler::LoadIsolate(Register dst) {
398 ldr(dst, Address(THR, Thread::isolate_offset())); 399 ldr(dst, Address(THR, Thread::isolate_offset()));
399 } 400 }
400 401
401 402
402 void Assembler::LoadObjectHelper(Register dst, 403 void Assembler::LoadObjectHelper(Register dst,
403 const Object& object, 404 const Object& object,
404 bool is_unique) { 405 bool is_unique) {
405 ASSERT(!object.IsICData() || ICData::Cast(object).IsOriginal()); 406 ASSERT(!object.IsICData() || ICData::Cast(object).IsOriginal());
407 ASSERT(!object.IsField() || Field::Cast(object).IsOriginal());
406 if (Thread::CanLoadFromThread(object)) { 408 if (Thread::CanLoadFromThread(object)) {
407 ldr(dst, Address(THR, Thread::OffsetFromThread(object))); 409 ldr(dst, Address(THR, Thread::OffsetFromThread(object)));
408 } else if (CanLoadFromObjectPool(object)) { 410 } else if (CanLoadFromObjectPool(object)) {
409 const int32_t offset = ObjectPool::element_offset( 411 const int32_t offset = ObjectPool::element_offset(
410 is_unique ? object_pool_wrapper_.AddObject(object) 412 is_unique ? object_pool_wrapper_.AddObject(object)
411 : object_pool_wrapper_.FindObject(object)); 413 : object_pool_wrapper_.FindObject(object));
412 LoadWordFromPoolOffset(dst, offset); 414 LoadWordFromPoolOffset(dst, offset);
413 } else { 415 } else {
414 ASSERT(object.IsSmi() || object.InVMHeap()); 416 ASSERT(object.IsSmi() || object.InVMHeap());
415 ASSERT(object.IsSmi() || FLAG_allow_absolute_addresses); 417 ASSERT(object.IsSmi() || FLAG_allow_absolute_addresses);
(...skipping 19 matching lines...) Expand all
435 } 437 }
436 438
437 439
438 void Assembler::LoadUniqueObject(Register dst, const Object& object) { 440 void Assembler::LoadUniqueObject(Register dst, const Object& object) {
439 LoadObjectHelper(dst, object, true); 441 LoadObjectHelper(dst, object, true);
440 } 442 }
441 443
442 444
443 void Assembler::CompareObject(Register reg, const Object& object) { 445 void Assembler::CompareObject(Register reg, const Object& object) {
444 ASSERT(!object.IsICData() || ICData::Cast(object).IsOriginal()); 446 ASSERT(!object.IsICData() || ICData::Cast(object).IsOriginal());
447 ASSERT(!object.IsField() || Field::Cast(object).IsOriginal());
445 if (Thread::CanLoadFromThread(object)) { 448 if (Thread::CanLoadFromThread(object)) {
446 ldr(TMP, Address(THR, Thread::OffsetFromThread(object))); 449 ldr(TMP, Address(THR, Thread::OffsetFromThread(object)));
447 CompareRegisters(reg, TMP); 450 CompareRegisters(reg, TMP);
448 } else if (CanLoadFromObjectPool(object)) { 451 } else if (CanLoadFromObjectPool(object)) {
449 LoadObject(TMP, object); 452 LoadObject(TMP, object);
450 CompareRegisters(reg, TMP); 453 CompareRegisters(reg, TMP);
451 } else { 454 } else {
452 ASSERT(object.IsSmi() || FLAG_allow_absolute_addresses); 455 ASSERT(object.IsSmi() || FLAG_allow_absolute_addresses);
453 CompareImmediate(reg, reinterpret_cast<int64_t>(object.raw())); 456 CompareImmediate(reg, reinterpret_cast<int64_t>(object.raw()));
454 } 457 }
(...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after
941 AddImmediate(TMP, object, offset - kHeapObjectTag); 944 AddImmediate(TMP, object, offset - kHeapObjectTag);
942 StoreIntoObjectNoBarrier(object, Address(TMP), value); 945 StoreIntoObjectNoBarrier(object, Address(TMP), value);
943 } 946 }
944 } 947 }
945 948
946 949
947 void Assembler::StoreIntoObjectNoBarrier(Register object, 950 void Assembler::StoreIntoObjectNoBarrier(Register object,
948 const Address& dest, 951 const Address& dest,
949 const Object& value) { 952 const Object& value) {
950 ASSERT(!value.IsICData() || ICData::Cast(value).IsOriginal()); 953 ASSERT(!value.IsICData() || ICData::Cast(value).IsOriginal());
954 ASSERT(!value.IsField() || Field::Cast(value).IsOriginal());
951 ASSERT(value.IsSmi() || value.InVMHeap() || 955 ASSERT(value.IsSmi() || value.InVMHeap() ||
952 (value.IsOld() && value.IsNotTemporaryScopedHandle())); 956 (value.IsOld() && value.IsNotTemporaryScopedHandle()));
953 // No store buffer update. 957 // No store buffer update.
954 LoadObject(TMP2, value); 958 LoadObject(TMP2, value);
955 str(TMP2, dest); 959 str(TMP2, dest);
956 } 960 }
957 961
958 962
959 void Assembler::StoreIntoObjectOffsetNoBarrier(Register object, 963 void Assembler::StoreIntoObjectOffsetNoBarrier(Register object,
960 int32_t offset, 964 int32_t offset,
(...skipping 520 matching lines...) Expand 10 before | Expand all | Expand 10 after
1481 add(base, array, Operand(index, LSL, shift)); 1485 add(base, array, Operand(index, LSL, shift));
1482 } 1486 }
1483 const OperandSize size = Address::OperandSizeFor(cid); 1487 const OperandSize size = Address::OperandSizeFor(cid);
1484 ASSERT(Address::CanHoldOffset(offset, Address::Offset, size)); 1488 ASSERT(Address::CanHoldOffset(offset, Address::Offset, size));
1485 return Address(base, offset, Address::Offset, size); 1489 return Address(base, offset, Address::Offset, size);
1486 } 1490 }
1487 1491
1488 } // namespace dart 1492 } // namespace dart
1489 1493
1490 #endif // defined TARGET_ARCH_ARM64 1494 #endif // defined TARGET_ARCH_ARM64
OLDNEW
« no previous file with comments | « runtime/vm/assembler_arm.cc ('k') | runtime/vm/assembler_ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698