17d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Copyright 2013 the V8 project authors. All rights reserved. 27d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be 37d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// found in the LICENSE file. 47d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 57d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/code-generator.h" 67d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 77d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/code-generator-impl.h" 87d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/linkage.h" 97d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/pipeline.h" 107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace v8 { 127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace internal { 137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace compiler { 147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgCodeGenerator::CodeGenerator(InstructionSequence* code) 167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org : code_(code), 177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org current_block_(NULL), 187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org current_source_position_(SourcePosition::Invalid()), 197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org masm_(code->zone()->isolate(), NULL, 0), 207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org resolver_(this), 217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org safepoints_(code->zone()), 22fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org deoptimization_states_(code->zone()), 23fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org deoptimization_literals_(code->zone()), 2406b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org translations_(code->zone()), 2506b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org last_lazy_deopt_pc_(0) {} 267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgHandle<Code> CodeGenerator::GenerateCode() { 297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CompilationInfo* info = linkage()->info(); 307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Emit a code line info recording start event. 327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org PositionsRecorder* recorder = masm()->positions_recorder(); 337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org LOG_CODE_EVENT(isolate(), CodeStartLinePosInfoRecordEvent(recorder)); 347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Place function entry hook if requested to do so. 367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (linkage()->GetIncomingDescriptor()->IsJSFunctionCall()) { 377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ProfileEntryHookStub::MaybeCallEntryHook(masm()); 387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Architecture-specific, linkage-specific prologue. 417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org info->set_prologue_offset(masm()->pc_offset()); 427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org AssemblePrologue(); 437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Assemble all instructions. 457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org for (InstructionSequence::const_iterator i = code()->begin(); 467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org i != code()->end(); ++i) { 477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org AssembleInstruction(*i); 487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FinishCode(masm()); 517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 529e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org // Ensure there is space for lazy deopt. 539e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org if (!info->IsStub()) { 549e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org int target_offset = masm()->pc_offset() + Deoptimizer::patch_size(); 559e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org while (masm()->pc_offset() < target_offset) { 569e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org masm()->nop(); 579e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org } 589e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org } 599e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org 607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org safepoints()->Emit(masm(), frame()->GetSpillSlotCount()); 617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // TODO(titzer): what are the right code flags here? 637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Code::Kind kind = Code::STUB; 647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (linkage()->GetIncomingDescriptor()->IsJSFunctionCall()) { 657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org kind = Code::OPTIMIZED_FUNCTION; 667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Handle<Code> result = v8::internal::CodeGenerator::MakeCodeEpilogue( 687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org masm(), Code::ComputeFlags(kind), info); 697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org result->set_is_turbofanned(true); 707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org result->set_stack_slots(frame()->GetSpillSlotCount()); 717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org result->set_safepoint_table_offset(safepoints()->GetCodeOffset()); 727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org PopulateDeoptimizationData(result); 747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Emit a code line info recording stop event. 767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org void* line_info = recorder->DetachJITHandlerData(); 777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org LOG_CODE_EVENT(isolate(), CodeEndLinePosInfoRecordEvent(*result, line_info)); 787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return result; 807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 839e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.orgvoid CodeGenerator::RecordSafepoint(PointerMap* pointers, Safepoint::Kind kind, 849e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org int arguments, 859e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org Safepoint::DeoptMode deopt_mode) { 867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org const ZoneList<InstructionOperand*>* operands = 877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org pointers->GetNormalizedOperands(); 887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Safepoint safepoint = 897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org safepoints()->DefineSafepoint(masm(), kind, arguments, deopt_mode); 907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org for (int i = 0; i < operands->length(); i++) { 917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org InstructionOperand* pointer = operands->at(i); 927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (pointer->IsStackSlot()) { 937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org safepoint.DefinePointerSlot(pointer->index(), zone()); 947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else if (pointer->IsRegister() && (kind & Safepoint::kWithRegisters)) { 957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Register reg = Register::FromAllocationIndex(pointer->index()); 967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org safepoint.DefinePointerRegister(reg, zone()); 977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 1007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid CodeGenerator::AssembleInstruction(Instruction* instr) { 1037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (instr->IsBlockStart()) { 1047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Bind a label for a block start and handle parallel moves. 1057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org BlockStartInstruction* block_start = BlockStartInstruction::cast(instr); 1067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org current_block_ = block_start->block(); 1077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (FLAG_code_comments) { 1087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // TODO(titzer): these code comments are a giant memory leak. 1097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Vector<char> buffer = Vector<char>::New(32); 1107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org SNPrintF(buffer, "-- B%d start --", block_start->block()->id()); 1117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org masm()->RecordComment(buffer.start()); 1127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 1137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org masm()->bind(block_start->label()); 1147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 1157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (instr->IsGapMoves()) { 1167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Handle parallel moves associated with the gap instruction. 1177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org AssembleGap(GapInstruction::cast(instr)); 1187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else if (instr->IsSourcePosition()) { 1197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org AssembleSourcePosition(SourcePositionInstruction::cast(instr)); 1207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 1217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Assemble architecture-specific code for the instruction. 1227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org AssembleArchInstruction(instr); 1237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Assemble branches or boolean materializations after this instruction. 1257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FlagsMode mode = FlagsModeField::decode(instr->opcode()); 1267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FlagsCondition condition = FlagsConditionField::decode(instr->opcode()); 1277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org switch (mode) { 1287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kFlags_none: 1297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return; 1307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kFlags_set: 1317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return AssembleArchBoolean(instr, condition); 1327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kFlags_branch: 1337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return AssembleArchBranch(instr, condition); 1347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 1357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org UNREACHABLE(); 1367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 1377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 1387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid CodeGenerator::AssembleSourcePosition(SourcePositionInstruction* instr) { 1417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org SourcePosition source_position = instr->source_position(); 1427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (source_position == current_source_position_) return; 143e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!source_position.IsInvalid()); 1447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (!source_position.IsUnknown()) { 1457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int code_pos = source_position.raw(); 1467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org masm()->positions_recorder()->RecordPosition(source_position.raw()); 1477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org masm()->positions_recorder()->WriteRecordedPositions(); 1487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (FLAG_code_comments) { 1497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Vector<char> buffer = Vector<char>::New(256); 1507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CompilationInfo* info = linkage()->info(); 1517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int ln = Script::GetLineNumber(info->script(), code_pos); 1527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int cn = Script::GetColumnNumber(info->script(), code_pos); 1537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (info->script()->name()->IsString()) { 1547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Handle<String> file(String::cast(info->script()->name())); 1557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org base::OS::SNPrintF(buffer.start(), buffer.length(), "-- %s:%d:%d --", 1567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org file->ToCString().get(), ln, cn); 1577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 1587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org base::OS::SNPrintF(buffer.start(), buffer.length(), 1597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org "-- <unknown>:%d:%d --", ln, cn); 1607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 1617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org masm()->RecordComment(buffer.start()); 1627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 1637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 1647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org current_source_position_ = source_position; 1657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 1667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid CodeGenerator::AssembleGap(GapInstruction* instr) { 1697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org for (int i = GapInstruction::FIRST_INNER_POSITION; 1707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org i <= GapInstruction::LAST_INNER_POSITION; i++) { 1717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org GapInstruction::InnerPosition inner_pos = 1727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org static_cast<GapInstruction::InnerPosition>(i); 1737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ParallelMove* move = instr->GetParallelMove(inner_pos); 1747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (move != NULL) resolver()->Resolve(move); 1757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 1767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 1777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid CodeGenerator::PopulateDeoptimizationData(Handle<Code> code_object) { 1807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CompilationInfo* info = linkage()->info(); 181ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org int deopt_count = static_cast<int>(deoptimization_states_.size()); 182ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org if (deopt_count == 0) return; 1836474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org Handle<DeoptimizationInputData> data = 1846474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org DeoptimizationInputData::New(isolate(), deopt_count, TENURED); 1857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Handle<ByteArray> translation_array = 1877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org translations_.CreateByteArray(isolate()->factory()); 1887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org data->SetTranslationByteArray(*translation_array); 1907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org data->SetInlinedFunctionCount(Smi::FromInt(0)); 1917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org data->SetOptimizationId(Smi::FromInt(info->optimization_id())); 1927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // TODO(jarin) The following code was copied over from Lithium, not sure 1937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // whether the scope or the IsOptimizing condition are really needed. 1947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (info->IsOptimizing()) { 1957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Reference to shared function info does not change between phases. 1967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org AllowDeferredHandleDereference allow_handle_dereference; 1977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org data->SetSharedFunctionInfo(*info->shared_info()); 1987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 1997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org data->SetSharedFunctionInfo(Smi::FromInt(0)); 2007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 2017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Handle<FixedArray> literals = isolate()->factory()->NewFixedArray( 2037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org static_cast<int>(deoptimization_literals_.size()), TENURED); 2047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org { 2057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org AllowDeferredHandleDereference copy_handles; 2067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org for (unsigned i = 0; i < deoptimization_literals_.size(); i++) { 2077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org literals->set(i, *deoptimization_literals_[i]); 2087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 2097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org data->SetLiteralArray(*literals); 2107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 2117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // No OSR in Turbofan yet... 2137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org BailoutId osr_ast_id = BailoutId::None(); 2147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org data->SetOsrAstId(Smi::FromInt(osr_ast_id.ToInt())); 2157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org data->SetOsrPcOffset(Smi::FromInt(-1)); 2167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Populate deoptimization entries. 2187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org for (int i = 0; i < deopt_count; i++) { 219ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org DeoptimizationState* deoptimization_state = deoptimization_states_[i]; 220ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org data->SetAstId(i, deoptimization_state->bailout_id()); 22131c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org CHECK_NE(NULL, deoptimization_states_[i]); 22231c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org data->SetTranslationIndex( 223ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org i, Smi::FromInt(deoptimization_states_[i]->translation_id())); 2247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org data->SetArgumentsStackHeight(i, Smi::FromInt(0)); 2259e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org data->SetPc(i, Smi::FromInt(deoptimization_state->pc_offset())); 2267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 2277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org code_object->set_deoptimization_data(*data); 2297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 2307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 232a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgvoid CodeGenerator::AddSafepointAndDeopt(Instruction* instr) { 233d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org CallDescriptor::Flags flags(MiscField::decode(instr->opcode())); 234a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 235d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org bool needs_frame_state = (flags & CallDescriptor::kNeedsFrameState); 236a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 2379e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org RecordSafepoint( 238a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org instr->pointer_map(), Safepoint::kSimple, 0, 239a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org needs_frame_state ? Safepoint::kLazyDeopt : Safepoint::kNoLazyDeopt); 240a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 2419e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org if (flags & CallDescriptor::kNeedsNopAfterCall) { 2429e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org AddNopForSmiCodeInlining(); 2439e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org } 2449e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org 2456474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org if (needs_frame_state) { 24606b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org MarkLazyDeoptSite(); 247a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org // If the frame state is present, it starts at argument 1 248a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org // (just after the code address). 249a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org InstructionOperandConverter converter(this, instr); 2505fc1eed70f85bd1e9d0833742945798d6ef49cf0machenbach@chromium.org // Deoptimization info starts at argument 1 251a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org size_t frame_state_offset = 1; 252ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org FrameStateDescriptor* descriptor = 253ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org GetFrameStateDescriptor(instr, frame_state_offset); 2549e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org int pc_offset = masm()->pc_offset(); 2559e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org int deopt_state_id = BuildTranslation(instr, pc_offset, frame_state_offset, 2569e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org descriptor->state_combine()); 2579e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org // If the pre-call frame state differs from the post-call one, produce the 2589e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org // pre-call frame state, too. 2599e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org // TODO(jarin) We might want to avoid building the pre-call frame state 2609e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org // because it is only used to get locals and arguments (by the debugger and 2619e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org // f.arguments), and those are the same in the pre-call and post-call 2629e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org // states. 263ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org if (descriptor->state_combine() != kIgnoreOutput) { 2649e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org deopt_state_id = 2659e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org BuildTranslation(instr, -1, frame_state_offset, kIgnoreOutput); 266ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org } 2676474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org#if DEBUG 2686474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org // Make sure all the values live in stack slots or they are immediates. 2696474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org // (The values should not live in register because registers are clobbered 2706474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org // by calls.) 271a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org for (size_t i = 0; i < descriptor->size(); i++) { 2725fc1eed70f85bd1e9d0833742945798d6ef49cf0machenbach@chromium.org InstructionOperand* op = instr->InputAt(frame_state_offset + 1 + i); 2736474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org CHECK(op->IsStackSlot() || op->IsImmediate()); 2746474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org } 2756474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org#endif 2769e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org safepoints()->RecordLazyDeoptimizationIndex(deopt_state_id); 277d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org } 278a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org} 279a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 280a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 2817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgint CodeGenerator::DefineDeoptimizationLiteral(Handle<Object> literal) { 2827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int result = static_cast<int>(deoptimization_literals_.size()); 2837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org for (unsigned i = 0; i < deoptimization_literals_.size(); ++i) { 2847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (deoptimization_literals_[i].is_identical_to(literal)) return i; 2857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 2867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org deoptimization_literals_.push_back(literal); 2877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return result; 2887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 2897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 291ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgFrameStateDescriptor* CodeGenerator::GetFrameStateDescriptor( 292a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org Instruction* instr, size_t frame_state_offset) { 2935fc1eed70f85bd1e9d0833742945798d6ef49cf0machenbach@chromium.org InstructionOperandConverter i(this, instr); 294a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org InstructionSequence::StateId state_id = InstructionSequence::StateId::FromInt( 295a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org i.InputInt32(static_cast<int>(frame_state_offset))); 296ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org return code()->GetFrameStateDescriptor(state_id); 297ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org} 2985fc1eed70f85bd1e9d0833742945798d6ef49cf0machenbach@chromium.org 2997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 3009aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.orgvoid CodeGenerator::BuildTranslationForFrameStateDescriptor( 3019aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org FrameStateDescriptor* descriptor, Instruction* instr, 302a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org Translation* translation, size_t frame_state_offset, 3039aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org OutputFrameStateCombine state_combine) { 3049aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org // Outer-most state must be added to translation first. 3059aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org if (descriptor->outer_state() != NULL) { 306a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org BuildTranslationForFrameStateDescriptor(descriptor->outer_state(), instr, 307a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org translation, frame_state_offset, 308a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org kIgnoreOutput); 3099aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org } 310ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org 311a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org int id = Translation::kSelfLiteralId; 312a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org if (!descriptor->jsfunction().is_null()) { 313a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org id = DefineDeoptimizationLiteral( 314a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org Handle<Object>::cast(descriptor->jsfunction().ToHandleChecked())); 315a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org } 316a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 317a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org switch (descriptor->type()) { 318a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org case JS_FRAME: 319a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org translation->BeginJSFrame( 320a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org descriptor->bailout_id(), id, 321a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org static_cast<unsigned int>(descriptor->GetHeight(state_combine))); 322ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org break; 323a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org case ARGUMENTS_ADAPTOR: 324a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org translation->BeginArgumentsAdaptorFrame( 325a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org id, static_cast<unsigned int>(descriptor->parameters_count())); 326ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org break; 327ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org } 328ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org 329a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org frame_state_offset += descriptor->outer_state()->GetTotalSize(); 330a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org for (size_t i = 0; i < descriptor->size(); i++) { 331a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org AddTranslationForOperand( 332a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org translation, instr, 333a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org instr->InputAt(static_cast<int>(frame_state_offset + i))); 3349d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org } 3357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 336ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org switch (state_combine) { 337ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org case kPushOutput: 338ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org DCHECK(instr->OutputCount() == 1); 3399aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org AddTranslationForOperand(translation, instr, instr->OutputAt(0)); 340ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org break; 341ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org case kIgnoreOutput: 342ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org break; 343ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org } 3449aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org} 3459aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org 3469aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org 3479e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.orgint CodeGenerator::BuildTranslation(Instruction* instr, int pc_offset, 348a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org size_t frame_state_offset, 3499aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org OutputFrameStateCombine state_combine) { 3509aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org FrameStateDescriptor* descriptor = 3519aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org GetFrameStateDescriptor(instr, frame_state_offset); 3529aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org frame_state_offset++; 3539aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org 354a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org Translation translation( 355a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org &translations_, static_cast<int>(descriptor->GetFrameCount()), 356a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org static_cast<int>(descriptor->GetJSFrameCount()), zone()); 3579aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org BuildTranslationForFrameStateDescriptor(descriptor, instr, &translation, 3589aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org frame_state_offset, state_combine); 359ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org 360ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org int deoptimization_id = static_cast<int>(deoptimization_states_.size()); 361ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org 362ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org deoptimization_states_.push_back(new (zone()) DeoptimizationState( 3639e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org descriptor->bailout_id(), translation.index(), pc_offset)); 3645fc1eed70f85bd1e9d0833742945798d6ef49cf0machenbach@chromium.org 3655fc1eed70f85bd1e9d0833742945798d6ef49cf0machenbach@chromium.org return deoptimization_id; 3667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 3677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 3687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 3699d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.orgvoid CodeGenerator::AddTranslationForOperand(Translation* translation, 3709d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org Instruction* instr, 3719d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org InstructionOperand* op) { 3729d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org if (op->IsStackSlot()) { 3739d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org translation->StoreStackSlot(op->index()); 3749d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org } else if (op->IsDoubleStackSlot()) { 3759d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org translation->StoreDoubleStackSlot(op->index()); 3769d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org } else if (op->IsRegister()) { 3779d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org InstructionOperandConverter converter(this, instr); 3789d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org translation->StoreRegister(converter.ToRegister(op)); 3799d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org } else if (op->IsDoubleRegister()) { 3809d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org InstructionOperandConverter converter(this, instr); 3819d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org translation->StoreDoubleRegister(converter.ToDoubleRegister(op)); 3829d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org } else if (op->IsImmediate()) { 3839d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org InstructionOperandConverter converter(this, instr); 3849d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org Constant constant = converter.ToConstant(op); 3859d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org Handle<Object> constant_object; 3869d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org switch (constant.type()) { 3879d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org case Constant::kInt32: 3889d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org constant_object = 3899d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org isolate()->factory()->NewNumberFromInt(constant.ToInt32()); 3909d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org break; 3919d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org case Constant::kFloat64: 39206b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org constant_object = isolate()->factory()->NewNumber(constant.ToFloat64()); 3939d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org break; 3949d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org case Constant::kHeapObject: 3959d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org constant_object = constant.ToHeapObject(); 3969d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org break; 3979d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org default: 3989d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org UNREACHABLE(); 3999d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org } 4009d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org int literal_id = DefineDeoptimizationLiteral(constant_object); 4019d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org translation->StoreLiteral(literal_id); 4029d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org } else { 4039d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org UNREACHABLE(); 4049d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org } 4059d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org} 4069d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 40706b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 40806b2696801712948b665372a38f96b1f10be6997machenbach@chromium.orgvoid CodeGenerator::MarkLazyDeoptSite() { 40906b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org last_lazy_deopt_pc_ = masm()->pc_offset(); 41006b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org} 41106b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 4123e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org#if !V8_TURBOFAN_BACKEND 4133e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org 4147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid CodeGenerator::AssembleArchInstruction(Instruction* instr) { 4157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org UNIMPLEMENTED(); 4167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 4177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid CodeGenerator::AssembleArchBranch(Instruction* instr, 4207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FlagsCondition condition) { 4217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org UNIMPLEMENTED(); 4227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 4237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid CodeGenerator::AssembleArchBoolean(Instruction* instr, 4267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FlagsCondition condition) { 4277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org UNIMPLEMENTED(); 4287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 4297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 431ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgvoid CodeGenerator::AssembleDeoptimizerCall(int deoptimization_id) { 432ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org UNIMPLEMENTED(); 433ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org} 434ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org 435ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org 4367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid CodeGenerator::AssemblePrologue() { UNIMPLEMENTED(); } 4377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid CodeGenerator::AssembleReturn() { UNIMPLEMENTED(); } 4407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid CodeGenerator::AssembleMove(InstructionOperand* source, 4437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org InstructionOperand* destination) { 4447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org UNIMPLEMENTED(); 4457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 4467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid CodeGenerator::AssembleSwap(InstructionOperand* source, 4497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org InstructionOperand* destination) { 4507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org UNIMPLEMENTED(); 4517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 4527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid CodeGenerator::AddNopForSmiCodeInlining() { UNIMPLEMENTED(); } 4557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4563e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org#endif // !V8_TURBOFAN_BACKEND 4577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} // namespace compiler 4597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} // namespace internal 4607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} // namespace v8 461