| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/compiler/code-generator.h" | 5 #include "src/compiler/code-generator.h" |
| 6 | 6 |
| 7 #include "src/compiler/code-generator-impl.h" | 7 #include "src/compiler/code-generator-impl.h" |
| 8 #include "src/compiler/linkage.h" | 8 #include "src/compiler/linkage.h" |
| 9 #include "src/compiler/pipeline.h" | 9 #include "src/compiler/pipeline.h" |
| 10 | 10 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 30 }; | 30 }; |
| 31 | 31 |
| 32 | 32 |
| 33 CodeGenerator::CodeGenerator(Frame* frame, Linkage* linkage, | 33 CodeGenerator::CodeGenerator(Frame* frame, Linkage* linkage, |
| 34 InstructionSequence* code, CompilationInfo* info) | 34 InstructionSequence* code, CompilationInfo* info) |
| 35 : frame_(frame), | 35 : frame_(frame), |
| 36 linkage_(linkage), | 36 linkage_(linkage), |
| 37 code_(code), | 37 code_(code), |
| 38 info_(info), | 38 info_(info), |
| 39 labels_(zone()->NewArray<Label>(code->InstructionBlockCount())), | 39 labels_(zone()->NewArray<Label>(code->InstructionBlockCount())), |
| 40 current_block_(BasicBlock::RpoNumber::Invalid()), | 40 current_block_(RpoNumber::Invalid()), |
| 41 current_source_position_(SourcePosition::Invalid()), | 41 current_source_position_(SourcePosition::Invalid()), |
| 42 masm_(info->isolate(), NULL, 0), | 42 masm_(info->isolate(), NULL, 0), |
| 43 resolver_(this), | 43 resolver_(this), |
| 44 safepoints_(code->zone()), | 44 safepoints_(code->zone()), |
| 45 handlers_(code->zone()), | 45 handlers_(code->zone()), |
| 46 deoptimization_states_(code->zone()), | 46 deoptimization_states_(code->zone()), |
| 47 deoptimization_literals_(code->zone()), | 47 deoptimization_literals_(code->zone()), |
| 48 translations_(code->zone()), | 48 translations_(code->zone()), |
| 49 last_lazy_deopt_pc_(0), | 49 last_lazy_deopt_pc_(0), |
| 50 jump_tables_(nullptr), | 50 jump_tables_(nullptr), |
| (...skipping 27 matching lines...) Expand all Loading... |
| 78 if (block->IsDeferred() == (deferred == 0)) { | 78 if (block->IsDeferred() == (deferred == 0)) { |
| 79 continue; | 79 continue; |
| 80 } | 80 } |
| 81 // Align loop headers on 16-byte boundaries. | 81 // Align loop headers on 16-byte boundaries. |
| 82 if (block->IsLoopHeader()) masm()->Align(16); | 82 if (block->IsLoopHeader()) masm()->Align(16); |
| 83 // Bind a label for a block. | 83 // Bind a label for a block. |
| 84 current_block_ = block->rpo_number(); | 84 current_block_ = block->rpo_number(); |
| 85 if (FLAG_code_comments) { | 85 if (FLAG_code_comments) { |
| 86 // TODO(titzer): these code comments are a giant memory leak. | 86 // TODO(titzer): these code comments are a giant memory leak. |
| 87 Vector<char> buffer = Vector<char>::New(32); | 87 Vector<char> buffer = Vector<char>::New(32); |
| 88 SNPrintF(buffer, "-- B%d start --", block->id().ToInt()); | 88 SNPrintF(buffer, "-- B%d start --", block->rpo_number().ToInt()); |
| 89 masm()->RecordComment(buffer.start()); | 89 masm()->RecordComment(buffer.start()); |
| 90 } | 90 } |
| 91 masm()->bind(GetLabel(current_block_)); | 91 masm()->bind(GetLabel(current_block_)); |
| 92 for (int i = block->code_start(); i < block->code_end(); ++i) { | 92 for (int i = block->code_start(); i < block->code_end(); ++i) { |
| 93 AssembleInstruction(code()->InstructionAt(i)); | 93 AssembleInstruction(code()->InstructionAt(i)); |
| 94 } | 94 } |
| 95 } | 95 } |
| 96 } | 96 } |
| 97 | 97 |
| 98 // Assemble all out-of-line code. | 98 // Assemble all out-of-line code. |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 152 } | 152 } |
| 153 | 153 |
| 154 // Emit a code line info recording stop event. | 154 // Emit a code line info recording stop event. |
| 155 void* line_info = recorder->DetachJITHandlerData(); | 155 void* line_info = recorder->DetachJITHandlerData(); |
| 156 LOG_CODE_EVENT(isolate(), CodeEndLinePosInfoRecordEvent(*result, line_info)); | 156 LOG_CODE_EVENT(isolate(), CodeEndLinePosInfoRecordEvent(*result, line_info)); |
| 157 | 157 |
| 158 return result; | 158 return result; |
| 159 } | 159 } |
| 160 | 160 |
| 161 | 161 |
| 162 bool CodeGenerator::IsNextInAssemblyOrder(BasicBlock::RpoNumber block) const { | 162 bool CodeGenerator::IsNextInAssemblyOrder(RpoNumber block) const { |
| 163 return code()->InstructionBlockAt(current_block_)->ao_number().IsNext( | 163 return code()->InstructionBlockAt(current_block_)->ao_number().IsNext( |
| 164 code()->InstructionBlockAt(block)->ao_number()); | 164 code()->InstructionBlockAt(block)->ao_number()); |
| 165 } | 165 } |
| 166 | 166 |
| 167 | 167 |
| 168 void CodeGenerator::RecordSafepoint(PointerMap* pointers, Safepoint::Kind kind, | 168 void CodeGenerator::RecordSafepoint(PointerMap* pointers, Safepoint::Kind kind, |
| 169 int arguments, | 169 int arguments, |
| 170 Safepoint::DeoptMode deopt_mode) { | 170 Safepoint::DeoptMode deopt_mode) { |
| 171 const ZoneList<InstructionOperand*>* operands = | 171 const ZoneList<InstructionOperand*>* operands = |
| 172 pointers->GetNormalizedOperands(); | 172 pointers->GetNormalizedOperands(); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 192 AssembleSourcePosition(SourcePositionInstruction::cast(instr)); | 192 AssembleSourcePosition(SourcePositionInstruction::cast(instr)); |
| 193 } else { | 193 } else { |
| 194 // Assemble architecture-specific code for the instruction. | 194 // Assemble architecture-specific code for the instruction. |
| 195 AssembleArchInstruction(instr); | 195 AssembleArchInstruction(instr); |
| 196 | 196 |
| 197 FlagsMode mode = FlagsModeField::decode(instr->opcode()); | 197 FlagsMode mode = FlagsModeField::decode(instr->opcode()); |
| 198 FlagsCondition condition = FlagsConditionField::decode(instr->opcode()); | 198 FlagsCondition condition = FlagsConditionField::decode(instr->opcode()); |
| 199 if (mode == kFlags_branch) { | 199 if (mode == kFlags_branch) { |
| 200 // Assemble a branch after this instruction. | 200 // Assemble a branch after this instruction. |
| 201 InstructionOperandConverter i(this, instr); | 201 InstructionOperandConverter i(this, instr); |
| 202 BasicBlock::RpoNumber true_rpo = i.InputRpo(instr->InputCount() - 2); | 202 RpoNumber true_rpo = i.InputRpo(instr->InputCount() - 2); |
| 203 BasicBlock::RpoNumber false_rpo = i.InputRpo(instr->InputCount() - 1); | 203 RpoNumber false_rpo = i.InputRpo(instr->InputCount() - 1); |
| 204 | 204 |
| 205 if (true_rpo == false_rpo) { | 205 if (true_rpo == false_rpo) { |
| 206 // redundant branch. | 206 // redundant branch. |
| 207 if (!IsNextInAssemblyOrder(true_rpo)) { | 207 if (!IsNextInAssemblyOrder(true_rpo)) { |
| 208 AssembleArchJump(true_rpo); | 208 AssembleArchJump(true_rpo); |
| 209 } | 209 } |
| 210 return; | 210 return; |
| 211 } | 211 } |
| 212 if (IsNextInAssemblyOrder(true_rpo)) { | 212 if (IsNextInAssemblyOrder(true_rpo)) { |
| 213 // true block is next, can fall through if condition negated. | 213 // true block is next, can fall through if condition negated. |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 336 CallDescriptor::Flags flags(MiscField::decode(instr->opcode())); | 336 CallDescriptor::Flags flags(MiscField::decode(instr->opcode())); |
| 337 | 337 |
| 338 bool needs_frame_state = (flags & CallDescriptor::kNeedsFrameState); | 338 bool needs_frame_state = (flags & CallDescriptor::kNeedsFrameState); |
| 339 | 339 |
| 340 RecordSafepoint( | 340 RecordSafepoint( |
| 341 instr->pointer_map(), Safepoint::kSimple, 0, | 341 instr->pointer_map(), Safepoint::kSimple, 0, |
| 342 needs_frame_state ? Safepoint::kLazyDeopt : Safepoint::kNoLazyDeopt); | 342 needs_frame_state ? Safepoint::kLazyDeopt : Safepoint::kNoLazyDeopt); |
| 343 | 343 |
| 344 if (flags & CallDescriptor::kHasExceptionHandler) { | 344 if (flags & CallDescriptor::kHasExceptionHandler) { |
| 345 InstructionOperandConverter i(this, instr); | 345 InstructionOperandConverter i(this, instr); |
| 346 BasicBlock::RpoNumber handler_rpo = | 346 RpoNumber handler_rpo = |
| 347 i.InputRpo(static_cast<int>(instr->InputCount()) - 1); | 347 i.InputRpo(static_cast<int>(instr->InputCount()) - 1); |
| 348 handlers_.push_back({GetLabel(handler_rpo), masm()->pc_offset()}); | 348 handlers_.push_back({GetLabel(handler_rpo), masm()->pc_offset()}); |
| 349 } | 349 } |
| 350 | 350 |
| 351 if (flags & CallDescriptor::kNeedsNopAfterCall) { | 351 if (flags & CallDescriptor::kNeedsNopAfterCall) { |
| 352 AddNopForSmiCodeInlining(); | 352 AddNopForSmiCodeInlining(); |
| 353 } | 353 } |
| 354 | 354 |
| 355 if (needs_frame_state) { | 355 if (needs_frame_state) { |
| 356 MarkLazyDeoptSite(); | 356 MarkLazyDeoptSite(); |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 585 UNIMPLEMENTED(); | 585 UNIMPLEMENTED(); |
| 586 } | 586 } |
| 587 | 587 |
| 588 | 588 |
| 589 void CodeGenerator::AssembleArchBoolean(Instruction* instr, | 589 void CodeGenerator::AssembleArchBoolean(Instruction* instr, |
| 590 FlagsCondition condition) { | 590 FlagsCondition condition) { |
| 591 UNIMPLEMENTED(); | 591 UNIMPLEMENTED(); |
| 592 } | 592 } |
| 593 | 593 |
| 594 | 594 |
| 595 void CodeGenerator::AssembleArchJump(BasicBlock::RpoNumber target) { | 595 void CodeGenerator::AssembleArchJump(RpoNumber target) { UNIMPLEMENTED(); } |
| 596 UNIMPLEMENTED(); | |
| 597 } | |
| 598 | 596 |
| 599 | 597 |
| 600 void CodeGenerator::AssembleDeoptimizerCall(int deoptimization_id) { | 598 void CodeGenerator::AssembleDeoptimizerCall(int deoptimization_id) { |
| 601 UNIMPLEMENTED(); | 599 UNIMPLEMENTED(); |
| 602 } | 600 } |
| 603 | 601 |
| 604 | 602 |
| 605 void CodeGenerator::AssemblePrologue() { UNIMPLEMENTED(); } | 603 void CodeGenerator::AssemblePrologue() { UNIMPLEMENTED(); } |
| 606 | 604 |
| 607 | 605 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 634 : masm_(gen->masm()), next_(gen->ools_) { | 632 : masm_(gen->masm()), next_(gen->ools_) { |
| 635 gen->ools_ = this; | 633 gen->ools_ = this; |
| 636 } | 634 } |
| 637 | 635 |
| 638 | 636 |
| 639 OutOfLineCode::~OutOfLineCode() {} | 637 OutOfLineCode::~OutOfLineCode() {} |
| 640 | 638 |
| 641 } // namespace compiler | 639 } // namespace compiler |
| 642 } // namespace internal | 640 } // namespace internal |
| 643 } // namespace v8 | 641 } // namespace v8 |
| OLD | NEW |