| 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 <limits> | 7 #include <limits> |
| 8 | 8 |
| 9 #include "src/base/adapters.h" | 9 #include "src/base/adapters.h" |
| 10 #include "src/compiler/instruction-selector-impl.h" | 10 #include "src/compiler/instruction-selector-impl.h" |
| (...skipping 540 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 551 } | 551 } |
| 552 DCHECK_LE(sw.min_value, sw.max_value); | 552 DCHECK_LE(sw.min_value, sw.max_value); |
| 553 // Note that {value_range} can be 0 if {min_value} is -2^31 and | 553 // Note that {value_range} can be 0 if {min_value} is -2^31 and |
| 554 // {max_value} | 554 // {max_value} |
| 555 // is 2^31-1, so don't assume that it's non-zero below. | 555 // is 2^31-1, so don't assume that it's non-zero below. |
| 556 sw.value_range = 1u + bit_cast<uint32_t>(sw.max_value) - | 556 sw.value_range = 1u + bit_cast<uint32_t>(sw.max_value) - |
| 557 bit_cast<uint32_t>(sw.min_value); | 557 bit_cast<uint32_t>(sw.min_value); |
| 558 return VisitSwitch(input, sw); | 558 return VisitSwitch(input, sw); |
| 559 } | 559 } |
| 560 case BasicBlock::kReturn: { | 560 case BasicBlock::kReturn: { |
| 561 // If the result itself is a return, return its input. | 561 DCHECK_EQ(IrOpcode::kReturn, input->opcode()); |
| 562 Node* value = (input != nullptr && input->opcode() == IrOpcode::kReturn) | 562 return VisitReturn(input->InputAt(0)); |
| 563 ? input->InputAt(0) | |
| 564 : input; | |
| 565 return VisitReturn(value); | |
| 566 } | 563 } |
| 567 case BasicBlock::kDeoptimize: { | 564 case BasicBlock::kDeoptimize: { |
| 568 // If the result itself is a return, return its input. | 565 // If the result itself is a return, return its input. |
| 569 Node* value = | 566 Node* value = |
| 570 (input != nullptr && input->opcode() == IrOpcode::kDeoptimize) | 567 (input != nullptr && input->opcode() == IrOpcode::kDeoptimize) |
| 571 ? input->InputAt(0) | 568 ? input->InputAt(0) |
| 572 : input; | 569 : input; |
| 573 return VisitDeoptimize(value); | 570 return VisitDeoptimize(value); |
| 574 } | 571 } |
| 575 case BasicBlock::kThrow: | 572 case BasicBlock::kThrow: |
| (...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1038 | 1035 |
| 1039 | 1036 |
| 1040 void InstructionSelector::VisitGoto(BasicBlock* target) { | 1037 void InstructionSelector::VisitGoto(BasicBlock* target) { |
| 1041 // jump to the next block. | 1038 // jump to the next block. |
| 1042 OperandGenerator g(this); | 1039 OperandGenerator g(this); |
| 1043 Emit(kArchJmp, g.NoOutput(), g.Label(target)); | 1040 Emit(kArchJmp, g.NoOutput(), g.Label(target)); |
| 1044 } | 1041 } |
| 1045 | 1042 |
| 1046 | 1043 |
| 1047 void InstructionSelector::VisitReturn(Node* value) { | 1044 void InstructionSelector::VisitReturn(Node* value) { |
| 1045 DCHECK_NOT_NULL(value); |
| 1048 OperandGenerator g(this); | 1046 OperandGenerator g(this); |
| 1049 if (value != NULL) { | 1047 Emit(kArchRet, g.NoOutput(), |
| 1050 Emit(kArchRet, g.NoOutput(), | 1048 g.UseLocation(value, linkage()->GetReturnLocation(), |
| 1051 g.UseLocation(value, linkage()->GetReturnLocation(), | 1049 linkage()->GetReturnType())); |
| 1052 linkage()->GetReturnType())); | |
| 1053 } else { | |
| 1054 Emit(kArchRet, g.NoOutput()); | |
| 1055 } | |
| 1056 } | 1050 } |
| 1057 | 1051 |
| 1058 | 1052 |
| 1059 void InstructionSelector::VisitDeoptimize(Node* value) { | 1053 void InstructionSelector::VisitDeoptimize(Node* value) { |
| 1060 DCHECK(FLAG_turbo_deoptimization); | 1054 DCHECK(FLAG_turbo_deoptimization); |
| 1061 | 1055 |
| 1062 OperandGenerator g(this); | 1056 OperandGenerator g(this); |
| 1063 | 1057 |
| 1064 FrameStateDescriptor* desc = GetFrameStateDescriptor(value); | 1058 FrameStateDescriptor* desc = GetFrameStateDescriptor(value); |
| 1065 size_t arg_count = desc->GetTotalSize() + 1; // Include deopt id. | 1059 size_t arg_count = desc->GetTotalSize() + 1; // Include deopt id. |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1200 MachineOperatorBuilder::Flags | 1194 MachineOperatorBuilder::Flags |
| 1201 InstructionSelector::SupportedMachineOperatorFlags() { | 1195 InstructionSelector::SupportedMachineOperatorFlags() { |
| 1202 return MachineOperatorBuilder::Flag::kNoFlags; | 1196 return MachineOperatorBuilder::Flag::kNoFlags; |
| 1203 } | 1197 } |
| 1204 | 1198 |
| 1205 #endif // !V8_TURBOFAN_BACKEND | 1199 #endif // !V8_TURBOFAN_BACKEND |
| 1206 | 1200 |
| 1207 } // namespace compiler | 1201 } // namespace compiler |
| 1208 } // namespace internal | 1202 } // namespace internal |
| 1209 } // namespace v8 | 1203 } // namespace v8 |
| OLD | NEW |