| 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 403 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 414 } | 414 } | 
| 415 | 415 | 
| 416 Node* CodeAssembler::TailCallN(CallDescriptor* descriptor, Node* code_target, | 416 Node* CodeAssembler::TailCallN(CallDescriptor* descriptor, Node* code_target, | 
| 417                                Node** args) { | 417                                Node** args) { | 
| 418   return raw_assembler()->TailCallN(descriptor, code_target, args); | 418   return raw_assembler()->TailCallN(descriptor, code_target, args); | 
| 419 } | 419 } | 
| 420 | 420 | 
| 421 template <class... TArgs> | 421 template <class... TArgs> | 
| 422 Node* CodeAssembler::CallRuntime(Runtime::FunctionId function, Node* context, | 422 Node* CodeAssembler::CallRuntime(Runtime::FunctionId function, Node* context, | 
| 423                                  TArgs... args) { | 423                                  TArgs... args) { | 
| 424   CallPrologue(); |  | 
| 425 |  | 
| 426   int argc = static_cast<int>(sizeof...(args)); | 424   int argc = static_cast<int>(sizeof...(args)); | 
| 427   CallDescriptor* desc = Linkage::GetRuntimeCallDescriptor( | 425   CallDescriptor* desc = Linkage::GetRuntimeCallDescriptor( | 
| 428       zone(), function, argc, Operator::kNoProperties, | 426       zone(), function, argc, Operator::kNoProperties, | 
| 429       CallDescriptor::kNoFlags); | 427       CallDescriptor::kNoFlags); | 
| 430   int return_count = static_cast<int>(desc->ReturnCount()); | 428   int return_count = static_cast<int>(desc->ReturnCount()); | 
| 431 | 429 | 
| 432   Node* centry = | 430   Node* centry = | 
| 433       HeapConstant(CodeFactory::RuntimeCEntry(isolate(), return_count)); | 431       HeapConstant(CodeFactory::RuntimeCEntry(isolate(), return_count)); | 
| 434   Node* ref = ExternalConstant(ExternalReference(function, isolate())); | 432   Node* ref = ExternalConstant(ExternalReference(function, isolate())); | 
| 435   Node* arity = Int32Constant(argc); | 433   Node* arity = Int32Constant(argc); | 
| 436 | 434 | 
| 437   Node* nodes[] = {centry, args..., ref, arity, context}; | 435   Node* nodes[] = {centry, args..., ref, arity, context}; | 
| 438 | 436 | 
|  | 437   CallPrologue(); | 
| 439   Node* return_value = raw_assembler()->CallN(desc, arraysize(nodes), nodes); | 438   Node* return_value = raw_assembler()->CallN(desc, arraysize(nodes), nodes); | 
| 440 |  | 
| 441   CallEpilogue(); | 439   CallEpilogue(); | 
| 442   return return_value; | 440   return return_value; | 
| 443 } | 441 } | 
| 444 | 442 | 
| 445 // Instantiate CallRuntime() with up to 5 arguments. | 443 // Instantiate CallRuntime() with up to 5 arguments. | 
| 446 #define INSTANTIATE(...)                                       \ | 444 #define INSTANTIATE(...)                                       \ | 
| 447   template V8_EXPORT_PRIVATE Node* CodeAssembler::CallRuntime( \ | 445   template V8_EXPORT_PRIVATE Node* CodeAssembler::CallRuntime( \ | 
| 448       Runtime::FunctionId, __VA_ARGS__); | 446       Runtime::FunctionId, __VA_ARGS__); | 
| 449 REPEAT_1_TO_6(INSTANTIATE, Node*) | 447 REPEAT_1_TO_6(INSTANTIATE, Node*) | 
| 450 #undef INSTANTIATE | 448 #undef INSTANTIATE | 
| 451 | 449 | 
| 452 template <class... TArgs> | 450 template <class... TArgs> | 
| 453 Node* CodeAssembler::TailCallRuntime(Runtime::FunctionId function, | 451 Node* CodeAssembler::TailCallRuntime(Runtime::FunctionId function, | 
| 454                                      Node* context, TArgs... args) { | 452                                      Node* context, TArgs... args) { | 
| 455   CallPrologue(); |  | 
| 456 |  | 
| 457   int argc = static_cast<int>(sizeof...(args)); | 453   int argc = static_cast<int>(sizeof...(args)); | 
| 458   CallDescriptor* desc = Linkage::GetRuntimeCallDescriptor( | 454   CallDescriptor* desc = Linkage::GetRuntimeCallDescriptor( | 
| 459       zone(), function, argc, Operator::kNoProperties, | 455       zone(), function, argc, Operator::kNoProperties, | 
| 460       CallDescriptor::kSupportsTailCalls); | 456       CallDescriptor::kSupportsTailCalls); | 
| 461   int return_count = static_cast<int>(desc->ReturnCount()); | 457   int return_count = static_cast<int>(desc->ReturnCount()); | 
| 462 | 458 | 
| 463   Node* centry = | 459   Node* centry = | 
| 464       HeapConstant(CodeFactory::RuntimeCEntry(isolate(), return_count)); | 460       HeapConstant(CodeFactory::RuntimeCEntry(isolate(), return_count)); | 
| 465   Node* ref = ExternalConstant(ExternalReference(function, isolate())); | 461   Node* ref = ExternalConstant(ExternalReference(function, isolate())); | 
| 466   Node* arity = Int32Constant(argc); | 462   Node* arity = Int32Constant(argc); | 
| 467 | 463 | 
| 468   Node* nodes[] = {centry, args..., ref, arity, context}; | 464   Node* nodes[] = {centry, args..., ref, arity, context}; | 
| 469 | 465 | 
|  | 466   CallPrologue(); | 
| 470   Node* return_value = | 467   Node* return_value = | 
| 471       raw_assembler()->TailCallN(desc, arraysize(nodes), nodes); | 468       raw_assembler()->TailCallN(desc, arraysize(nodes), nodes); | 
| 472 |  | 
| 473   CallEpilogue(); | 469   CallEpilogue(); | 
| 474   return return_value; | 470   return return_value; | 
| 475 } | 471 } | 
| 476 | 472 | 
| 477 // Instantiate TailCallRuntime() with up to 6 arguments. | 473 // Instantiate TailCallRuntime() with up to 6 arguments. | 
| 478 #define INSTANTIATE(...)                                           \ | 474 #define INSTANTIATE(...)                                           \ | 
| 479   template V8_EXPORT_PRIVATE Node* CodeAssembler::TailCallRuntime( \ | 475   template V8_EXPORT_PRIVATE Node* CodeAssembler::TailCallRuntime( \ | 
| 480       Runtime::FunctionId, __VA_ARGS__); | 476       Runtime::FunctionId, __VA_ARGS__); | 
| 481 REPEAT_1_TO_7(INSTANTIATE, Node*) | 477 REPEAT_1_TO_7(INSTANTIATE, Node*) | 
| 482 #undef INSTANTIATE | 478 #undef INSTANTIATE | 
| 483 | 479 | 
| 484 Node* CodeAssembler::CallStub(Callable const& callable, Node* context, | 480 template <class... TArgs> | 
| 485                               Node* arg1, size_t result_size) { | 481 Node* CodeAssembler::CallStubR(const CallInterfaceDescriptor& descriptor, | 
| 486   Node* target = HeapConstant(callable.code()); | 482                                size_t result_size, Node* target, Node* context, | 
| 487   return CallStub(callable.descriptor(), target, context, arg1, result_size); | 483                                TArgs... args) { | 
|  | 484   Node* nodes[] = {target, args..., context}; | 
|  | 485   return CallStubN(descriptor, result_size, arraysize(nodes), nodes); | 
| 488 } | 486 } | 
| 489 | 487 | 
| 490 Node* CodeAssembler::CallStub(Callable const& callable, Node* context, | 488 // Instantiate CallStubR() with up to 5 arguments. | 
| 491                               Node* arg1, Node* arg2, size_t result_size) { | 489 #define INSTANTIATE(...)                                     \ | 
| 492   Node* target = HeapConstant(callable.code()); | 490   template V8_EXPORT_PRIVATE Node* CodeAssembler::CallStubR( \ | 
| 493   return CallStub(callable.descriptor(), target, context, arg1, arg2, | 491       const CallInterfaceDescriptor& descriptor, size_t, Node*, __VA_ARGS__); | 
| 494                   result_size); | 492 REPEAT_1_TO_6(INSTANTIATE, Node*) | 
| 495 } | 493 #undef INSTANTIATE | 
| 496 | 494 | 
| 497 Node* CodeAssembler::CallStub(Callable const& callable, Node* context, | 495 Node* CodeAssembler::CallStubN(const CallInterfaceDescriptor& descriptor, | 
| 498                               Node* arg1, Node* arg2, Node* arg3, | 496                                size_t result_size, int input_count, | 
| 499                               size_t result_size) { | 497                                Node* const* inputs) { | 
| 500   Node* target = HeapConstant(callable.code()); | 498   // 2 is for target and context. | 
| 501   return CallStub(callable.descriptor(), target, context, arg1, arg2, arg3, | 499   DCHECK_LE(2, input_count); | 
| 502                   result_size); | 500   int argc = input_count - 2; | 
| 503 } | 501   DCHECK_LE(descriptor.GetParameterCount(), argc); | 
| 504 | 502   // Extra arguments not mentioned in the descriptor are passed on the stack. | 
| 505 Node* CodeAssembler::CallStub(Callable const& callable, Node* context, | 503   int stack_parameter_count = argc - descriptor.GetRegisterParameterCount(); | 
| 506                               Node* arg1, Node* arg2, Node* arg3, Node* arg4, | 504   DCHECK_LE(descriptor.GetStackParameterCount(), stack_parameter_count); | 
| 507                               size_t result_size) { | 505   CallDescriptor* desc = Linkage::GetStubCallDescriptor( | 
| 508   Node* target = HeapConstant(callable.code()); | 506       isolate(), zone(), descriptor, stack_parameter_count, | 
| 509   return CallStub(callable.descriptor(), target, context, arg1, arg2, arg3, |  | 
| 510                   arg4, result_size); |  | 
| 511 } |  | 
| 512 |  | 
| 513 Node* CodeAssembler::CallStubN(Callable const& callable, Node** args, |  | 
| 514                                size_t result_size) { |  | 
| 515   Node* target = HeapConstant(callable.code()); |  | 
| 516   return CallStubN(callable.descriptor(), target, args, result_size); |  | 
| 517 } |  | 
| 518 |  | 
| 519 Node* CodeAssembler::CallStub(const CallInterfaceDescriptor& descriptor, |  | 
| 520                               Node* target, Node* context, size_t result_size) { |  | 
| 521   CallDescriptor* call_descriptor = Linkage::GetStubCallDescriptor( |  | 
| 522       isolate(), zone(), descriptor, descriptor.GetStackParameterCount(), |  | 
| 523       CallDescriptor::kNoFlags, Operator::kNoProperties, | 507       CallDescriptor::kNoFlags, Operator::kNoProperties, | 
| 524       MachineType::AnyTagged(), result_size); | 508       MachineType::AnyTagged(), result_size); | 
| 525 | 509 | 
| 526   Node** args = zone()->NewArray<Node*>(1); | 510   CallPrologue(); | 
| 527   args[0] = context; | 511   Node* return_value = raw_assembler()->CallN(desc, input_count, inputs); | 
| 528 | 512   CallEpilogue(); | 
| 529   return CallN(call_descriptor, target, args); | 513   return return_value; | 
| 530 } | 514 } | 
| 531 | 515 | 
| 532 Node* CodeAssembler::CallStub(const CallInterfaceDescriptor& descriptor, |  | 
| 533                               Node* target, Node* context, Node* arg1, |  | 
| 534                               size_t result_size) { |  | 
| 535   CallDescriptor* call_descriptor = Linkage::GetStubCallDescriptor( |  | 
| 536       isolate(), zone(), descriptor, descriptor.GetStackParameterCount(), |  | 
| 537       CallDescriptor::kNoFlags, Operator::kNoProperties, |  | 
| 538       MachineType::AnyTagged(), result_size); |  | 
| 539 |  | 
| 540   Node** args = zone()->NewArray<Node*>(2); |  | 
| 541   args[0] = arg1; |  | 
| 542   args[1] = context; |  | 
| 543 |  | 
| 544   return CallN(call_descriptor, target, args); |  | 
| 545 } |  | 
| 546 |  | 
| 547 Node* CodeAssembler::CallStub(const CallInterfaceDescriptor& descriptor, |  | 
| 548                               Node* target, Node* context, Node* arg1, |  | 
| 549                               Node* arg2, size_t result_size) { |  | 
| 550   CallDescriptor* call_descriptor = Linkage::GetStubCallDescriptor( |  | 
| 551       isolate(), zone(), descriptor, descriptor.GetStackParameterCount(), |  | 
| 552       CallDescriptor::kNoFlags, Operator::kNoProperties, |  | 
| 553       MachineType::AnyTagged(), result_size); |  | 
| 554 |  | 
| 555   Node** args = zone()->NewArray<Node*>(3); |  | 
| 556   args[0] = arg1; |  | 
| 557   args[1] = arg2; |  | 
| 558   args[2] = context; |  | 
| 559 |  | 
| 560   return CallN(call_descriptor, target, args); |  | 
| 561 } |  | 
| 562 |  | 
| 563 Node* CodeAssembler::CallStub(const CallInterfaceDescriptor& descriptor, |  | 
| 564                               Node* target, Node* context, Node* arg1, |  | 
| 565                               Node* arg2, Node* arg3, size_t result_size) { |  | 
| 566   CallDescriptor* call_descriptor = Linkage::GetStubCallDescriptor( |  | 
| 567       isolate(), zone(), descriptor, descriptor.GetStackParameterCount(), |  | 
| 568       CallDescriptor::kNoFlags, Operator::kNoProperties, |  | 
| 569       MachineType::AnyTagged(), result_size); |  | 
| 570 |  | 
| 571   Node** args = zone()->NewArray<Node*>(4); |  | 
| 572   args[0] = arg1; |  | 
| 573   args[1] = arg2; |  | 
| 574   args[2] = arg3; |  | 
| 575   args[3] = context; |  | 
| 576 |  | 
| 577   return CallN(call_descriptor, target, args); |  | 
| 578 } |  | 
| 579 |  | 
| 580 Node* CodeAssembler::CallStub(const CallInterfaceDescriptor& descriptor, |  | 
| 581                               Node* target, Node* context, Node* arg1, |  | 
| 582                               Node* arg2, Node* arg3, Node* arg4, |  | 
| 583                               size_t result_size) { |  | 
| 584   CallDescriptor* call_descriptor = Linkage::GetStubCallDescriptor( |  | 
| 585       isolate(), zone(), descriptor, descriptor.GetStackParameterCount(), |  | 
| 586       CallDescriptor::kNoFlags, Operator::kNoProperties, |  | 
| 587       MachineType::AnyTagged(), result_size); |  | 
| 588 |  | 
| 589   Node** args = zone()->NewArray<Node*>(5); |  | 
| 590   args[0] = arg1; |  | 
| 591   args[1] = arg2; |  | 
| 592   args[2] = arg3; |  | 
| 593   args[3] = arg4; |  | 
| 594   args[4] = context; |  | 
| 595 |  | 
| 596   return CallN(call_descriptor, target, args); |  | 
| 597 } |  | 
| 598 |  | 
| 599 Node* CodeAssembler::CallStub(const CallInterfaceDescriptor& descriptor, |  | 
| 600                               Node* target, Node* context, Node* arg1, |  | 
| 601                               Node* arg2, Node* arg3, Node* arg4, Node* arg5, |  | 
| 602                               size_t result_size) { |  | 
| 603   CallDescriptor* call_descriptor = Linkage::GetStubCallDescriptor( |  | 
| 604       isolate(), zone(), descriptor, descriptor.GetStackParameterCount(), |  | 
| 605       CallDescriptor::kNoFlags, Operator::kNoProperties, |  | 
| 606       MachineType::AnyTagged(), result_size); |  | 
| 607 |  | 
| 608   Node** args = zone()->NewArray<Node*>(6); |  | 
| 609   args[0] = arg1; |  | 
| 610   args[1] = arg2; |  | 
| 611   args[2] = arg3; |  | 
| 612   args[3] = arg4; |  | 
| 613   args[4] = arg5; |  | 
| 614   args[5] = context; |  | 
| 615 |  | 
| 616   return CallN(call_descriptor, target, args); |  | 
| 617 } |  | 
| 618 | 516 | 
| 619 Node* CodeAssembler::CallStub(const CallInterfaceDescriptor& descriptor, | 517 Node* CodeAssembler::CallStub(const CallInterfaceDescriptor& descriptor, | 
| 620                               Node* target, Node* context, const Arg& arg1, | 518                               Node* target, Node* context, const Arg& arg1, | 
| 621                               const Arg& arg2, size_t result_size) { | 519                               const Arg& arg2, size_t result_size) { | 
| 622   CallDescriptor* call_descriptor = Linkage::GetStubCallDescriptor( | 520   CallDescriptor* call_descriptor = Linkage::GetStubCallDescriptor( | 
| 623       isolate(), zone(), descriptor, descriptor.GetStackParameterCount(), | 521       isolate(), zone(), descriptor, descriptor.GetStackParameterCount(), | 
| 624       CallDescriptor::kNoFlags, Operator::kNoProperties, | 522       CallDescriptor::kNoFlags, Operator::kNoProperties, | 
| 625       MachineType::AnyTagged(), result_size); | 523       MachineType::AnyTagged(), result_size); | 
| 626 | 524 | 
| 627   const int kArgsCount = 3; | 525   const int kArgsCount = 3; | 
| (...skipping 558 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1186       } | 1084       } | 
| 1187     } | 1085     } | 
| 1188   } | 1086   } | 
| 1189 | 1087 | 
| 1190   bound_ = true; | 1088   bound_ = true; | 
| 1191 } | 1089 } | 
| 1192 | 1090 | 
| 1193 }  // namespace compiler | 1091 }  // namespace compiler | 
| 1194 }  // namespace internal | 1092 }  // namespace internal | 
| 1195 }  // namespace v8 | 1093 }  // namespace v8 | 
| OLD | NEW | 
|---|