diff options
Diffstat (limited to 'deps/v8/src/crankshaft/ia32/lithium-ia32.cc')
-rw-r--r-- | deps/v8/src/crankshaft/ia32/lithium-ia32.cc | 151 |
1 files changed, 38 insertions, 113 deletions
diff --git a/deps/v8/src/crankshaft/ia32/lithium-ia32.cc b/deps/v8/src/crankshaft/ia32/lithium-ia32.cc index e2772d5ee3..4afeef5d68 100644 --- a/deps/v8/src/crankshaft/ia32/lithium-ia32.cc +++ b/deps/v8/src/crankshaft/ia32/lithium-ia32.cc @@ -267,27 +267,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); @@ -434,13 +413,6 @@ LPlatformChunk* LChunkBuilder::Build() { LPhase phase("L_Building chunk", chunk_); status_ = BUILDING; - // Reserve the first spill slot for the state of dynamic alignment. - if (info()->IsOptimizing()) { - int alignment_state_index = chunk_->GetNextSpillIndex(GENERAL_REGISTERS); - DCHECK_EQ(alignment_state_index, 4); - USE(alignment_state_index); - } - // If compiling for OSR, reserve space for the unoptimized frame, // which will be subsumed into this frame. if (graph()->has_osr()) { @@ -618,11 +590,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); } @@ -936,22 +904,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; } @@ -964,15 +926,15 @@ 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(); LOperand* temp = !easy_case && expected.NeedsMap() ? TempRegister() : NULL; LInstruction* branch = new(zone()) LBranch(UseRegister(value), temp); if (!easy_case && - ((!expected.Contains(ToBooleanStub::SMI) && expected.NeedsMap()) || + ((!expected.Contains(ToBooleanICStub::SMI) && expected.NeedsMap()) || !expected.IsGeneric())) { branch = AssignEnvironment(branch); } @@ -1100,16 +1062,6 @@ LInstruction* LChunkBuilder::DoDeclareGlobals(HDeclareGlobals* instr) { } -LInstruction* LChunkBuilder::DoCallJSFunction( - HCallJSFunction* instr) { - LOperand* function = UseFixed(instr->function(), edi); - - LCallJSFunction* result = new(zone()) LCallJSFunction(function); - - return MarkAsCall(DefineFixed(result, eax), instr, CANNOT_DEOPTIMIZE_EAGERLY); -} - - LInstruction* LChunkBuilder::DoCallWithDescriptor( HCallWithDescriptor* instr) { CallInterfaceDescriptor descriptor = instr->descriptor(); @@ -1132,6 +1084,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, eax), instr, CANNOT_DEOPTIMIZE_EAGERLY); } @@ -1140,6 +1095,9 @@ LInstruction* LChunkBuilder::DoInvokeFunction(HInvokeFunction* instr) { LOperand* context = UseFixed(instr->context(), esi); LOperand* function = UseFixed(instr->function(), edi); LInvokeFunction* result = new(zone()) LInvokeFunction(context, function); + if (instr->syntactic_tail_call_mode() == TailCallMode::kAllow) { + result->MarkAsSyntacticTailCall(); + } return MarkAsCall(DefineFixed(result, eax), instr, CANNOT_DEOPTIMIZE_EAGERLY); } @@ -1170,22 +1128,33 @@ LInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) { } } - LInstruction* LChunkBuilder::DoMathFloor(HUnaryMathOperation* instr) { + DCHECK(instr->value()->representation().IsDouble()); LOperand* input = UseRegisterAtStart(instr->value()); - LMathFloor* result = new(zone()) LMathFloor(input); - return AssignEnvironment(DefineAsRegister(result)); + if (instr->representation().IsInteger32()) { + LMathFloorI* result = new (zone()) LMathFloorI(input); + return AssignEnvironment(AssignPointerMap(DefineAsRegister(result))); + } else { + DCHECK(instr->representation().IsDouble()); + LMathFloorD* result = new (zone()) LMathFloorD(input); + return DefineAsRegister(result); + } } - LInstruction* LChunkBuilder::DoMathRound(HUnaryMathOperation* instr) { + DCHECK(instr->value()->representation().IsDouble()); LOperand* input = UseRegister(instr->value()); - LOperand* temp = FixedTemp(xmm4); - LMathRound* result = new(zone()) LMathRound(input, temp); - return AssignEnvironment(DefineAsRegister(result)); + if (instr->representation().IsInteger32()) { + LOperand* temp = FixedTemp(xmm4); + LMathRoundI* result = new (zone()) LMathRoundI(input, temp); + return AssignEnvironment(AssignPointerMap(DefineAsRegister(result))); + } else { + DCHECK(instr->representation().IsDouble()); + LMathRoundD* result = new (zone()) LMathRoundD(input); + return DefineAsRegister(result); + } } - LInstruction* LChunkBuilder::DoMathFround(HUnaryMathOperation* instr) { LOperand* input = UseRegister(instr->value()); LMathFround* result = new (zone()) LMathFround(input); @@ -1253,22 +1222,6 @@ LInstruction* LChunkBuilder::DoCallNewArray(HCallNewArray* instr) { } -LInstruction* LChunkBuilder::DoCallFunction(HCallFunction* instr) { - LOperand* context = UseFixed(instr->context(), esi); - LOperand* function = UseFixed(instr->function(), edi); - LOperand* slot = NULL; - LOperand* vector = NULL; - if (instr->HasVectorAndSlot()) { - slot = FixedTemp(edx); - vector = FixedTemp(ebx); - } - - LCallFunction* call = - new (zone()) LCallFunction(context, function, slot, vector); - return MarkAsCall(DefineFixed(call, eax), instr); -} - - LInstruction* LChunkBuilder::DoCallRuntime(HCallRuntime* instr) { LOperand* context = UseFixed(instr->context(), esi); return MarkAsCall(DefineFixed(new(zone()) LCallRuntime(context), eax), instr); @@ -1834,13 +1787,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. @@ -2507,11 +2453,6 @@ LInstruction* LChunkBuilder::DoUnknownOSRValue(HUnknownOSRValue* instr) { Retry(kNotEnoughSpillSlotsForOsr); spill_index = 0; } - if (spill_index == 0) { - // The dynamic frame alignment state overwrites the first local. - // The first local is saved at the end of the unoptimized frame. - spill_index = graph()->osr()->UnoptimizedFrameSlots(); - } spill_index += StandardFrameConstants::kFixedSlotCount; } return DefineAsSpilled(new(zone()) LUnknownOSRValue, spill_index); @@ -2551,13 +2492,6 @@ LInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) { } -LInstruction* LChunkBuilder::DoToFastProperties(HToFastProperties* instr) { - LOperand* object = UseFixed(instr->value(), eax); - LToFastProperties* result = new(zone()) LToFastProperties(object); - return MarkAsCall(DefineFixed(result, eax), instr); -} - - LInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) { LOperand* context = UseFixed(instr->context(), esi); LOperand* value = UseFixed(instr->value(), ebx); @@ -2595,11 +2529,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()); @@ -2660,13 +2592,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 |