| 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 | 
|---|