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

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

Issue 1544583002: For background compilation we copy ICData so that it is immutable during comnpilation. However, we … (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: remove flag Created 4 years, 12 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 349 matching lines...) Expand 10 before | Expand all | Expand 10 after
360 ldr(dst, Address(dst, lower12)); 360 ldr(dst, Address(dst, lower12));
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(!Thread::CanLoadFromThread(object)); 371 ASSERT(!Thread::CanLoadFromThread(object));
371 if (!constant_pool_allowed()) { 372 if (!constant_pool_allowed()) {
372 return false; 373 return false;
373 } 374 }
374 375
375 // TODO(zra, kmillikin): Also load other large immediates from the object 376 // TODO(zra, kmillikin): Also load other large immediates from the object
376 // pool 377 // pool
377 if (object.IsSmi()) { 378 if (object.IsSmi()) {
378 // If the raw smi does not fit into a 32-bit signed int, then we'll keep 379 // If the raw smi does not fit into a 32-bit signed int, then we'll keep
379 // the raw value in the object pool. 380 // the raw value in the object pool.
(...skipping 14 matching lines...) Expand all
394 395
395 396
396 void Assembler::LoadIsolate(Register dst) { 397 void Assembler::LoadIsolate(Register dst) {
397 ldr(dst, Address(THR, Thread::isolate_offset())); 398 ldr(dst, Address(THR, Thread::isolate_offset()));
398 } 399 }
399 400
400 401
401 void Assembler::LoadObjectHelper(Register dst, 402 void Assembler::LoadObjectHelper(Register dst,
402 const Object& object, 403 const Object& object,
403 bool is_unique) { 404 bool is_unique) {
405 ASSERT(!object.IsICData() || ICData::Cast(object).IsOriginal());
404 if (Thread::CanLoadFromThread(object)) { 406 if (Thread::CanLoadFromThread(object)) {
405 ldr(dst, Address(THR, Thread::OffsetFromThread(object))); 407 ldr(dst, Address(THR, Thread::OffsetFromThread(object)));
406 } else if (CanLoadFromObjectPool(object)) { 408 } else if (CanLoadFromObjectPool(object)) {
407 const int32_t offset = ObjectPool::element_offset( 409 const int32_t offset = ObjectPool::element_offset(
408 is_unique ? object_pool_wrapper_.AddObject(object) 410 is_unique ? object_pool_wrapper_.AddObject(object)
409 : object_pool_wrapper_.FindObject(object)); 411 : object_pool_wrapper_.FindObject(object));
410 LoadWordFromPoolOffset(dst, offset); 412 LoadWordFromPoolOffset(dst, offset);
411 } else { 413 } else {
412 ASSERT(object.IsSmi() || object.InVMHeap()); 414 ASSERT(object.IsSmi() || object.InVMHeap());
413 ASSERT(object.IsSmi() || FLAG_allow_absolute_addresses); 415 ASSERT(object.IsSmi() || FLAG_allow_absolute_addresses);
(...skipping 18 matching lines...) Expand all
432 LoadObjectHelper(dst, object, false); 434 LoadObjectHelper(dst, object, false);
433 } 435 }
434 436
435 437
436 void Assembler::LoadUniqueObject(Register dst, const Object& object) { 438 void Assembler::LoadUniqueObject(Register dst, const Object& object) {
437 LoadObjectHelper(dst, object, true); 439 LoadObjectHelper(dst, object, true);
438 } 440 }
439 441
440 442
441 void Assembler::CompareObject(Register reg, const Object& object) { 443 void Assembler::CompareObject(Register reg, const Object& object) {
444 ASSERT(!object.IsICData() || ICData::Cast(object).IsOriginal());
442 if (Thread::CanLoadFromThread(object)) { 445 if (Thread::CanLoadFromThread(object)) {
443 ldr(TMP, Address(THR, Thread::OffsetFromThread(object))); 446 ldr(TMP, Address(THR, Thread::OffsetFromThread(object)));
444 CompareRegisters(reg, TMP); 447 CompareRegisters(reg, TMP);
445 } else if (CanLoadFromObjectPool(object)) { 448 } else if (CanLoadFromObjectPool(object)) {
446 LoadObject(TMP, object); 449 LoadObject(TMP, object);
447 CompareRegisters(reg, TMP); 450 CompareRegisters(reg, TMP);
448 } else { 451 } else {
449 ASSERT(object.IsSmi() || FLAG_allow_absolute_addresses); 452 ASSERT(object.IsSmi() || FLAG_allow_absolute_addresses);
450 CompareImmediate(reg, reinterpret_cast<int64_t>(object.raw())); 453 CompareImmediate(reg, reinterpret_cast<int64_t>(object.raw()));
451 } 454 }
(...skipping 474 matching lines...) Expand 10 before | Expand all | Expand 10 after
926 } else { 929 } else {
927 AddImmediate(TMP, object, offset - kHeapObjectTag); 930 AddImmediate(TMP, object, offset - kHeapObjectTag);
928 StoreIntoObjectNoBarrier(object, Address(TMP), value); 931 StoreIntoObjectNoBarrier(object, Address(TMP), value);
929 } 932 }
930 } 933 }
931 934
932 935
933 void Assembler::StoreIntoObjectNoBarrier(Register object, 936 void Assembler::StoreIntoObjectNoBarrier(Register object,
934 const Address& dest, 937 const Address& dest,
935 const Object& value) { 938 const Object& value) {
939 ASSERT(!value.IsICData() || ICData::Cast(value).IsOriginal());
936 ASSERT(value.IsSmi() || value.InVMHeap() || 940 ASSERT(value.IsSmi() || value.InVMHeap() ||
937 (value.IsOld() && value.IsNotTemporaryScopedHandle())); 941 (value.IsOld() && value.IsNotTemporaryScopedHandle()));
938 // No store buffer update. 942 // No store buffer update.
939 LoadObject(TMP2, value); 943 LoadObject(TMP2, value);
940 str(TMP2, dest); 944 str(TMP2, dest);
941 } 945 }
942 946
943 947
944 void Assembler::StoreIntoObjectOffsetNoBarrier(Register object, 948 void Assembler::StoreIntoObjectOffsetNoBarrier(Register object,
945 int32_t offset, 949 int32_t offset,
(...skipping 517 matching lines...) Expand 10 before | Expand all | Expand 10 after
1463 add(base, array, Operand(index, LSL, shift)); 1467 add(base, array, Operand(index, LSL, shift));
1464 } 1468 }
1465 const OperandSize size = Address::OperandSizeFor(cid); 1469 const OperandSize size = Address::OperandSizeFor(cid);
1466 ASSERT(Address::CanHoldOffset(offset, Address::Offset, size)); 1470 ASSERT(Address::CanHoldOffset(offset, Address::Offset, size));
1467 return Address(base, offset, Address::Offset, size); 1471 return Address(base, offset, Address::Offset, size);
1468 } 1472 }
1469 1473
1470 } // namespace dart 1474 } // namespace dart
1471 1475
1472 #endif // defined TARGET_ARCH_ARM64 1476 #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