| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/common-operator.h" | 5 #include "src/compiler/common-operator.h" |
| 6 #include "src/compiler/graph.h" | 6 #include "src/compiler/graph.h" |
| 7 #include "src/compiler/instruction.h" | 7 #include "src/compiler/instruction.h" |
| 8 | 8 |
| 9 namespace v8 { | 9 namespace v8 { |
| 10 namespace internal { | 10 namespace internal { |
| (...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 272 if (i > 0) os << ", "; | 272 if (i > 0) os << ", "; |
| 273 printable_op.op_ = instr.OutputAt(i); | 273 printable_op.op_ = instr.OutputAt(i); |
| 274 os << printable_op; | 274 os << printable_op; |
| 275 } | 275 } |
| 276 | 276 |
| 277 if (instr.OutputCount() > 1) os << ") = "; | 277 if (instr.OutputCount() > 1) os << ") = "; |
| 278 if (instr.OutputCount() == 1) os << " = "; | 278 if (instr.OutputCount() == 1) os << " = "; |
| 279 | 279 |
| 280 if (instr.IsGapMoves()) { | 280 if (instr.IsGapMoves()) { |
| 281 const GapInstruction* gap = GapInstruction::cast(&instr); | 281 const GapInstruction* gap = GapInstruction::cast(&instr); |
| 282 os << (instr.IsBlockStart() ? " block-start" : "gap "); | 282 os << "gap "; |
| 283 for (int i = GapInstruction::FIRST_INNER_POSITION; | 283 for (int i = GapInstruction::FIRST_INNER_POSITION; |
| 284 i <= GapInstruction::LAST_INNER_POSITION; i++) { | 284 i <= GapInstruction::LAST_INNER_POSITION; i++) { |
| 285 os << "("; | 285 os << "("; |
| 286 if (gap->parallel_moves_[i] != NULL) { | 286 if (gap->parallel_moves_[i] != NULL) { |
| 287 PrintableParallelMove ppm = {printable.register_configuration_, | 287 PrintableParallelMove ppm = {printable.register_configuration_, |
| 288 gap->parallel_moves_[i]}; | 288 gap->parallel_moves_[i]}; |
| 289 os << ppm; | 289 os << ppm; |
| 290 } | 290 } |
| 291 os << ") "; | 291 os << ") "; |
| 292 } | 292 } |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 450 } | 450 } |
| 451 | 451 |
| 452 | 452 |
| 453 int InstructionSequence::NextVirtualRegister() { | 453 int InstructionSequence::NextVirtualRegister() { |
| 454 int virtual_register = next_virtual_register_++; | 454 int virtual_register = next_virtual_register_++; |
| 455 CHECK_NE(virtual_register, UnallocatedOperand::kInvalidVirtualRegister); | 455 CHECK_NE(virtual_register, UnallocatedOperand::kInvalidVirtualRegister); |
| 456 return virtual_register; | 456 return virtual_register; |
| 457 } | 457 } |
| 458 | 458 |
| 459 | 459 |
| 460 BlockStartInstruction* InstructionSequence::GetBlockStart( | 460 GapInstruction* InstructionSequence::GetBlockStart( |
| 461 BasicBlock::RpoNumber rpo) const { | 461 BasicBlock::RpoNumber rpo) const { |
| 462 const InstructionBlock* block = InstructionBlockAt(rpo); | 462 const InstructionBlock* block = InstructionBlockAt(rpo); |
| 463 return BlockStartInstruction::cast(InstructionAt(block->code_start())); | 463 return GapInstruction::cast(InstructionAt(block->code_start())); |
| 464 } | 464 } |
| 465 | 465 |
| 466 | 466 |
| 467 void InstructionSequence::StartBlock(BasicBlock::RpoNumber rpo) { | 467 void InstructionSequence::StartBlock(BasicBlock::RpoNumber rpo) { |
| 468 DCHECK(block_starts_.size() == rpo.ToSize()); | 468 DCHECK(block_starts_.size() == rpo.ToSize()); |
| 469 InstructionBlock* block = InstructionBlockAt(rpo); | 469 InstructionBlock* block = InstructionBlockAt(rpo); |
| 470 int code_start = static_cast<int>(instructions_.size()); | 470 int code_start = static_cast<int>(instructions_.size()); |
| 471 block->set_code_start(code_start); | 471 block->set_code_start(code_start); |
| 472 block_starts_.push_back(code_start); | 472 block_starts_.push_back(code_start); |
| 473 BlockStartInstruction* block_start = BlockStartInstruction::New(zone()); | |
| 474 AddInstruction(block_start); | |
| 475 } | 473 } |
| 476 | 474 |
| 477 | 475 |
| 478 void InstructionSequence::EndBlock(BasicBlock::RpoNumber rpo) { | 476 void InstructionSequence::EndBlock(BasicBlock::RpoNumber rpo) { |
| 479 int end = static_cast<int>(instructions_.size()); | 477 int end = static_cast<int>(instructions_.size()); |
| 480 InstructionBlock* block = InstructionBlockAt(rpo); | 478 InstructionBlock* block = InstructionBlockAt(rpo); |
| 479 if (block->code_start() == end) { // Empty block. Insert a nop. |
| 480 AddInstruction(Instruction::New(zone(), kArchNop)); |
| 481 end = static_cast<int>(instructions_.size()); |
| 482 } |
| 481 DCHECK(block->code_start() >= 0 && block->code_start() < end); | 483 DCHECK(block->code_start() >= 0 && block->code_start() < end); |
| 482 block->set_code_end(end); | 484 block->set_code_end(end); |
| 483 } | 485 } |
| 484 | 486 |
| 485 | 487 |
| 486 int InstructionSequence::AddInstruction(Instruction* instr) { | 488 int InstructionSequence::AddInstruction(Instruction* instr) { |
| 487 // TODO(titzer): the order of these gaps is a holdover from Lithium. | |
| 488 GapInstruction* gap = GapInstruction::New(zone()); | 489 GapInstruction* gap = GapInstruction::New(zone()); |
| 489 if (instr->IsControl()) instructions_.push_back(gap); | 490 instructions_.push_back(gap); |
| 490 int index = static_cast<int>(instructions_.size()); | 491 int index = static_cast<int>(instructions_.size()); |
| 491 instructions_.push_back(instr); | 492 instructions_.push_back(instr); |
| 492 if (!instr->IsControl()) instructions_.push_back(gap); | |
| 493 if (instr->NeedsPointerMap()) { | 493 if (instr->NeedsPointerMap()) { |
| 494 DCHECK(instr->pointer_map() == NULL); | 494 DCHECK(instr->pointer_map() == NULL); |
| 495 PointerMap* pointer_map = new (zone()) PointerMap(zone()); | 495 PointerMap* pointer_map = new (zone()) PointerMap(zone()); |
| 496 pointer_map->set_instruction_position(index); | 496 pointer_map->set_instruction_position(index); |
| 497 instr->set_pointer_map(pointer_map); | 497 instr->set_pointer_map(pointer_map); |
| 498 pointer_maps_.push_back(pointer_map); | 498 pointer_maps_.push_back(pointer_map); |
| 499 } | 499 } |
| 500 return index; | 500 return index; |
| 501 } | 501 } |
| 502 | 502 |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 693 os << " B" << succ_block->id(); | 693 os << " B" << succ_block->id(); |
| 694 } | 694 } |
| 695 os << "\n"; | 695 os << "\n"; |
| 696 } | 696 } |
| 697 return os; | 697 return os; |
| 698 } | 698 } |
| 699 | 699 |
| 700 } // namespace compiler | 700 } // namespace compiler |
| 701 } // namespace internal | 701 } // namespace internal |
| 702 } // namespace v8 | 702 } // namespace v8 |
| OLD | NEW |