// Copyright 2014 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_COMPILER_JS_GENERIC_LOWERING_H_
#define V8_COMPILER_JS_GENERIC_LOWERING_H_

#include "src/codegen/code-factory.h"
#include "src/compiler/graph-reducer.h"
#include "src/compiler/linkage.h"
#include "src/compiler/opcodes.h"

namespace v8 {
namespace internal {
namespace compiler {

// Forward declarations.
class CommonOperatorBuilder;
class JSGraph;
class MachineOperatorBuilder;
class Linkage;


// Lowers JS-level operators to runtime and IC calls in the "generic" case.
class JSGenericLowering final : public AdvancedReducer {
 public:
  JSGenericLowering(JSGraph* jsgraph, Editor* editor, JSHeapBroker* broker);
  ~JSGenericLowering() final;

  const char* reducer_name() const override { return "JSGenericLowering"; }

  Reduction Reduce(Node* node) final;

 protected:
#define DECLARE_LOWER(x, ...) void Lower##x(Node* node);
  // Dispatched depending on opcode.
  JS_OP_LIST(DECLARE_LOWER)
#undef DECLARE_LOWER

  // Helpers to replace existing nodes with a generic call.
  void ReplaceWithBuiltinCall(Node* node, Builtins::Name builtin);
  void ReplaceWithBuiltinCall(Node* node, Callable c,
                              CallDescriptor::Flags flags);
  void ReplaceWithBuiltinCall(Node* node, Callable c,
                              CallDescriptor::Flags flags,
                              Operator::Properties properties);
  void ReplaceWithRuntimeCall(Node* node, Runtime::FunctionId f, int args = -1);

  void ReplaceUnaryOpWithBuiltinCall(Node* node,
                                     Builtins::Name builtin_without_feedback,
                                     Builtins::Name builtin_with_feedback);
  void ReplaceBinaryOpWithBuiltinCall(Node* node,
                                      Builtins::Name builtin_without_feedback,
                                      Builtins::Name builtin_with_feedback);

  Zone* zone() const;
  Isolate* isolate() const;
  JSGraph* jsgraph() const { return jsgraph_; }
  Graph* graph() const;
  CommonOperatorBuilder* common() const;
  MachineOperatorBuilder* machine() const;
  JSHeapBroker* broker() const { return broker_; }

 private:
  JSGraph* const jsgraph_;
  JSHeapBroker* const broker_;
};

}  // namespace compiler
}  // namespace internal
}  // namespace v8

#endif  // V8_COMPILER_JS_GENERIC_LOWERING_H_
