| Index: vm/intermediate_language_x64.cc
|
| ===================================================================
|
| --- vm/intermediate_language_x64.cc (revision 10621)
|
| +++ vm/intermediate_language_x64.cc (working copy)
|
| @@ -761,59 +761,17 @@
|
| locs->set_temp(0, Location::RequiresRegister());
|
| locs->set_out(Location::RequiresRegister());
|
| return locs;
|
| - } else if ((receiver_type() == kArrayCid) ||
|
| - (receiver_type() == kImmutableArrayCid)) {
|
| + } else {
|
| + ASSERT((receiver_type() == kArrayCid) ||
|
| + (receiver_type() == kImmutableArrayCid));
|
| return LocationSummary::Make(kNumInputs,
|
| Location::RequiresRegister(),
|
| LocationSummary::kNoCall);
|
| - } else {
|
| - ASSERT(receiver_type() == kIllegalCid);
|
| - return MakeCallSummary();
|
| }
|
| }
|
|
|
|
|
| -static void EmitLoadIndexedPolymorphic(FlowGraphCompiler* compiler,
|
| - LoadIndexedComp* comp) {
|
| - Label* deopt = compiler->AddDeoptStub(comp->deopt_id(),
|
| - comp->try_index(),
|
| - kDeoptLoadIndexedPolymorphic);
|
| - ASSERT(comp->ic_data()->NumberOfChecks() > 0);
|
| - ASSERT(comp->HasICData());
|
| - const ICData& ic_data = *comp->ic_data();
|
| - ASSERT(ic_data.num_args_tested() == 1);
|
| - // No indexed access on Smi.
|
| - ASSERT(ic_data.GetReceiverClassIdAt(0) != kSmiCid);
|
| - // Load receiver into RAX.
|
| - const intptr_t kNumArguments = 2;
|
| - __ movq(RAX, Address(RSP, (kNumArguments - 1) * kWordSize));
|
| - __ testq(RAX, Immediate(kSmiTagMask));
|
| - __ j(ZERO, deopt);
|
| - __ LoadClassId(RDI, RAX);
|
| - compiler->EmitTestAndCall(ic_data,
|
| - RDI, // Class id register.
|
| - kNumArguments,
|
| - Array::Handle(), // No named arguments.
|
| - deopt, // Deoptimize target.
|
| - NULL, // Fallthrough when done.
|
| - comp->deopt_id(),
|
| - comp->token_pos(),
|
| - comp->try_index(),
|
| - comp->locs()->stack_bitmap());
|
| -}
|
| -
|
| -
|
| void LoadIndexedComp::EmitNativeCode(FlowGraphCompiler* compiler) {
|
| - if (receiver_type() == kIllegalCid) {
|
| - if (HasICData() && (ic_data()->NumberOfChecks() > 0)) {
|
| - EmitLoadIndexedPolymorphic(compiler, this);
|
| - } else {
|
| - compiler->EmitLoadIndexedGeneric(this);
|
| - }
|
| - ASSERT(locs()->out().reg() == RAX);
|
| - return;
|
| - }
|
| -
|
| Register receiver = locs()->in(0).reg();
|
| Register index = locs()->in(1).reg();
|
| Register result = locs()->out().reg();
|
| @@ -822,8 +780,8 @@
|
| (receiver_type() == kGrowableObjectArrayCid) ?
|
| kDeoptLoadIndexedGrowableArray : kDeoptLoadIndexedFixedArray;
|
|
|
| - Label* deopt = compiler->AddDeoptStub(deopt_id(),
|
| - try_index(),
|
| + Label* deopt = compiler->AddDeoptStub(original()->deopt_id(),
|
| + original()->try_index(),
|
| deopt_reason,
|
| receiver,
|
| index);
|
| @@ -878,86 +836,22 @@
|
| locs->set_temp(0, Location::RequiresRegister());
|
| locs->set_out(Location::NoLocation());
|
| return locs;
|
| - } else if (receiver_type() == kArrayCid) {
|
| + } else {
|
| + ASSERT(receiver_type() == kArrayCid);
|
| return LocationSummary::Make(kNumInputs,
|
| Location::NoLocation(),
|
| LocationSummary::kNoCall);
|
| - } else {
|
| - ASSERT(receiver_type() == kIllegalCid);
|
| - return MakeCallSummary();
|
| }
|
| }
|
|
|
|
|
| -static void EmitStoreIndexedGeneric(FlowGraphCompiler* compiler,
|
| - StoreIndexedComp* comp) {
|
| - const String& function_name =
|
| - String::ZoneHandle(Symbols::New(Token::Str(Token::kASSIGN_INDEX)));
|
| -
|
| - compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
|
| - comp->deopt_id(),
|
| - comp->token_pos(),
|
| - comp->try_index());
|
| -
|
| - const intptr_t kNumArguments = 3;
|
| - const intptr_t kNumArgsChecked = 1; // Type-feedback.
|
| - compiler->GenerateInstanceCall(comp->deopt_id(),
|
| - comp->token_pos(),
|
| - comp->try_index(),
|
| - function_name,
|
| - kNumArguments,
|
| - Array::ZoneHandle(), // No named arguments.
|
| - kNumArgsChecked,
|
| - comp->locs()->stack_bitmap());
|
| -}
|
| -
|
| -
|
| -static void EmitStoreIndexedPolymorphic(FlowGraphCompiler* compiler,
|
| - StoreIndexedComp* comp) {
|
| - Label* deopt = compiler->AddDeoptStub(comp->deopt_id(),
|
| - comp->try_index(),
|
| - kDeoptStoreIndexedPolymorphic);
|
| - ASSERT(comp->ic_data()->NumberOfChecks() > 0);
|
| - ASSERT(comp->HasICData());
|
| - const ICData& ic_data = *comp->ic_data();
|
| - ASSERT(ic_data.num_args_tested() == 1);
|
| - // No indexed access on Smi.
|
| - ASSERT(ic_data.GetReceiverClassIdAt(0) != kSmiCid);
|
| - // Load receiver into RAX.
|
| - const intptr_t kNumArguments = 3;
|
| - __ movq(RAX, Address(RSP, (kNumArguments - 1) * kWordSize));
|
| - __ testq(RAX, Immediate(kSmiTagMask));
|
| - __ j(ZERO, deopt);
|
| - __ LoadClassId(RDI, RAX);
|
| - compiler->EmitTestAndCall(ic_data,
|
| - RDI, // Class id register.
|
| - kNumArguments,
|
| - Array::Handle(), // No named arguments.
|
| - deopt, // deoptimize label.
|
| - NULL, // fallthrough when done.
|
| - comp->deopt_id(),
|
| - comp->token_pos(),
|
| - comp->try_index(),
|
| - comp->locs()->stack_bitmap());
|
| -}
|
| -
|
| -
|
| void StoreIndexedComp::EmitNativeCode(FlowGraphCompiler* compiler) {
|
| - if (receiver_type() == kIllegalCid) {
|
| - if (HasICData() && (ic_data()->NumberOfChecks() > 0)) {
|
| - EmitStoreIndexedPolymorphic(compiler, this);
|
| - } else {
|
| - EmitStoreIndexedGeneric(compiler, this);
|
| - }
|
| - return;
|
| - }
|
| -
|
| Register receiver = locs()->in(0).reg();
|
| Register index = locs()->in(1).reg();
|
| Register value = locs()->in(2).reg();
|
|
|
| - Label* deopt = compiler->AddDeoptStub(deopt_id(),
|
| - try_index(),
|
| + Label* deopt = compiler->AddDeoptStub(original()->deopt_id(),
|
| + original()->try_index(),
|
| kDeoptStoreIndexed,
|
| receiver,
|
| index,
|
|
|