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/instruction-selector.h" | 5 #include "src/compiler/instruction-selector.h" |
6 | 6 |
7 #include "src/compiler/graph.h" | 7 #include "src/compiler/graph.h" |
8 #include "src/compiler/instruction-selector-impl.h" | 8 #include "src/compiler/instruction-selector-impl.h" |
9 #include "src/compiler/node-matchers.h" | 9 #include "src/compiler/node-matchers.h" |
10 #include "src/compiler/node-properties-inl.h" | 10 #include "src/compiler/node-properties-inl.h" |
(...skipping 439 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
450 // matching may cover more than one node at a time. | 450 // matching may cover more than one node at a time. |
451 for (BasicBlock::reverse_iterator i = block->rbegin(); i != block->rend(); | 451 for (BasicBlock::reverse_iterator i = block->rbegin(); i != block->rend(); |
452 ++i) { | 452 ++i) { |
453 Node* node = *i; | 453 Node* node = *i; |
454 // Skip nodes that are unused or already defined. | 454 // Skip nodes that are unused or already defined. |
455 if (!IsUsed(node) || IsDefined(node)) continue; | 455 if (!IsUsed(node) || IsDefined(node)) continue; |
456 // Generate code for this node "top down", but schedule the code "bottom | 456 // Generate code for this node "top down", but schedule the code "bottom |
457 // up". | 457 // up". |
458 size_t current_node_end = instructions_.size(); | 458 size_t current_node_end = instructions_.size(); |
459 VisitNode(node); | 459 VisitNode(node); |
| 460 // TODO(turbofan): only reverse if > 1 instruction emitted. |
460 std::reverse(instructions_.begin() + current_node_end, instructions_.end()); | 461 std::reverse(instructions_.begin() + current_node_end, instructions_.end()); |
461 } | 462 } |
462 | 463 |
463 // We're done with the block. | 464 // We're done with the block. |
464 InstructionBlock* instruction_block = | 465 InstructionBlock* instruction_block = |
465 sequence()->InstructionBlockAt(block->GetRpoNumber()); | 466 sequence()->InstructionBlockAt(block->GetRpoNumber()); |
466 instruction_block->set_code_start(static_cast<int>(instructions_.size())); | 467 instruction_block->set_code_start(static_cast<int>(instructions_.size())); |
467 instruction_block->set_code_end(current_block_end); | 468 instruction_block->set_code_end(current_block_end); |
468 | 469 |
469 current_block_ = NULL; | 470 current_block_ = NULL; |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
529 case IrOpcode::kIfFalse: | 530 case IrOpcode::kIfFalse: |
530 case IrOpcode::kEffectPhi: | 531 case IrOpcode::kEffectPhi: |
531 case IrOpcode::kMerge: | 532 case IrOpcode::kMerge: |
532 case IrOpcode::kTerminate: | 533 case IrOpcode::kTerminate: |
533 // No code needed for these graph artifacts. | 534 // No code needed for these graph artifacts. |
534 return kMachNone; | 535 return kMachNone; |
535 case IrOpcode::kFinish: | 536 case IrOpcode::kFinish: |
536 return kMachAnyTagged; | 537 return kMachAnyTagged; |
537 case IrOpcode::kParameter: | 538 case IrOpcode::kParameter: |
538 return linkage()->GetParameterType(OpParameter<int>(node)); | 539 return linkage()->GetParameterType(OpParameter<int>(node)); |
| 540 case IrOpcode::kOsrValue: |
| 541 return kMachAnyTagged; |
539 case IrOpcode::kPhi: | 542 case IrOpcode::kPhi: |
540 return OpParameter<MachineType>(node); | 543 return OpParameter<MachineType>(node); |
541 case IrOpcode::kProjection: | 544 case IrOpcode::kProjection: |
542 // TODO(jarin) Really project from outputs. | 545 // TODO(jarin) Really project from outputs. |
543 return kMachAnyTagged; | 546 return kMachAnyTagged; |
544 case IrOpcode::kInt32Constant: | 547 case IrOpcode::kInt32Constant: |
545 return kMachInt32; | 548 return kMachInt32; |
546 case IrOpcode::kInt64Constant: | 549 case IrOpcode::kInt64Constant: |
547 return kMachInt64; | 550 return kMachInt64; |
548 case IrOpcode::kExternalConstant: | 551 case IrOpcode::kExternalConstant: |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
667 case IrOpcode::kMerge: | 670 case IrOpcode::kMerge: |
668 // No code needed for these graph artifacts. | 671 // No code needed for these graph artifacts. |
669 return; | 672 return; |
670 case IrOpcode::kFinish: | 673 case IrOpcode::kFinish: |
671 return MarkAsReference(node), VisitFinish(node); | 674 return MarkAsReference(node), VisitFinish(node); |
672 case IrOpcode::kParameter: { | 675 case IrOpcode::kParameter: { |
673 MachineType type = linkage()->GetParameterType(OpParameter<int>(node)); | 676 MachineType type = linkage()->GetParameterType(OpParameter<int>(node)); |
674 MarkAsRepresentation(type, node); | 677 MarkAsRepresentation(type, node); |
675 return VisitParameter(node); | 678 return VisitParameter(node); |
676 } | 679 } |
| 680 case IrOpcode::kOsrValue: |
| 681 return VisitOsrValue(node); |
677 case IrOpcode::kPhi: { | 682 case IrOpcode::kPhi: { |
678 MachineType type = OpParameter<MachineType>(node); | 683 MachineType type = OpParameter<MachineType>(node); |
679 MarkAsRepresentation(type, node); | 684 MarkAsRepresentation(type, node); |
680 return VisitPhi(node); | 685 return VisitPhi(node); |
681 } | 686 } |
682 case IrOpcode::kProjection: | 687 case IrOpcode::kProjection: |
683 return VisitProjection(node); | 688 return VisitProjection(node); |
684 case IrOpcode::kInt32Constant: | 689 case IrOpcode::kInt32Constant: |
685 case IrOpcode::kInt64Constant: | 690 case IrOpcode::kInt64Constant: |
686 case IrOpcode::kExternalConstant: | 691 case IrOpcode::kExternalConstant: |
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
951 | 956 |
952 void InstructionSelector::VisitParameter(Node* node) { | 957 void InstructionSelector::VisitParameter(Node* node) { |
953 OperandGenerator g(this); | 958 OperandGenerator g(this); |
954 int index = OpParameter<int>(node); | 959 int index = OpParameter<int>(node); |
955 Emit(kArchNop, | 960 Emit(kArchNop, |
956 g.DefineAsLocation(node, linkage()->GetParameterLocation(index), | 961 g.DefineAsLocation(node, linkage()->GetParameterLocation(index), |
957 linkage()->GetParameterType(index))); | 962 linkage()->GetParameterType(index))); |
958 } | 963 } |
959 | 964 |
960 | 965 |
| 966 void InstructionSelector::VisitOsrValue(Node* node) { |
| 967 OperandGenerator g(this); |
| 968 int index = OpParameter<int>(node); |
| 969 Emit(kArchNop, g.DefineAsLocation(node, linkage()->GetOsrValueLocation(index), |
| 970 kMachAnyTagged)); |
| 971 } |
| 972 |
| 973 |
961 void InstructionSelector::VisitPhi(Node* node) { | 974 void InstructionSelector::VisitPhi(Node* node) { |
962 const int input_count = node->op()->ValueInputCount(); | 975 const int input_count = node->op()->ValueInputCount(); |
963 PhiInstruction* phi = new (instruction_zone()) | 976 PhiInstruction* phi = new (instruction_zone()) |
964 PhiInstruction(instruction_zone(), GetVirtualRegister(node), | 977 PhiInstruction(instruction_zone(), GetVirtualRegister(node), |
965 static_cast<size_t>(input_count)); | 978 static_cast<size_t>(input_count)); |
966 sequence()->InstructionBlockAt(current_block_->GetRpoNumber())->AddPhi(phi); | 979 sequence()->InstructionBlockAt(current_block_->GetRpoNumber())->AddPhi(phi); |
967 for (int i = 0; i < input_count; ++i) { | 980 for (int i = 0; i < input_count; ++i) { |
968 Node* const input = node->InputAt(i); | 981 Node* const input = node->InputAt(i); |
969 MarkAsUsed(input); | 982 MarkAsUsed(input); |
970 phi->Extend(instruction_zone(), GetVirtualRegister(input)); | 983 phi->Extend(instruction_zone(), GetVirtualRegister(input)); |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1142 MachineOperatorBuilder::Flags | 1155 MachineOperatorBuilder::Flags |
1143 InstructionSelector::SupportedMachineOperatorFlags() { | 1156 InstructionSelector::SupportedMachineOperatorFlags() { |
1144 return MachineOperatorBuilder::Flag::kNoFlags; | 1157 return MachineOperatorBuilder::Flag::kNoFlags; |
1145 } | 1158 } |
1146 | 1159 |
1147 #endif // !V8_TURBOFAN_BACKEND | 1160 #endif // !V8_TURBOFAN_BACKEND |
1148 | 1161 |
1149 } // namespace compiler | 1162 } // namespace compiler |
1150 } // namespace internal | 1163 } // namespace internal |
1151 } // namespace v8 | 1164 } // namespace v8 |
OLD | NEW |