| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/code-assembler.h" | 5 #include "src/compiler/code-assembler.h" |
| 6 | 6 |
| 7 #include <ostream> | 7 #include <ostream> |
| 8 | 8 |
| 9 #include "src/code-factory.h" | 9 #include "src/code-factory.h" |
| 10 #include "src/compiler/graph.h" | 10 #include "src/compiler/graph.h" |
| (...skipping 495 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 506 isolate(), zone(), descriptor, stack_parameter_count, | 506 isolate(), zone(), descriptor, stack_parameter_count, |
| 507 CallDescriptor::kNoFlags, Operator::kNoProperties, | 507 CallDescriptor::kNoFlags, Operator::kNoProperties, |
| 508 MachineType::AnyTagged(), result_size); | 508 MachineType::AnyTagged(), result_size); |
| 509 | 509 |
| 510 CallPrologue(); | 510 CallPrologue(); |
| 511 Node* return_value = raw_assembler()->CallN(desc, input_count, inputs); | 511 Node* return_value = raw_assembler()->CallN(desc, input_count, inputs); |
| 512 CallEpilogue(); | 512 CallEpilogue(); |
| 513 return return_value; | 513 return return_value; |
| 514 } | 514 } |
| 515 | 515 |
| 516 Node* CodeAssembler::TailCallStub(Callable const& callable, Node* context, | 516 template <class... TArgs> |
| 517 Node* arg1, size_t result_size) { | |
| 518 Node* target = HeapConstant(callable.code()); | |
| 519 return TailCallStub(callable.descriptor(), target, context, arg1, | |
| 520 result_size); | |
| 521 } | |
| 522 | |
| 523 Node* CodeAssembler::TailCallStub(Callable const& callable, Node* context, | |
| 524 Node* arg1, Node* arg2, size_t result_size) { | |
| 525 Node* target = HeapConstant(callable.code()); | |
| 526 return TailCallStub(callable.descriptor(), target, context, arg1, arg2, | |
| 527 result_size); | |
| 528 } | |
| 529 | |
| 530 Node* CodeAssembler::TailCallStub(Callable const& callable, Node* context, | |
| 531 Node* arg1, Node* arg2, Node* arg3, | |
| 532 size_t result_size) { | |
| 533 Node* target = HeapConstant(callable.code()); | |
| 534 return TailCallStub(callable.descriptor(), target, context, arg1, arg2, arg3, | |
| 535 result_size); | |
| 536 } | |
| 537 | |
| 538 Node* CodeAssembler::TailCallStub(Callable const& callable, Node* context, | |
| 539 Node* arg1, Node* arg2, Node* arg3, | |
| 540 Node* arg4, size_t result_size) { | |
| 541 Node* target = HeapConstant(callable.code()); | |
| 542 return TailCallStub(callable.descriptor(), target, context, arg1, arg2, arg3, | |
| 543 arg4, result_size); | |
| 544 } | |
| 545 | |
| 546 Node* CodeAssembler::TailCallStub(Callable const& callable, Node* context, | |
| 547 Node* arg1, Node* arg2, Node* arg3, | |
| 548 Node* arg4, Node* arg5, size_t result_size) { | |
| 549 Node* target = HeapConstant(callable.code()); | |
| 550 return TailCallStub(callable.descriptor(), target, context, arg1, arg2, arg3, | |
| 551 arg4, arg5, result_size); | |
| 552 } | |
| 553 | |
| 554 Node* CodeAssembler::TailCallStub(const CallInterfaceDescriptor& descriptor, | 517 Node* CodeAssembler::TailCallStub(const CallInterfaceDescriptor& descriptor, |
| 555 Node* target, Node* context, Node* arg1, | 518 Node* target, Node* context, TArgs... args) { |
| 556 size_t result_size) { | 519 DCHECK_EQ(descriptor.GetParameterCount(), sizeof...(args)); |
| 557 CallDescriptor* call_descriptor = Linkage::GetStubCallDescriptor( | 520 size_t result_size = 1; |
| 521 CallDescriptor* desc = Linkage::GetStubCallDescriptor( |
| 558 isolate(), zone(), descriptor, descriptor.GetStackParameterCount(), | 522 isolate(), zone(), descriptor, descriptor.GetStackParameterCount(), |
| 559 CallDescriptor::kSupportsTailCalls, Operator::kNoProperties, | 523 CallDescriptor::kSupportsTailCalls, Operator::kNoProperties, |
| 560 MachineType::AnyTagged(), result_size); | 524 MachineType::AnyTagged(), result_size); |
| 561 | 525 |
| 562 Node** args = zone()->NewArray<Node*>(2); | 526 Node* nodes[] = {target, args..., context}; |
| 563 args[0] = arg1; | |
| 564 args[1] = context; | |
| 565 | 527 |
| 566 return raw_assembler()->TailCallN(call_descriptor, target, args); | 528 return raw_assembler()->TailCallN(desc, arraysize(nodes), nodes); |
| 567 } | 529 } |
| 568 | 530 |
| 569 Node* CodeAssembler::TailCallStub(const CallInterfaceDescriptor& descriptor, | 531 // Instantiate TailCallStub() with up to 6 arguments. |
| 570 Node* target, Node* context, Node* arg1, | 532 #define INSTANTIATE(...) \ |
| 571 Node* arg2, size_t result_size) { | 533 template V8_EXPORT_PRIVATE Node* CodeAssembler::TailCallStub( \ |
| 572 CallDescriptor* call_descriptor = Linkage::GetStubCallDescriptor( | 534 const CallInterfaceDescriptor& descriptor, Node*, __VA_ARGS__); |
| 573 isolate(), zone(), descriptor, descriptor.GetStackParameterCount(), | 535 REPEAT_1_TO_7(INSTANTIATE, Node*) |
| 574 CallDescriptor::kSupportsTailCalls, Operator::kNoProperties, | 536 #undef INSTANTIATE |
| 575 MachineType::AnyTagged(), result_size); | |
| 576 | |
| 577 Node** args = zone()->NewArray<Node*>(3); | |
| 578 args[0] = arg1; | |
| 579 args[1] = arg2; | |
| 580 args[2] = context; | |
| 581 | |
| 582 return raw_assembler()->TailCallN(call_descriptor, target, args); | |
| 583 } | |
| 584 | |
| 585 Node* CodeAssembler::TailCallStub(const CallInterfaceDescriptor& descriptor, | |
| 586 Node* target, Node* context, Node* arg1, | |
| 587 Node* arg2, Node* arg3, size_t result_size) { | |
| 588 CallDescriptor* call_descriptor = Linkage::GetStubCallDescriptor( | |
| 589 isolate(), zone(), descriptor, descriptor.GetStackParameterCount(), | |
| 590 CallDescriptor::kSupportsTailCalls, Operator::kNoProperties, | |
| 591 MachineType::AnyTagged(), result_size); | |
| 592 | |
| 593 Node** args = zone()->NewArray<Node*>(4); | |
| 594 args[0] = arg1; | |
| 595 args[1] = arg2; | |
| 596 args[2] = arg3; | |
| 597 args[3] = context; | |
| 598 | |
| 599 return raw_assembler()->TailCallN(call_descriptor, target, args); | |
| 600 } | |
| 601 | |
| 602 Node* CodeAssembler::TailCallStub(const CallInterfaceDescriptor& descriptor, | |
| 603 Node* target, Node* context, Node* arg1, | |
| 604 Node* arg2, Node* arg3, Node* arg4, | |
| 605 size_t result_size) { | |
| 606 CallDescriptor* call_descriptor = Linkage::GetStubCallDescriptor( | |
| 607 isolate(), zone(), descriptor, descriptor.GetStackParameterCount(), | |
| 608 CallDescriptor::kSupportsTailCalls, Operator::kNoProperties, | |
| 609 MachineType::AnyTagged(), result_size); | |
| 610 | |
| 611 Node** args = zone()->NewArray<Node*>(5); | |
| 612 args[0] = arg1; | |
| 613 args[1] = arg2; | |
| 614 args[2] = arg3; | |
| 615 args[3] = arg4; | |
| 616 args[4] = context; | |
| 617 | |
| 618 return raw_assembler()->TailCallN(call_descriptor, target, args); | |
| 619 } | |
| 620 | |
| 621 Node* CodeAssembler::TailCallStub(const CallInterfaceDescriptor& descriptor, | |
| 622 Node* target, Node* context, Node* arg1, | |
| 623 Node* arg2, Node* arg3, Node* arg4, | |
| 624 Node* arg5, size_t result_size) { | |
| 625 CallDescriptor* call_descriptor = Linkage::GetStubCallDescriptor( | |
| 626 isolate(), zone(), descriptor, descriptor.GetStackParameterCount(), | |
| 627 CallDescriptor::kSupportsTailCalls, Operator::kNoProperties, | |
| 628 MachineType::AnyTagged(), result_size); | |
| 629 | |
| 630 Node** args = zone()->NewArray<Node*>(6); | |
| 631 args[0] = arg1; | |
| 632 args[1] = arg2; | |
| 633 args[2] = arg3; | |
| 634 args[3] = arg4; | |
| 635 args[4] = arg5; | |
| 636 args[5] = context; | |
| 637 | |
| 638 return raw_assembler()->TailCallN(call_descriptor, target, args); | |
| 639 } | |
| 640 | |
| 641 Node* CodeAssembler::TailCallStub(const CallInterfaceDescriptor& descriptor, | |
| 642 Node* target, Node* context, Node* arg1, | |
| 643 Node* arg2, Node* arg3, Node* arg4, | |
| 644 Node* arg5, Node* arg6, size_t result_size) { | |
| 645 CallDescriptor* call_descriptor = Linkage::GetStubCallDescriptor( | |
| 646 isolate(), zone(), descriptor, descriptor.GetStackParameterCount(), | |
| 647 CallDescriptor::kSupportsTailCalls, Operator::kNoProperties, | |
| 648 MachineType::AnyTagged(), result_size); | |
| 649 | |
| 650 Node** args = zone()->NewArray<Node*>(7); | |
| 651 args[0] = arg1; | |
| 652 args[1] = arg2; | |
| 653 args[2] = arg3; | |
| 654 args[3] = arg4; | |
| 655 args[4] = arg5; | |
| 656 args[5] = arg6; | |
| 657 args[6] = context; | |
| 658 | |
| 659 return raw_assembler()->TailCallN(call_descriptor, target, args); | |
| 660 } | |
| 661 | 537 |
| 662 Node* CodeAssembler::TailCallBytecodeDispatch( | 538 Node* CodeAssembler::TailCallBytecodeDispatch( |
| 663 const CallInterfaceDescriptor& interface_descriptor, | 539 const CallInterfaceDescriptor& interface_descriptor, |
| 664 Node* code_target_address, Node** args) { | 540 Node* code_target_address, Node** args) { |
| 665 CallDescriptor* descriptor = Linkage::GetBytecodeDispatchCallDescriptor( | 541 CallDescriptor* descriptor = Linkage::GetBytecodeDispatchCallDescriptor( |
| 666 isolate(), zone(), interface_descriptor, | 542 isolate(), zone(), interface_descriptor, |
| 667 interface_descriptor.GetStackParameterCount()); | 543 interface_descriptor.GetStackParameterCount()); |
| 668 return raw_assembler()->TailCallN(descriptor, code_target_address, args); | 544 return raw_assembler()->TailCallN(descriptor, code_target_address, args); |
| 669 } | 545 } |
| 670 | 546 |
| (...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 874 } | 750 } |
| 875 } | 751 } |
| 876 } | 752 } |
| 877 | 753 |
| 878 bound_ = true; | 754 bound_ = true; |
| 879 } | 755 } |
| 880 | 756 |
| 881 } // namespace compiler | 757 } // namespace compiler |
| 882 } // namespace internal | 758 } // namespace internal |
| 883 } // namespace v8 | 759 } // namespace v8 |
| OLD | NEW |