diff options
Diffstat (limited to 'deps/v8/src/crankshaft/mips/lithium-mips.cc')
-rw-r--r-- | deps/v8/src/crankshaft/mips/lithium-mips.cc | 113 |
1 files changed, 19 insertions, 94 deletions
diff --git a/deps/v8/src/crankshaft/mips/lithium-mips.cc b/deps/v8/src/crankshaft/mips/lithium-mips.cc index a7c5488d04..71c34df516 100644 --- a/deps/v8/src/crankshaft/mips/lithium-mips.cc +++ b/deps/v8/src/crankshaft/mips/lithium-mips.cc @@ -255,27 +255,6 @@ void LInnerAllocatedObject::PrintDataTo(StringStream* stream) { } -void LCallFunction::PrintDataTo(StringStream* stream) { - context()->PrintTo(stream); - stream->Add(" "); - function()->PrintTo(stream); - if (hydrogen()->HasVectorAndSlot()) { - stream->Add(" (type-feedback-vector "); - temp_vector()->PrintTo(stream); - stream->Add(" "); - temp_slot()->PrintTo(stream); - stream->Add(")"); - } -} - - -void LCallJSFunction::PrintDataTo(StringStream* stream) { - stream->Add("= "); - function()->PrintTo(stream); - stream->Add("#%d / ", arity()); -} - - void LCallWithDescriptor::PrintDataTo(StringStream* stream) { for (int i = 0; i < InputCount(); i++) { InputAt(i)->PrintTo(stream); @@ -574,12 +553,7 @@ LInstruction* LChunkBuilder::DefineFixedDouble( LInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) { HEnvironment* hydrogen_env = current_block_->last_environment(); - int argument_index_accumulator = 0; - ZoneList<HValue*> objects_to_materialize(0, zone()); - instr->set_environment(CreateEnvironment(hydrogen_env, - &argument_index_accumulator, - &objects_to_materialize)); - return instr; + return LChunkBuilderBase::AssignEnvironment(instr, hydrogen_env); } @@ -907,22 +881,16 @@ void LChunkBuilder::AddInstruction(LInstruction* instr, } chunk_->AddInstruction(instr, current_block_); - if (instr->IsCall() || instr->IsPrologue()) { - HValue* hydrogen_value_for_lazy_bailout = hydrogen_val; - if (hydrogen_val->HasObservableSideEffects()) { - HSimulate* sim = HSimulate::cast(hydrogen_val->next()); - sim->ReplayEnvironment(current_block_->last_environment()); - hydrogen_value_for_lazy_bailout = sim; - } - LInstruction* bailout = AssignEnvironment(new(zone()) LLazyBailout()); - bailout->set_hydrogen_value(hydrogen_value_for_lazy_bailout); - chunk_->AddInstruction(bailout, current_block_); - } + CreateLazyBailoutForCall(current_block_, instr, hydrogen_val); } LInstruction* LChunkBuilder::DoPrologue(HPrologue* instr) { - return new (zone()) LPrologue(); + LInstruction* result = new (zone()) LPrologue(); + if (info_->num_heap_slots() > 0) { + result = MarkAsCall(result, instr); + } + return result; } @@ -935,14 +903,14 @@ LInstruction* LChunkBuilder::DoBranch(HBranch* instr) { HValue* value = instr->value(); Representation r = value->representation(); HType type = value->type(); - ToBooleanStub::Types expected = instr->expected_input_types(); - if (expected.IsEmpty()) expected = ToBooleanStub::Types::Generic(); + ToBooleanICStub::Types expected = instr->expected_input_types(); + if (expected.IsEmpty()) expected = ToBooleanICStub::Types::Generic(); bool easy_case = !r.IsTagged() || type.IsBoolean() || type.IsSmi() || type.IsJSArray() || type.IsHeapNumber() || type.IsString(); LInstruction* branch = new(zone()) LBranch(UseRegister(value)); if (!easy_case && - ((!expected.Contains(ToBooleanStub::SMI) && expected.NeedsMap()) || + ((!expected.Contains(ToBooleanICStub::SMI) && expected.NeedsMap()) || !expected.IsGeneric())) { branch = AssignEnvironment(branch); } @@ -1064,16 +1032,6 @@ LInstruction* LChunkBuilder::DoDeclareGlobals(HDeclareGlobals* instr) { } -LInstruction* LChunkBuilder::DoCallJSFunction( - HCallJSFunction* instr) { - LOperand* function = UseFixed(instr->function(), a1); - - LCallJSFunction* result = new(zone()) LCallJSFunction(function); - - return MarkAsCall(DefineFixed(result, v0), instr); -} - - LInstruction* LChunkBuilder::DoCallWithDescriptor( HCallWithDescriptor* instr) { CallInterfaceDescriptor descriptor = instr->descriptor(); @@ -1097,6 +1055,9 @@ LInstruction* LChunkBuilder::DoCallWithDescriptor( LCallWithDescriptor* result = new(zone()) LCallWithDescriptor( descriptor, ops, zone()); + if (instr->syntactic_tail_call_mode() == TailCallMode::kAllow) { + result->MarkAsSyntacticTailCall(); + } return MarkAsCall(DefineFixed(result, v0), instr); } @@ -1105,6 +1066,9 @@ LInstruction* LChunkBuilder::DoInvokeFunction(HInvokeFunction* instr) { LOperand* context = UseFixed(instr->context(), cp); LOperand* function = UseFixed(instr->function(), a1); LInvokeFunction* result = new(zone()) LInvokeFunction(context, function); + if (instr->syntactic_tail_call_mode() == TailCallMode::kAllow) { + result->MarkAsSyntacticTailCall(); + } return MarkAsCall(DefineFixed(result, v0), instr, CANNOT_DEOPTIMIZE_EAGERLY); } @@ -1224,22 +1188,6 @@ LInstruction* LChunkBuilder::DoCallNewArray(HCallNewArray* instr) { } -LInstruction* LChunkBuilder::DoCallFunction(HCallFunction* instr) { - LOperand* context = UseFixed(instr->context(), cp); - LOperand* function = UseFixed(instr->function(), a1); - LOperand* slot = NULL; - LOperand* vector = NULL; - if (instr->HasVectorAndSlot()) { - slot = FixedTemp(a3); - vector = FixedTemp(a2); - } - - LCallFunction* call = - new (zone()) LCallFunction(context, function, slot, vector); - return MarkAsCall(DefineFixed(call, v0), instr); -} - - LInstruction* LChunkBuilder::DoCallRuntime(HCallRuntime* instr) { LOperand* context = UseFixed(instr->context(), cp); return MarkAsCall(DefineFixed(new(zone()) LCallRuntime(context), v0), instr); @@ -1790,13 +1738,6 @@ LInstruction* LChunkBuilder::DoBoundsCheck(HBoundsCheck* instr) { } -LInstruction* LChunkBuilder::DoBoundsCheckBaseIndexInformation( - HBoundsCheckBaseIndexInformation* instr) { - UNREACHABLE(); - return NULL; -} - - LInstruction* LChunkBuilder::DoAbnormalExit(HAbnormalExit* instr) { // The control instruction marking the end of a block that completed // abruptly (e.g., threw an exception). There is nothing specific to do. @@ -2435,13 +2376,6 @@ LInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) { } -LInstruction* LChunkBuilder::DoToFastProperties(HToFastProperties* instr) { - LOperand* object = UseFixed(instr->value(), a0); - LToFastProperties* result = new(zone()) LToFastProperties(object); - return MarkAsCall(DefineFixed(result, v0), instr); -} - - LInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) { LOperand* context = UseFixed(instr->context(), cp); LOperand* value = UseFixed(instr->value(), a3); @@ -2478,11 +2412,9 @@ LInstruction* LChunkBuilder::DoEnterInlined(HEnterInlined* instr) { HEnvironment* outer = current_block_->last_environment(); outer->set_ast_id(instr->ReturnId()); HConstant* undefined = graph()->GetConstantUndefined(); - HEnvironment* inner = outer->CopyForInlining(instr->closure(), - instr->arguments_count(), - instr->function(), - undefined, - instr->inlining_kind()); + HEnvironment* inner = outer->CopyForInlining( + instr->closure(), instr->arguments_count(), instr->function(), undefined, + instr->inlining_kind(), instr->syntactic_tail_call_mode()); // Only replay binding of arguments object if it wasn't removed from graph. if (instr->arguments_var() != NULL && instr->arguments_object()->IsLinked()) { inner->Bind(instr->arguments_var(), instr->arguments_object()); @@ -2543,13 +2475,6 @@ LInstruction* LChunkBuilder::DoLoadFieldByIndex(HLoadFieldByIndex* instr) { return AssignPointerMap(result); } - - -LInstruction* LChunkBuilder::DoStoreFrameContext(HStoreFrameContext* instr) { - LOperand* context = UseRegisterAtStart(instr->context()); - return new(zone()) LStoreFrameContext(context); -} - } // namespace internal } // namespace v8 |