xref: /netbsd-src/external/gpl3/binutils.old/dist/opcodes/arc-dis.h (revision e992f068c547fd6e84b3f104dc2340adcc955732)
1 /* Disassembler structures definitions for the ARC.
2    Copyright (C) 1994-2022 Free Software Foundation, Inc.
3 
4    Contributed by Claudiu Zissulescu (claziss@synopsys.com)
5 
6    This file is part of libopcodes.
7 
8    This library is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3, or (at your option)
11    any later version.
12 
13    It is distributed in the hope that it will be useful, but WITHOUT
14    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
16    License for more details.
17 
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software Foundation,
20    Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
21 
22 #ifndef ARCDIS_H
23 #define ARCDIS_H
24 
25 #ifdef __cplusplus
26 extern "C" {
27 #endif
28 
29 enum arc_ldst_writeback_mode
30 {
31   ARC_WRITEBACK_NO = 0,
32   ARC_WRITEBACK_AW = 1,
33   ARC_WRITEBACK_A = ARC_WRITEBACK_AW,
34   ARC_WRITEBACK_AB = 2,
35   ARC_WRITEBACK_AS = 3,
36 };
37 
38 
39 enum arc_ldst_data_size
40 {
41   ARC_SCALING_NONE = 4,
42   ARC_SCALING_B = 1,
43   ARC_SCALING_H = 2,
44   ARC_SCALING_D = 8,
45 };
46 
47 
48 enum arc_condition_code
49 {
50   ARC_CC_AL = 0x0,
51   ARC_CC_RA = ARC_CC_AL,
52   ARC_CC_EQ = 0x1,
53   ARC_CC_Z = ARC_CC_EQ,
54   ARC_CC_NE = 0x2,
55   ARC_CC_NZ = ARC_CC_NE,
56   ARC_CC_PL = 0x3,
57   ARC_CC_P = ARC_CC_PL,
58   ARC_CC_MI = 0x4,
59   ARC_CC_N = ARC_CC_MI,
60   ARC_CC_CS = 0x5,
61   ARC_CC_C = ARC_CC_CS,
62   ARC_CC_LO = ARC_CC_CS,
63   ARC_CC_CC = 0x6,
64   ARC_CC_NC = ARC_CC_CC,
65   ARC_CC_HS = ARC_CC_CC,
66   ARC_CC_VS = 0x7,
67   ARC_CC_V = ARC_CC_VS,
68   ARC_CC_VC = 0x8,
69   ARC_CC_NV = ARC_CC_VC,
70   ARC_CC_GT = 0x9,
71   ARC_CC_GE = 0xA,
72   ARC_CC_LT = 0xB,
73   ARC_CC_LE = 0xC,
74   ARC_CC_HI = 0xD,
75   ARC_CC_LS = 0xE,
76   ARC_CC_PNZ = 0xF,
77   ARC_CC_UNDEF0 = 0x10,
78   ARC_CC_UNDEF1 = 0x11,
79   ARC_CC_UNDEF2 = 0x12,
80   ARC_CC_UNDEF3 = 0x13,
81   ARC_CC_UNDEF4 = 0x14,
82   ARC_CC_UNDEF5 = 0x15,
83   ARC_CC_UNDEF6 = 0x16,
84   ARC_CC_UNDEF7 = 0x17,
85   ARC_CC_UNDEF8 = 0x18,
86   ARC_CC_UNDEF9 = 0x19,
87   ARC_CC_UNDEFA = 0x1A,
88   ARC_CC_UNDEFB = 0x1B,
89   ARC_CC_UNDEFC = 0x1C,
90   ARC_CC_UNDEFD = 0x1D,
91   ARC_CC_UNDEFE = 0x1E,
92   ARC_CC_UNDEFF = 0x1F
93 };
94 
95 enum arc_operand_kind
96 {
97   ARC_OPERAND_KIND_UNKNOWN = 0,
98   ARC_OPERAND_KIND_REG,
99   ARC_OPERAND_KIND_SHIMM,
100   ARC_OPERAND_KIND_LIMM
101 };
102 
103 struct arc_insn_operand
104 {
105   /* Operand value as encoded in instruction.  */
106   unsigned long value;
107 
108   enum arc_operand_kind kind;
109 };
110 
111 /* Container for information about instruction.  Provides a higher
112    level access to data that is contained in struct arc_opcode.  */
113 
114 struct arc_instruction
115 {
116   /* Address of this instruction.  */
117   bfd_vma address;
118 
119   /* Whether this is a valid instruction.  */
120   bool valid;
121 
122   insn_class_t insn_class;
123 
124   /* Length (without LIMM).  */
125   unsigned length;
126 
127   /* Is there a LIMM in this instruction?  */
128   int limm_p;
129 
130   /* Long immediate value.  */
131   unsigned limm_value;
132 
133   /* Is it a branch/jump instruction?  */
134   int is_control_flow;
135 
136   /* Whether this instruction has a delay slot.  */
137   int has_delay_slot;
138 
139   /* Value of condition code field.  */
140   enum arc_condition_code condition_code;
141 
142   /* Load/store writeback mode.  */
143   enum arc_ldst_writeback_mode writeback_mode;
144 
145   /* Load/store data size.  */
146   enum arc_ldst_data_size data_size_mode;
147 
148   /* Amount of operands in instruction.  Note that amount of operands
149      reported by opcodes disassembler can be different from the one
150      encoded in the instruction.  Notable case is "ld a,[b,offset]",
151      when offset == 0.  In this case opcodes disassembler presents
152      this instruction as "ld a,[b]", hence there are *two* operands,
153      not three.  OPERANDS_COUNT and OPERANDS contain only those
154      explicit operands, hence it is up to invoker to handle the case
155      described above based on instruction opcodes.  Another notable
156      thing is that in opcodes disassembler representation square
157      brackets (`[' and `]') are so called fake-operands - they are in
158      the list of operands, but do not have any value of they own.
159      Those "operands" are not present in this array.  */
160   struct arc_insn_operand operands[MAX_INSN_ARGS];
161 
162   unsigned int operands_count;
163 };
164 
165 /* Fill INSN with data about instruction at specified ADDR.  */
166 
167 void arc_insn_decode (bfd_vma addr,
168 		      struct disassemble_info *di,
169 		      disassembler_ftype func,
170 		      struct arc_instruction *insn);
171 
172 #ifdef __cplusplus
173 }
174 #endif
175 
176 #endif
177