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

Unified Diff: runtime/vm/simulator_dbc.cc

Issue 2331033003: DBC: A couple allocation fastpaths. (Closed)
Patch Set: Address comments Created 4 years, 3 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
« no previous file with comments | « runtime/vm/intermediate_language_dbc.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/simulator_dbc.cc
diff --git a/runtime/vm/simulator_dbc.cc b/runtime/vm/simulator_dbc.cc
index 2e271c7197aa8cd30001d5fd44ef6322e2bc1fa8..e02cec330ed5822e1a5fb1143b2f1f4588569044 100644
--- a/runtime/vm/simulator_dbc.cc
+++ b/runtime/vm/simulator_dbc.cc
@@ -256,8 +256,6 @@ class SimulatorHelpers {
RawTypedData* array = reinterpret_cast<RawTypedData*>(obj);
const intptr_t byte_offset = Smi::Value(RAW_CAST(Smi, index));
ASSERT(byte_offset >= 0);
- ASSERT(((byte_offset + (1 << scale)) >> scale) <=
- Smi::Value(array->ptr()->length_));
return array->ptr()->data() + byte_offset;
}
};
@@ -1826,9 +1824,8 @@ RawObject* Simulator::Call(const Code& code,
{
BYTECODE(WriteIntoDouble, A_D);
const double value = bit_cast<double, RawObject*>(FP[rD]);
- RawDouble* box = RAW_CAST(Double, *SP--);
+ RawDouble* box = RAW_CAST(Double, FP[rA]);
box->ptr()->value_ = value;
- FP[rA] = box;
DISPATCH();
}
@@ -2324,6 +2321,25 @@ RawObject* Simulator::Call(const Code& code,
}
{
+ BYTECODE(AllocateOpt, A_D);
+ const uword tags =
+ static_cast<uword>(Smi::Value(RAW_CAST(Smi, LOAD_CONSTANT(rD))));
+ const intptr_t instance_size = RawObject::SizeTag::decode(tags);
+ const uword start = thread->heap()->new_space()->TryAllocate(instance_size);
+ if (LIKELY(start != 0)) {
+ *reinterpret_cast<uword*>(start + Instance::tags_offset()) = tags;
+ for (intptr_t current_offset = sizeof(RawInstance);
+ current_offset < instance_size;
+ current_offset += kWordSize) {
+ *reinterpret_cast<RawObject**>(start + current_offset) = null_value;
+ }
+ FP[rA] = reinterpret_cast<RawObject*>(start + kHeapObjectTag);
+ pc += 2;
+ }
+ DISPATCH();
+ }
+
+ {
BYTECODE(Allocate, A_D);
SP[1] = 0; // Space for the result.
SP[2] = LOAD_CONSTANT(rD); // Class object.
@@ -2347,6 +2363,38 @@ RawObject* Simulator::Call(const Code& code,
}
{
+ BYTECODE(CreateArrayOpt, A_B_C);
+ const intptr_t length = Smi::Value(RAW_CAST(Smi, FP[rB]));
+ if (LIKELY(length <= Array::kMaxElements)) {
+ const intptr_t fixed_size = sizeof(RawArray) + kObjectAlignment - 1;
+ const intptr_t instance_size =
+ (fixed_size + length*kWordSize) & ~(kObjectAlignment - 1);
+ const uword start =
+ thread->heap()->new_space()->TryAllocate(instance_size);
+ if (LIKELY(start != 0)) {
+ const intptr_t cid = kArrayCid;
+ uword tags = 0;
+ if (LIKELY(instance_size < RawObject::SizeTag::kMaxSizeTag)) {
+ tags = RawObject::SizeTag::update(instance_size, tags);
+ }
+ tags = RawObject::ClassIdTag::update(cid, tags);
+ *reinterpret_cast<uword*>(start + Instance::tags_offset()) = tags;
+ *reinterpret_cast<RawObject**>(start + Array::length_offset()) = FP[rB];
+ *reinterpret_cast<RawObject**>(start + Array::type_arguments_offset()) =
+ FP[rC];
+ RawObject** data =
+ reinterpret_cast<RawObject**>(start + Array::data_offset());
+ for (intptr_t i = 0; i < length; i++) {
+ data[i] = null_value;
+ }
+ FP[rA] = reinterpret_cast<RawObject*>(start + kHeapObjectTag);
+ pc += 4;
+ }
+ }
+ DISPATCH();
+ }
+
+ {
BYTECODE(CreateArrayTOS, 0);
SP[1] = SP[-0]; // Length.
SP[2] = SP[-1]; // Type.
« no previous file with comments | « runtime/vm/intermediate_language_dbc.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698