| Index: src/x64/lithium-codegen-x64.cc
|
| diff --git a/src/x64/lithium-codegen-x64.cc b/src/x64/lithium-codegen-x64.cc
|
| index 0da98f346834ac9ee6be67303160a21829412c7f..066fdd215a09e9999d93314eced0fddb8c6b4032 100644
|
| --- a/src/x64/lithium-codegen-x64.cc
|
| +++ b/src/x64/lithium-codegen-x64.cc
|
| @@ -35,6 +35,148 @@ namespace internal {
|
|
|
| #define __ masm()->
|
|
|
| +bool LCodeGen::GenerateCode() {
|
| + HPhase phase("Code generation", chunk());
|
| + ASSERT(is_unused());
|
| + status_ = GENERATING;
|
| + return GeneratePrologue() &&
|
| + GenerateBody() &&
|
| + GenerateDeferredCode() &&
|
| + GenerateSafepointTable();
|
| +}
|
| +
|
| +
|
| +void LCodeGen::FinishCode(Handle<Code> code) {
|
| + ASSERT(is_done());
|
| + code->set_stack_slots(StackSlotCount());
|
| + code->set_safepoint_table_start(safepoints_.GetCodeOffset());
|
| + PopulateDeoptimizationData(code);
|
| +}
|
| +
|
| +
|
| +void LCodeGen::Abort(const char* format, ...) {
|
| + if (FLAG_trace_bailout) {
|
| + SmartPointer<char> debug_name = graph()->debug_name()->ToCString();
|
| + PrintF("Aborting LCodeGen in @\"%s\": ", *debug_name);
|
| + va_list arguments;
|
| + va_start(arguments, format);
|
| + OS::VPrint(format, arguments);
|
| + va_end(arguments);
|
| + PrintF("\n");
|
| + }
|
| + status_ = ABORTED;
|
| +}
|
| +
|
| +
|
| +void LCodeGen::Comment(const char* format, ...) {
|
| + Abort("Unimplemented: %s", "Comment");
|
| +}
|
| +
|
| +
|
| +bool LCodeGen::GeneratePrologue() {
|
| + Abort("Unimplemented: %s", "GeneratePrologue");
|
| + return !is_aborted();
|
| +}
|
| +
|
| +
|
| +bool LCodeGen::GenerateBody() {
|
| + ASSERT(is_generating());
|
| + bool emit_instructions = true;
|
| + for (current_instruction_ = 0;
|
| + !is_aborted() && current_instruction_ < instructions_->length();
|
| + current_instruction_++) {
|
| + LInstruction* instr = instructions_->at(current_instruction_);
|
| + if (instr->IsLabel()) {
|
| + LLabel* label = LLabel::cast(instr);
|
| + emit_instructions = !label->HasReplacement();
|
| + }
|
| +
|
| + if (emit_instructions) {
|
| + Comment(";;; @%d: %s.", current_instruction_, instr->Mnemonic());
|
| + instr->CompileToNative(this);
|
| + }
|
| + }
|
| + return !is_aborted();
|
| +}
|
| +
|
| +
|
| +LInstruction* LCodeGen::GetNextInstruction() {
|
| + if (current_instruction_ < instructions_->length() - 1) {
|
| + return instructions_->at(current_instruction_ + 1);
|
| + } else {
|
| + return NULL;
|
| + }
|
| +}
|
| +
|
| +
|
| +bool LCodeGen::GenerateDeferredCode() {
|
| + ASSERT(is_generating());
|
| + for (int i = 0; !is_aborted() && i < deferred_.length(); i++) {
|
| + LDeferredCode* code = deferred_[i];
|
| + __ bind(code->entry());
|
| + code->Generate();
|
| + __ jmp(code->exit());
|
| + }
|
| +
|
| + // Deferred code is the last part of the instruction sequence. Mark
|
| + // the generated code as done unless we bailed out.
|
| + if (!is_aborted()) status_ = DONE;
|
| + return !is_aborted();
|
| +}
|
| +
|
| +
|
| +bool LCodeGen::GenerateSafepointTable() {
|
| + Abort("Unimplemented: %s", "GeneratePrologue");
|
| + return !is_aborted();
|
| +}
|
| +
|
| +
|
| +Register LCodeGen::ToRegister(int index) const {
|
| + return Register::FromAllocationIndex(index);
|
| +}
|
| +
|
| +
|
| +XMMRegister LCodeGen::ToDoubleRegister(int index) const {
|
| + return XMMRegister::FromAllocationIndex(index);
|
| +}
|
| +
|
| +
|
| +Register LCodeGen::ToRegister(LOperand* op) const {
|
| + ASSERT(op->IsRegister());
|
| + return ToRegister(op->index());
|
| +}
|
| +
|
| +
|
| +XMMRegister LCodeGen::ToDoubleRegister(LOperand* op) const {
|
| + ASSERT(op->IsDoubleRegister());
|
| + return ToDoubleRegister(op->index());
|
| +}
|
| +
|
| +
|
| +int LCodeGen::ToInteger32(LConstantOperand* op) const {
|
| + Handle<Object> value = chunk_->LookupLiteral(op);
|
| + ASSERT(chunk_->LookupLiteralRepresentation(op).IsInteger32());
|
| + ASSERT(static_cast<double>(static_cast<int32_t>(value->Number())) ==
|
| + value->Number());
|
| + return static_cast<int32_t>(value->Number());
|
| +}
|
| +
|
| +
|
| +Operand LCodeGen::ToOperand(LOperand* op) const {
|
| + // Does not handle registers. In X64 assembler, plain registers are not
|
| + // representable as an Operand.
|
| + ASSERT(op->IsStackSlot() || op->IsDoubleStackSlot());
|
| + int index = op->index();
|
| + if (index >= 0) {
|
| + // Local or spill slot. Skip the frame pointer, function, and
|
| + // context in the fixed part of the frame.
|
| + return Operand(rbp, -(index + 3) * kPointerSize);
|
| + } else {
|
| + // Incoming parameter. Skip the return address.
|
| + return Operand(rbp, -(index - 1) * kPointerSize);
|
| + }
|
| +}
|
| +
|
|
|
| void LCodeGen::WriteTranslation(LEnvironment* environment,
|
| Translation* translation) {
|
| @@ -75,6 +217,886 @@ void LCodeGen::WriteTranslation(LEnvironment* environment,
|
| }
|
|
|
|
|
| +void LCodeGen::AddToTranslation(Translation* translation,
|
| + LOperand* op,
|
| + bool is_tagged) {
|
| + if (op == NULL) {
|
| + // TODO(twuerthinger): Introduce marker operands to indicate that this value
|
| + // is not present and must be reconstructed from the deoptimizer. Currently
|
| + // this is only used for the arguments object.
|
| + translation->StoreArgumentsObject();
|
| + } else if (op->IsStackSlot()) {
|
| + if (is_tagged) {
|
| + translation->StoreStackSlot(op->index());
|
| + } else {
|
| + translation->StoreInt32StackSlot(op->index());
|
| + }
|
| + } else if (op->IsDoubleStackSlot()) {
|
| + translation->StoreDoubleStackSlot(op->index());
|
| + } else if (op->IsArgument()) {
|
| + ASSERT(is_tagged);
|
| + int src_index = StackSlotCount() + op->index();
|
| + translation->StoreStackSlot(src_index);
|
| + } else if (op->IsRegister()) {
|
| + Register reg = ToRegister(op);
|
| + if (is_tagged) {
|
| + translation->StoreRegister(reg);
|
| + } else {
|
| + translation->StoreInt32Register(reg);
|
| + }
|
| + } else if (op->IsDoubleRegister()) {
|
| + XMMRegister reg = ToDoubleRegister(op);
|
| + translation->StoreDoubleRegister(reg);
|
| + } else if (op->IsConstantOperand()) {
|
| + Handle<Object> literal = chunk()->LookupLiteral(LConstantOperand::cast(op));
|
| + int src_index = DefineDeoptimizationLiteral(literal);
|
| + translation->StoreLiteral(src_index);
|
| + } else {
|
| + UNREACHABLE();
|
| + }
|
| +}
|
| +
|
| +
|
| +void LCodeGen::CallCode(Handle<Code> code,
|
| + RelocInfo::Mode mode,
|
| + LInstruction* instr) {
|
| + Abort("Unimplemented: %s", "CallCode");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::CallRuntime(Runtime::Function* function,
|
| + int num_arguments,
|
| + LInstruction* instr) {
|
| + Abort("Unimplemented: %s", "CallRuntime");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::RegisterLazyDeoptimization(LInstruction* instr) {
|
| + // Create the environment to bailout to. If the call has side effects
|
| + // execution has to continue after the call otherwise execution can continue
|
| + // from a previous bailout point repeating the call.
|
| + LEnvironment* deoptimization_environment;
|
| + if (instr->HasDeoptimizationEnvironment()) {
|
| + deoptimization_environment = instr->deoptimization_environment();
|
| + } else {
|
| + deoptimization_environment = instr->environment();
|
| + }
|
| +
|
| + RegisterEnvironmentForDeoptimization(deoptimization_environment);
|
| + RecordSafepoint(instr->pointer_map(),
|
| + deoptimization_environment->deoptimization_index());
|
| +}
|
| +
|
| +
|
| +void LCodeGen::RegisterEnvironmentForDeoptimization(LEnvironment* environment) {
|
| + Abort("Unimplemented: %s", "RegisterEnvironmentForDeoptimization");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DeoptimizeIf(Condition cc, LEnvironment* environment) {
|
| + Abort("Unimplemented: %s", "Deoptimiz");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::PopulateDeoptimizationData(Handle<Code> code) {
|
| + int length = deoptimizations_.length();
|
| + if (length == 0) return;
|
| + ASSERT(FLAG_deopt);
|
| + Handle<DeoptimizationInputData> data =
|
| + Factory::NewDeoptimizationInputData(length, TENURED);
|
| +
|
| + data->SetTranslationByteArray(*translations_.CreateByteArray());
|
| + data->SetInlinedFunctionCount(Smi::FromInt(inlined_function_count_));
|
| +
|
| + Handle<FixedArray> literals =
|
| + Factory::NewFixedArray(deoptimization_literals_.length(), TENURED);
|
| + for (int i = 0; i < deoptimization_literals_.length(); i++) {
|
| + literals->set(i, *deoptimization_literals_[i]);
|
| + }
|
| + data->SetLiteralArray(*literals);
|
| +
|
| + data->SetOsrAstId(Smi::FromInt(info_->osr_ast_id()));
|
| + data->SetOsrPcOffset(Smi::FromInt(osr_pc_offset_));
|
| +
|
| + // Populate the deoptimization entries.
|
| + for (int i = 0; i < length; i++) {
|
| + LEnvironment* env = deoptimizations_[i];
|
| + data->SetAstId(i, Smi::FromInt(env->ast_id()));
|
| + data->SetTranslationIndex(i, Smi::FromInt(env->translation_index()));
|
| + data->SetArgumentsStackHeight(i,
|
| + Smi::FromInt(env->arguments_stack_height()));
|
| + }
|
| + code->set_deoptimization_data(*data);
|
| +}
|
| +
|
| +
|
| +int LCodeGen::DefineDeoptimizationLiteral(Handle<Object> literal) {
|
| + int result = deoptimization_literals_.length();
|
| + for (int i = 0; i < deoptimization_literals_.length(); ++i) {
|
| + if (deoptimization_literals_[i].is_identical_to(literal)) return i;
|
| + }
|
| + deoptimization_literals_.Add(literal);
|
| + return result;
|
| +}
|
| +
|
| +
|
| +void LCodeGen::PopulateDeoptimizationLiteralsWithInlinedFunctions() {
|
| + ASSERT(deoptimization_literals_.length() == 0);
|
| +
|
| + const ZoneList<Handle<JSFunction> >* inlined_closures =
|
| + chunk()->inlined_closures();
|
| +
|
| + for (int i = 0, length = inlined_closures->length();
|
| + i < length;
|
| + i++) {
|
| + DefineDeoptimizationLiteral(inlined_closures->at(i));
|
| + }
|
| +
|
| + inlined_function_count_ = deoptimization_literals_.length();
|
| +}
|
| +
|
| +
|
| +void LCodeGen::RecordSafepoint(LPointerMap* pointers,
|
| + int deoptimization_index) {
|
| + const ZoneList<LOperand*>* operands = pointers->operands();
|
| + Safepoint safepoint = safepoints_.DefineSafepoint(masm(),
|
| + deoptimization_index);
|
| + for (int i = 0; i < operands->length(); i++) {
|
| + LOperand* pointer = operands->at(i);
|
| + if (pointer->IsStackSlot()) {
|
| + safepoint.DefinePointerSlot(pointer->index());
|
| + }
|
| + }
|
| +}
|
| +
|
| +
|
| +void LCodeGen::RecordSafepointWithRegisters(LPointerMap* pointers,
|
| + int arguments,
|
| + int deoptimization_index) {
|
| + const ZoneList<LOperand*>* operands = pointers->operands();
|
| + Safepoint safepoint =
|
| + safepoints_.DefineSafepointWithRegisters(
|
| + masm(), arguments, deoptimization_index);
|
| + for (int i = 0; i < operands->length(); i++) {
|
| + LOperand* pointer = operands->at(i);
|
| + if (pointer->IsStackSlot()) {
|
| + safepoint.DefinePointerSlot(pointer->index());
|
| + } else if (pointer->IsRegister()) {
|
| + safepoint.DefinePointerRegister(ToRegister(pointer));
|
| + }
|
| + }
|
| + // Register rsi always contains a pointer to the context.
|
| + safepoint.DefinePointerRegister(rsi);
|
| +}
|
| +
|
| +
|
| +void LCodeGen::RecordPosition(int position) {
|
| + if (!FLAG_debug_info || position == RelocInfo::kNoPosition) return;
|
| + masm()->positions_recorder()->RecordPosition(position);
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoLabel(LLabel* label) {
|
| + if (label->is_loop_header()) {
|
| + Comment(";;; B%d - LOOP entry", label->block_id());
|
| + } else {
|
| + Comment(";;; B%d", label->block_id());
|
| + }
|
| + __ bind(label->label());
|
| + current_block_ = label->block_id();
|
| + LCodeGen::DoGap(label);
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoParallelMove(LParallelMove* move) {
|
| + Abort("Unimplemented: %s", "DoParallelMove");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoGap(LGap* gap) {
|
| + for (int i = LGap::FIRST_INNER_POSITION;
|
| + i <= LGap::LAST_INNER_POSITION;
|
| + i++) {
|
| + LGap::InnerPosition inner_pos = static_cast<LGap::InnerPosition>(i);
|
| + LParallelMove* move = gap->GetParallelMove(inner_pos);
|
| + if (move != NULL) DoParallelMove(move);
|
| + }
|
| +
|
| + LInstruction* next = GetNextInstruction();
|
| + if (next != NULL && next->IsLazyBailout()) {
|
| + int pc = masm()->pc_offset();
|
| + safepoints_.SetPcAfterGap(pc);
|
| + }
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoParameter(LParameter* instr) {
|
| + // Nothing to do.
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoCallStub(LCallStub* instr) {
|
| + Abort("Unimplemented: %s", "DoCallStub");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoUnknownOSRValue(LUnknownOSRValue* instr) {
|
| + // Nothing to do.
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoModI(LModI* instr) {
|
| + Abort("Unimplemented: %s", "DoModI");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoDivI(LDivI* instr) {
|
| + Abort("Unimplemented: %s", "DoDivI");}
|
| +
|
| +
|
| +void LCodeGen::DoMulI(LMulI* instr) {
|
| + Abort("Unimplemented: %s", "DoMultI");}
|
| +
|
| +
|
| +void LCodeGen::DoBitI(LBitI* instr) {
|
| + Abort("Unimplemented: %s", "DoBitI");}
|
| +
|
| +
|
| +void LCodeGen::DoShiftI(LShiftI* instr) {
|
| + Abort("Unimplemented: %s", "DoShiftI");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoSubI(LSubI* instr) {
|
| + Abort("Unimplemented: %s", "DoSubI");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoConstantI(LConstantI* instr) {
|
| + Abort("Unimplemented: %s", "DoConstantI");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoConstantD(LConstantD* instr) {
|
| + Abort("Unimplemented: %s", "DoConstantI");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoConstantT(LConstantT* instr) {
|
| + Abort("Unimplemented: %s", "DoConstantT");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoJSArrayLength(LJSArrayLength* instr) {
|
| + Abort("Unimplemented: %s", "DoJSArrayLength");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoFixedArrayLength(LFixedArrayLength* instr) {
|
| + Abort("Unimplemented: %s", "DoFixedArrayLength");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoValueOf(LValueOf* instr) {
|
| + Abort("Unimplemented: %s", "DoValueOf");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoBitNotI(LBitNotI* instr) {
|
| + Abort("Unimplemented: %s", "DoBitNotI");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoThrow(LThrow* instr) {
|
| + Abort("Unimplemented: %s", "DoThrow");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoAddI(LAddI* instr) {
|
| + Abort("Unimplemented: %s", "DoAddI");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoArithmeticD(LArithmeticD* instr) {
|
| + Abort("Unimplemented: %s", "DoArithmeticD");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoArithmeticT(LArithmeticT* instr) {
|
| + Abort("Unimplemented: %s", "DoArithmeticT");
|
| +}
|
| +
|
| +
|
| +int LCodeGen::GetNextEmittedBlock(int block) {
|
| + for (int i = block + 1; i < graph()->blocks()->length(); ++i) {
|
| + LLabel* label = chunk_->GetLabel(i);
|
| + if (!label->HasReplacement()) return i;
|
| + }
|
| + return -1;
|
| +}
|
| +
|
| +
|
| +void LCodeGen::EmitBranch(int left_block, int right_block, Condition cc) {
|
| + Abort("Unimplemented: %s", "EmitBranch");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoBranch(LBranch* instr) {
|
| + Abort("Unimplemented: %s", "DoBranch");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::EmitGoto(int block, LDeferredCode* deferred_stack_check) {
|
| + Abort("Unimplemented: %s", "EmitGoto");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoDeferredStackCheck(LGoto* instr) {
|
| + Abort("Unimplemented: %s", "DoDeferredStackCheck");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoGoto(LGoto* instr) {
|
| + Abort("Unimplemented: %s", "DoGoto");
|
| +}
|
| +
|
| +
|
| +Condition LCodeGen::TokenToCondition(Token::Value op, bool is_unsigned) {
|
| + Condition cond = no_condition;
|
| + switch (op) {
|
| + case Token::EQ:
|
| + case Token::EQ_STRICT:
|
| + cond = equal;
|
| + break;
|
| + case Token::LT:
|
| + cond = is_unsigned ? below : less;
|
| + break;
|
| + case Token::GT:
|
| + cond = is_unsigned ? above : greater;
|
| + break;
|
| + case Token::LTE:
|
| + cond = is_unsigned ? below_equal : less_equal;
|
| + break;
|
| + case Token::GTE:
|
| + cond = is_unsigned ? above_equal : greater_equal;
|
| + break;
|
| + case Token::IN:
|
| + case Token::INSTANCEOF:
|
| + default:
|
| + UNREACHABLE();
|
| + }
|
| + return cond;
|
| +}
|
| +
|
| +
|
| +void LCodeGen::EmitCmpI(LOperand* left, LOperand* right) {
|
| + Abort("Unimplemented: %s", "EmitCmpI");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoCmpID(LCmpID* instr) {
|
| + Abort("Unimplemented: %s", "DoCmpID");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoCmpIDAndBranch(LCmpIDAndBranch* instr) {
|
| + Abort("Unimplemented: %s", "DoCmpIDAndBranch");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoCmpJSObjectEq(LCmpJSObjectEq* instr) {
|
| + Abort("Unimplemented: %s", "DoCmpJSObjectEq");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoCmpJSObjectEqAndBranch(LCmpJSObjectEqAndBranch* instr) {
|
| + Abort("Unimplemented: %s", "DoCmpJSObjectAndBranch");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoIsNull(LIsNull* instr) {
|
| + Abort("Unimplemented: %s", "DoIsNull");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoIsNullAndBranch(LIsNullAndBranch* instr) {
|
| + Abort("Unimplemented: %s", "DoIsNullAndBranch");
|
| +}
|
| +
|
| +
|
| +Condition LCodeGen::EmitIsObject(Register input,
|
| + Register temp1,
|
| + Register temp2,
|
| + Label* is_not_object,
|
| + Label* is_object) {
|
| + Abort("Unimplemented: %s", "EmitIsObject");
|
| + return below_equal;
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoIsObject(LIsObject* instr) {
|
| + Abort("Unimplemented: %s", "DoIsObject");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoIsObjectAndBranch(LIsObjectAndBranch* instr) {
|
| + Abort("Unimplemented: %s", "DoIsObjectAndBranch");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoIsSmi(LIsSmi* instr) {
|
| + Abort("Unimplemented: %s", "DoIsSmi");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoIsSmiAndBranch(LIsSmiAndBranch* instr) {
|
| + Abort("Unimplemented: %s", "DoIsSmiAndBranch");
|
| +}
|
| +
|
| +
|
| +InstanceType LHasInstanceType::TestType() {
|
| + InstanceType from = hydrogen()->from();
|
| + InstanceType to = hydrogen()->to();
|
| + if (from == FIRST_TYPE) return to;
|
| + ASSERT(from == to || to == LAST_TYPE);
|
| + return from;
|
| +}
|
| +
|
| +
|
| +
|
| +Condition LHasInstanceType::BranchCondition() {
|
| + InstanceType from = hydrogen()->from();
|
| + InstanceType to = hydrogen()->to();
|
| + if (from == to) return equal;
|
| + if (to == LAST_TYPE) return above_equal;
|
| + if (from == FIRST_TYPE) return below_equal;
|
| + UNREACHABLE();
|
| + return equal;
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoHasInstanceType(LHasInstanceType* instr) {
|
| + Abort("Unimplemented: %s", "DoHasInstanceType");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoHasInstanceTypeAndBranch(LHasInstanceTypeAndBranch* instr) {
|
| + Abort("Unimplemented: %s", "DoHasInstanceTypeAndBranch");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoHasCachedArrayIndex(LHasCachedArrayIndex* instr) {
|
| + Abort("Unimplemented: %s", "DoHasCachedArrayIndex");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoHasCachedArrayIndexAndBranch(
|
| + LHasCachedArrayIndexAndBranch* instr) {
|
| + Abort("Unimplemented: %s", "DoHasCachedArrayIndexAndBranch");
|
| +}
|
| +
|
| +
|
| +// Branches to a label or falls through with the answer in the z flag. Trashes
|
| +// the temp registers, but not the input. Only input and temp2 may alias.
|
| +void LCodeGen::EmitClassOfTest(Label* is_true,
|
| + Label* is_false,
|
| + Handle<String>class_name,
|
| + Register input,
|
| + Register temp,
|
| + Register temp2) {
|
| + Abort("Unimplemented: %s", "EmitClassOfTest");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoClassOfTest(LClassOfTest* instr) {
|
| + Abort("Unimplemented: %s", "DoClassOfTest");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoClassOfTestAndBranch(LClassOfTestAndBranch* instr) {
|
| + Abort("Unimplemented: %s", "DoClassOfTestAndBranch");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoCmpMapAndBranch(LCmpMapAndBranch* instr) {
|
| + Abort("Unimplemented: %s", "DoCmpMapAndBranch");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoInstanceOf(LInstanceOf* instr) {
|
| + Abort("Unimplemented: %s", "DoInstanceOf");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoInstanceOfAndBranch(LInstanceOfAndBranch* instr) {
|
| + Abort("Unimplemented: %s", "DoInstanceOfAndBranch");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr) {
|
| + Abort("Unimplemented: %s", "DoInstanceOfKnowGLobal");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoDeferredLInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr,
|
| + Label* map_check) {
|
| + Abort("Unimplemented: %s", "DoDeferredLInstanceOfKnownGlobakl");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoCmpT(LCmpT* instr) {
|
| + Abort("Unimplemented: %s", "DoCmpT");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoCmpTAndBranch(LCmpTAndBranch* instr) {
|
| + Abort("Unimplemented: %s", "DoCmpTAndBranch");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoReturn(LReturn* instr) {
|
| + Abort("Unimplemented: %s", "DoReturn");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoLoadGlobal(LLoadGlobal* instr) {
|
| + Abort("Unimplemented: %s", "DoLoadGlobal");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoStoreGlobal(LStoreGlobal* instr) {
|
| + Abort("Unimplemented: %s", "DoStoreGlobal");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoLoadNamedField(LLoadNamedField* instr) {
|
| + Abort("Unimplemented: %s", "DoLoadNamedField");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoLoadNamedGeneric(LLoadNamedGeneric* instr) {
|
| + Abort("Unimplemented: %s", "DoLoadNamedGeneric");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoLoadFunctionPrototype(LLoadFunctionPrototype* instr) {
|
| + Abort("Unimplemented: %s", "DoLoadFunctionPrototype");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoLoadElements(LLoadElements* instr) {
|
| + Abort("Unimplemented: %s", "DoLoadElements");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoAccessArgumentsAt(LAccessArgumentsAt* instr) {
|
| + Abort("Unimplemented: %s", "DoAccessArgumentsAt");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoLoadKeyedFastElement(LLoadKeyedFastElement* instr) {
|
| + Abort("Unimplemented: %s", "DoLoadKeyedFastElement");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoLoadKeyedGeneric(LLoadKeyedGeneric* instr) {
|
| + Abort("Unimplemented: %s", "DoLoadKeyedGeneric");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoArgumentsElements(LArgumentsElements* instr) {
|
| + Abort("Unimplemented: %s", "DoArgumentsElements");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoArgumentsLength(LArgumentsLength* instr) {
|
| + Abort("Unimplemented: %s", "DoArgumentsLength");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoApplyArguments(LApplyArguments* instr) {
|
| + Abort("Unimplemented: %s", "DoApplyArguments");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoPushArgument(LPushArgument* instr) {
|
| + Abort("Unimplemented: %s", "DoPushArgument");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoGlobalObject(LGlobalObject* instr) {
|
| + Abort("Unimplemented: %s", "DoGlobalObject");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoGlobalReceiver(LGlobalReceiver* instr) {
|
| + Abort("Unimplemented: %s", "DoGlobalReceiver");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::CallKnownFunction(Handle<JSFunction> function,
|
| + int arity,
|
| + LInstruction* instr) {
|
| + Abort("Unimplemented: %s", "CallKnownFunction");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoCallConstantFunction(LCallConstantFunction* instr) {
|
| + Abort("Unimplemented: %s", "DoCallConstantFunction");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoDeferredMathAbsTaggedHeapNumber(LUnaryMathOperation* instr) {
|
| + Abort("Unimplemented: %s", "DoDeferredMathAbsTaggedHeapNumber");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoMathAbs(LUnaryMathOperation* instr) {
|
| + Abort("Unimplemented: %s", "DoMathAbs");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoMathFloor(LUnaryMathOperation* instr) {
|
| + Abort("Unimplemented: %s", "DoMathFloor");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoMathRound(LUnaryMathOperation* instr) {
|
| + Abort("Unimplemented: %s", "DoMathRound");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoMathSqrt(LUnaryMathOperation* instr) {
|
| + Abort("Unimplemented: %s", "DoMathSqrt");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoMathPowHalf(LUnaryMathOperation* instr) {
|
| + Abort("Unimplemented: %s", "DoMathPowHalf");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoPower(LPower* instr) {
|
| + Abort("Unimplemented: %s", "DoPower");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoMathLog(LUnaryMathOperation* instr) {
|
| + Abort("Unimplemented: %s", "DoMathLog");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoMathCos(LUnaryMathOperation* instr) {
|
| + Abort("Unimplemented: %s", "DoMathCos");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoMathSin(LUnaryMathOperation* instr) {
|
| + Abort("Unimplemented: %s", "DoMathSin");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoUnaryMathOperation(LUnaryMathOperation* instr) {
|
| + Abort("Unimplemented: %s", "DoUnaryMathOperation");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoCallKeyed(LCallKeyed* instr) {
|
| + Abort("Unimplemented: %s", "DoCallKeyed");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoCallNamed(LCallNamed* instr) {
|
| + Abort("Unimplemented: %s", "DoCallNamed");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoCallFunction(LCallFunction* instr) {
|
| + Abort("Unimplemented: %s", "DoCallFunction");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoCallGlobal(LCallGlobal* instr) {
|
| + Abort("Unimplemented: %s", "DoCallGlobal");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoCallKnownGlobal(LCallKnownGlobal* instr) {
|
| + Abort("Unimplemented: %s", "DoCallKnownGlobal");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoCallNew(LCallNew* instr) {
|
| + Abort("Unimplemented: %s", "DoCallNew");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoCallRuntime(LCallRuntime* instr) {
|
| + Abort("Unimplemented: %s", "DoCallRuntime");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) {
|
| + Abort("Unimplemented: %s", "DoStoreNamedField");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoStoreNamedGeneric(LStoreNamedGeneric* instr) {
|
| + Abort("Unimplemented: %s", "DoStoreNamedGeneric");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoBoundsCheck(LBoundsCheck* instr) {
|
| + Abort("Unimplemented: %s", "DoBoundsCheck");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoStoreKeyedFastElement(LStoreKeyedFastElement* instr) {
|
| + Abort("Unimplemented: %s", "DoStoreKeyedFastElement");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) {
|
| + Abort("Unimplemented: %s", "DoStoreKeyedGeneric");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoInteger32ToDouble(LInteger32ToDouble* instr) {
|
| + Abort("Unimplemented: %s", "DoInteger32ToDouble");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoNumberTagI(LNumberTagI* instr) {
|
| + Abort("Unimplemented: %s", "DoNumberTagI");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoDeferredNumberTagI(LNumberTagI* instr) {
|
| + Abort("Unimplemented: %s", "DoDeferredNumberTagI");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoNumberTagD(LNumberTagD* instr) {
|
| + Abort("Unimplemented: %s", "DoNumberTagD");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoDeferredNumberTagD(LNumberTagD* instr) {
|
| + Abort("Unimplemented: %s", "DoDeferredNumberTagD");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoSmiTag(LSmiTag* instr) {
|
| + Abort("Unimplemented: %s", "DoSmiTag");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoSmiUntag(LSmiUntag* instr) {
|
| + Abort("Unimplemented: %s", "DoSmiUntag");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::EmitNumberUntagD(Register input_reg,
|
| + XMMRegister result_reg,
|
| + LEnvironment* env) {
|
| + Abort("Unimplemented: %s", "EmitNumberUntagD");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoDeferredTaggedToI(LTaggedToI* instr) {
|
| + Abort("Unimplemented: %s", "DoDeferredTaggedToI");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoTaggedToI(LTaggedToI* instr) {
|
| + Abort("Unimplemented: %s", "DoTaggedToI");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoNumberUntagD(LNumberUntagD* instr) {
|
| + Abort("Unimplemented: %s", "DoNumberUntagD");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoDoubleToI(LDoubleToI* instr) {
|
| + Abort("Unimplemented: %s", "DoDoubleToI");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoCheckSmi(LCheckSmi* instr) {
|
| + Abort("Unimplemented: %s", "DoCheckSmi");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoCheckInstanceType(LCheckInstanceType* instr) {
|
| + Abort("Unimplemented: %s", "DoCheckInstanceType");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoCheckFunction(LCheckFunction* instr) {
|
| + Abort("Unimplemented: %s", "DoCheckFunction");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoCheckMap(LCheckMap* instr) {
|
| + Abort("Unimplemented: %s", "DoCheckMap");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::LoadPrototype(Register result, Handle<JSObject> prototype) {
|
| + Abort("Unimplemented: %s", "LoadPrototype");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoCheckPrototypeMaps(LCheckPrototypeMaps* instr) {
|
| + Abort("Unimplemented: %s", "DoCheckPrototypeMaps");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoArrayLiteral(LArrayLiteral* instr) {
|
| + Abort("Unimplemented: %s", "DoArrayLiteral");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoObjectLiteral(LObjectLiteral* instr) {
|
| + Abort("Unimplemented: %s", "DoObjectLiteral");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoRegExpLiteral(LRegExpLiteral* instr) {
|
| + Abort("Unimplemented: %s", "DoRegExpLiteral");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoFunctionLiteral(LFunctionLiteral* instr) {
|
| + Abort("Unimplemented: %s", "DoFunctionLiteral");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoTypeof(LTypeof* instr) {
|
| + Abort("Unimplemented: %s", "DoTypeof");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoTypeofIs(LTypeofIs* instr) {
|
| + Abort("Unimplemented: %s", "DoTypeofIs");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoTypeofIsAndBranch(LTypeofIsAndBranch* instr) {
|
| + Abort("Unimplemented: %s", "DoTypeofIsAndBranch");
|
| +}
|
| +
|
| +
|
| +Condition LCodeGen::EmitTypeofIs(Label* true_label,
|
| + Label* false_label,
|
| + Register input,
|
| + Handle<String> type_name) {
|
| + Abort("Unimplemented: %s", "EmitTypeofIs");
|
| + return no_condition;
|
| +}
|
| +
|
| +
|
| void LCodeGen::DoLazyBailout(LLazyBailout* instr) {
|
| // No code for lazy bailout instruction. Used to capture environment after a
|
| // call for populating the safepoint data with deoptimization data.
|
| @@ -86,11 +1108,20 @@ void LCodeGen::DoDeoptimize(LDeoptimize* instr) {
|
| }
|
|
|
|
|
| -void LCodeGen::DoOsrEntry(LOsrEntry* instr) {
|
| - UNIMPLEMENTED();
|
| +void LCodeGen::DoDeleteProperty(LDeleteProperty* instr) {
|
| + Abort("Unimplemented: %s", "DoDeleteProperty");
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoStackCheck(LStackCheck* instr) {
|
| + Abort("Unimplemented: %s", "DoStackCheck");
|
| }
|
|
|
|
|
| +void LCodeGen::DoOsrEntry(LOsrEntry* instr) {
|
| + Abort("Unimplemented: %s", "DoOsrEntry");
|
| +}
|
| +
|
| #undef __
|
|
|
| } } // namespace v8::internal
|
|
|