// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

#ifndef RUNTIME_VM_COMPILER_ASSEMBLER_ASSEMBLER_DBC_H_
#define RUNTIME_VM_COMPILER_ASSEMBLER_ASSEMBLER_DBC_H_

#ifndef RUNTIME_VM_COMPILER_ASSEMBLER_ASSEMBLER_H_
#error Do not include assembler_dbc.h directly; use assembler.h instead.
#endif

#include "platform/assert.h"
#include "platform/utils.h"
#include "vm/constants_dbc.h"
#include "vm/cpu.h"
#include "vm/hash_map.h"
#include "vm/simulator.h"

namespace dart {

namespace compiler {

// Dummy declaration to make things compile.
class Address : public ValueObject {
 private:
  Address();
};

class Assembler : public AssemblerBase {
 public:
  explicit Assembler(ObjectPoolBuilder* object_pool_builder,
                     bool use_far_branches = false)
      : AssemblerBase(object_pool_builder) {}
  ~Assembler() {}

  void Bind(Label* label);
  void Jump(Label* label);

  // Misc. functionality
  intptr_t prologue_offset() const { return 0; }

  // Debugging and bringup support.
  void Stop(const char* message) override;

  static void InitializeMemoryWithBreakpoints(uword data, intptr_t length);

  static uword GetBreakInstructionFiller() { return SimulatorBytecode::kTrap; }

  static bool IsSafe(const Object& value) { return true; }
  static bool IsSafeSmi(const Object& value) { return false; }

  enum CanBeSmi {
    kValueIsNotSmi,
    kValueCanBeSmi,
  };

  // Bytecodes.

#define DECLARE_EMIT(Name, Signature, Fmt0, Fmt1, Fmt2)                        \
  void Name(PARAMS_##Signature);

#define PARAMS_0
#define PARAMS_A_D uintptr_t ra, uintptr_t rd
#define PARAMS_D uintptr_t rd
#define PARAMS_A_B_C uintptr_t ra, uintptr_t rb, uintptr_t rc
#define PARAMS_A_B_Y uintptr_t ra, uintptr_t rb, intptr_t ry
#define PARAMS_A uintptr_t ra
#define PARAMS_X intptr_t x
#define PARAMS_T intptr_t x
#define PARAMS_A_X uintptr_t ra, intptr_t x

  BYTECODES_LIST(DECLARE_EMIT)

#undef PARAMS_0
#undef PARAMS_A_D
#undef PARAMS_D
#undef PARAMS_A_B_C
#undef PARAMS_A_B_Y
#undef PARAMS_A
#undef PARAMS_X
#undef PARAMS_T
#undef PARAMS_A_X
#undef DECLARE_EMIT

  void Emit(int32_t value);

  void PushConstant(const Object& obj);
  void LoadConstant(uintptr_t ra, const Object& obj);

  intptr_t AddConstant(const Object& obj);

  void Nop(intptr_t d) { Nop(0, d); }

 private:
  DISALLOW_ALLOCATION();
  DISALLOW_COPY_AND_ASSIGN(Assembler);
};

}  // namespace compiler

using compiler::Address;

}  // namespace dart

#endif  // RUNTIME_VM_COMPILER_ASSEMBLER_ASSEMBLER_DBC_H_
