| 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 1433 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1444 linkage()->GetParameterType(index).representation()); | 1444 linkage()->GetParameterType(index).representation()); |
| 1445 | 1445 |
| 1446 Emit(kArchNop, op); | 1446 Emit(kArchNop, op); |
| 1447 } | 1447 } |
| 1448 | 1448 |
| 1449 | 1449 |
| 1450 void InstructionSelector::VisitIfException(Node* node) { | 1450 void InstructionSelector::VisitIfException(Node* node) { |
| 1451 OperandGenerator g(this); | 1451 OperandGenerator g(this); |
| 1452 Node* call = node->InputAt(1); | 1452 Node* call = node->InputAt(1); |
| 1453 DCHECK_EQ(IrOpcode::kCall, call->opcode()); | 1453 DCHECK_EQ(IrOpcode::kCall, call->opcode()); |
| 1454 const CallDescriptor* descriptor = OpParameter<const CallDescriptor*>(call); | 1454 const CallDescriptor* descriptor = CallDescriptorOf(call->op()); |
| 1455 Emit(kArchNop, | 1455 Emit(kArchNop, |
| 1456 g.DefineAsLocation(node, descriptor->GetReturnLocation(0), | 1456 g.DefineAsLocation(node, descriptor->GetReturnLocation(0), |
| 1457 descriptor->GetReturnType(0).representation())); | 1457 descriptor->GetReturnType(0).representation())); |
| 1458 } | 1458 } |
| 1459 | 1459 |
| 1460 | 1460 |
| 1461 void InstructionSelector::VisitOsrValue(Node* node) { | 1461 void InstructionSelector::VisitOsrValue(Node* node) { |
| 1462 OperandGenerator g(this); | 1462 OperandGenerator g(this); |
| 1463 int index = OpParameter<int>(node); | 1463 int index = OpParameter<int>(node); |
| 1464 Emit(kArchNop, g.DefineAsLocation(node, linkage()->GetOsrValueLocation(index), | 1464 Emit(kArchNop, g.DefineAsLocation(node, linkage()->GetOsrValueLocation(index), |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1516 void InstructionSelector::VisitConstant(Node* node) { | 1516 void InstructionSelector::VisitConstant(Node* node) { |
| 1517 // We must emit a NOP here because every live range needs a defining | 1517 // We must emit a NOP here because every live range needs a defining |
| 1518 // instruction in the register allocator. | 1518 // instruction in the register allocator. |
| 1519 OperandGenerator g(this); | 1519 OperandGenerator g(this); |
| 1520 Emit(kArchNop, g.DefineAsConstant(node)); | 1520 Emit(kArchNop, g.DefineAsConstant(node)); |
| 1521 } | 1521 } |
| 1522 | 1522 |
| 1523 | 1523 |
| 1524 void InstructionSelector::VisitCall(Node* node, BasicBlock* handler) { | 1524 void InstructionSelector::VisitCall(Node* node, BasicBlock* handler) { |
| 1525 OperandGenerator g(this); | 1525 OperandGenerator g(this); |
| 1526 const CallDescriptor* descriptor = OpParameter<const CallDescriptor*>(node); | 1526 const CallDescriptor* descriptor = CallDescriptorOf(node->op()); |
| 1527 | 1527 |
| 1528 FrameStateDescriptor* frame_state_descriptor = nullptr; | 1528 FrameStateDescriptor* frame_state_descriptor = nullptr; |
| 1529 if (descriptor->NeedsFrameState()) { | 1529 if (descriptor->NeedsFrameState()) { |
| 1530 frame_state_descriptor = GetFrameStateDescriptor( | 1530 frame_state_descriptor = GetFrameStateDescriptor( |
| 1531 node->InputAt(static_cast<int>(descriptor->InputCount()))); | 1531 node->InputAt(static_cast<int>(descriptor->InputCount()))); |
| 1532 } | 1532 } |
| 1533 | 1533 |
| 1534 CallBuffer buffer(zone(), descriptor, frame_state_descriptor); | 1534 CallBuffer buffer(zone(), descriptor, frame_state_descriptor); |
| 1535 | 1535 |
| 1536 // Compute InstructionOperands for inputs and outputs. | 1536 // Compute InstructionOperands for inputs and outputs. |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1584 size_t const output_count = buffer.outputs.size(); | 1584 size_t const output_count = buffer.outputs.size(); |
| 1585 auto* outputs = output_count ? &buffer.outputs.front() : nullptr; | 1585 auto* outputs = output_count ? &buffer.outputs.front() : nullptr; |
| 1586 Emit(opcode, output_count, outputs, buffer.instruction_args.size(), | 1586 Emit(opcode, output_count, outputs, buffer.instruction_args.size(), |
| 1587 &buffer.instruction_args.front()) | 1587 &buffer.instruction_args.front()) |
| 1588 ->MarkAsCall(); | 1588 ->MarkAsCall(); |
| 1589 } | 1589 } |
| 1590 | 1590 |
| 1591 | 1591 |
| 1592 void InstructionSelector::VisitTailCall(Node* node) { | 1592 void InstructionSelector::VisitTailCall(Node* node) { |
| 1593 OperandGenerator g(this); | 1593 OperandGenerator g(this); |
| 1594 CallDescriptor const* descriptor = OpParameter<CallDescriptor const*>(node); | 1594 CallDescriptor const* descriptor = CallDescriptorOf(node->op()); |
| 1595 DCHECK_NE(0, descriptor->flags() & CallDescriptor::kSupportsTailCalls); | 1595 DCHECK_NE(0, descriptor->flags() & CallDescriptor::kSupportsTailCalls); |
| 1596 DCHECK_EQ(0, descriptor->flags() & CallDescriptor::kPatchableCallSite); | 1596 DCHECK_EQ(0, descriptor->flags() & CallDescriptor::kPatchableCallSite); |
| 1597 DCHECK_EQ(0, descriptor->flags() & CallDescriptor::kNeedsNopAfterCall); | 1597 DCHECK_EQ(0, descriptor->flags() & CallDescriptor::kNeedsNopAfterCall); |
| 1598 | 1598 |
| 1599 // TODO(turbofan): Relax restriction for stack parameters. | 1599 // TODO(turbofan): Relax restriction for stack parameters. |
| 1600 | 1600 |
| 1601 int stack_param_delta = 0; | 1601 int stack_param_delta = 0; |
| 1602 if (linkage()->GetIncomingDescriptor()->CanTailCall(node, | 1602 if (linkage()->GetIncomingDescriptor()->CanTailCall(node, |
| 1603 &stack_param_delta)) { | 1603 &stack_param_delta)) { |
| 1604 CallBuffer buffer(zone(), descriptor, nullptr); | 1604 CallBuffer buffer(zone(), descriptor, nullptr); |
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1802 return new (instruction_zone()) FrameStateDescriptor( | 1802 return new (instruction_zone()) FrameStateDescriptor( |
| 1803 instruction_zone(), state_info.type(), state_info.bailout_id(), | 1803 instruction_zone(), state_info.type(), state_info.bailout_id(), |
| 1804 state_info.state_combine(), parameters, locals, stack, | 1804 state_info.state_combine(), parameters, locals, stack, |
| 1805 state_info.shared_info(), outer_state); | 1805 state_info.shared_info(), outer_state); |
| 1806 } | 1806 } |
| 1807 | 1807 |
| 1808 | 1808 |
| 1809 } // namespace compiler | 1809 } // namespace compiler |
| 1810 } // namespace internal | 1810 } // namespace internal |
| 1811 } // namespace v8 | 1811 } // namespace v8 |
| OLD | NEW |