// Copyright 2017 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef V8_BUILTINS_BUILTINS_UTILS_GEN_H_
#define V8_BUILTINS_BUILTINS_UTILS_GEN_H_

#include "src/builtins/builtins-descriptors.h"

namespace v8 {
namespace internal {

namespace compiler {
class CodeAssemblerState;
}  // namespace compiler

// ----------------------------------------------------------------------------
// Support macro for defining builtins with Turbofan.
// ----------------------------------------------------------------------------
//
// A builtin function is defined by writing:
//
//   TF_BUILTIN(name, code_assember_base_class) {
//     ...
//   }
//
// In the body of the builtin function the arguments can be accessed
// as "Parameter(n)".
#define TF_BUILTIN(Name, AssemblerBase)                                  \
  class Name##Assembler : public AssemblerBase {                         \
   public:                                                               \
    typedef Builtin_##Name##_InterfaceDescriptor Descriptor;             \
                                                                         \
    explicit Name##Assembler(compiler::CodeAssemblerState* state)        \
        : AssemblerBase(state) {}                                        \
    void Generate##Name##Impl();                                         \
                                                                         \
    Node* Parameter(Descriptor::ParameterIndices index) {                \
      return CodeAssembler::Parameter(static_cast<int>(index));          \
    }                                                                    \
    /* TODO(ishell): Remove this way of accessing parameters once the */ \
    /* JSFunction linkage arguments are reordered. */                    \
    Node* Parameter(BuiltinDescriptor::ParameterIndices index) {         \
      return CodeAssembler::Parameter(static_cast<int>(index));          \
    }                                                                    \
  };                                                                     \
  void Builtins::Generate_##Name(compiler::CodeAssemblerState* state) {  \
    Name##Assembler assembler(state);                                    \
    state->SetInitialDebugInformation(#Name, __FILE__, __LINE__);        \
    assembler.Generate##Name##Impl();                                    \
  }                                                                      \
  void Name##Assembler::Generate##Name##Impl()

}  // namespace internal
}  // namespace v8

#endif  // V8_BUILTINS_BUILTINS_UTILS_GEN_H_
