| /* Disassembler structures definitions for the ARC. | 
 |    Copyright (C) 1994-2023 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 |