Chromium Code Reviews| Index: runtime/vm/intermediate_language_dbc.cc |
| diff --git a/runtime/vm/intermediate_language_dbc.cc b/runtime/vm/intermediate_language_dbc.cc |
| index 08f05d7b3aae692036c4d84ba897461f9a293517..b09f51201cbd6b298bc142670d708e0bc459a4cc 100644 |
| --- a/runtime/vm/intermediate_language_dbc.cc |
| +++ b/runtime/vm/intermediate_language_dbc.cc |
| @@ -683,13 +683,18 @@ EMIT_NATIVE_CODE(CreateArray, |
| 2, Location::RequiresRegister(), |
| LocationSummary::kCall) { |
| if (compiler->is_optimizing()) { |
| - __ Push(locs()->in(0).reg()); |
| - __ Push(locs()->in(1).reg()); |
| - } |
| - __ CreateArrayTOS(); |
| - compiler->RecordSafepoint(locs()); |
| - if (compiler->is_optimizing()) { |
| - __ PopLocal(locs()->out(0).reg()); |
| + const Register length = locs()->in(kLengthPos).reg(); |
| + const Register typ = locs()->in(kElementTypePos).reg(); |
|
Florian Schneider
2016/09/13 17:06:58
s/typ/type_argument/
zra
2016/09/13 17:21:18
Done.
|
| + const Register out = locs()->out(0).reg(); |
| + __ CreateArrayOpt(out, length, typ); |
| + __ Push(typ); |
| + __ Push(length); |
| + __ CreateArrayTOS(); |
| + compiler->RecordSafepoint(locs()); |
| + __ PopLocal(out); |
| + } else { |
| + __ CreateArrayTOS(); |
| + compiler->RecordSafepoint(locs()); |
| } |
| } |
| @@ -910,21 +915,45 @@ EMIT_NATIVE_CODE(AllocateObject, |
| 0, Location::RequiresRegister(), |
| LocationSummary::kCall) { |
| if (ArgumentCount() == 1) { |
| + // Allocate with type arguments. |
| __ PushConstant(cls()); |
| __ AllocateT(); |
| compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, |
| Thread::kNoDeoptId, |
| token_pos()); |
| - } else { |
| + compiler->RecordSafepoint(locs()); |
| + if (compiler->is_optimizing()) { |
| + __ PopLocal(locs()->out(0).reg()); |
| + } |
| + } else if (compiler->is_optimizing()) { |
| + // If we're optimizing, try a streamlined fastpath. |
| + const intptr_t instance_size = cls().instance_size(); |
| + Isolate* isolate = Isolate::Current(); |
| + if (Heap::IsAllocatableInNewSpace(instance_size) && |
| + !cls().TraceAllocation(isolate)) { |
| + uword tags = 0; |
| + tags = RawObject::SizeTag::update(instance_size, tags); |
| + ASSERT(cls().id() != kIllegalCid); |
| + tags = RawObject::ClassIdTag::update(cls().id(), tags); |
| + if (Smi::IsValid(tags)) { |
| + const intptr_t tags_kidx = __ AddConstant(Smi::Handle(Smi::New(tags))); |
| + __ AllocateOpt(locs()->out(0).reg(), tags_kidx); |
| + } |
| + } |
| const intptr_t kidx = __ AddConstant(cls()); |
| __ Allocate(kidx); |
| compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, |
| Thread::kNoDeoptId, |
| token_pos()); |
| - } |
| - compiler->RecordSafepoint(locs()); |
| - if (compiler->is_optimizing()) { |
| + compiler->RecordSafepoint(locs()); |
| __ PopLocal(locs()->out(0).reg()); |
| + } else { |
| + const intptr_t kidx = __ AddConstant(cls()); |
| + __ Allocate(kidx); |
| + compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, |
| + Thread::kNoDeoptId, |
| + token_pos()); |
| + compiler->RecordSafepoint(locs()); |
| } |
| } |
| @@ -1413,13 +1442,23 @@ EMIT_NATIVE_CODE(Box, 1, Location::RequiresRegister(), LocationSummary::kCall) { |
| ASSERT(from_representation() == kUnboxedDouble); |
| const Register value = locs()->in(0).reg(); |
| const Register out = locs()->out(0).reg(); |
| + const intptr_t instance_size = compiler->double_class().instance_size(); |
| + Isolate* isolate = Isolate::Current(); |
| + ASSERT(Heap::IsAllocatableInNewSpace(instance_size)); |
| + if (!compiler->double_class().TraceAllocation(isolate)) { |
| + uword tags = 0; |
| + tags = RawObject::SizeTag::update(instance_size, tags); |
| + tags = RawObject::ClassIdTag::update(compiler->double_class().id(), tags); |
| + const intptr_t tags_kidx = __ AddConstant(Smi::Handle(Smi::New(tags))); |
|
Florian Schneider
2016/09/13 17:06:58
Check Smi::IsValid(tags)?
zra
2016/09/13 17:21:18
Done.
|
| + __ AllocateOpt(out, tags_kidx); |
| + } |
| const intptr_t kidx = __ AddConstant(compiler->double_class()); |
| __ Allocate(kidx); |
| compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, |
| Thread::kNoDeoptId, |
| token_pos()); |
| compiler->RecordSafepoint(locs()); |
| - // __ Allocate puts the box at the top of the stack. |
| + __ PopLocal(out); |
| __ WriteIntoDouble(out, value); |
| } |