/* Disassembler structures definitions for the ARC.
   Copyright (C) 1994-2021 Free Software Foundation, Inc.

   Contributed by Claudiu Zissulescu (claziss@synopsys.com)

   This file is part of libopcodes.

   This library is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3, or (at your option)
   any later version.

   It is distributed in the hope that it will be useful, but WITHOUT
   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
   License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software Foundation,
   Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */

#ifndef ARCDIS_H
#define ARCDIS_H

#ifdef __cplusplus
extern "C" {
#endif

enum arc_ldst_writeback_mode
{
  ARC_WRITEBACK_NO = 0,
  ARC_WRITEBACK_AW = 1,
  ARC_WRITEBACK_A = ARC_WRITEBACK_AW,
  ARC_WRITEBACK_AB = 2,
  ARC_WRITEBACK_AS = 3,
};


enum arc_ldst_data_size
{
  ARC_SCALING_NONE = 4,
  ARC_SCALING_B = 1,
  ARC_SCALING_H = 2,
  ARC_SCALING_D = 8,
};


enum arc_condition_code
{
  ARC_CC_AL = 0x0,
  ARC_CC_RA = ARC_CC_AL,
  ARC_CC_EQ = 0x1,
  ARC_CC_Z = ARC_CC_EQ,
  ARC_CC_NE = 0x2,
  ARC_CC_NZ = ARC_CC_NE,
  ARC_CC_PL = 0x3,
  ARC_CC_P = ARC_CC_PL,
  ARC_CC_MI = 0x4,
  ARC_CC_N = ARC_CC_MI,
  ARC_CC_CS = 0x5,
  ARC_CC_C = ARC_CC_CS,
  ARC_CC_LO = ARC_CC_CS,
  ARC_CC_CC = 0x6,
  ARC_CC_NC = ARC_CC_CC,
  ARC_CC_HS = ARC_CC_CC,
  ARC_CC_VS = 0x7,
  ARC_CC_V = ARC_CC_VS,
  ARC_CC_VC = 0x8,
  ARC_CC_NV = ARC_CC_VC,
  ARC_CC_GT = 0x9,
  ARC_CC_GE = 0xA,
  ARC_CC_LT = 0xB,
  ARC_CC_LE = 0xC,
  ARC_CC_HI = 0xD,
  ARC_CC_LS = 0xE,
  ARC_CC_PNZ = 0xF,
  ARC_CC_UNDEF0 = 0x10,
  ARC_CC_UNDEF1 = 0x11,
  ARC_CC_UNDEF2 = 0x12,
  ARC_CC_UNDEF3 = 0x13,
  ARC_CC_UNDEF4 = 0x14,
  ARC_CC_UNDEF5 = 0x15,
  ARC_CC_UNDEF6 = 0x16,
  ARC_CC_UNDEF7 = 0x17,
  ARC_CC_UNDEF8 = 0x18,
  ARC_CC_UNDEF9 = 0x19,
  ARC_CC_UNDEFA = 0x1A,
  ARC_CC_UNDEFB = 0x1B,
  ARC_CC_UNDEFC = 0x1C,
  ARC_CC_UNDEFD = 0x1D,
  ARC_CC_UNDEFE = 0x1E,
  ARC_CC_UNDEFF = 0x1F
};

enum arc_operand_kind
{
  ARC_OPERAND_KIND_UNKNOWN = 0,
  ARC_OPERAND_KIND_REG,
  ARC_OPERAND_KIND_SHIMM,
  ARC_OPERAND_KIND_LIMM
};

struct arc_insn_operand
{
  /* Operand value as encoded in instruction.  */
  unsigned long value;

  enum arc_operand_kind kind;
};

/* Container for information about instruction.  Provides a higher
   level access to data that is contained in struct arc_opcode.  */

struct arc_instruction
{
  /* Address of this instruction.  */
  bfd_vma address;

  /* Whether this is a valid instruction.  */
  bool valid;

  insn_class_t insn_class;

  /* Length (without LIMM).  */
  unsigned length;

  /* Is there a LIMM in this instruction?  */
  int limm_p;

  /* Long immediate value.  */
  unsigned limm_value;

  /* Is it a branch/jump instruction?  */
  int is_control_flow;

  /* Whether this instruction has a delay slot.  */
  int has_delay_slot;

  /* Value of condition code field.  */
  enum arc_condition_code condition_code;

  /* Load/store writeback mode.  */
  enum arc_ldst_writeback_mode writeback_mode;

  /* Load/store data size.  */
  enum arc_ldst_data_size data_size_mode;

  /* Amount of operands in instruction.  Note that amount of operands
     reported by opcodes disassembler can be different from the one
     encoded in the instruction.  Notable case is "ld a,[b,offset]",
     when offset == 0.  In this case opcodes disassembler presents
     this instruction as "ld a,[b]", hence there are *two* operands,
     not three.  OPERANDS_COUNT and OPERANDS contain only those
     explicit operands, hence it is up to invoker to handle the case
     described above based on instruction opcodes.  Another notable
     thing is that in opcodes disassembler representation square
     brackets (`[' and `]') are so called fake-operands - they are in
     the list of operands, but do not have any value of they own.
     Those "operands" are not present in this array.  */
  struct arc_insn_operand operands[MAX_INSN_ARGS];

  unsigned int operands_count;
};

/* Fill INSN with data about instruction at specified ADDR.  */

void arc_insn_decode (bfd_vma addr,
		      struct disassemble_info *di,
		      disassembler_ftype func,
		      struct arc_instruction *insn);

#ifdef __cplusplus
}
#endif

#endif
