| 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 13 matching lines...) Expand all Loading... |
| 24 #include "src/zone/zone.h" | 24 #include "src/zone/zone.h" |
| 25 | 25 |
| 26 #define REPEAT_1_TO_2(V, T) V(T) V(T, T) | 26 #define REPEAT_1_TO_2(V, T) V(T) V(T, T) |
| 27 #define REPEAT_1_TO_3(V, T) REPEAT_1_TO_2(V, T) V(T, T, T) | 27 #define REPEAT_1_TO_3(V, T) REPEAT_1_TO_2(V, T) V(T, T, T) |
| 28 #define REPEAT_1_TO_4(V, T) REPEAT_1_TO_3(V, T) V(T, T, T, T) | 28 #define REPEAT_1_TO_4(V, T) REPEAT_1_TO_3(V, T) V(T, T, T, T) |
| 29 #define REPEAT_1_TO_5(V, T) REPEAT_1_TO_4(V, T) V(T, T, T, T, T) | 29 #define REPEAT_1_TO_5(V, T) REPEAT_1_TO_4(V, T) V(T, T, T, T, T) |
| 30 #define REPEAT_1_TO_6(V, T) REPEAT_1_TO_5(V, T) V(T, T, T, T, T, T) | 30 #define REPEAT_1_TO_6(V, T) REPEAT_1_TO_5(V, T) V(T, T, T, T, T, T) |
| 31 #define REPEAT_1_TO_7(V, T) REPEAT_1_TO_6(V, T) V(T, T, T, T, T, T, T) | 31 #define REPEAT_1_TO_7(V, T) REPEAT_1_TO_6(V, T) V(T, T, T, T, T, T, T) |
| 32 #define REPEAT_1_TO_8(V, T) REPEAT_1_TO_7(V, T) V(T, T, T, T, T, T, T, T) | 32 #define REPEAT_1_TO_8(V, T) REPEAT_1_TO_7(V, T) V(T, T, T, T, T, T, T, T) |
| 33 #define REPEAT_1_TO_9(V, T) REPEAT_1_TO_8(V, T) V(T, T, T, T, T, T, T, T, T) | 33 #define REPEAT_1_TO_9(V, T) REPEAT_1_TO_8(V, T) V(T, T, T, T, T, T, T, T, T) |
| 34 #define REPEAT_1_TO_10(V, T) REPEAT_1_TO_9(V, T) V(T, T, T, T, T, T, T, T, T, T) |
| 35 #define REPEAT_1_TO_11(V, T) \ |
| 36 REPEAT_1_TO_10(V, T) V(T, T, T, T, T, T, T, T, T, T, T) |
| 34 | 37 |
| 35 namespace v8 { | 38 namespace v8 { |
| 36 namespace internal { | 39 namespace internal { |
| 37 namespace compiler { | 40 namespace compiler { |
| 38 | 41 |
| 39 CodeAssemblerState::CodeAssemblerState( | 42 CodeAssemblerState::CodeAssemblerState( |
| 40 Isolate* isolate, Zone* zone, const CallInterfaceDescriptor& descriptor, | 43 Isolate* isolate, Zone* zone, const CallInterfaceDescriptor& descriptor, |
| 41 Code::Flags flags, const char* name, size_t result_size) | 44 Code::Flags flags, const char* name, size_t result_size) |
| 42 : CodeAssemblerState( | 45 : CodeAssemblerState( |
| 43 isolate, zone, | 46 isolate, zone, |
| (...skipping 481 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 525 Node* arity = Int32Constant(argc); | 528 Node* arity = Int32Constant(argc); |
| 526 | 529 |
| 527 Node* nodes[] = {centry, args..., ref, arity, context}; | 530 Node* nodes[] = {centry, args..., ref, arity, context}; |
| 528 | 531 |
| 529 CallPrologue(); | 532 CallPrologue(); |
| 530 Node* return_value = raw_assembler()->CallN(desc, arraysize(nodes), nodes); | 533 Node* return_value = raw_assembler()->CallN(desc, arraysize(nodes), nodes); |
| 531 CallEpilogue(); | 534 CallEpilogue(); |
| 532 return return_value; | 535 return return_value; |
| 533 } | 536 } |
| 534 | 537 |
| 535 // Instantiate CallRuntime() with up to 6 arguments. | 538 // Instantiate CallRuntime() for argument counts used by CSA-generated code |
| 536 #define INSTANTIATE(...) \ | 539 #define INSTANTIATE(...) \ |
| 537 template V8_EXPORT_PRIVATE Node* CodeAssembler::CallRuntime( \ | 540 template V8_EXPORT_PRIVATE Node* CodeAssembler::CallRuntime( \ |
| 538 Runtime::FunctionId, __VA_ARGS__); | 541 Runtime::FunctionId, __VA_ARGS__); |
| 539 REPEAT_1_TO_7(INSTANTIATE, Node*) | 542 REPEAT_1_TO_7(INSTANTIATE, Node*) |
| 540 #undef INSTANTIATE | 543 #undef INSTANTIATE |
| 541 | 544 |
| 542 template <class... TArgs> | 545 template <class... TArgs> |
| 543 Node* CodeAssembler::TailCallRuntime(Runtime::FunctionId function, | 546 Node* CodeAssembler::TailCallRuntime(Runtime::FunctionId function, |
| 544 Node* context, TArgs... args) { | 547 Node* context, TArgs... args) { |
| 545 int argc = static_cast<int>(sizeof...(args)); | 548 int argc = static_cast<int>(sizeof...(args)); |
| 546 CallDescriptor* desc = Linkage::GetRuntimeCallDescriptor( | 549 CallDescriptor* desc = Linkage::GetRuntimeCallDescriptor( |
| 547 zone(), function, argc, Operator::kNoProperties, | 550 zone(), function, argc, Operator::kNoProperties, |
| 548 CallDescriptor::kSupportsTailCalls); | 551 CallDescriptor::kSupportsTailCalls); |
| 549 int return_count = static_cast<int>(desc->ReturnCount()); | 552 int return_count = static_cast<int>(desc->ReturnCount()); |
| 550 | 553 |
| 551 Node* centry = | 554 Node* centry = |
| 552 HeapConstant(CodeFactory::RuntimeCEntry(isolate(), return_count)); | 555 HeapConstant(CodeFactory::RuntimeCEntry(isolate(), return_count)); |
| 553 Node* ref = ExternalConstant(ExternalReference(function, isolate())); | 556 Node* ref = ExternalConstant(ExternalReference(function, isolate())); |
| 554 Node* arity = Int32Constant(argc); | 557 Node* arity = Int32Constant(argc); |
| 555 | 558 |
| 556 Node* nodes[] = {centry, args..., ref, arity, context}; | 559 Node* nodes[] = {centry, args..., ref, arity, context}; |
| 557 | 560 |
| 558 return raw_assembler()->TailCallN(desc, arraysize(nodes), nodes); | 561 return raw_assembler()->TailCallN(desc, arraysize(nodes), nodes); |
| 559 } | 562 } |
| 560 | 563 |
| 561 // Instantiate TailCallRuntime() with up to 6 arguments. | 564 // Instantiate TailCallRuntime() for argument counts used by CSA-generated code |
| 562 #define INSTANTIATE(...) \ | 565 #define INSTANTIATE(...) \ |
| 563 template V8_EXPORT_PRIVATE Node* CodeAssembler::TailCallRuntime( \ | 566 template V8_EXPORT_PRIVATE Node* CodeAssembler::TailCallRuntime( \ |
| 564 Runtime::FunctionId, __VA_ARGS__); | 567 Runtime::FunctionId, __VA_ARGS__); |
| 565 REPEAT_1_TO_7(INSTANTIATE, Node*) | 568 REPEAT_1_TO_7(INSTANTIATE, Node*) |
| 566 #undef INSTANTIATE | 569 #undef INSTANTIATE |
| 567 | 570 |
| 568 template <class... TArgs> | 571 template <class... TArgs> |
| 569 Node* CodeAssembler::CallStubR(const CallInterfaceDescriptor& descriptor, | 572 Node* CodeAssembler::CallStubR(const CallInterfaceDescriptor& descriptor, |
| 570 size_t result_size, Node* target, Node* context, | 573 size_t result_size, Node* target, Node* context, |
| 571 TArgs... args) { | 574 TArgs... args) { |
| 572 Node* nodes[] = {target, args..., context}; | 575 Node* nodes[] = {target, args..., context}; |
| 573 return CallStubN(descriptor, result_size, arraysize(nodes), nodes); | 576 return CallStubN(descriptor, result_size, arraysize(nodes), nodes); |
| 574 } | 577 } |
| 575 | 578 |
| 576 // Instantiate CallStubR() with up to 6 arguments. | 579 // Instantiate CallStubR() for argument counts used by CSA-generated code. |
| 577 #define INSTANTIATE(...) \ | 580 #define INSTANTIATE(...) \ |
| 578 template V8_EXPORT_PRIVATE Node* CodeAssembler::CallStubR( \ | 581 template V8_EXPORT_PRIVATE Node* CodeAssembler::CallStubR( \ |
| 579 const CallInterfaceDescriptor& descriptor, size_t, Node*, __VA_ARGS__); | 582 const CallInterfaceDescriptor& descriptor, size_t, Node*, __VA_ARGS__); |
| 580 REPEAT_1_TO_7(INSTANTIATE, Node*) | 583 REPEAT_1_TO_7(INSTANTIATE, Node*) |
| 581 #undef INSTANTIATE | 584 #undef INSTANTIATE |
| 582 | 585 |
| 583 Node* CodeAssembler::CallStubN(const CallInterfaceDescriptor& descriptor, | 586 Node* CodeAssembler::CallStubN(const CallInterfaceDescriptor& descriptor, |
| 584 size_t result_size, int input_count, | 587 size_t result_size, int input_count, |
| 585 Node* const* inputs) { | 588 Node* const* inputs) { |
| 586 // 2 is for target and context. | 589 // 2 is for target and context. |
| (...skipping 18 matching lines...) Expand all Loading... |
| 605 Node* CodeAssembler::TailCallStub(const CallInterfaceDescriptor& descriptor, | 608 Node* CodeAssembler::TailCallStub(const CallInterfaceDescriptor& descriptor, |
| 606 Node* target, Node* context, TArgs... args) { | 609 Node* target, Node* context, TArgs... args) { |
| 607 DCHECK_EQ(descriptor.GetParameterCount(), sizeof...(args)); | 610 DCHECK_EQ(descriptor.GetParameterCount(), sizeof...(args)); |
| 608 size_t result_size = 1; | 611 size_t result_size = 1; |
| 609 CallDescriptor* desc = Linkage::GetStubCallDescriptor( | 612 CallDescriptor* desc = Linkage::GetStubCallDescriptor( |
| 610 isolate(), zone(), descriptor, descriptor.GetStackParameterCount(), | 613 isolate(), zone(), descriptor, descriptor.GetStackParameterCount(), |
| 611 CallDescriptor::kSupportsTailCalls, Operator::kNoProperties, | 614 CallDescriptor::kSupportsTailCalls, Operator::kNoProperties, |
| 612 MachineType::AnyTagged(), result_size); | 615 MachineType::AnyTagged(), result_size); |
| 613 | 616 |
| 614 Node* nodes[] = {target, args..., context}; | 617 Node* nodes[] = {target, args..., context}; |
| 615 | 618 CHECK_EQ(descriptor.GetParameterCount() + 2, arraysize(nodes)); |
| 616 return raw_assembler()->TailCallN(desc, arraysize(nodes), nodes); | 619 return raw_assembler()->TailCallN(desc, arraysize(nodes), nodes); |
| 617 } | 620 } |
| 618 | 621 |
| 619 // Instantiate TailCallStub() with up to 6 arguments. | 622 // Instantiate TailCallStub() for argument counts used by CSA-generated code |
| 620 #define INSTANTIATE(...) \ | 623 #define INSTANTIATE(...) \ |
| 621 template V8_EXPORT_PRIVATE Node* CodeAssembler::TailCallStub( \ | 624 template V8_EXPORT_PRIVATE Node* CodeAssembler::TailCallStub( \ |
| 622 const CallInterfaceDescriptor& descriptor, Node*, __VA_ARGS__); | 625 const CallInterfaceDescriptor& descriptor, Node*, __VA_ARGS__); |
| 623 REPEAT_1_TO_7(INSTANTIATE, Node*) | 626 REPEAT_1_TO_11(INSTANTIATE, Node*) |
| 624 #undef INSTANTIATE | 627 #undef INSTANTIATE |
| 625 | 628 |
| 626 template <class... TArgs> | 629 template <class... TArgs> |
| 627 Node* CodeAssembler::TailCallBytecodeDispatch( | 630 Node* CodeAssembler::TailCallBytecodeDispatch( |
| 628 const CallInterfaceDescriptor& descriptor, Node* target, TArgs... args) { | 631 const CallInterfaceDescriptor& descriptor, Node* target, TArgs... args) { |
| 629 DCHECK_EQ(descriptor.GetParameterCount(), sizeof...(args)); | 632 DCHECK_EQ(descriptor.GetParameterCount(), sizeof...(args)); |
| 630 CallDescriptor* desc = Linkage::GetBytecodeDispatchCallDescriptor( | 633 CallDescriptor* desc = Linkage::GetBytecodeDispatchCallDescriptor( |
| 631 isolate(), zone(), descriptor, descriptor.GetStackParameterCount()); | 634 isolate(), zone(), descriptor, descriptor.GetStackParameterCount()); |
| 632 | 635 |
| 633 Node* nodes[] = {target, args...}; | 636 Node* nodes[] = {target, args...}; |
| 637 CHECK_EQ(descriptor.GetParameterCount() + 1, arraysize(nodes)); |
| 634 return raw_assembler()->TailCallN(desc, arraysize(nodes), nodes); | 638 return raw_assembler()->TailCallN(desc, arraysize(nodes), nodes); |
| 635 } | 639 } |
| 636 | 640 |
| 637 // Instantiate TailCallBytecodeDispatch() with 4 arguments. | 641 // Instantiate TailCallBytecodeDispatch() for argument counts used by |
| 642 // CSA-generated code |
| 638 template V8_EXPORT_PRIVATE Node* CodeAssembler::TailCallBytecodeDispatch( | 643 template V8_EXPORT_PRIVATE Node* CodeAssembler::TailCallBytecodeDispatch( |
| 639 const CallInterfaceDescriptor& descriptor, Node* target, Node*, Node*, | 644 const CallInterfaceDescriptor& descriptor, Node* target, Node*, Node*, |
| 640 Node*, Node*); | 645 Node*, Node*); |
| 641 | 646 |
| 642 Node* CodeAssembler::CallCFunctionN(Signature<MachineType>* signature, | 647 Node* CodeAssembler::CallCFunctionN(Signature<MachineType>* signature, |
| 643 int input_count, Node* const* inputs) { | 648 int input_count, Node* const* inputs) { |
| 644 CallDescriptor* desc = Linkage::GetSimplifiedCDescriptor(zone(), signature); | 649 CallDescriptor* desc = Linkage::GetSimplifiedCDescriptor(zone(), signature); |
| 645 return raw_assembler()->CallN(desc, input_count, inputs); | 650 return raw_assembler()->CallN(desc, input_count, inputs); |
| 646 } | 651 } |
| 647 | 652 |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 870 } | 875 } |
| 871 } | 876 } |
| 872 } | 877 } |
| 873 | 878 |
| 874 bound_ = true; | 879 bound_ = true; |
| 875 } | 880 } |
| 876 | 881 |
| 877 } // namespace compiler | 882 } // namespace compiler |
| 878 } // namespace internal | 883 } // namespace internal |
| 879 } // namespace v8 | 884 } // namespace v8 |
| OLD | NEW |