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

Unified Diff: runtime/vm/assembler_arm64.cc

Issue 1225933002: Remove fixed contant pool entries by caching some global constants in Thread (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: added helper methods to Thread Created 5 years, 5 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 side-by-side diff with in-line comments
Download patch
Index: runtime/vm/assembler_arm64.cc
diff --git a/runtime/vm/assembler_arm64.cc b/runtime/vm/assembler_arm64.cc
index d82088b57292b135748780e29852aac9fffdcc13..5899fc6b108af85cc460ea8ec58f05ecb1c6489b 100644
--- a/runtime/vm/assembler_arm64.cc
+++ b/runtime/vm/assembler_arm64.cc
@@ -31,28 +31,6 @@ Assembler::Assembler(bool use_far_branches)
use_far_branches_(use_far_branches),
comments_(),
allow_constant_pool_(true) {
- if (Isolate::Current() != Dart::vm_isolate()) {
- // These objects and labels need to be accessible through every pool-pointer
- // at the same index.
- intptr_t index =
- object_pool_wrapper_.AddObject(Object::null_object());
- ASSERT(index == 0);
-
- index = object_pool_wrapper_.AddObject(Bool::True());
- ASSERT(index == 1);
-
- index = object_pool_wrapper_.AddObject(Bool::False());
- ASSERT(index == 2);
-
- const Smi& vacant = Smi::Handle(Smi::New(0xfa >> kSmiTagShift));
- StubCode* stub_code = Isolate::Current()->stub_code();
- if (stub_code->UpdateStoreBuffer_entry() != NULL) {
- object_pool_wrapper_.AddExternalLabel(
- &stub_code->UpdateStoreBufferLabel(), kNotPatchable);
- } else {
- object_pool_wrapper_.AddObject(vacant);
- }
- }
}
@@ -387,18 +365,10 @@ intptr_t Assembler::FindImmediate(int64_t imm) {
}
-// A set of VM objects that are present in every constant pool.
-static bool IsAlwaysInConstantPool(const Object& object) {
- // TODO(zra): Evaluate putting all VM heap objects into the pool.
- return (object.raw() == Object::null())
- || (object.raw() == Bool::True().raw())
- || (object.raw() == Bool::False().raw());
-}
-
-
-bool Assembler::CanLoadObjectFromPool(const Object& object) {
+bool Assembler::CanLoadFromObjectPool(const Object& object) {
srdjan 2015/07/07 16:58:27 const
Florian Schneider 2015/07/08 09:28:09 Done.
+ ASSERT(!Thread::CanLoadFromThread(object));
if (!allow_constant_pool()) {
- return IsAlwaysInConstantPool(object);
+ return false;
}
// TODO(zra, kmillikin): Also load other large immediates from the object
@@ -458,7 +428,9 @@ void Assembler::LoadIsolate(Register dst, Register pp) {
void Assembler::LoadObject(Register dst, const Object& object, Register pp) {
- if (CanLoadObjectFromPool(object)) {
+ if (Thread::CanLoadFromThread(object)) {
+ ldr(dst, Address(THR, Thread::OffsetFromThread(object)));
+ } else if (CanLoadFromObjectPool(object)) {
const int32_t offset =
ObjectPool::element_offset(object_pool_wrapper_.FindObject(object));
LoadWordFromPoolOffset(dst, pp, offset);
@@ -472,7 +444,10 @@ void Assembler::LoadObject(Register dst, const Object& object, Register pp) {
void Assembler::CompareObject(Register reg, const Object& object, Register pp) {
- if (CanLoadObjectFromPool(object)) {
+ if (Thread::CanLoadFromThread(object)) {
+ ldr(TMP, Address(THR, Thread::OffsetFromThread(object)));
+ CompareRegisters(reg, TMP);
+ } else if (CanLoadFromObjectPool(object)) {
LoadObject(TMP, object, pp);
CompareRegisters(reg, TMP);
} else {
@@ -915,8 +890,8 @@ void Assembler::StoreIntoObject(Register object,
if (object != R0) {
mov(R0, object);
}
- StubCode* stub_code = Isolate::Current()->stub_code();
- BranchLink(&stub_code->UpdateStoreBufferLabel(), PP);
+ ldr(TMP, Address(THR, Thread::update_store_buffer_entry_point_offset()));
+ blr(TMP);
Pop(LR);
if (value != R0) {
// Restore R0.

Powered by Google App Engine
This is Rietveld 408576698