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 |
11 namespace v8 { | 11 namespace v8 { |
12 namespace internal { | 12 namespace internal { |
13 namespace compiler { | 13 namespace compiler { |
14 | 14 |
15 CodeGenerator::CodeGenerator(Frame* frame, Linkage* linkage, | 15 CodeGenerator::CodeGenerator(Frame* frame, Linkage* linkage, |
16 InstructionSequence* code, CompilationInfo* info) | 16 InstructionSequence* code, CompilationInfo* info) |
17 : frame_(frame), | 17 : frame_(frame), |
18 linkage_(linkage), | 18 linkage_(linkage), |
19 code_(code), | 19 code_(code), |
20 info_(info), | 20 info_(info), |
21 labels_(zone()->NewArray<Label>(code->InstructionBlockCount())), | 21 labels_(zone()->NewArray<Label>(code->InstructionBlockCount())), |
22 current_block_(BasicBlock::RpoNumber::Invalid()), | 22 current_block_(BasicBlock::RpoNumber::Invalid()), |
23 current_source_position_(SourcePosition::Invalid()), | 23 current_source_position_(SourcePosition::Invalid()), |
24 masm_(code->zone()->isolate(), NULL, 0), | 24 masm_(code->zone()->isolate(), NULL, 0), |
25 resolver_(this), | 25 resolver_(this), |
26 safepoints_(code->zone()), | 26 safepoints_(code->zone()), |
27 deoptimization_states_(code->zone()), | 27 deoptimization_states_(code->zone()), |
28 deoptimization_literals_(code->zone()), | 28 deoptimization_literals_(code->zone()), |
29 translations_(code->zone()), | 29 translations_(code->zone()), |
30 last_lazy_deopt_pc_(0) { | 30 last_lazy_deopt_pc_(0), |
| 31 ools_(nullptr) { |
31 for (int i = 0; i < code->InstructionBlockCount(); ++i) { | 32 for (int i = 0; i < code->InstructionBlockCount(); ++i) { |
32 new (&labels_[i]) Label; | 33 new (&labels_[i]) Label; |
33 } | 34 } |
34 } | 35 } |
35 | 36 |
36 | 37 |
37 Handle<Code> CodeGenerator::GenerateCode() { | 38 Handle<Code> CodeGenerator::GenerateCode() { |
38 CompilationInfo* info = this->info(); | 39 CompilationInfo* info = this->info(); |
39 | 40 |
40 // Emit a code line info recording start event. | 41 // Emit a code line info recording start event. |
(...skipping 23 matching lines...) Expand all Loading... |
64 SNPrintF(buffer, "-- B%d start --", block->id().ToInt()); | 65 SNPrintF(buffer, "-- B%d start --", block->id().ToInt()); |
65 masm()->RecordComment(buffer.start()); | 66 masm()->RecordComment(buffer.start()); |
66 } | 67 } |
67 masm()->bind(GetLabel(current_block_)); | 68 masm()->bind(GetLabel(current_block_)); |
68 for (int i = block->code_start(); i < block->code_end(); ++i) { | 69 for (int i = block->code_start(); i < block->code_end(); ++i) { |
69 AssembleInstruction(code()->InstructionAt(i)); | 70 AssembleInstruction(code()->InstructionAt(i)); |
70 } | 71 } |
71 } | 72 } |
72 } | 73 } |
73 | 74 |
| 75 // Assemble all out-of-line code. |
| 76 if (ools_) { |
| 77 masm()->RecordComment("-- Out of line code --"); |
| 78 for (OutOfLineCode* ool = ools_; ool; ool = ool->next()) { |
| 79 masm()->bind(ool->entry()); |
| 80 ool->Generate(); |
| 81 masm()->jmp(ool->exit()); |
| 82 } |
| 83 } |
| 84 |
74 FinishCode(masm()); | 85 FinishCode(masm()); |
75 | 86 |
76 // Ensure there is space for lazy deopt. | 87 // Ensure there is space for lazy deopt. |
77 if (!info->IsStub()) { | 88 if (!info->IsStub()) { |
78 int target_offset = masm()->pc_offset() + Deoptimizer::patch_size(); | 89 int target_offset = masm()->pc_offset() + Deoptimizer::patch_size(); |
79 while (masm()->pc_offset() < target_offset) { | 90 while (masm()->pc_offset() < target_offset) { |
80 masm()->nop(); | 91 masm()->nop(); |
81 } | 92 } |
82 } | 93 } |
83 | 94 |
(...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
548 void CodeGenerator::AssembleSwap(InstructionOperand* source, | 559 void CodeGenerator::AssembleSwap(InstructionOperand* source, |
549 InstructionOperand* destination) { | 560 InstructionOperand* destination) { |
550 UNIMPLEMENTED(); | 561 UNIMPLEMENTED(); |
551 } | 562 } |
552 | 563 |
553 | 564 |
554 void CodeGenerator::AddNopForSmiCodeInlining() { UNIMPLEMENTED(); } | 565 void CodeGenerator::AddNopForSmiCodeInlining() { UNIMPLEMENTED(); } |
555 | 566 |
556 #endif // !V8_TURBOFAN_BACKEND | 567 #endif // !V8_TURBOFAN_BACKEND |
557 | 568 |
| 569 |
| 570 OutOfLineCode::OutOfLineCode(CodeGenerator* gen) |
| 571 : masm_(gen->masm()), next_(gen->ools_) { |
| 572 gen->ools_ = this; |
| 573 } |
| 574 |
| 575 |
| 576 OutOfLineCode::~OutOfLineCode() {} |
| 577 |
558 } // namespace compiler | 578 } // namespace compiler |
559 } // namespace internal | 579 } // namespace internal |
560 } // namespace v8 | 580 } // namespace v8 |
OLD | NEW |