| Index: src/compiler/code-assembler.cc | 
| diff --git a/src/compiler/code-assembler.cc b/src/compiler/code-assembler.cc | 
| index 39efdea79b401c613c3e94e82af0effa52095811..dc1be5b3dd809736961b3e23cd85ab0e2056641d 100644 | 
| --- a/src/compiler/code-assembler.cc | 
| +++ b/src/compiler/code-assembler.cc | 
| @@ -27,9 +27,9 @@ | 
| #define REPEAT_1_TO_4(V, T) REPEAT_1_TO_3(V, T) V(T, T, T, T) | 
| #define REPEAT_1_TO_5(V, T) REPEAT_1_TO_4(V, T) V(T, T, T, T, T) | 
| #define REPEAT_1_TO_6(V, T) REPEAT_1_TO_5(V, T) V(T, T, T, T, T, T) | 
| -#define REPEAT_1_TO_7(V, T) REPEAT_1_TO_6(V, T) V(T, T, T, T, T, T) | 
| -#define REPEAT_1_TO_8(V, T) REPEAT_1_TO_7(V, T) V(T, T, T, T, T, T, T) | 
| -#define REPEAT_1_TO_9(V, T) REPEAT_1_TO_8(V, T) V(T, T, T, T, T, T, T, T) | 
| +#define REPEAT_1_TO_7(V, T) REPEAT_1_TO_6(V, T) V(T, T, T, T, T, T, T) | 
| +#define REPEAT_1_TO_8(V, T) REPEAT_1_TO_7(V, T) V(T, T, T, T, T, T, T, T) | 
| +#define REPEAT_1_TO_9(V, T) REPEAT_1_TO_8(V, T) V(T, T, T, T, T, T, T, T, T) | 
|  | 
| namespace v8 { | 
| namespace internal { | 
| @@ -422,7 +422,22 @@ template <class... TArgs> | 
| Node* CodeAssembler::CallRuntime(Runtime::FunctionId function, Node* context, | 
| TArgs... args) { | 
| CallPrologue(); | 
| -  Node* return_value = raw_assembler()->CallRuntime(function, context, args...); | 
| + | 
| +  int argc = static_cast<int>(sizeof...(args)); | 
| +  CallDescriptor* desc = Linkage::GetRuntimeCallDescriptor( | 
| +      zone(), function, argc, Operator::kNoProperties, | 
| +      CallDescriptor::kNoFlags); | 
| +  int return_count = static_cast<int>(desc->ReturnCount()); | 
| + | 
| +  Node* centry = | 
| +      HeapConstant(CodeFactory::RuntimeCEntry(isolate(), return_count)); | 
| +  Node* ref = ExternalConstant(ExternalReference(function, isolate())); | 
| +  Node* arity = Int32Constant(argc); | 
| + | 
| +  Node* nodes[] = {centry, args..., ref, arity, context}; | 
| + | 
| +  Node* return_value = raw_assembler()->CallN(desc, arraysize(nodes), nodes); | 
| + | 
| CallEpilogue(); | 
| return return_value; | 
| } | 
| @@ -434,49 +449,37 @@ Node* CodeAssembler::CallRuntime(Runtime::FunctionId function, Node* context, | 
| REPEAT_1_TO_6(INSTANTIATE, Node*) | 
| #undef INSTANTIATE | 
|  | 
| -Node* CodeAssembler::TailCallRuntime(Runtime::FunctionId function_id, | 
| -                                     Node* context) { | 
| -  return raw_assembler()->TailCallRuntime0(function_id, context); | 
| -} | 
| +template <class... TArgs> | 
| +Node* CodeAssembler::TailCallRuntime(Runtime::FunctionId function, | 
| +                                     Node* context, TArgs... args) { | 
| +  CallPrologue(); | 
|  | 
| -Node* CodeAssembler::TailCallRuntime(Runtime::FunctionId function_id, | 
| -                                     Node* context, Node* arg1) { | 
| -  return raw_assembler()->TailCallRuntime1(function_id, arg1, context); | 
| -} | 
| +  int argc = static_cast<int>(sizeof...(args)); | 
| +  CallDescriptor* desc = Linkage::GetRuntimeCallDescriptor( | 
| +      zone(), function, argc, Operator::kNoProperties, | 
| +      CallDescriptor::kSupportsTailCalls); | 
| +  int return_count = static_cast<int>(desc->ReturnCount()); | 
|  | 
| -Node* CodeAssembler::TailCallRuntime(Runtime::FunctionId function_id, | 
| -                                     Node* context, Node* arg1, Node* arg2) { | 
| -  return raw_assembler()->TailCallRuntime2(function_id, arg1, arg2, context); | 
| -} | 
| +  Node* centry = | 
| +      HeapConstant(CodeFactory::RuntimeCEntry(isolate(), return_count)); | 
| +  Node* ref = ExternalConstant(ExternalReference(function, isolate())); | 
| +  Node* arity = Int32Constant(argc); | 
|  | 
| -Node* CodeAssembler::TailCallRuntime(Runtime::FunctionId function_id, | 
| -                                     Node* context, Node* arg1, Node* arg2, | 
| -                                     Node* arg3) { | 
| -  return raw_assembler()->TailCallRuntime3(function_id, arg1, arg2, arg3, | 
| -                                           context); | 
| -} | 
| +  Node* nodes[] = {centry, args..., ref, arity, context}; | 
|  | 
| -Node* CodeAssembler::TailCallRuntime(Runtime::FunctionId function_id, | 
| -                                     Node* context, Node* arg1, Node* arg2, | 
| -                                     Node* arg3, Node* arg4) { | 
| -  return raw_assembler()->TailCallRuntime4(function_id, arg1, arg2, arg3, arg4, | 
| -                                           context); | 
| -} | 
| +  Node* return_value = | 
| +      raw_assembler()->TailCallN(desc, arraysize(nodes), nodes); | 
|  | 
| -Node* CodeAssembler::TailCallRuntime(Runtime::FunctionId function_id, | 
| -                                     Node* context, Node* arg1, Node* arg2, | 
| -                                     Node* arg3, Node* arg4, Node* arg5) { | 
| -  return raw_assembler()->TailCallRuntime5(function_id, arg1, arg2, arg3, arg4, | 
| -                                           arg5, context); | 
| +  CallEpilogue(); | 
| +  return return_value; | 
| } | 
|  | 
| -Node* CodeAssembler::TailCallRuntime(Runtime::FunctionId function_id, | 
| -                                     Node* context, Node* arg1, Node* arg2, | 
| -                                     Node* arg3, Node* arg4, Node* arg5, | 
| -                                     Node* arg6) { | 
| -  return raw_assembler()->TailCallRuntime6(function_id, arg1, arg2, arg3, arg4, | 
| -                                           arg5, arg6, context); | 
| -} | 
| +// Instantiate TailCallRuntime() with up to 6 arguments. | 
| +#define INSTANTIATE(...)                                           \ | 
| +  template V8_EXPORT_PRIVATE Node* CodeAssembler::TailCallRuntime( \ | 
| +      Runtime::FunctionId, __VA_ARGS__); | 
| +REPEAT_1_TO_7(INSTANTIATE, Node*) | 
| +#undef INSTANTIATE | 
|  | 
| Node* CodeAssembler::CallStub(Callable const& callable, Node* context, | 
| Node* arg1, size_t result_size) { | 
|  |