| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |