| 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/base/adapters.h" | 5 #include "src/base/adapters.h" |
| 6 #include "src/base/bits.h" | 6 #include "src/base/bits.h" |
| 7 #include "src/compiler/instruction-selector-impl.h" | 7 #include "src/compiler/instruction-selector-impl.h" |
| 8 #include "src/compiler/node-matchers.h" | 8 #include "src/compiler/node-matchers.h" |
| 9 #include "src/compiler/node-properties.h" | 9 #include "src/compiler/node-properties.h" |
| 10 | 10 |
| (...skipping 545 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 556 for (size_t n = 0; n < arguments->size(); ++n) { | 556 for (size_t n = 0; n < arguments->size(); ++n) { |
| 557 if (Node* input = (*arguments)[n]) { | 557 if (Node* input = (*arguments)[n]) { |
| 558 Emit(kMipsStoreToStackSlot, g.NoOutput(), g.UseRegister(input), | 558 Emit(kMipsStoreToStackSlot, g.NoOutput(), g.UseRegister(input), |
| 559 g.TempImmediate(n << kPointerSizeLog2)); | 559 g.TempImmediate(n << kPointerSizeLog2)); |
| 560 } | 560 } |
| 561 } | 561 } |
| 562 } | 562 } |
| 563 } | 563 } |
| 564 | 564 |
| 565 | 565 |
| 566 void InstructionSelector::VisitTailCall(Node* node) { | 566 bool InstructionSelector::IsTailCallAddressImmediate() { return false; } |
| 567 MipsOperandGenerator g(this); | |
| 568 const CallDescriptor* descriptor = OpParameter<const CallDescriptor*>(node); | |
| 569 DCHECK_NE(0, descriptor->flags() & CallDescriptor::kSupportsTailCalls); | |
| 570 DCHECK_EQ(0, descriptor->flags() & CallDescriptor::kPatchableCallSite); | |
| 571 DCHECK_EQ(0, descriptor->flags() & CallDescriptor::kNeedsNopAfterCall); | |
| 572 | |
| 573 // TODO(turbofan): Relax restriction for stack parameters. | |
| 574 if (linkage()->GetIncomingDescriptor()->CanTailCall(node)) { | |
| 575 CallBuffer buffer(zone(), descriptor, nullptr); | |
| 576 | |
| 577 // Compute InstructionOperands for inputs and outputs. | |
| 578 InitializeCallBuffer(node, &buffer, true, false); | |
| 579 | |
| 580 // Select the appropriate opcode based on the call type. | |
| 581 InstructionCode opcode; | |
| 582 switch (descriptor->kind()) { | |
| 583 case CallDescriptor::kCallCodeObject: | |
| 584 opcode = kArchTailCallCodeObject; | |
| 585 break; | |
| 586 case CallDescriptor::kCallJSFunction: | |
| 587 opcode = kArchTailCallJSFunction; | |
| 588 break; | |
| 589 default: | |
| 590 UNREACHABLE(); | |
| 591 return; | |
| 592 } | |
| 593 opcode |= MiscField::encode(descriptor->flags()); | |
| 594 | |
| 595 // Emit the tailcall instruction. | |
| 596 Emit(opcode, 0, nullptr, buffer.instruction_args.size(), | |
| 597 &buffer.instruction_args.front()); | |
| 598 } else { | |
| 599 FrameStateDescriptor* frame_state_descriptor = | |
| 600 descriptor->NeedsFrameState() | |
| 601 ? GetFrameStateDescriptor( | |
| 602 node->InputAt(static_cast<int>(descriptor->InputCount()))) | |
| 603 : nullptr; | |
| 604 | |
| 605 CallBuffer buffer(zone(), descriptor, frame_state_descriptor); | |
| 606 | |
| 607 // Compute InstructionOperands for inputs and outputs. | |
| 608 InitializeCallBuffer(node, &buffer, true, false); | |
| 609 // Possibly align stack here for functions. | |
| 610 int push_count = static_cast<int>(descriptor->StackParameterCount()); | |
| 611 if (push_count > 0) { | |
| 612 Emit(kMipsStackClaim, g.NoOutput(), | |
| 613 g.TempImmediate(push_count << kPointerSizeLog2)); | |
| 614 } | |
| 615 int slot = static_cast<int>(buffer.pushed_nodes.size()) - 1; | |
| 616 for (Node* input : base::Reversed(buffer.pushed_nodes)) { | |
| 617 Emit(kMipsStoreToStackSlot, g.NoOutput(), g.UseRegister(input), | |
| 618 g.TempImmediate(slot << kPointerSizeLog2)); | |
| 619 slot--; | |
| 620 } | |
| 621 | |
| 622 // Select the appropriate opcode based on the call type. | |
| 623 InstructionCode opcode; | |
| 624 switch (descriptor->kind()) { | |
| 625 case CallDescriptor::kCallCodeObject: { | |
| 626 opcode = kArchCallCodeObject; | |
| 627 break; | |
| 628 } | |
| 629 case CallDescriptor::kCallJSFunction: | |
| 630 opcode = kArchCallJSFunction; | |
| 631 break; | |
| 632 default: | |
| 633 UNREACHABLE(); | |
| 634 return; | |
| 635 } | |
| 636 opcode |= MiscField::encode(descriptor->flags()); | |
| 637 | |
| 638 // Emit the call instruction. | |
| 639 size_t const output_count = buffer.outputs.size(); | |
| 640 auto* outputs = output_count ? &buffer.outputs.front() : nullptr; | |
| 641 Emit(opcode, output_count, outputs, buffer.instruction_args.size(), | |
| 642 &buffer.instruction_args.front())->MarkAsCall(); | |
| 643 Emit(kArchRet, 0, nullptr, output_count, outputs); | |
| 644 } | |
| 645 } | |
| 646 | 567 |
| 647 | 568 |
| 648 void InstructionSelector::VisitCheckedLoad(Node* node) { | 569 void InstructionSelector::VisitCheckedLoad(Node* node) { |
| 649 MachineType rep = RepresentationOf(OpParameter<MachineType>(node)); | 570 MachineType rep = RepresentationOf(OpParameter<MachineType>(node)); |
| 650 MachineType typ = TypeOf(OpParameter<MachineType>(node)); | 571 MachineType typ = TypeOf(OpParameter<MachineType>(node)); |
| 651 MipsOperandGenerator g(this); | 572 MipsOperandGenerator g(this); |
| 652 Node* const buffer = node->InputAt(0); | 573 Node* const buffer = node->InputAt(0); |
| 653 Node* const offset = node->InputAt(1); | 574 Node* const offset = node->InputAt(1); |
| 654 Node* const length = node->InputAt(2); | 575 Node* const length = node->InputAt(2); |
| 655 ArchOpcode opcode; | 576 ArchOpcode opcode; |
| (...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1112 IsFp64Mode()) { | 1033 IsFp64Mode()) { |
| 1113 flags |= MachineOperatorBuilder::kFloat64RoundDown | | 1034 flags |= MachineOperatorBuilder::kFloat64RoundDown | |
| 1114 MachineOperatorBuilder::kFloat64RoundTruncate; | 1035 MachineOperatorBuilder::kFloat64RoundTruncate; |
| 1115 } | 1036 } |
| 1116 return flags; | 1037 return flags; |
| 1117 } | 1038 } |
| 1118 | 1039 |
| 1119 } // namespace compiler | 1040 } // namespace compiler |
| 1120 } // namespace internal | 1041 } // namespace internal |
| 1121 } // namespace v8 | 1042 } // namespace v8 |
| OLD | NEW |