xref: /netbsd-src/external/gpl3/gdb.old/dist/sim/ppc/ld-insn.h (revision 82650ea59673ac1511a0f5b008a97de18ced4707)
1 /*  This file is part of the program psim.
2 
3     Copyright 1994, 1995, 1996, 2003 Andrew Cagney
4 
5     This program is free software; you can redistribute it and/or modify
6     it under the terms of the GNU General Public License as published by
7     the Free Software Foundation; either version 3 of the License, or
8     (at your option) any later version.
9 
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU General Public License for more details.
14 
15     You should have received a copy of the GNU General Public License
16     along with this program; if not, see <http://www.gnu.org/licenses/>.
17 
18     */
19 
20 /*
21 #   --
22 #
23 #
24 # Fields:
25 #
26 #	1	Instruction format as a `start-bit,content' pairs.
27 #		the content is one of a digit, field name or `/' (aka.0)
28 #
29 #	2	Format specifier
30 #
31 #	3	Flags:	64 - 64bit only
32 #			f - floating point enabled required
33 #
34 #	4 	short name
35 #
36 #	5	Description
37 #
38 #
39 # For flags marked 'model', the fields are interpreted as follows:
40 #
41 #	1	Not used
42 #
43 #	2	Not used
44 #
45 #	3	"macro"
46 #
47 #	4	String name for model
48 #
49 #	5	Specific CPU model, must be an identifier
50 #
51 #	6	Comma separated list of functional units
52 
53 */
54 
55 
56 /* Global constants */
57 
58 enum {
59   max_insn_bit_size = 32,
60 };
61 
62 
63 typedef struct _insn_field insn_field;
64 struct _insn_field {
65   int first;
66   int last;
67   int width;
68   int is_int;
69   int is_slash;
70   int is_string;
71   int val_int;
72   char *pos_string;
73   char *val_string;
74   insn_field *next;
75   insn_field *prev;
76 };
77 
78 typedef struct _insn_fields insn_fields;
79 struct _insn_fields {
80   insn_field *bits[max_insn_bit_size];
81   insn_field *first;
82   insn_field *last;
83   unsigned value;
84 };
85 
86 
87 /****************************************************************/
88 
89 typedef struct _opcode_field opcode_field;
90 struct _opcode_field {
91   int first;
92   int last;
93   int is_boolean;
94   unsigned boolean_constant;
95   opcode_field *parent;
96 };
97 
98 
99 /****************************************************************/
100 
101 typedef struct _insn_bits insn_bits;
102 struct _insn_bits {
103   int is_expanded;
104   int value;
105   insn_field *field;
106   opcode_field *opcode;
107   insn_bits *last;
108 };
109 
110 
111 /****************************************************************/
112 
113 
114 typedef enum {
115   insn_format,
116   insn_form,
117   insn_flags,
118   insn_mnemonic,
119   insn_name,
120   insn_comment,
121   insn_field_6,
122   insn_field_7,
123   nr_insn_table_fields
124 } insn_table_fields;
125 
126 typedef enum {
127   function_type = insn_format,
128   function_name = insn_name,
129   function_param = insn_comment
130 } function_table_fields;
131 
132 typedef enum {
133   model_name = insn_mnemonic,
134   model_identifer = insn_name,
135   model_default = insn_comment,
136 } model_table_fields;
137 
138 typedef enum {
139   include_flags = insn_flags,
140   include_path = insn_name,
141 } model_include_fields;
142 
143 typedef enum {
144   cache_type_def = insn_name,
145   cache_derived_name = insn_comment,
146   cache_name = insn_field_6,
147   cache_expression = insn_field_7,
148 } cache_fields;
149 
150 typedef struct _insn insn;
151 struct _insn {
152   table_entry *file_entry;
153   insn_fields *fields;
154   insn *next;
155 };
156 
157 typedef struct _insn_undef insn_undef;
158 struct _insn_undef {
159   insn_undef *next;
160   char *name;
161 };
162 
163 typedef struct _model model;
164 struct _model {
165   model *next;
166   char *name;
167   char *printable_name;
168   char *insn_default;
169   table_model_entry *func_unit_start;
170   table_model_entry *func_unit_end;
171 };
172 
173 typedef struct _insn_table insn_table;
174 struct _insn_table {
175   int opcode_nr;
176   insn_bits *expanded_bits;
177   int nr_insn;
178   insn *insns;
179   insn *functions;
180   insn *last_function;
181   decode_table *opcode_rule;
182   opcode_field *opcode;
183   int nr_entries;
184   insn_table *entries;
185   insn_table *sibling;
186   insn_table *parent;
187 };
188 
189 typedef enum {
190   insn_model_name,
191   insn_model_fields,
192   nr_insn_model_table_fields
193 } insn_model_table_fields;
194 
195 
196 extern insn_table *load_insn_table
197 (const char *file_name,
198  decode_table *decode_rules,
199  filter *filters,
200  table_include *includes,
201  cache_table **cache_rules);
202 
203 extern model *models;
204 
205 extern insn *model_macros;
206 extern insn *model_functions;
207 extern insn *model_internal;
208 extern insn *model_static;
209 extern insn *model_data;
210 
211 extern int max_model_fields_len;
212 
213 extern void insn_table_insert_insn
214 (insn_table *table,
215  table_entry *file_entry,
216  insn_fields *fields);
217 
218 
219 /****************************************************************/
220 
221 /****************************************************************/
222 
223 typedef void leaf_handler
224 (insn_table *entry,
225  lf *file,
226  void *data,
227  int depth);
228 
229 typedef void insn_handler
230 (insn_table *table,
231  lf *file,
232  void *data,
233  insn *instruction,
234  int depth);
235 
236 typedef void padding_handler
237 (insn_table *table,
238  lf *file,
239  void *data,
240  int depth,
241  int opcode_nr);
242 
243 
244 extern void insn_table_traverse_tree
245 (insn_table *table,
246  lf *file,
247  void *data,
248  int depth,
249  leaf_handler *start,
250  insn_handler *handler,
251  leaf_handler *end,
252  padding_handler *padding);
253 
254 
255 extern void insn_table_traverse_insn
256 (insn_table *table,
257  lf *file,
258  void *data,
259  insn_handler *handler);
260 
261 
262 
263 /****************************************************************/
264 
265 typedef void function_handler
266 (insn_table *table,
267  lf *file,
268  void *data,
269  table_entry *function);
270 
271 extern void
272 insn_table_traverse_function
273 (insn_table *table,
274  lf *file,
275  void *data,
276  function_handler *leaf);
277 
278 /****************************************************************/
279 
280 
281 
282 extern void insn_table_expand_insns
283 (insn_table *table);
284 
285 extern int insn_table_depth
286 (insn_table *table);
287