Chromium Code Reviews| 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..b89ee8c068f31cfbfec3746379453ba4c2454477 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,885 @@ 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 |
|
Rico
2011/01/12 20:06:25
Lets file a bug for this if it needs to be fixed-
|
| + // 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"); |
| +} |
| + |
|
Rico
2011/01/12 20:06:25
add line
|
| +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; |
| +} |
| + |
| + |
|
Rico
2011/01/12 20:06:25
extra blank line
|
| + |
| +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 +1107,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");} |
|
Rico
2011/01/12 20:06:25
Move } to its own line
|
| + |
| + |
| #undef __ |
| } } // namespace v8::internal |